Forum: Mikrocontroller und Digitale Elektronik ESP-01 funktioniert in Sleep-Mode nur nach 2xReset


von Dominik (Gast)


Lesenswert?

Hallo,

auf cc2.tv wurde kürzlich ein Temp-Sensor mit ESP-01 uC vorgestellt 
(Sendung 227+228). Infolgedessen habe ich mir mal je 2 DHT11 + 2 ESP-01 
bei aliexpress bestellt:
Die Software habe ich 1zu1 von cc2 übernommen: http://cc2.tv/wetter.ino

Bei dem Programm blicke ich nicht ganz durch: Dort gibt es keine 
Main-Funktion? Keine Ahnung, wie der in der Loop-Funktion landet, aber 
es scheint irgendwie zu funktionieren: Habe zum Testen die Timer auf 
30sek reduziert:

void loop() {

  // Lege den Sensor schlafen für 5 Minuten
  ESP.deepSleep(30000000, WAKE_RF_DISABLED); // entspricht 300 s

  // Wenn der Sensor nicht schlafen gelegt werden soll,
  // kann hiermit auch einfach 5 Minuten gewartet werden.
  delay(30000);
  readdht();
}

Wenn ich den Deepsleep auskommentiere funktioniert alles einwandfrei! 
Alle 30sek bekomme ich einen Wert. Strom liegt zwischen 0,07A 
(sendephase) und 0,02A (delay-Funktion).

Mit dem Deepsleep läuft es leider nicht. Der uC schaltet von 0,07A nach 
0,00A. Nach 30sekunden erwacht er wieder und führt den Reset durch 
(Brücke habe ich gelötet). Jedoch blinkt die blaue LED dann munter ca. 
in 0,5sek Takt vor sich hin - endlos lange! Der Strom liegt bei 0,01A 
statt bei 0,07A. Das gleiche Verhalten tritt auch auf, wenn ich im 
Sleep-Mode den Reset manuell fahre (Reset-Pin kurz gegen GND brücken, 
bzw. Reset-Taster am DHT11-Modul betätigen). Erst ein zweiter 
Resetimpuls lässt den ESP wieder normal arbeiten (0,07A Strom, 4x blau 
Blinken und wieder Sleep).

Ich hatte schon mein Labornetzteil in Verdacht. Also habe ich das ganze 
mal wie in der CC2-Sendung mit 3xAA Bat und einer 1N4001 in Reihe 
probiert: Gleiches Verhalten!


Das Problem lässt sich auf beiden bestellten Modulen (von 
unterschiedlichen Händlern! Ich bestelle bei aliexpress Kleinkram immer 
doppelt, weil oft nur die Hälfte ankommt). Beim zweiten Modul habe ich 
die Reset-Brücke vom ESP6288 allerdings noch nicht gelötet, sondern den 
Reset im Sleep-Mode per Hand simuliert: Bleibt aber genauso hängen, bzw. 
braucht immer einen 2. Reset.


Kann jemand dieses seltsame Phänomen erklären? Müssen beim ESP 
vielleicht noch irgendwelche Fuses gesetzt werden?

Danke im Voraus

von Gаst (Gast)


Lesenswert?

Allgemeines ESP-Troubleshooting:
Reset-Pullup vergessen?
CH_PD-Pullup vergessen?
Kerko an der Versorgung dicht am ESP vergessen?
GPIO0 und 2 dürfen beim Boot außerdem nicht low sein.

von Timmo H. (masterfx)


Lesenswert?

Der ESP-01 hat den GPIO16 nicht herausgeführt. Dieser wird für deep 
sleep benötigt, da der ESP buggy ist. Der GPIO16 muss mit dem Reset-Pin 
verbunden werden, so wie hier: 
https://hackaday.com/2015/02/08/hack-allows-esp-01-to-go-to-deep-sleep/

Das sagt der Herr cc2tv aber ja auch in seinem Video 
https://youtu.be/kf_0f90rJHA?t=525

: Bearbeitet durch User
von Dominik (Gast)


Lesenswert?

Ich habe den Pin doch mit Reset verbunden. Das schrieb ich aber bereits. 
Wenn ich ihn nicht verbinde, startet der ESP nach Ablauf des Zeit nicht 
selbst neu. Dabei bleibt er aber immer hängen.

