Alle Beispiele, welche beim Helvepic32 angegeben sind, können unverändert natürlich auch beim HelvePic32 Breadboard verwendet werden. Daher nutzen wir die Gelegenheit, einen Internet Data Logger aufzubauen. (Selbstverständlich geht diese Beispiel auch mit dem Helvepic32)
Selbstverständlich kann ich alles über die Serielle Schnittstelle monitoren, wenn ich den Logger aber an einer Stelle einbauen will, ist es oft hilfreich, den aktuellen Status am Logger anzuzeigen. Inzwischen sind TFT Displays so günstig geworden, dass wir hier einen 1.8" TFT mit SPI-Anschluss verwenden. Da der HelvePic32 mit 40 MHz läuft, sind die Monitorausgaben mit dem SPI Bus hinreichend schnell. Die Anschlüsse dieser TFT Module variieren von Modell zu Modell, so dass hier nur eine exemplarische Darstellung gewählt wird:
Das Modul wird als erstes mit der Versorgungsspannung verbunden:
Danach verbindet man RST mit dem Reset des HelvePic32
jetzt RS, auch oft als CD bezeichnet, nicht zu verwechseln mit CS (auch SS)
nun SDA, besser als MOSI (Master Out, Slave In)
und SCK
und als letztes CS, auch SS genannt
Jetzt kann man dieses Display ansprechen. Das funktioniert sowohl mit der bekannten UTFT Library als auch der von den Entwicklern von UECIDE geschriebenen DisplayCore Library. Das TFT hat den Controller ST7735. Als ersten Test geben wir einfach die verstrichene Zeit aus.
Code kommt ...
Als Datenquelle wollen wir den DHT22 einsetzen. Dieser ist zwar etwas teurer als der billige DHT11, dafür aber genauer und stabiler. Von den vier Pins sind nur drei belegt. Oft findet man auch einen fertigen Breakout, der den Pull-Up Widerstand schon an Board hat:
Der DHT22 wird mit Masse und 3.3V verbunden. Man kann ihn auch mit 5V verbinden, bei einigen Modulen soll dadurch eine bessere Messung erzielt worden sein.
Zur Auslese verwenden wir die DHT Library (alle Libraries sind am Ende bereitgestellt)
Als letztes fügen wir ein WiFi Modul hinzu, welches ein ESP8266 Modul verwendet. In diesem Beispiel verwenden wir ein fertiges Breakout, das uns die Beschaltung des ESP8266 abnimmt:
Hier kommt nun eine Eigenschaft der HelvePic32 besonders zum Tragen: Da Serial0 und Serial1 nicht über den USB Anschluss laufen, kann man das WiFi-Modul direkt an diese Schnittstelle anschliessen. Da Serial1 mit dem SPI Bus verbunden ist, wählen wir Serial0.
Anmerkung: Serial1 nutzt die gleichen Pins wie der SPI Bus. Das ist die Vorerinstellung. Im Gegensatz zum Arduino, kann man diese Pinbelegung aber ändern, was an anderer Stelle beschrieben ist (Peripheral Port Select)
Der folgende Code verbindet sich mit dem Web-Dienst von Thingspeak.com (die entsprechenden ID-Informationen müssen angepasst werden.
#include "HelvePic32.h" #include <DHT22.h> #define DHT22_PIN nP[RIGHT][2] DHT22 myDHT22(DHT22_PIN); #define ESPgppd nP[RIGHT][1] // SMD #define ESPreset nP[LEFT][0] #define SSID "xxxx SSID xxxx" #define PASS "xxxx passwort xxxx" #define IP "184.106.153.149" // thingspeak.com String GET = "GET /update?key=xxxx_API_key_xxx&field1="; String F2 = "&field2="; String inputString = ""; // a string to hold incoming data const char* header = "Sensor Monitor"; const char* footer = "HelvePic32.org"; boolean debug = false; // if true: ignore DHT float avgT, avgH; uint8_t cnt; void setup() { pinMode(ESPgppd,OUTPUT); pinMode(ESPreset,OUTPUT); digitalWrite(ESPgppd,HIGH); digitalWrite(ESPreset,HIGH); avgT = 0.0; avgH = 0.0; cnt = 0; Serial.begin(9600); Serial0.begin(115200); doWait(10); Serial.println("Send AT to Esp8266"); Serial0.println("AT"); Serial.println("Wait for 5 seconds"); doWait(5); while (Serial0.available()){ char inChar = (char)Serial0.read(); inputString += inChar; } Serial.print(inputString); if(inputString.indexOf("OK")>0){ Serial.println("ESP8266: OK"); connectWiFi(); } else { Serial.println("Send AT+RST to ESP8266"); Serial0.println("AT+RST"); Serial.println("Wait for 5 seconds"); doWait(5); if(Serial0.find("ready")){ Serial.println("ESP8266: OK"); connectWiFi(); } else { Serial.println("ESP8266 not responding as expected"); } } Serial.println("Wait for DHT "); doWait(2); } void loop() { DHT22_ERROR_t errorCode; char bt[10]; char bh[10]; String tempC, hum; if (debug) { if (cnt==0) { Serial.print("Debug Mode - no Data --- OK --- "); Serial.println(millis()); } Serial.print("."); avgT += 23.5; avgH += 48; cnt++; if (cnt>29){ Serial.println(); avgT = (float)avgT/cnt; avgH = (float)avgH/cnt; Serial.println("Debug Mode - Sending Data to ESP8266"); tempC = dtostrf(avgT, 5, 2, bt); hum = dtostrf(avgH, 5, 2, bh); updateDHT(tempC, hum); cnt = 0; avgT = 0; avgH = 0; } } else { errorCode = myDHT22.readData(); switch(errorCode) { case DHT_ERROR_NONE: Serial.print("Humidity: "); Serial.print(myDHT22.getHumidity()); Serial.print(" %"); Serial.print("Temperature: "); Serial.print(myDHT22.getTemperatureC()); Serial.print(" C "); Serial.print("---- OK ----"); Serial.print(millis()); avgT += myDHT22.getTemperatureC(); avgH += myDHT22.getHumidity(); cnt++; if (cnt>59){ avgT = (float)avgT/cnt; avgH = (float)avgH/cnt; Serial.println(" -----> Sending averages to WEB Server"); Serial.print("Humidity: "); Serial.print(avgH); Serial.print(" %"); Serial.print("Temperature: "); Serial.print(avgT); Serial.print(" C "); tempC = dtostrf(avgT, 5, 2, bt); hum = dtostrf(avgH, 5, 2, bh); updateDHT(tempC, hum); cnt = 0; avgT = 0; avgH = 0; } break; case DHT_ERROR_CHECKSUM: Serial.print("Error"); Serial.print("check sum"); break; case DHT_BUS_HUNG: Serial.print("Error"); Serial.print("BUS Hung "); break; case DHT_ERROR_NOT_PRESENT: Serial.print("Error"); Serial.print("Not Present "); break; case DHT_ERROR_ACK_TOO_LONG: Serial.print("Error"); Serial.print("ACK time out "); break; case DHT_ERROR_SYNC_TIMEOUT: Serial.print("Error"); Serial.print("Sync Timeout "); break; case DHT_ERROR_DATA_TIMEOUT: Serial.print("Error"); Serial.print("Data Timeout "); break; case DHT_ERROR_TOOQUICK: Serial.print("Error"); Serial.print("Polled to quick "); break; } Serial.println(); } delay (2000); // DHT needs 2 s for next measurment/poll } boolean connectWiFi(){ Serial.println("AT+CWMODE=1"); Serial0.println("AT+CWMODE=1"); doWait(2); String cmd="AT+CWJAP=\""; cmd+=SSID; cmd+="\",\""; cmd+=PASS; cmd+="\""; Serial.println(cmd); Serial0.println(cmd); Serial.println("Waiting 8 seconds to set WiFi credentials"); doWait(8); if(Serial0.find("OK")){ Serial.println("ESP8266: OK"); return true; }else{ Serial.println("ESP8266: failed"); return false; } } void updateDHT(String tC, String hU){ Serial.println("Send Data to WEB "); String cmd = "AT+CIPSTART=\"TCP\",\""; cmd += IP; cmd += "\",80"; Serial.println(cmd); Serial0.println(cmd); Serial.println("Waiting 2 s to connect to Web Server"); doWait(2); if(Serial0.find("CONNECT")){ // if(Serial0.find("Linked")){ Serial.println("ESP8266: Linked"); cmd = GET; cmd += tC; cmd += F2; cmd += hU; cmd += "\r\n"; Serial.print("AT+CIPSEND="); Serial.println(cmd.length()); Serial.println(cmd); Serial0.print("AT+CIPSEND="); Serial0.println(cmd.length()); delay(500); if(Serial0.find(">")){ Serial0.print(cmd); if(Serial0.find("SEND")){ Serial.println("ESP8266: Send OK"); } }else{ Serial.println("ESP8266: Send failed"); Serial.println("AT+CIPCLOSE"); Serial0.println("AT+CIPCLOSE"); } return; } else { Serial.println("ESP8266: cannot connect to WEB Server"); } } void doWait(int s){ for (int i=0; i<s; i++){ Serial.print("."); delay(1000); } Serial.println(); }