KFZ Thermometer Hygrometer der über Mobile Internet die Daten zum ThingSpeak sendet und damit als Temperatur und Feuchtigkeit Logger fungiert. Wobei die Ergebnisse und Verlauf von überall eingesehen werden können.
|
SIM800L Modul habe ich bei aliexpress für 2,20€ gekauft.
SIM-Karte absolut kostenlaos beim netzclub.net bestellt. Und Datenverbindung ist auch kostenlos. Datenvolumen reicht für Messzwecken völlig aus.
Als Mikrocontroller habe ich ESP8266 wegen niedrigen Stromverbrauch verbrauch im Deep Sleep Modus gewählt. Arduino hätte es auch getan aber nicht so Batterie schonend.
Funktionsweise
ESP8266 erwacht alle 15 Minuten, aktiviert SIM800L GSM-Modul, misst mit dem DHT22 ( AM2302 ) -Sensor das Temperatur und die Feuchtigkeit, SIM800L baut die Verbindung zum Internet per GPRS und sendet die Daten an ThingSpeak. Danach geht das Gerät in Schlafmodus bis zu nächster Messung. Stromversorgung erfolgt mit Li Ion Akku.
Etwas kompliziert war in diesem Projekt die gleichzeitige serielle kommunikation mit SIM800L-Modul und Computer. Computer war notwendig für Debug Ausgaben. Dazu habe ich die serielle Schnittstelle per Swap-Befehl an die PINs TX, GPIO15 und RX,GPIO13 umgeschaltet. Daran ist auch das GGSM GPRS-Modul SIM800L angeschlossen. Und die Kommunikation mit PC über standard RX/TX Pins mit softserial organisiert. Ich bin stolz auf diese idee. Denn kommunikation mit SIM800L per softserial hat schlecht funktioniert wegen fehlender Hardware FIFO und zwischenspeicherung.
Richtige SIM800L Konfiguration für dieses Projekt ist mit Echo und die Baudrate von 115200 Baud. Auch bei der SIM-Karte soll vorher mit dem Handy die Pin Abfrage deaktiviert sein.
SIM800L-Modul zieht bei verbindung mit dem Mobilen Internet kurzzeitig bis 1,5A. Deswegen soll das Akku dieses strom liefern können.
Es gab auch probleme mit dem ESP8266 Modul wegen dem Stromspitzen. Die lösung dafür war ein 470uF 6,3V Kondensator zwischen 3,3V und GND an dem Wemos D1-Modul zu schalten.
WARNUNG Bei Stromversorgung über USB-Port des Wemos D1-Moduls soll Akku und SIM800L-Modul vom 5V -PIN am Wemos D1-Moduls abgeklemmt werden. SIM800L darf nicht mit 5V gespeist werden. Im Schaltplan ist das Jumper U3, der muss unbedingt beim USB-Port Betrieb offen sein.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
#include <SoftwareSerial.h> #include "DHTesp.h" #include <ESP8266WiFi.h> #include "Ticker.h" SoftwareSerial debug(3, 1); // RX, TX #define DHT22Pin D5 #define FETPin D6 #define Messintervall 15 // in Sekunden DHTesp dht; Ticker staticTicker; EspClass esp; float humidity; float temperature; String myReadString() // Eine Zeile über serielle Schnittstelle einlesen { unsigned long startTime = millis(); char c = 0; String message = ""; while (c != '\n' && (millis() - startTime <= 1000)) { yield(); if (Serial.available()) { c = Serial.read(); message += c; } } return message; } void setup() { staticTicker.attach(120, SleepTimer); //nach 2 minuten Unterprogramm SleepTimer ausführen pinMode(FETPin, OUTPUT); digitalWrite(FETPin, 0); // SIM800L einschalten Serial.begin(115200); // SIM800L Kommunikation Serial.swap(); delay(500); debug.begin(115200); // PC Kommunikation debug.println(""); debug.println("Start"); delay(5000); // Zeit um SIM800L hochzufahren dht.setup(DHT22Pin, DHTesp::DHT22); // Connect DHT Serial.println("AT"); // Kommunikation mit SIM800L prüfen delay(1000); char inser; while (Serial.available()) // antwort einlesen { inser = Serial.read(); debug.write(inser); if (inser == 'O') { inser = Serial.read(); if (inser == 'K') goto weiter; // ist "OK" entchalten? } } digitalWrite(FETPin, 1); debug.println("OK fon SIM800L Fehlt"); debug.println("Gehe schlafem Z.z..."); esp.deepSleep(Messintervall * 60e6, WAKE_RF_DISABLED); // Gehe schlafen delay(2000); weiter: while (Serial.available()) debug.write(Serial.read()); //inputbuffer leern humidity = dht.getHumidity(); temperature = dht.getTemperature(); debug.println(humidity); debug.println(temperature); int i = 0; String dataIn; delay(20000); // Zeit für SIM800L um sich im GPRS netz anzumelden boolean Status = false; int TimeoutZaeler = 0; do { TimeoutZaeler++; delay(10000); Serial.println("AT+CGATT?"); // bei Mobilen Internet GPRS eingebucht? delay(100); while (Serial.available()) { dataIn = myReadString(); if (dataIn.indexOf("CGATT: 1") >= 0) Status = true; debug.println(dataIn); } if (TimeoutZaeler > 10) { digitalWrite(FETPin, 1); debug.println("Netzwerkverbingung Timeout"); debug.println("Gehe schlafem Z.z..."); esp.deepSleep(Messintervall * 60e6, WAKE_RF_DISABLED); delay(2000); } } while (!Status); // Versuche 10 mal in GPRS netz anzumelden Serial.println("AT+SAPBR=1,1"); delay(100); while (Serial.available()) { dataIn = myReadString(); debug.print(dataIn); } Serial.println("AT+HTTPINIT"); // Aktiviere HTTP-Kommunikation delay(100); while (Serial.available()) { dataIn = myReadString(); debug.print(dataIn); } String url = "http://api.thingspeak.com/update?api_key=0R8VDR8R8TWCDTSY&field1=" + String(temperature, 1) + "&field2=" + String(humidity, 0); Serial.println("AT+HTTPPARA=\"URL\",\"" + url + "\""); // Sende HTTP Anfrage delay(100); while (Serial.available()) { dataIn = myReadString(); debug.print(dataIn); } Serial.println("AT+HTTPACTION=0"); delay(1000); while (Serial.available()) { dataIn = myReadString(); debug.print(dataIn); } delay(200); // Warten auf Serverantwort Serial.println("AT+HTTPREAD=0,20"); while (Serial.available()) { debug.write(Serial.read()); } delay(2000); while (Serial.available()) { debug.write(Serial.read()); } Serial.println("AT+HTTPTERM"); // Beende HTTP-Verbindung delay(1000); while (Serial.available()) { dataIn = myReadString(); debug.print(dataIn); } Serial.println("AT+SAPBR=0,1"); delay(2000); while (Serial.available()) { debug.write(Serial.read()); } digitalWrite(FETPin, 1); // SIM800L ausschalten delay(2000); esp.deepSleep(Messintervall * 60e6, WAKE_RF_DISABLED); // gehe schlafen } void SleepTimer() { digitalWrite(FETPin, 1); // SIM800L ausschalten debug.println("allgemein Timeout"); debug.println("Gehe schlafem Z.z..."); delay(2000); esp.deepSleep(Messintervall * 60e6, WAKE_RF_DISABLED); delay(2000); } void loop() { yield(); } |