Reset und CH_PD sind auf der DHT11 Platine mit 10K gegen VCC 
hochgezogen. Ich habe nun erst festgestellt, dass die DHT11-Platine 
sogar ein Spannungsregler hat, welcher von 3,7-12V arbeitet. Insofern 
ist die Versorgung mit 3AA Batterie und Diode Unsinn. Ich habe die 
DHT-Platine jetzt einfach mal mit 5V USB betrieben. Leider tritt der 
Fehler auch auf.

GPIO2 ist ja der Datenpin zum DHT. Wie GPIO0 beschaltet ist, weiß ich 
nicht. Das Datenblatt von der DHT11-Platine ist leider offline.
Ich vermute diese DHT11 Modul-Platine ist gar nicht für Deep-Standby 
ausgelegt. Ein Wunder, dass es beim cc2 funktioniert, obwohl ich mir da 
auch nicht sicher bin, ob die da nicht flunkern.

von G. H. (schufti)


Lesenswert?

wenn der Sketch wirklich so wie im O.P. angegeben publiziert wurde, lege 
ich den Herren vom CC2 nahe, endlich in den (verdienten) Ruhestand zu 
gehen.

nach deepsleep macht der ESP einen Reset und fängt wieder mit setup() 
an.
Wenn dann in loop das erste ist, ihn wieder in deepsleep zu schicken, wo 
bitte soll dann jemals gemessen werden ?

mit delay funzt es natürlich ...

also: in loop() zuerst messen, dann deepsleep oder delay, so wird ein 
Schuh draus.

von Daniel (Gast)


Lesenswert?


von Dominik (Gast)


Lesenswert?

Danke, noch ein Indiz mehr, dass die bei cc2.tv bezüglich des 
deepstandby geflunkert haben. Verstehe nicht, warum trotz aktivierten 
deepstandby dann trotzdem mal ein Wert an mein Webserver durchkam?!?

Jetzt mal zum Verständnis eines arduino Anfängers: Also zuerst wird bei 
arduino immer setup() aufgerufen und dann loop()? Eine main(), die beide 
Routinen aufruft ist nicht erforderlich?

von G. H. (schufti)


Lesenswert?

das main() das die beiden Hauptroutinen setup() und loop() aufruft ist 
vor dem Benutzer verborgen im Arduino Framework realisiert.

von Dominik (Gast)


Lesenswert?

ok, verstehe. Ich habe die Loop jetzt mal umgedreht:

void loop() {
  readdht();

  // Lege den Sensor schlafen für 5 Minuten
  ESP.deepSleep(30000000, WAKE_RF_DISABLED); // entspricht 300 s

  // Wenn der Sensor nicht schlafen gelegt werden soll,
  // kann hiermit auch einfach 5 Minuten gewartet werden.
  delay(30000);
}

Seltsamerweise bekommt mein Webserver nun zwei Werte direkt 
hintereinander, beim 2. aber mit timeout! Irgendwie scheint readht() nun 
doch 2mal aufgerufen zu werden?

2018-06-9 19:49:33 2 29.00 64.00 OK 31.67
2018-06-9 19:49:34 2 nan nan TIMEOUT nan


