Forum: Mikrocontroller und Digitale Elektronik ESP8266 wacht aus dem deepsleep nicht auf


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Carsten (cc13)


Lesenswert?

Hallo,

ich habe mir bei AZ-Delivery ein paar ESP8266 geholt. Quasi die Wemos D1 
Mini clones.

Nun wollte ich den deepsleep aktivieren, allerdings wachen die Teile 
nicht wieder auf, bzw mit viel Glück nur einmal. Zuerst habe ich einen 
Sketch verwendet, der schon auf anderen D1 läuft. Als das nicht 
funktionierte, habe ich mich an ein einfaches Beispiel gehalten 
(https://randomnerdtutorials.com/esp8266-deep-sleep-with-arduino-ide/) 
und einen einfachen Sketch aufgespielt.

/*
 * ESP8266 Deep sleep mode example
 * Rui Santos
 * Complete Project Details https://randomnerdtutorials.com
 */

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(2000);

  // Wait for serial to initialize.
  while(!Serial) { }

  // Deep sleep mode for 30 seconds, the ESP8266 wakes up by itself when 
GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin
  Serial.println("I'm awake, but I'm going into deep sleep mode for 30 
seconds");
  ESP.deepSleep(30e6);

  // Deep sleep mode until RESET pin is connected to a LOW signal (for 
example pushbutton or magnetic reed switch)
  //Serial.println("I'm awake, but I'm going into deep sleep mode until 
RESET pin is connected to a LOW signal");
  //ESP.deepSleep(0);
}

void loop() {
}

Egal wie viele Sekunden ich auswähle, nach Ablauf der Schlafzeit 
leuchtet die blaue LED kurz auf, wie als würde ich den Kontroller an den 
Strom hängen. Mehr passiert nicht, auf der console erscheinen nur 
kryptische Zeichen und das war's. Kein nächster deepsleep.

Ich habe RST und D0 mit einem Draht verbunden. Strom bekommt das ganze 
gerade über USB vom PC.

Wie gesagt, das gleiche Setup funktioniert mit einem D1 von einem 
anderen Anbieter ohne Probleme seit Wochen.

Habt ihr noch eine Idee, wo ich ansetzen muss?

von Alexander (alecxs)


Lesenswert?

ändere mal auf 74880 baud und setze den Pull-up
1
Serial.begin(74880);
2
pinMode(D0, WAKEUP_PULLUP);

: Bearbeitet durch User
von Monk (Gast)


Lesenswert?

Zwischen den Timer Ausgang und dem Reset Eingang gehört ein 470 Ohm 
Widerstand. Wenn du dazu die Lötbrücke auf der Rückseite der Platine 
verwendest hast du ihn dabei.

Und füge hinter deepsleep einen delay(100) ein, das soll manchmal auch 
helfen.

von Carsten (cc13)


Lesenswert?

Ich habe den Code wie von euch geschrieben angepasst. Serielle 
Geschwindigkeit auf 74880, den Pull-up gesetzt und am Ende nach 
ESP.sleep einen Delay eingebaut.

Nun sehe ich zwar etwas auf der Konsole, aber der Controller wacht nur 
einmal nach 30 Sekunden auf.

Das erscheint, nachdem das Teil Strom bekommen bzw. über den Reset Knopf 
gestartet wurde:
1
load 0x4010f000, len 3584, room 16 
2
tail 0
3
chksum 0xb0
4
csum 0xb0
5
v2843a5ac
6
~ld
7
I'm awake, but I'm going into deep sleep mode for 30 seconds
Und das erscheint nach 30 Sekunden:
1
 ets Jan  8 2013,rst cause:2, boot mode:(3,6)
Im Anschluss habe ich noch einen 470 Ohm Widerstand zwischen die beiden 
Pins gesteckt. Erstmal nur auf einem Steckbrett, aber es hat nichts an 
dem o.g. Ergebnis geändert.

von Alexander (alecxs)


Lesenswert?

Monk schrieb:
> Und füge hinter deepsleep einen delay(100) ein, das soll manchmal auch
> helfen.

versuch's mal andersrum bzw im void loop() { }

: Bearbeitet durch User
von Monk (Gast)


Lesenswert?

Ist das ein originales Wemos D1 Mini Board? Wenn nicht, haben die 
vielleicht Bauteile um den Reset Pin herum eingespart. Siehe 
http://stefanfrings.de/esp8266/index.html#deepsleep

