Forum: Mikrocontroller und Digitale Elektronik ESP8266 + Deep Sleep


von Jan Christian H. (jhaddorp)


Lesenswert?

Hallo, ich nutze den ESP8266 (z.B. NodeMCU) mit der Arduino IDE. Zwecks 
Energiesparens würde ich den µC gern temporär in Deep Sleep setzen - 
also ESP.deepSleep(SLEEP_TIME);

Nun beschreiben verschiedene Seiten, dass zu Aufwachen GPIO16 und RST 
mit einander zu verbinden ist. Soweit alles verständlich... Nur sobald 
ich die beiden PINs verbinde, macht der µC einen Endlos-Reset. So 
zumindest das Verhalten zweier verschiedener ESP8266 Module.

Liegt hier ein Missverständnis vor? Oder muss noch etwas konfiguriert 
werden, damit der Reset erst nach Beendigung der Deep Sleep Phase 
ausgeführt wird?

von Ulrich F. (Gast)


Lesenswert?

Jan Christian H. schrieb:
> Nun beschreiben verschiedene Seiten, dass zu Aufwachen GPIO16 und RST
> mit einander zu verbinden ist. Soweit alles verständlich...

Das ist korrekt!


GPIO16 darf dazu nicht mit pinMode() konfiguriert werden.

Nach ESP.deepSleep(Zeitraum, WAKE_RF_DEFAULT);
Sollte ein delay(100); erfolgen.

Frage mich nicht wozu, aber damit klappt es bei mir.

Meine bisherigen Informationen sagen:
delay() ruft intern esp_yield()auf, und damit bekommen die 
Hintergrundtasks Rechenzeit und können den Sleep einleiten.
ohne Gewähr

von Jan Christian H. (jhaddorp)


Lesenswert?

Vielen Dank für die Antwort! Bzgl. delay(100) habe ich ebenfalls 
gelesen, dass die Pause erforderlich ist, damit der Sleep Mode aktiviert 
wird. Ansonsten würde die normale Ausführung wohl zunächst weitergehen.

Zu GPIO16 habe ich keine Angaben gemacht - den PinMode also nicht aktiv 
gesetzt. Kann ich im Code überhaupt etwas ausführen, was den Reset 
triggert?

Irgendwie alles ganz schön kompliziert ;-)

1
int ledPin = 1; // Photon's lone, blue LED is on pin 1
2
// int ledPin = BUILTIN_LED;
3
4
void setup() {
5
    pinMode(ledPin, OUTPUT);
6
    blink(10, 250); // Blink 10 times
7
    ESP.deepSleep(30000000); // 30 secs.
8
    delay(100);
9
}
10
11
void loop() {
12
13
}
14
15
void blink(unsigned int count, unsigned long period) {
16
    for (unsigned int i = 0; i < count; i++) {
17
        digitalWrite(ledPin, HIGH);
18
        delay(period / 2);
19
        digitalWrite(ledPin, LOW);
20
        delay(period / 2);
21
    }
22
}

von Jan Christian H. (jhaddorp)


Lesenswert?

Die unten aufgeführte Seite liefert interessante Infos. Damit 
funktioniert der Deep Sleep nun mit dem NodeMCU.

Muss dann nur noch klären, warum sich folgendes Modul anders verhält...
http://www.dx.com/p/wi-fi-module-esp-07-esp8266-serial-wireless-with-built-in-antenna-adapter-board-for-arduino-rpi-386077


----------------------
https://www.reddit.com/r/esp8266/comments/3qequ8/how_do_i_get_deep_sleep_working_on_nodemcu

Ok. I figured out my problem. I was using BUILTIN_LED as a flasher to 
indicate when it woke up. In the arduino esp8266 library, that pin is 
connected to io16.... The wake up pin. So when that flashed, it reset 
the board continually.

von Ulrich F. (Gast)


Lesenswert?

Interessant!

von Christoph (Gast)


Lesenswert?

Grüße *,

ich hab auch ein ESP hier (das WROOM-02), das tief schlafen soll und 
einen sensor-wert lesen soll, und wenn ein threshhold überschritten ist, 
WIFI anwerfen und den Wert losschicken.

Leider ist es so, daß auch wenn die Messungen nur 10s auseinander 
liegen, beim Initialisieren des WIFI extrem viel Strom verbraucht wird 
(120mA). Ist es möglich, irgendwie den Wifi-State zu sichern und nach 
dem Reset wiederherzustellen, damit dsa eben nicht soviel Strom braucht?

Oder kann jemand genauer sagen, woher dieser hohe Verbrauch kommt?

PS: zum Hacken hab ich erst einmal die NodeMCU (neueste Master) drauf. 
Deren Möglichkeiten sind natürlich eingeschränkt.

