Forum: Mikrocontroller und Digitale Elektronik ESP8266 DeepSleep Wetterstation


von KielerFlo (Gast)


Lesenswert?

Hallo liebe Leute,
ich versuche seit Tagen meinen Wetterstationsaußenposten einigermaßen 
stromsparend zu programmieren. Leider kann ich mir momentan nur 
aussuchen, ob ich über Openhab2 ein Signal erhalte oder die Anlage auch 
wirklich stromsparend läuft, dann bekommt der Pi nämlich kein Signal 
mehr.
Ich verwende einen ESP8266 als NodeMCU Board und einem DHT22 Temperatur- 
und Luftfeuchtigkeitsfühler. Das Ziel ist es, den Wettersensor in einem 
Vogelhäuschen anzubringen und dann über eine Solarzelle in einem LiPol 
Akku zu versorgen.
Hier ist mein Sketch dazu:
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>

#define DHTTYPE   DHT22
#define DHTPIN    5

#define WLAN_SSID     "geheim"
#define WLAN_PASSWORD "auch geheim"

DHT dht(DHTPIN, DHTTYPE, 22);

ESP8266WebServer server(80);



float temperature, humidity;
//int soil = analogRead(A0);
//float soil_percent;
unsigned long previousMillis = 0;
const long interval = 2000;

