Forum: Mikrocontroller und Digitale Elektronik esp32: deep sleep + esp-now


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 Zo R. (hsch1978)


Lesenswert?

Hallo,

für die Übertragung von Daten soll das ESP-NOW Protokoll eingesetzt 
werden.
Dazu habe ich 2 ESP32 Evaluationboards. Auf deim einen Evaluationboard 
ist aktuell der Sender implementiert. Sobald ein Taster betätigt wird, 
soll ein Datenpacket via ESP-NOW an den Emfänger übertragen werden. 
Danach geht der ESP32 in den Tiefschlafmodus. Nach 5 Sekunden wird der 
ESP32 wieder aufgeweckt. Nun ist es so, dass auf der EMpfängerseite 
keine Nachricht ankommt. Ich habe die beiden Anwendungen mit PlattformIO 
entwickelt. Für jegliche Hilfe wäre ich sehr dankbar.

: Bearbeitet durch User
von Obelix X. (obelix)


Lesenswert?

Funktioniert es denn ohne Sleep?

Ansonsten könnte der Fehler in Zeile 275 liegen ;-)

Die Vcc Leitung ist am Empfänger nicht richtig angeschlossen, sagt meine 
Glaskugel.

von Zo R. (hsch1978)


Lesenswert?

Ja das Senden und Empfangen funktioniert nun. Ich habe vor deep Sleep 
eine kleine Verzögerung eingebaut.

von Helmut -. (dc3yc)


Lesenswert?

Obelix X. schrieb:
> Ansonsten könnte der Fehler in Zeile 275 liegen ;-)

Unwahrscheinlich. Ich glaube an Zeile 42! Aber ohne irgendwelchen Kot 
(äh code) ist das Kaffeesatzleserei.

von Zo R. (hsch1978)


Lesenswert?

Ich habe aktuell eine andere Konstellation. Der ESP32 soll beim Start 
(Power On) in den DeepSleep gehen. Nur durch einen Taster (GPIO Pin 9 - 
BOOT Taster) soll der ESP32 aufgeweckt und eine gewisse Zeit was tun. 
Danach soll der ESP32 wieder in den DeepSleep gehen. Aktuell drehe ich 
mich im Kreis.
1
#include <esp_now.h>
2
#include <WiFi.h>
3
#include <esp_wifi.h>
4
5
#define BOOT_PIN 9  // Der Pin für den BOOT-Taster, hier GPIO9
6
7
// Struktur für Daten
8
typedef struct struct_message 
9
{
10
  uint8_t status;
11
  uint8_t data[10];
12
} struct_message;
13
14
struct_message outgoingData;
15
16
void print_wakeup_reason()
17
{
18
  esp_sleep_wakeup_cause_t wakeup_reason;
19
20
  wakeup_reason = esp_sleep_get_wakeup_cause();
21
22
  switch(wakeup_reason)
23
  {
24
      case ESP_SLEEP_WAKEUP_GPIO: Serial.println("Aufgewacht durch GPIO-Signal!"); break;
25
      case ESP_SLEEP_WAKEUP_TIMER: Serial.println("Aufgewacht durch Timer!"); break;
26
      default: Serial.println("Anderer Aufwachgrund.");
27
  }
28
}
29
30
31
void setup() 
32
{
33
  Serial.begin(115200);
34
35
  pinMode(BOOT_PIN, INPUT_PULLUP);
36
37
  delay(2000);  // Zeit für Debugging
38
39
  esp_deep_sleep_enable_gpio_wakeup(BOOT_PIN, ESP_GPIO_WAKEUP_GPIO_LOW);
40
  delay(200);
41
  esp_deep_sleep_start();
42
}
43
44
void loop() 
45
{
46
  delay(1000);
47
  print_wakeup_reason();
48
}

: Bearbeitet durch User
von Obelix X. (obelix)


Lesenswert?

Was gibt

> print_wakeup_reason();

bei dir aus?

Solltest du nicht vor "esp_deep_sleep_start();" prüfen, was 
"wakeup_reason = esp_sleep_get_wakeup_cause();" macht?

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Ja da kommt keine Daten über die serielle Schnittstelle raus. irgendwie 
habe ich ein komisches Verhalten beim ESP32.

von Zo R. (hsch1978)


Lesenswert?

In der setup Routine werden keine Informationen über den serial Port 
ausgegeben. Wenn ich das Programm auf minimum reduziere (keinen externen 
PIN benutzt und keine deep sleep funktionen) wird auch in der loop Daten 
über den serial Port ausgegeben.

Einmal hatte ich eine Ausgabe:
E (5114) sleep: gpio 9 is an invalid deep sleep wakeup IO

Ich vermute ich muss dafür einen anderen GPIO Pin für mein Vorhaben 
nutzen.

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Der ESP32 geht nicht in den DeepSleep und auch keine seriellen Daten 
kann ich loggen.
1
#include <esp_now.h>
2
#include <WiFi.h>
3
#include <esp_wifi.h>
4
5
#define BOOT_PIN 9  // Der Pin für den BOOT-Taster, hier GPIO9
6
7
// Struktur für Daten
8
typedef struct struct_message 
9
{
10
  uint8_t status;
11
  uint8_t data[10];
12
} struct_message;
13
14
struct_message outgoingData;
15
16
void print_wakeup_reason()
17
{
18
  esp_sleep_wakeup_cause_t wakeup_reason;
19
20
  wakeup_reason = esp_sleep_get_wakeup_cause();
21
22
  switch(wakeup_reason)
23
  {
24
      case ESP_SLEEP_WAKEUP_GPIO: Serial.println("Aufgewacht durch GPIO-Signal!"); break;
25
      case ESP_SLEEP_WAKEUP_TIMER: Serial.println("Aufgewacht durch Timer!"); break;
26
      default: Serial.println("Anderer Aufwachgrund.");
27
  }
28
}
29
30
31
void setup() 
32
{
33
  Serial.begin(115200);
34
35
  pinMode(BOOT_PIN, INPUT_PULLUP);
36
37
  Serial.println("Gehe in den Tiefschlaf...");
38
  delay(5000);  // Zeit für Debugging
39
40
  esp_deep_sleep_enable_gpio_wakeup((1ULL << 9),ESP_GPIO_WAKEUP_GPIO_HIGH);
41
  delay(200);
42
43
  print_wakeup_reason();
44
  delay(1000);  // Zeit für Debugging
45
  esp_deep_sleep_start();
46
}
47
48
void loop() 
49
{
50
51
}

von Jan H. (jan_h74) Flattr this


Lesenswert?

Pin 9 ist keine RTC pin, und ist forgesehen fur das onboard Flash. Da 
soll ich eine andere Pin suchen : 
https://randomnerdtutorials.com/esp32-pinout-reference-gpios/

von Zo R. (hsch1978)


Lesenswert?

Ok habs nun in der Doku auch finden können. Hab jetzt den GPIO Pin 5 
benutzt. Siehe da es funktioniert.

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.