von Monk (Gast)


Lesenswert?

Mir fällt da gerade ein, dass hier mal jemand von Flash Speichern 
berichtete, mit denen der Chip aus dem Deep-Sleep Modus nicht mehr 
richtig aufwachen konnte. Das Fehlerbild war das gleiche, wie bei dir. 
Siehe Beitrag "ESP01s + deepsleep"

von Carsten (cc13)


Lesenswert?

Das hier steht in der Beschreibung der Bestellung:

"Der AZ-Delivery D1 mini ist ein Mini-NodeMcu WiFi Board basierend auf 
einem ESP-8266-12F mit Micro-USB-Anschluss."

Morgen schreibe ich dem Anbieter mal eine Mail mit dem Fehlerbild.

von Steve L. (stevel)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin vor einigen Monaten in die gleiche Falle getappt, ebenfalls 
bestellt bei AZ Delivery. Und ja, es scheint etwas mit der 
Flash-Bestückung zu tun zu haben. Hab auch ewig mit Oszi und 
unterschiedlichsten R,C Bestückungen am besagten GPIO16-Kanal 
rumgespielt, ohne Erfolg.
Daraufhin hab ich testweise nochmal eine Handvoll ESP01-S diesmal bei 
Roboter-Bausatz Dot de bestellt. Und mit denen funktionierte der 
DeepSleep!

Ich habe mal zwei Bilder der unterschiedlichen Versender angehängt. 
Auffällig ist der unterschiedliche Aufdruck (sowohl Bottom als auch 
Top). Ausserdem wurden die ESPs von R-B einzeln in ESD 
Blistergurtstücken geliefert.

Steve

PS: nicht wundern, ich hab ein unmodifiziertes Modul von AZ für das Foto 
verwendet.

PPS: ok, sehe grade, dass es sich um ein D1 mini handelt und nicht um 
ein ESP01-S

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Wie ich bisher sehen konnte, ist das Deep-Sleep des ESP eine absolute 
Krücke und überhaupt nicht vergleichbar, z.B. mit dem Power-Down eines 
AVR.
Eine genaue Beschreibung des Deep-Sleep konnte ich leider nirgends 
finden, sondern nur rudimentäre Beispiele.

Wie es aussieht, muß man den Resetpin über einen IO-Pin für eine 
bestimmte Zeit extern ziehen und darin liegt wohl das Hauptproblem. Der 
Pin schaltet sich durch das Reset natürlich selber wieder ab, d.h. der 
Puls wäre zu kurz und daher bleibt der ESP im Nirwana hängen. Empfohlen 
wird ein RC-Glied (470R+100nF) zur Verlängerung. Ob das immer sicher 
ausreicht, um vom Flash neu in den RAM zu booten, wissen die Götter. Das 
könnte jedenfalls die Abhängigkeit vom Flash-Typ erklären, daß manche 
etwas länger brauchen zu Aufwachen. Bei Problemen würde ich daher 
erstmal das RC-Glied vergrößern.

Ich würde zum Stromsparen einen erheblich besser ausgerüsteten µC 
benutzen (z.B. AVR) und nur zum Funken den ESP unter Strom setzen.

Falls jemand einen Link zum Datenblatt des ESP8266 kennt, welches die 
Bezeichnung auch verdient, immer her damit. Das mit nur 117 Seiten 
verdient es jedenfalls nicht.

von Alexander (alecxs)


Lesenswert?

Ich würde mal versuchen GPIO7 mit einem Pull-up high zu ziehen, das ist 
der zweite Kontakt unten, nicht nach außen geführt da verbunden mit dem 
Flash Speicher.

https://github.com/esp8266/Arduino/issues/6007#issuecomment-2024041618

andere Möglichkeit: im Deep Sleep muss ja eine RTC aktiv sein. der Reset 
wird ja auch direkt nach 30 sek getriggert. kann es sein dass es so 
konzipiert ist dass das setup() im RAM den (zu kurzen) Reset überlebt? 
Dein loop() ist ja leer, also weißt Du nicht ob er wach ist oder sich 
aufgehängt hat. It's not a bug it's a feature. Ich würde das testen.

: Bearbeitet durch User
von Carsten (cc13)


Lesenswert?

Die nächsten Tage werde ich eure Tipps und Vorschläge mal testen, ich 
komme leider nicht jeden Tag dazu.

