ESP 8266 kurzes Lebenszeichen aber dann nichts

Hallo liebe Community,

ich versuch mich gerade an einem ESP8266, wie wohl jeder mal irgendwann. Soweit funktioniert alles super. Nur wenn ich den kleinen in den deepsleep-Modus gesteckt habe wacht er nicht wirklich wieder auf.

Ich bekomme nach der vorgegebenen Zeit noch ein kleines Lebenszeichen im Stil von Hieroglyphen im Seriellen Monitor der Arduino-IDE angezeigt aber dann nichts mehr, das Script wird nicht nochmal ausgeführt.

Ich hab RST mit D0 am Wemos (GPIO 16) verbunden.

Habt ihr eine Ahnung, warum das script nicht erneut ausgeführt wird?

Viele Grüße

Felix

Der Sketch hat einen Fehler in Zeile 42.

Gruß Fips

Natürlich hab ich auch den Code da:

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <PubSubClient.h>

//Luftfeuchtemesser
#include <DHT.h>

//Einstellungen
#include "settings.h"

ESP8266WiFiMulti WiFiMulti;
WiFiClient wifiClient;
PubSubClient client(wifiClient);

#define SERIAL_BAUD 115200
#define FORCE_DEEPSLEEP

/********************************( Definieren der Objekte )********************************/                          
#define DHTPIN 5          // PIN-Nummer der Data-Leitung
#define DHTTYPE DHT11 

DHT dht(DHTPIN, DHTTYPE);


/**
 * Le Setup
 */
void setup() {
  Serial.begin(SERIAL_BAUD);
  delay(500);
  Serial.println("Initalisiere DHT11");
  dht.begin();
  startWIFI();
}


/**
 * Looping Louie
 */
void loop() {
  runMQTT();
  sendSensorData();

  delay(500); //wait
  goToBed(minutes2sleep); //sending into deep sleep
}


/**
 * Building http-POST-request and send all necessary data              
 */
void sendSensorData () {
	float hum = dht.readHumidity();    // Lesen der Luftfeuchtigkeit und speichern in die Variable hum
	float temp = dht.readTemperature();// Lesen der Temperatur und speichern in die Variable temp
  Serial.println("Luftfeuchte:");
  Serial.print(hum);
  Serial.println(" %");
  Serial.println("Temperatur:");
  Serial.print(temp);
  Serial.println(" °C");
  
	client.publish(topic_temperature, String(temp).c_str(), true);
	client.publish(topic_humidity, String(hum).c_str(), true);
}


/**
 * Establish WiFi-Connection
 * 
 * If connection times out (threshold 50 sec) 
 * device will sleep for 5 minutes and will restart afterwards.
 */
void startWIFI() {
  Serial.println("---");
  WiFi.mode(WIFI_STA);
  Serial.println("Verbindung zum Wifi-Netzwerk mit folgenden Einstellungen:");
  Serial.print("SSID: ");
  Serial.println(ssid);
  Serial.print("Key: ");
  Serial.println(password);
  Serial.print("Device-Name: ");
  Serial.println(espName);
  
  WiFi.hostname(espName);
  WiFiMulti.addAP(ssid, password);

  int tryCnt = 0;
  
  while (WiFiMulti.run() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    tryCnt++;

    if (tryCnt > 100) {
      Serial.println("");
      Serial.println("Verbindung zum WiFi fehlgeschlagen. Setze Geraet in Schlafmodus.");
      goToBed(2);
    }
  }

  Serial.println("");
  Serial.println("WiFi verbunden");  
  Serial.print("IP-Adresse: ");
  Serial.println(WiFi.localIP());
  delay(300);
}


/**
 * Establish MQTT-Connection
 * 
 * If connection fails, device will sleep for 5 minutes and will restart afterwards.
 */
void runMQTT() {
  Serial.println("---");
  Serial.println("Starte MQTT-Client mit folgenden Einstellungen:");
  Serial.print("Host: ");
  Serial.println(mqtt_server);
  Serial.print("Benutzer: ");
  Serial.println(mqtt_user);
  Serial.print("Passwort: ");
  Serial.println(mqtt_password);
  Serial.print("ClientId: ");
  Serial.println(mqtt_clientId);

  client.setServer(mqtt_server, 1883);
  
  while (!client.connected()) {
    Serial.print("Erwarte Verbindung ... ");
    // Attempt to connect
    if (client.connect(mqtt_clientId, mqtt_user, mqtt_password)) {
      Serial.println("Erfolg.");
      client.loop();
    } else {
      Serial.println("Fehlschlag.");
      Serial.println("Verbindung zum MQTT-Server konnte nicht hergestellt werden. Setze Geraet in Schlafmodus.");
      goToBed(5);
    }
  }
}