void setup() {
    Serial.begin(115200);
    delay(10);


    dht.begin();
    humidity = dht.readHumidity();
    temperature = dht.readTemperature();
//    pinMode(soil, INPUT);


    Serial.println(); Serial.println();
    Serial.print("Connecting to ");
    Serial.println(WLAN_SSID);

    WiFi.mode(WIFI_STA);
    WiFi.begin(WLAN_SSID, WLAN_PASSWORD);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println();

    Serial.println("WiFi connected");
    Serial.println("IP address: "); Serial.println(WiFi.localIP());


    server.on("/dht22.json", [](){
        unsigned long currentMillis = millis();

        if (currentMillis - previousMillis >= interval) {
            previousMillis = currentMillis;

            humidity = dht.readHumidity();
            temperature = dht.readTemperature();


            if (isnan(humidity) || isnan(temperature)) {
                Serial.println("Failed to read from DHT sensor!");
                return;
            }

            Serial.println("Reporting " + String((int)temperature) + "C 
and " + String((int)humidity) + " % humidity");
        }

        StaticJsonBuffer<500> jsonBuffer;
        JsonObject& root = jsonBuffer.createObject();
        root["temperature"] = temperature;
        root["humidity"] = humidity;

        String jsonString;
        root.printTo(jsonString);

        Serial.println(jsonString);
        server.send(200, "application/json", jsonString);
    });

    server.begin();
    Serial.println("HTTP server started! Waiting for clients!");

}
void loop() {
    server.handleClient();
  // delay(20e6);
   // ESP.deepSleep(300e6); //5 Minuten schlafen
    //delay(100);
}

von Marc G. (marcm)


Lesenswert?


von Stefan F. (Gast)


Lesenswert?

Das NodeMCU Board eignet sich dafür nicht gut, weil die Bauteile um den 
ESP herum viel Ruhestrom aufnehmen. Zum Üben der Programmierung ist es 
jedoch sehr gut geeignet.

Wenn dein Programm fertig ist, wird das Board trotz Depp-Sleep noch ein 
paar mA aufnehmen. Dann steigst du auf ein "nacktes" ESP-12 Modul um und 
Drops ist gelutscht.

Was dein Programm angeht: Im Deep Sleep kann niemand den ESP 
kontaktieren, deswegen nutzt Dir der ESP8266WebServer hier nichts. Du 
musst die Kommunikation umkehren: Der ESP verbindet sich in regelmäßigen 
Intervallen  mit einem zentralen Server und sendet seine Messwerte.

Dazu brauchst du einen Server, der ständig empfangsbereit ist. Für 
zuhause würde ich dazu einen Raspberry Pi (oder ähnlich) verwenden - es 
sei denn du hast schon einen Server aufgestellt.

Hier bietet sich das MQTT Protokoll und Serverseitig ein MQTT Broaker 
an. Aber man kann auch z.B. mit PHP eine einfache Brücke zur Datenbank 
herstellen, wo die Messwerte gespeichert werden.

Wie das ganze mit OpenHab zusammen kommen kann, weiss ich nicht. Davon 
habe ich keine Ahnung. Vermutlich kann man aber auch das irgendwie mit 
PHP Scripten lösen.

von Blabla (Gast)


Lesenswert?

Hi, also meine bisherigen "Stromspar" Erfahrungen mit dem ESP8266 wie 
auch ESP32 würde ich als nicht zufrieden stellenden beschreiben. Ich 
habe mehrere Boards mit mit verschiedener Software mal ausprobiert. 
MicroPython, EasyEsp, Arduino Sketch hat kein gutes Ergebnis geliefert. 
Akkubetrieb war mit einem 2000mAh Akku mit aufwachen Intervallen im 
Minuten Bereich nur für wenige Tage möglich.
Mit permanent Strom und auch per Solar habe ich welche Betrieben, das 
größte Manko bei mir ist das dass WLAN Modul also der HF Part immer 
gestorben ist mal nach einen paar Wochen oder auch Monaten in Betrieb. 
Sowohl drinne als auch draussen. MC funktioniert soweit einwandfrei ich 
kann nur keine Verbindung zum WLAN mehr aufbauen. Seit dem habe ich ein 
Stapel ESPs im Schrank liegen.

Ich habe das ganze auch mit MQTT zur Kommunikation Betrieben und dann 
eine InfluxDB mit Grafana auf meinem Udoo x86 Server Betrieben(ne SSD 
macht auf  Dauer mehr Spaß als ne SD Karte). IMHO

Ich würde für stromsparendes inzwischen Abstand von ESP Modulen nehmen 
und eher zu einer Cortex-M0 mit Lora Lösung tendieren. Mir fehlt nur 
noch ein gescheites Lora Gateway.

von Wolfgang (Gast)


Lesenswert?

Stefanus F. schrieb:
> Wie das ganze mit OpenHab zusammen kommen kann, weiss ich nicht. Davon
> habe ich keine Ahnung.

Wie wäre es mit einem MQTT Broker, z.B. Mosquitto.
https://www.openhab.org/addons/bindings/mqtt/

von Stefan F. (Gast)


Lesenswert?

Blabla schrieb:
> bei mir ist das dass WLAN Modul also der HF Part immer
> gestorben ist

Meinst du damit, dass sie kaputt gegangen sind, oder sind sie nur bis 
zum nächsten Reset (oder Batteriewechsel) ausgefallen?

von Tomb (Gast)


Lesenswert?

Blabla schrieb:
> Mit permanent Strom und auch per Solar habe ich welche Betrieben, das
> größte Manko bei mir ist das dass WLAN Modul also der HF Part immer
> gestorben ist mal nach einen paar Wochen oder auch Monaten in Betrieb.

Ist zwar schon älter der Beitrag, aber sicher, dass es der HF Part ist 
und nicht das Flash?
Nutzt man die Arduino Lib, sollte man folgende Zeile im setup verwenden:

WiFi.persistent( false ); // avoid writing to flash after every wakeup

Hab selbst gerade zwei NodeMCU+BM280 Wetterstationen mit CR123 am 
Laufen. Allerdings erst seit ein paar Wochen. War einiges an Board 
Modifikation notwendig um auf < 20uA im Deep Sleep zu kommen. LDO musste 
weg, Versorgung zum UART2USB chip musste weg und alle on-board 
Verbindungen zu GPIO0 und RST musste ich ebenfalls unterbrechen, da es 
sonst manchmal Probleme mit dem Wakeup gegeben hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.