Ich habe GPIO 0+2 nun jeweils mit 10K gegen VCC hochgezogen. Leider hat 
das am Problem nichts verändert, dass er nach dem ersten Reset aus dem 
Deepsleep nicht richtig hochkommt :(

von Dominik (Gast)


Lesenswert?

readdht(); wird bereits in setup() einmal aufgerufen! Siehe 
http://cc2.tv/wetter.ino

von Timmo H. (masterfx)


Lesenswert?

Guck dir mal an was an der seriellen Schnittstelle rauskommt,ich vermute 
mal dass er zwei mal nen reset macht weil deine Spannungsversorgung 
nicht ganz sauber ist (Kondensator vergessen?)

von Michael U. (amiga)


Lesenswert?

Hallo,

Dominik schrieb:
> ESP.deepSleep(30000000, WAKE_RF_DISABLED);

Mit WAKE_RF_DISABLED startet der ESP nach Reset mit komplett 
abgeschaltetem WLAN, ist das Absicht?
Aus diesem Zustand ist er nur durch Reset wieder rauszuholen, das ist 
Dein 2. nötiger Reset...
Wenn WLAN aktiv sein soll ist der Paramter WAKE_RF_DEFAULT.

ESP.deepSleep(30000000); müßte auch gehen. Bach dem Sleep-Kommando ist 
ein delay(100); zwingend nötig, das ist ja durch das delay(30000); bei 
Dir ok.

Gruß aus Berlin
Michael

von Dominik (Gast)


Lesenswert?

Danke Timmo H. und Michael U., jetzt kommen ich der Sache näher:
Im Serial log sehe ich, dass der ESP aufwacht und versucht eine 
WLAN-Verbindung aufzubauen (alle 0,5 Sekunden ein Punkt im Log). Laut 
wireshark kommt an meinen Rechner aber nichts an.
Ich hatte jetzt schon ein delay(1000); vor  WiFi.begin(ssid, pwd); 
gesetzt, weil ich dachte, dass der ESP vielleicht ein bisschen Zeit zum 
Aufwachen braucht, bevor er loslegen kann.

Jetzt kommt der Tipp von Michael U. ins Spiel, der passen würde. 
Verstehe nur nicht, warum WLAN nach dem ersten Reset nicht schon 
zurückgesetzt wird.

von Dominik (Gast)


Lesenswert?

Danke, das war es! ESP.deepSleep(30000000); und es funktioniert 
einwandfrei! Mein Labornetzteil zeigt 30Sekunden 0,00A und dann für 
jeweils knapp 2sek 0,07A und der Wert erscheint.
Jetzt noch die LED vom ESP und vom DHT11 Modul auslöten und mit einem 
genaueren Amperemeter mal nachmessen. Eventuell muss der Spannungsregler 
dann auch noch raus.

von Michael U. (amiga)


Lesenswert?

Hallo,

Dominik schrieb:
> Verstehe nur nicht, warum WLAN nach dem ersten Reset nicht schon
> zurückgesetzt wird.

weil WAKE_RF_DISABLED ihm sagt, daß er beim nächsten Reset mit 
abgeschaltetem Funkmodul starten soll...
Ist auch die einzige Möglichkeit, das komplett abzuschalten.
Macht u.U. Sinn, wenn man längere Meßaktionen, hat bevor man das 
wegschickt.
Ohne WLAN braucht der ESP nur ca. 15mA. Man muß die MEßwerte dann 
natürlich zwischenspeichern (EPROM oder RTC-Ram) und macht dann ein
ESP.deepSleep(1, WAKE_RF_DEFAULT);
Schickt ihn also für 1µs schalfen und weckt ihn sofort wieder mit WLAN 
aktiv.

Gruß aus Berlin
Michael

von G. H. (schufti)


Lesenswert?

da wäre ich vorsichtig. das mit 1µs funktioniert etwa bis core 2.3 
danach sind es so ca. ab 100 wo es funktioniert. Gab mal ein issue dazu 
auf github; k.A. wie das ausging.

von Michael U. (amiga)


Lesenswert?

Hallo,

muß ich direkt mal testen mit der 2.4.1.

Gruß aus Berlin
Michael

von Wolfgang S. (wollecnc)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Also ich habe mir vor einiger Zeit die DHT Module bestellt.
Die wurden ja in cc2 vorgestellt.
Also ich muss nach einigen Versuchen sagen das die Vorstellung
in cc2 nicht ganz ausgereift waren.
Die Module haben ja ein 3.3 Volt Regler drauf.
Betreibt man die mit der Diode und 3 Zellen macht der Regler nicht auf.
Habe hier 4 AAA Zellen in Betrieb.
Was ich am Programm umgestellt habe kann ich hier gar nicht alles im 
einzelnen aufzählen.
Ich betreibe die Module aber mit DHT22 und 4.7K Widerstand zwischen
3.3 Volt und GPIO2.

von Wolfgang S. (wollecnc)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Habe das Programm vergessen dranzuhängen ...

von Stefan F. (Gast)


Lesenswert?

Ich bin schon öfters auf fehlerhafte Anleitungen bei Youtube gestoßen, 
habe die Fehler gemeldet und dann passierte nicht weiter.

Vermutlich scheuen sich deren Autoren, die erfolgreichen Videos durch 
neue zu ersetzen, da diese dann möglicherweise weniger Klicks bekommen. 
Oder sie scheuen den Aufwand.

Mein Tipp: Anleitungen sucht man normalerweise nicht bei Youtube. Außer 
vielleicht Sachen wie: "Wie öffne ich mein Notebook?" oder "Wie knetet 
man einen Pizza-Teig?".

von x2k (Gast)


Lesenswert?

Da kann ich dir den Kanal von der bitbastelei empfehlen. Er geht auf 
Fehler ein und zieht in den Kommentaren viele mit, die sich auch 
auskennen und Fehler bemerken.
Er hat übrigens genau das gleiche Projekt aber mit ausgereifter Software 
umgesetzt.
Hab es gegengetestet und läuft prima.

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.