/**
 * Sending device into deep sleep
 */
void goToBed (int minutes) {
  #ifdef FORCE_DEEPSLEEP
    Serial.print("Ohhhh. Ich bin muede. Ich gehe jetzt ins Bett fuer ");
    Serial.print(minutes);
    Serial.println(" Minuten. Gute Nacht!");
    Serial.println("---");
    ESP.deepSleep(minutes * 60 * 1000000);
    delay(100);
  #endif
}
ESP.deepSleep(minutes * 60 * 1000000);

Ist das nicht ein wenig viel?
Eine Sekunde hat wieviele Milisekunden?
(Auch wenn sich "Mili..." so ähnlich anhört wie Million, so ist es doch nur der Tausendste Teil und nicht der Millionste)
Also eine Sekunde hat 1000 Milisekunden und eine Minute hat 60 000 Milisekunden.

Mit ESP.deepSleep(ms) kann der Chip maximal 71 Minuten schlafen.

Edit: Das ist zwar richtig zitiert, aber die Quelle (Stefan Frings) irrt... :slight_smile:
Kennst du Seite von Stefan Frings:
http://stefanfrings.de/esp8266/

Beim deep sleep geht es mit Micro Sekunden..

Gruß Fips

Derfips:
Beim deep sleep geht es mit Micro Sekunden..

Stimmt!
Sorry!
Ach, da hab ich mich von so Formalitäten wie "ms" das ich für "Milisekunden" gehalten habe in die Irre führen lassen. :slight_smile:
Das kommt davon, wenn man über etwas schreibt, das man selbst noch nicht angewendet hat.
Hab zwar mehrere ESPs im Einsatz, hab aber noch nie einen schlafen geschickt...

Was hast du für eine Stromversorgung? Netzteil oder Powerbank?

Derzeit noch am Netzteil Micro USB am Wemos. Ich plane aber einen Batteriebetrieb.

Leider ist es bei 99,9% aller Powerbanks so, dass diese eine Mindeststromabnahme brauchen. Ansonsten schalten sie sich ab, damit der Akku nicht tiefentladen wird.
Geht der ESP8266 in den Deep Sleep Modus, dann verbraucht er so wenig Strom, dass die Powerbank abschaltet. Folglich wacht der ESP8266 dann auch nicht mehr auf. Das liegt aber daran dass sich die Powerbank ausgeschaltet hat.
Soweit hab ich das auch schon gebaut gehabt, und es funktionierte aus besagtem Grund nicht.

Die einzige Lösung die ich gefunden, aber noch nicht gebaut habe ist ein ESP8266 ohne Spannungsregler versorgt mit einem LiFePo4 Akku. Der kann dann DeepSleep und verbraucht extrem wenig Strom.
Benutzt man einen Wemos oder nodeMCU dann verbrennt der Spannungsregler den Löwenanteil vom Strom. Das bringt dann auch wieder nix.
Daher bei Akku und DeepSleep einen "rohen" ESP12 (die kleine schwarze Platine, die auf dem Wemos oder nodeMCU aufgelötet ist) und ein LiFePo4 Akku.
Das ist dann nicht mehr fertig zum zusammenstecken, funktioniert aber erst so richtig.

Lieben Gruß,
Chris

Hieroglyphen im Seriellen Monitor der Arduino

Stell den Seriellen Monitor auf 74880, dann kannst du sehen was der Wemos meldet.

Reduziere deinen Sketch auf das nötige.

Könnte es sein das er zu schnell wieder pennt?

 if (tryCnt > 100) {
      Serial.println("");
      Serial.println("Verbindung zum WiFi fehlgeschlagen. Setze Geraet in Schlafmodus.");
      goToBed(2);

Ich habe vor zwei Tagen das erste mal mit dem deep sleep gespielt, nach anfänglichen Schwierigkeiten hat es aber super geklappt.

Gruß Fips

Derfips:
Stell den Seriellen Monitor auf 74880, dann kannst du sehen was der Wemos meldet.

Danke für den Tipp.

Leider kommt bei der baudrate immernoch Hieroglyphen an, was den Start nach der Schlaphase angeht.

Derfips:
Reduziere deinen Sketch auf das nötige.

ich habe jetzt dieses einfache Beispiel versucht

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
  // but actually the LED is on; this is because
  // it is active low on the ESP-01)
  delay(1000);                      // Wait for a second
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
  delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)

  ESP.deepSleep(30 * 1000000);
  delay(100);
}

