Forum: Mikrocontroller und Digitale Elektronik ESP32 - Mit WLAN Verbinden unzuverlässig?


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 Jens (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab hier einen ESP32 (ESP32 Thing von Sparkfun), den ich mit 
PlatformIO/Arduino Framework programmiere.

Beim Start soll sich der ESP32 mit meinem WLAN (Fritzbox/1750E Repeater 
Mesh) verbinden, und eine E-Mail versenden (danach geht er in den Deep 
Sleep, bis er wieder von Extern resetted wird).

Das funktioniert leider nur in 70% der Fälle. Ziemlich häufig bleibt der 
Controller beim Verbindungsaufbau hängen (es wird nicht mal ein Watchdog 
ausgelöst!). Oder er crasht dabei, und resetted sich.

Letzteres ist nicht wirklich schlimm, da es danach im zweiten Anlauf 
meist klappt. Aber wenn sich der Controller komplett aufhängt, ist das 
natürlich fatal. Das bekommt man von außen nicht mit und der Akku 
entleer sich rasend schnell (da der ESP nicht mehr in den DeepSleep 
kommt).

Nun meine Fragen dazu:
Ist das beim ESP32 "normal", dass die WLAN Verbindung so unzuverlässig 
ist?
Liegt es am Arduinio Framework (ist das IDF hier stabiler)?
Könnte es auch an der Fritzbox/dem Mesh liegen?

PS: Den Code habe ich gerade nicht griffbereit, ist aber nichts 
Besonderes (WiFi.begin()). Kann ich aber gerne nachliefern.

von Pete K. (pete77)


Bewertung
1 lesenswert
nicht lesenswert
Ist denn die Spannungsversorgung stabil? Spendiere mal einen 100uF Elko, 
der scheint dem Board zu fehlen.
Welchen Akku benutzt Du?

Wir brauchen mehr Infos über die Schaltung und das Programm.

von Schorschi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Außerdem wäre es interessant, ob du die onboard Antenne oder eine 
aufgesteckte benutzt. Die letzten ESP32 Boards waren bei mir immer so 
verdrahtet (Widerstand) dass eine externe Antenne angeschlossen werden 
musste.

Da hatte ich eine Weile auch mit WLAN gekämpft bis ich das bemerkte.

von Michael U. (amiga)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe nur einen ESP32 mit Akkubetrieb hier laufen. Feste IP, da ich 
nicht auf den DHCP warten willl, kostet nur Zeit.
Mit DHCP unbedingt den Event abfragen, ob er eine aktuelle IP bekommen 
hat, Connect pausschal sagt nur, daß er mit dem AP verbunden ist.
Normalerweise ist er bei mir in ca. 1-2s mit AP und MQTT Broker 
verbunden. Manchmal dauert es aber auch bis zu 5s, keine Ahnung warum. 
Ich habe inen Timeout um die Verbindunsabfrage, wenn er nach 6s nicht 
sauber verbunden ist, geht er eben wieder schlafen. Stört hier auch 
nicht, ist nur ein Temp./Feuchte/Luftdruck-Sensor, der alle 5 Minuten 
die Daten schickt.
Spannungsversorgung ist eine LiFePO4 18650 Zelle mit 1500mAh, lebt 2 
Monate bis zum neu laden. Modul ein nackter ESP32 Wroom, 220uF am Modul 
über der Betriebsspannung.

Gruß aus Berlin
Michael

von Jens (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Hier ist der Code:
#include <Arduino.h>
#include "Mailing.h"

#define WIFI_SSID     "MySSID"
#define WIFI_PASSWORD   "MyPWD"


RTC_DATA_ATTR int gPersistentBootCount = 0; // Persistent even during deep sleep!!!
uint8_t gWifiConnectTryCounter = 0;


void SendMsg()
{
  Serial.println("Turning on radio");
  WiFi.mode(WIFI_STA);

  Serial.println("Trying to establishing connection to WiFi");
  WiFi.persistent(false);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  while ((WiFi.status() != WL_CONNECTED) && (gWifiConnectTryCounter < 10))
  {
    delay(1000);
    gWifiConnectTryCounter++;
    Serial.print(".");
  }

  if (WiFi.status() == WL_CONNECTED)
  {
    Serial.println("Connected successfully to wifi.");
    setupMailer();
    sendMail();
  }
  else
  {
    Serial.println("Counld NOT establish Connection to WiFi Network.");
  }

  Serial.println("Disconnecting wifi");
  WiFi.disconnect();

  Serial.println("Turning off Radio");
  WiFi.mode(WIFI_OFF);
}

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

  ++gPersistentBootCount;
  Serial.println("Boot number: " + String(gPersistentBootCount));
  
  if (gPersistentBootCount == 1)
  {
    Serial.println("Sending mail...");
    SendMsg();

    Serial.println("Going to sleep now.");
    esp_sleep_enable_ext0_wakeup(GPIO_NUM_36, 1);
    esp_deep_sleep_start();
  }
  else
  {
    Serial.println("Rebooting...");

    // Restart the controller. Will send an E-Mail on next boot
    ESP.restart();
  }
}

void loop()
{
  // Loop is not required. All logic is handled in setup()
}

Versorgt wird der Controller über USB, die Antenne ist direkt auf dem 
Board.

von Pete K. (pete77)


Bewertung
0 lesenswert
nicht lesenswert
Das delay(1000) funktioniert nicht gut mit des ESPs, damit blockierst Du 
den ESP, das hat er nicht so gerne. Nimm das mal raus.

von Jens (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Das delay(1000) funktioniert nicht gut mit des ESPs, damit blockierst Du
> den ESP, das hat er nicht so gerne. Nimm das mal raus.

Bist du da sicher? Der WIFi Stack läuft beim ESP32 ja auf Core 0, der 
User Code auf Core 1. Damit sollte sich da nichts blockieren. Oder bin 
ich da falsch informiert?

von DasTutWeh (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Ist das beim ESP32 "normal", dass die WLAN Verbindung so unzuverlässig
> ist?
> Liegt es am Arduinio Framework (ist das IDF hier stabiler)?
> Könnte es auch an der Fritzbox/dem Mesh liegen?

Ohne ins Detail zu gehen, alle genannten Quellen sind nicht richtig 
stabil!

Z.B. der Fritz Repeater hat ein FW Problem, WLAN stirbt regelmäßig bei 
mir bzw. friert ein auf Schneckentempo, nach Reset läuft alles wieder.

Es gibt auch einige Hinweise im Netz, wie man mit den ESP32 
Fehlversuchen umgehen muss, aber auch viel Unsinn dazu.

Das Framework hat nicht die Reife, wie das von ESP8266, wird aber jedes 
Jahr stabiler!

Ich kann MicroPython auf dem ESP32 empfehlen, das macht viel Freude!

von John P. (brushlesspower)


Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Der WIFi Stack läuft beim ESP32 ja auf Core 0, der
> User Code auf Core 1. Damit sollte sich da nichts blockieren. Oder bin
> ich da falsch informiert?

Das wäre mir neu.

Ich habe selber die ganzen WLAN/Server Routinen bei mir auf den 2. Core 
gelegt.
Unter Arduino läuft ALLES auf den 1. Core.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Das delay(1000) funktioniert nicht gut mit des ESPs, damit
> blockierst Du
> den ESP, das hat er nicht so gerne. Nimm das mal raus.

Nein, das delay blockiert nicht. Es ruft wiederholt yield() auf, was der 
Firmware des ESP Zeit abgibt.

: Bearbeitet durch User
von Karo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
John P. schrieb:
> Unter Arduino läuft ALLES auf den 1. Core.

Das stimmt so nicht. Der Radio Stack läuft definitiv auf Core 0, der 
User Code auf Core 1.

"CPU 0 is also called Protocol CPU (PRO_CPU) and CPU 1 Application CPU 
(APP_CPU). The CPU 0 controls the WLAN, Bluetooth and other internal 
peripherals such as SPI, I2C, ADC, etc., while the CPU 1 is available to 
our user program. Skits that we write in the main loop and upload to the 
ESP are always executed on the CPU 1 without exception."

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.