Zwischenzeitlich habe ich mich mit AZ Delivery in Verbindung gesetzt und 
das Fehlerbild geschildert. Als Antwort kam folgendes:

"Unsere technische Abteilung geht von einem Hardwaredefekt aus." Ich 
bekomme jetzt eine Rückerstattung.

Was ich noch hinzufügen möchte: Mit anderen ESP8266, bestellt beim 
schnellen Ali, habe ich überhaupt keine Probleme mit dem DeepSleep. Nur 
habe ich da inzwischen leider 2 von 5 defekten Kontrollern. Sie lassen 
sich nicht mehr flashen. Deshalb habe ich mich diesmal für "Markenteile" 
entschieden. ;-)

von Peter D. (peda)


Lesenswert?

Carsten schrieb:
> Nur
> habe ich da inzwischen leider 2 von 5 defekten Kontrollern. Sie lassen
> sich nicht mehr flashen.

Ich denke mal nicht, daß die wirklich defekt sind. Da wirds irgendwie 
die Bootfunktion im Flash gerissen haben.
Viele ARM haben einen Ur-Bootloader über die UART, der über bestimmte 
Pins aktiviert wird. Damit kann man einen defekten Custom-Bootloader im 
Flash wieder reparieren, d.h. neu programmieren. Dazu müßte man aber ein 
Datenblatt haben, wo beschrieben steht, wie das geht.
Die ESP scheinen doch ziemlich mit der heißen Nadel gestrickt worden zu 
sein.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Peter D. schrieb:
> Da wirds irgendwie die Bootfunktion im Flash gerissen haben.

Der Bereich wird als ROM bezeichnet.
Ob das in Realität ein Flash ist, weiß ich nicht. Es liegt auf jeden 
Fall nicht in dem  Flash Baustein, in dem das Programm oder SPIFFS 
steckt.
Habe aber noch nie davon gehört, dass "eingebaute Bootloader" kaputt 
geht, oder gar repariert werden könnte. Einen Weiteren Bootloader gibt 
es üblicher weise nicht, wenn man von dem OTA Verfahren mal absieht.

von Monk (Gast)


Lesenswert?

Der Bootloader ist unveränderlich. Das esptool lädt zunächst einen 
"Stub" von der Festplatte des PC in den RAM des ESP und startet ihn. 
Dieser übertragt dann erst die Firmware in den Flash Speicher.

Laut Doku von ESP dient der Stub auch dazu, Bugs des festen Bootloaders 
zu umgehen.

https://docs.espressif.com/projects/esptool/en/latest/esp8266/esptool/flasher-stub.html

Peter D. schrieb:
> Die ESP scheinen doch ziemlich mit der heißen Nadel gestrickt worden zu
> sein.

Den Eindruck habe ich auch.

von Bastian W. (jackfrost)


Lesenswert?

Hi,

Bei meinen ESPs lag es am Flash, der ist nach dem Deep Sleep nicht mehr 
aufgewacht und das Programm konnte vom Bootloader nicht geladen werden.

Das Fehlerbild war wie beim TO.

Geholfen hat der Sleep Modus von 
https://github.com/esp8266/Arduino/issues/6318#issuecomment-706386677


Gruß JackFrost

von Peter D. (peda)


Lesenswert?

Bastian W. schrieb:
> Geholfen hat der Sleep Modus von
> https://github.com/esp8266/Arduino/issues/6318#issuecomment-706386677

Also magische Zahlen an magische Adressen schreiben.
Einfach nur gruselig.
Da bin ich ja heilfroh, keinen ESP gekauft zu haben.

von Carsten (cc13)


Lesenswert?

Zuerst einmal möchte ich mich bedanken, wie ich hier aufgenommen wurde 
und dass ihr euch so rege beteiligt. Das kenne ich von anderen Foren 
leider nicht.

Mit dem Codebeispiel, welches @jackfrost verlinkt hat, funktioniert der 
Sleep. Allerdings habe ich noch nicht verstanden, wie ich eine andere 
Zeit zum Schlafen übergebe. Ich habe den Wert im Aufruf der Funktion
1
 nk_deep_sleep(2000000);