Leider das selbe Problem. Der Monitor spuckt mir folgendes aus:

ets Jan 8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vbb28d4a3
~ld
怘€

Derfips:
Könnte es sein das er zu schnell wieder pennt?

 if (tryCnt > 100) {

Serial.println("");
      Serial.println("Verbindung zum WiFi fehlgeschlagen. Setze Geraet in Schlafmodus.");
      goToBed(2);

Das kann es eigentlich nicht ein, die 2 Minuten deep sleep kommen nur, wenn er keine WLAN-Verbindung bekommt. Die hat er aber.

bade_one:

void setup() {

pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
 digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
 // but actually the LED is on; this is because
 // it is active low on the ESP-01)
 delay(1000);                      // Wait for a second
 digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
 delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)

ESP.deepSleep(30 * 1000000);
 delay(100);
}

Probiere doch mal den Sketch.

void setup() {
  Serial.begin(74880);
  Serial.println("\nSetup");
}

void loop() {
  delay(1000);                      
  Serial.println("Keine LED_BUILTIN und deep sleep bei Verbindung von D0 mit RST\n");                     
  ESP.deepSleep(10e6);
}

Edit: Keine LED_BUILTIN und deep sleep bei Verbindung von D0 mit RST!
Gilt nur für den Nodemcu.

Gruß Fips

Derfips:
Probiere doch mal den Sketch.

void setup() {

Serial.begin(74880);
  Serial.println("\nSetup");
}

void loop() {
  delay(1000);                     
  Serial.println(“Keine LED_BUILTIN und deep sleep bei Verbindung von D0 mit RST\n”);                   
  ESP.deepSleep(10e6);
}




Edit: Keine LED_BUILTIN und deep sleep bei Verbindung von D0 mit RST!
Gilt nur für den Nodemcu.


Gruß Fips

Danke Fips für deine Bemühungen, leider hab ich auch hier das selbe Problem. Siehe Screenshot.

void setup() {
  Serial.begin(74880);
  Serial.println("\nSetup");
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println("Wemos D1 mini pro LED_BUILTIN und deep sleep klappt\n");
  ESP.deepSleep(10e6);
}

Ausgabe

Setup
Wemos D1 mini pro LED_BUILTIN und deep sleep klappt

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vbb28d4a3
~ld

Setup
Wemos D1 mini pro LED_BUILTIN und deep sleep klappt

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vbb28d4a3
~ld

Setup
Wemos D1 mini pro LED_BUILTIN und deep sleep klappt

Funktioniert bei mir.

Gruß Fips

Derfips:
Ausgabe
Funktioniert bei mir.

Muss ich bestimmte Einstellungen in der Arduino IDE beachten oder kann es an der Firmware auf dem Wemos liegen?

Verbindust du D0 mit RST direkt oder über einen Widerstand?

bade_one:
Muss ich bestimmte Einstellungen in der Arduino IDE beachten oder kann es an der Firmware auf dem Wemos liegen?

Nein!

Getestet hab ich mit Core Version 2.4.2

SDK:2.2.1(cfd48f3)/Core:2.4.2/lwIP:2.0.3(STABLE-2_0_3_RELEASE/glue:arduino-2.4.1-13-g163bb82)/BearSSL:6d1cefc

Derfips:
Nein!

Getestet hab ich mit Core Version 2.4.2

SDK:2.2.1(cfd48f3)/Core:2.4.2/lwIP:2.0.3(STABLE-2_0_3_RELEASE/glue:arduino-2.4.1-13-g163bb82)/BearSSL:6d1cefc

Verbindust du D0 mit RST direkt oder über einen Widerstand?

bade_one:
Verbindust du D0 mit RST direkt oder über einen Widerstand?

Direkt

Gruß Fips

Ich hab absolut keine Ahnung, was es noch sein könnte.

Ich dank dir trotzdem für deine Hilfe Derfips

bade_one:
Ich hab absolut keine Ahnung, was es noch sein könnte.

Ich dank dir trotzdem für deine Hilfe Derfips

Du hattest noch nicht geschrieben welchen Wemos du hast.

Ich kann nur mit Wemos D1 mini pro oder Nodemcu testen.

Gruß Fips