Danke!

von Ulrich F. (Gast)


Lesenswert?

Christoph schrieb:
> Oder kann jemand genauer sagen, woher dieser hohe Verbrauch kommt?
Der Aufbau der Verbindung!
Ist auch so im Datenblatt erwähnt.

Vielleicht ist der DeepSleep ja nichts für dich....

von Christoph (Gast)


Lesenswert?

Grüße, Danke Dir.

Ich hab grad mal im SDK Programming Guide nachgeschaut, außer einem Deep 
Sleep scheint es da keinen anderen Sleep Modus zu geben. Wenn ich also 
nur disconnect()e, würde das WIFI Modem in den gesetzten Sleep-Modus 
(light, oder MODEM_SLEEP) gehen, aber es würde die CPU ja trotzdem 
weiterlaufen?

Gibt es irgendwo eine Quelle, die verschiedene Stromsparstrategien 
gegenüberstellt? Oder überhaupt mal auslistet?

von Christoph (Gast)


Lesenswert?

Um meine Frage gleich selbst zu beantworten, hier ist etwas, was ich 
gefunden hab:
http://tinker.yeoman.com.au/2015/03/08/reducing-esp8266-power-consumption-using-deep-sleep/

Vielleicht nützt es noch jemandem...

von Chr. M. (snowfly)


Lesenswert?

Das Datenblatt S.13ff hast du gelesen?
https://www.adafruit.com/images/product-files/2471/0A-ESP8266__Datasheet__EN_v4.3.pdf

In der Doku zu dem Arduinoport sind bestimmt auch ein paar Infos 
verteilt.
wie z.B.:
ESP.deepSleep(microseconds, mode) will put the chip into deep sleep. 
mode is one of WAKE_RF_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, 
WAKE_RF_DISABLED. (GPIO16 needs to be tied to RST to wake from 
deepSleep.)
https://github.com/esp8266/Arduino

von Poertner (Gast)


Lesenswert?

Hallo zusammen,

ich versuche ebenfalls meinen ESP in den deep sleep zu schicken.

Als Basis hierfür verwende ich meinen bereits funktionsfähigen Sketch, 
der einen DHT22 ausliest und die Werte an Thingspeak sendet.
Darüber hinaus messe ich die Versorgungsspannung.

Sobald ich aber nun nicht die Funktion delay(...) verwende sondern 
ESP.deepSleep(...) verliere ich den Kontakt zum DHT und übertrage nur 
noch den Wert der Versorgungsspannung an Thingspeak.

Sind hier Probleme bekannt?

Danke und Gruß

von Poertner (Gast)


Lesenswert?

Hallo zusammen,

ich habe nun das Problem etwas eingrenzen können.

Wenn ich die Versorgungsspannung gleichzeitig an den ESP sowie den DHT 
anlege liest er genau ein mal Werte vom Sensor. Nach dem ersten Reset 
(nach deep sleep) kann der ESP keine Werte mehr vom DHT lesen.

Lege ich die Versorgungsspannung an den ESP an während der DHT bereits 
versorgt wird kann ich keine Daten vom DHT einlesen.

von Trinsic (Gast)


Lesenswert?

Hi, ich habe eine kurze Frage an dich bzgl. DHT22 und ESP mit 
ArduinoIDE. Könntest du mir bitte mal deine Verbindung nennen (also 
welche Pin mit dem DHT22 verbunden ist) und das dazugehörige Sketch? Bei 
mir klappt das leider nicht so wie ich es will. Danke im Voraus.

von Poertner (Gast)


Lesenswert?

Hallo Trinsic,

dein Post ist ja schon ein paar Tage alt. Ich hoffe der folgende Code 
hilft dir trotzdem.

#include "DHT.h" //Library für den DHT Written by ladyada, public domain
#include <ESP8266WiFi.h> //Library für den ESP8266

#define DHTPIN 2     // Digitaleingang GPIO2 wird für den DHT22 Sensor 
verwendet
#define DHTTYPE DHT22   // Definieren, welcher Sensor verwendet wird: 
DHT 22
DHT dht(DHTPIN, DHTTYPE, 50);


void setup() {
  dht.begin();
}



void loop() {

  float h = 0;
  float t = 0;
  int x = 0;

  h = dht.readHumidity();
  delay(500);

  t = dht.readTemperature();
  delay(500);


}

von Arno H. (ahtdf)


Lesenswert?