verändert, allerdings wacht der ESP immer nach ca. 28 Sekunden wieder 
auf. Mal ein paar mehr oder weniger Sekunden. Ich möchte es gerne auf 15 
Minuten verlängern, aber egal, was ich als größere Zahl eingebe, es 
ändert nichts. Habt ihr da vielleicht noch eine Idee?

Jetzt werde ich mich noch damit beschäftigen, wie ich die nicht mehr 
funktionierenden ESPs wieder flashen kann. Auch ein neues Gebiet für 
mich, aber man lernt ja nie aus. ;-)

von Peter D. (peda)


Lesenswert?

Ja, wenn es bloß ein Datenblatt gäbe, wo die Register beschrieben sind, 
die an den magischen Adressen liegen.
Daß ein 64Bit Wert übergeben wird, heißt noch lange nicht, daß auch 64 
Bit signifikant sind.
Hast Du mal mit verschiedenen Werten probiert, ob der Parameter 
überhaupt einen Einfluß hat?

von Carsten (cc13)


Lesenswert?

Ja, ich habe den Wert mal 5 genommen und auch mal 10, allerdings bleibt 
es immer bei Sleep Zeiten zwischen 25 und 32 Sekunden. Wenigsten bei mal 
10 hätte ich einen spürbaren Unterschied erwartet.

Ich spiele mal noch ein wenig rum.

von Alexander (alecxs)


Lesenswert?

ansonsten teste auch noch mal die Lösung mit dem Widerstand

von Manfred P. (pruckelfred)


Lesenswert?

Carsten schrieb:
> allerdings wacht der ESP immer nach ca. 28 Sekunden wieder
> auf. Mal ein paar mehr oder weniger Sekunden. Ich möchte es gerne auf 15
> Minuten verlängern, aber egal, was ich als größere Zahl eingebe, es
> ändert nichts. Habt ihr da vielleicht noch eine Idee?

Ob er tatsächlich nur 30s kann, musst Du anhand seines Datenblattes 
klären.

Wenn dem so ist, dann bei jedem Aufwachen eine Variable erhöhen und bei 
Wert größer 30 die gewünschten Dinge ausführen.

Der G* fördert anderes zutage:

https://thingpulse.com/max-deep-sleep-for-esp8266/

Beitrag "ESP8266 - maximale deep-sleep Zeit?"

von Monk (Gast)


Lesenswert?

Manfred P. schrieb:
> Ob er tatsächlich nur 30s kann, musst Du anhand seines Datenblattes
> klären.

Kann ich auch so beantworten: Ohne Tricks sind maximal 71 Minuten 
möglich.

> Wenn dem so ist, dann bei jedem Aufwachen eine Variable erhöhen

Nein, denn der RAM Inhalt geht bei jedem Aufwachen verloren. Man kann 
dazu allerdings (mit etwas mehr Aufwand als eine simple Variable) Flash 
oder Speicher der internen RTC verwenden.

von Manfred P. (pruckelfred)


Lesenswert?

Monk schrieb:
> Manfred P. schrieb:
>> Ob er tatsächlich nur 30s kann, musst Du anhand seines Datenblattes
>> klären.
> Kann ich auch so beantworten: Ohne Tricks sind maximal 71 Minuten
> möglich.

Das wird auch auf der Webseite gesagt, deren link ich angehängt hatte.

Wäre es Dir jetzt zu aufwendig, ihm den Lösungsweg aufzuzeigen?

von Monk (Gast)


Lesenswert?

Manfred P. schrieb:
> Wäre es Dir jetzt zu aufwendig, ihm den Lösungsweg aufzuzeigen?

Der normale Weg funktioniert halt bei ihm nicht, wegen fehlerhafter 
Hardware. Er bekommt bereits Ersatz.

von Alexander (alecxs)



Lesenswert?

Monk schrieb:
> Der normale Weg funktioniert halt bei ihm nicht, wegen fehlerhafter
> Hardware.

was man ja korrigieren könnte

https://www.mikrocontroller.net/topic/goto_post/7702701

: Bearbeitet durch User
von Carsten (cc13)


Lesenswert?

Nachdem ich in o.g. Github-Link noch einmal nachgefragt habe, hat mir 
folgender Aufruf geholfen:
1
nk_deep_sleep(300*1000000);

Wobei 300 die Sekunden sind. Nachdem ich es gerade auf 900 geändert 
habe, schläft der ESP ca. 15 Minuten. Das passt für mich.

Danke euch für die Denkanstöße.

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.