Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
elektronik:esp8266:dht_deepsleep:start [2018/08/07 19:29] |
elektronik:esp8266:dht_deepsleep:start [2020/11/01 16:40] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== ESP8266 with DHT22 sending MQTT ====== | ||
+ | {{: | ||
+ | Um einen Aussensensor eine gewisse Zeit mit einer Batterie betreiben zu können ist die Möglichkeit den Prozessor schlafen zu legen extrem wichtig. Und wenn man mit einem relativ großen Messinterval zufrieden ist, lässt sich noch mehr aus einem Akku herausholen. Der ESP8266 kann das sogar recht gut. Im Netz kann man durchaus Quellen finden, die biss zu 60 Minuten lange deep sleeps erwähnen. Mit %%ESP.deepSleep(sleep_uSec)%% lässt sich der ESP schlafen legen. Zusätzlich muss der Reset Pin mit GPIO16 verbunden werden. | ||
+ | |||
+ | Im deepsleep läuft nur noch die RTC vom Prozessor, der nach Ablauf der festgelegten Periode per GPIO16 den Reset Pin auf low zieht. Und so den geladenen Sketch (ja ich programmiere den ESP mit Arduino) neu ausführt. Code nach dem Aufruf des deep sleep wird nicht ausgeführt. Allerdings wird berichtet, dass ein %%delay(100); | ||
+ | |||
+ | Mit %%ESP.getResetReason()%% kann man als Klartext den Grund für den letzten Reset abfragen. Die Antwort lautet dann " | ||
+ | |||
+ | Wichtig ist entweder die Brücke vor einem neu Programmieren auszulöten oder anders schaltbar zu machen. Damit man genug Zeit hat den neuen Sketch auf den ESP hoch zu laden. Alternativ kann man vor dem sleep ein delay von 30 Sekunden einbauen. | ||
+ | |||
+ | <callout type=" | ||
+ | |||
+ | Ich benutze shiftr.io als MQTT Broker um die Messages schön zu visualisieren. Das ganze ist aber ziemlich langweilig wenn alle Nodes nur alle 15 Minuten was senden. ;-) | ||
+ | < | ||
+ | |||
+ | ===== Material | ||
+ | * [[banggood> | ||
+ | * [[banggood> | ||
+ | * [[banggood> | ||
+ | |||
+ | * [[http:// | ||
+ | ===== Code ===== | ||
+ | |||
+ | <code c dht_deepsleep.ino> | ||
+ | /* | ||
+ | License TBD Christian Moll | ||
+ | */ | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | #include " | ||
+ | #include < | ||
+ | |||
+ | #define DHTTYPE DHT22 | ||
+ | #define DHTPIN 4 | ||
+ | |||
+ | #define FORCE_DEEPSLEEP | ||
+ | |||
+ | const char* host = " | ||
+ | const char* ssid = " | ||
+ | const char* password = " | ||
+ | |||
+ | WiFiClient net; | ||
+ | MQTTClient mqtt; | ||
+ | |||
+ | DHT dht(DHTPIN, DHTTYPE); | ||
+ | |||
+ | unsigned int batt; | ||
+ | double battV; | ||
+ | |||
+ | void connect(); | ||
+ | |||
+ | void setup(void){ | ||
+ | |||
+ | dht.begin(); | ||
+ | |||
+ | Serial.begin(115200); | ||
+ | Serial.println(); | ||
+ | Serial.println(" | ||
+ | WiFi.mode(WIFI_AP_STA); | ||
+ | WiFi.begin(ssid, | ||
+ | |||
+ | mqtt.begin(" | ||
+ | |||
+ | connect(); | ||
+ | Serial.printf(" | ||
+ | } | ||
+ | |||
+ | void loop(void){ | ||
+ | if(!mqtt.connected()) { | ||
+ | connect(); | ||
+ | } | ||
+ | | ||
+ | mqtt.loop(); | ||
+ | delay(30000); | ||
+ | | ||
+ | batt = analogRead(A0); | ||
+ | battV = mapDouble(batt, | ||
+ | float h = dht.readHumidity(); | ||
+ | float t = dht.readTemperature(); | ||
+ | | ||
+ | // Check if any reads failed and exit early (to try again). | ||
+ | if (!isnan(h) || !isnan(t)) { | ||
+ | mqtt.publish("/ | ||
+ | mqtt.publish("/ | ||
+ | } | ||
+ | | ||
+ | mqtt.publish("/ | ||
+ | mqtt.publish("/ | ||
+ | mqtt.publish("/ | ||
+ | | ||
+ | #ifdef FORCE_DEEPSLEEP | ||
+ | Serial.println(" | ||
+ | ESP.deepSleep(15 * 60 * 1000000); | ||
+ | delay(100); | ||
+ | #endif | ||
+ | //handle deep sleep depending on battV | ||
+ | if (battV < 3.3) { | ||
+ | ESP.deepSleep(30 * 1000000); //send IFTTT low_bat warning | ||
+ | delay(100); | ||
+ | } else if (battV < 4.0) { | ||
+ | ESP.deepSleep(2 * 1000000); | ||
+ | delay(100); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void connect() { | ||
+ | while(WiFi.waitForConnectResult() != WL_CONNECTED){ | ||
+ | WiFi.begin(ssid, | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.println(WiFi.localIP()); | ||
+ | |||
+ | while (!mqtt.connect(host, | ||
+ | Serial.print(" | ||
+ | } | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | |||
+ | void messageReceived(String topic, String payload, char * bytes, unsigned int length) { | ||
+ | Serial.print(" | ||
+ | Serial.print(topic); | ||
+ | Serial.print(" | ||
+ | Serial.print(payload); | ||
+ | Serial.println(); | ||
+ | } | ||
+ | |||
+ | double mapDouble(double x, double in_min, double in_max, double out_min, double out_max) | ||
+ | { | ||
+ | double temp = (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; | ||
+ | temp = (int) (4*temp + .5); | ||
+ | return (double) temp/4; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Bilder ===== | ||
+ | |||
+ | {{gallery>: | ||