Hallo
ich habe auch ein Problem mit dem deepSleep.
Ich habe einige EPS8266 D1 mini von AZ delivery am Start, die 
funktionieren einwandfrei.
Jetzt habe ich mir neue Di mini bestellt (Model Vendor)
und die Dinger wachen nicht aus dem deepSleep auf.
Nach dem ersten laden startet er ganz normal.
nach der abgelaufenen Zeit kommt im Seriellen Monitor nur diese Meldung
"14:08:42.923 -> ;l" und nichts weiter passiert.
Drücke ich dann den Reset Knopf läuft er weiter.
das gleiiche verhalten zeigt sich auch bei Reset.
1 mal drücken eine Meldung wie oben, 2. mal drücken, und weiter gehts.
Mein Sketch sieht so aus

#include <ESP8266WiFi.h>
#include <MQTTClient.h>

#include "DHT.h"
#include <MQTT.h>

#define DHTTYPE DHT11
#define DHTPIN 12

int ADC;
float Voltage;


const char* host = "192.168.2.109"; //die IP des MQTT Brokers
const char* ssid = "WLAN-3C6AFE";    //_Wifi@3500/ WLAN-3C6AFE
const char* password = "26278769835280501062"; 
//anmeldung1./26278769835280501062
//const char* mqttuser = "DeinOptionalerMQTTuser";
//const char* mqttpwd = "DeinOptionalesMQTTpasswort";
char* clientId = "ESP_Innen_01";

WiFiClient net;
MQTTClient mqtt;

DHT dht(DHTPIN, DHTTYPE);

void setup() {

  dht.begin();
  delay(500);

  Serial.begin(115200);
  Serial.println();
  Serial.println("Booting...");

  connect();

  Serial.println("Setup completed...");

  mqtt.loop();

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


  ADC = analogRead(A0);
  Voltage = (((ADC / 1024.0) * 3,3) + 0,3) ;


  Serial.print("Sending... ");
  if (!isnan(humidity) || !isnan(temperature)) {
    mqtt.publish("/woni/innen/temperature", String(temperature));
    mqtt.publish("/woni/innen/humidity", String(humidity));
    mqtt.publish("/woni/innen/ESP-Spannung", String(Voltage));

   // mqtt.disconnect();

    Serial.print("Temp: ");
    Serial.print(String(temperature));
    Serial.print(" Humidity: ");
    Serial.print(String(humidity));
    Serial.print(" Spannung: ");
    Serial.println(String(Voltage));



  }

    delay(300); //wichtig, da sonst keine Verbindung
    Serial.println("Going into deep sleep for xx seconds");
    ESP.deepSleep(20e6*40); // e.g. 20e6 is 20 seconds, 1800e6 war 
Vorgabe 20e6*20 ca.6.5 min
}

void connect() {
  WiFi.mode(WIFI_AP_STA);
  while(WiFi.waitForConnectResult() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
    //delay(500);
    Serial.println("WiFi connection failed. Retry.");
  }

  Serial.print("Wifi connection successful - IP-Address: ");
  Serial.println(WiFi.localIP());

  mqtt.begin(host, net);
  while (!mqtt.connect(host, clientId )) //mqttuser, mqttpwd
  {
    Serial.print("*");
  }
  Serial.println("MQTT connected!");
  //delay(500);
}

void loop(){
}

Hat da jeman eine Idee
Gruß Arno

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Arno H. schrieb:
> Hallo
> ich habe auch ein Problem mit dem deepSleep.

Bitte kapere keinen alten Thread, sondern mache einen neuen auf.

von Stefan F. (Gast)


Lesenswert?

Arno H. schrieb:
> Model Vendor

Das ist weder eine Modell- noch eine Herstellerangabe. Das sind die 
Beschriftungen der Felder, die hier wirklich von Interesse gewesen 
wären. Für ein Foto war auch keine Zeit? Oder ein Link zum Shop?

Kontrolliere die Beschaltung von Pin 16 und Reset. Sie muss ungefähr so 
aussehen, wie dort beschrieben: 
http://stefanfrings.de/esp8266/index.html#deepsleep

von Arno H. (ahtdf)


Angehängte Dateien:

Lesenswert?

@ Christian
Sorry ich gelobe beim nächsten Mal Besserung.
Ich dachte da es mehr oder weniger das gleiche Thema ist könnte man den 
Thread weiter nutzen.
@ Stefan
anbei ein Foto, und hier hab ich die Dinger her 
https://www.ebay.de/itm/233923402519
Vom Aufbau her habe ich das Teil genauso behandlt wie den von 
AZ-delivery.
Den DHT 11 auf D6, und eine Steckbrücke von Reset auf D0

von Stefan F. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Kontrolliere die Beschaltung von Pin 16 und Reset. Sie muss ungefähr so
> aussehen, wie dort beschrieben:
> http://stefanfrings.de/esp8266/index.html#deepsleep

Sind die Widerstände und der Kondensator vorhanden? Wenn ja, befinden 
sie sich unter der Abdeckung, du musst es also durch Messen überprüfen.

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.