Zum Hauptinhalt springen

ESP spezifische Programmierung

Spezielle Tipps und Tricks für die Programmierung von ESP32 und ESP8266 Mikrocontrollern.


Inhaltsverzeichnis


Erste Schritte

ESP-Board in Arduino IDE einrichten

  1. Öffnen Sie die Arduino IDE
  2. Gehen Sie zu File > Preferences
  3. Fügen Sie die Board-URL hinzu:
    • ESP32: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    • ESP8266: http://arduino.esp8266.com/stable/package_esp8266com_index.json
  4. Gehen Sie zu Tools > Board > Boards Manager
  5. Suchen Sie nach "ESP32" oder "ESP8266" und installieren Sie das Board-Paket
Tipp

Nach der Installation finden Sie die ESP-Boards unter Tools > Board. Wählen Sie das passende Board aus (z.B. "ESP32 Dev Module" oder "NodeMCU 1.0 (ESP-12E Module)").

Erstes ESP-Programm

void setup() {
Serial.begin(115200); // Höhere Baudrate für ESP
delay(1000);
Serial.println("ESP gestartet!");
}

void loop() {
Serial.println("Hallo von ESP!");
delay(1000);
}

ESP32 vs. ESP8266

Hauptunterschiede

EigenschaftESP32ESP8266
CPU-KerneDual-Core (240 MHz)Single-Core (80-160 MHz)
RAM520 KB80 KB
GPIOs3417
ADC12-Bit10-Bit
Bluetooth✅ Ja❌ Nein
Touch-Pins✅ Ja❌ Nein

GPIO-Belegung

Wichtig

Nicht alle GPIOs sind auf allen ESP-Boards verfügbar. Einige Pins haben spezielle Funktionen:

ESP32:

  • GPIO 0, 2, 4, 5, 12, 15 haben Boot-Modi
  • GPIO 34-39 sind nur Eingänge (kein Pull-up/Pull-down)

ESP8266:

  • GPIO 0, 2, 15 haben Boot-Modi
  • GPIO 16 kann nicht für Interrupts verwendet werden

WLAN-Funktionalität

WLAN Access Point (AP) erstellen

#include <WiFi.h>  // ESP32
// #include <ESP8266WiFi.h> // ESP8266

const char* ssid = "ESP_AccessPoint";
const char* password = "12345678";

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

WiFi.softAP(ssid, password);

IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP-Adresse: ");
Serial.println(IP);
}

void loop() {
// Code hier
}

WLAN Station (Client) Modus

#include <WiFi.h>  // ESP32
// #include <ESP8266WiFi.h> // ESP8266

const char* ssid = "Ihr_WLAN_Name";
const char* password = "Ihr_WLAN_Passwort";

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

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WLAN verbunden!");
Serial.print("IP-Adresse: ");
Serial.println(WiFi.localIP());
}

void loop() {
// Code hier
}

WLAN-Verbindung überwachen

void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WLAN-Verbindung verloren! Reconnect...");
WiFi.reconnect();
}
delay(1000);
}

Deep Sleep und Energieeffizienz

Deep Sleep für ESP32

#define uS_TO_S_FACTOR 1000000  // Umrechnungsfaktor Mikrosekunden zu Sekunden
#define TIME_TO_SLEEP 30 // Sleep-Zeit in Sekunden

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

// Deep Sleep konfigurieren
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

Serial.println("Gehe in Deep Sleep...");
Serial.flush();

esp_deep_sleep_start();
}

void loop() {
// Wird nie erreicht, da ESP nach Deep Sleep neu startet
}

Deep Sleep für ESP8266

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

// Code ausführen
Serial.println("Gehe in Deep Sleep...");

// Deep Sleep für 30 Sekunden
ESP.deepSleep(30e6); // 30 Sekunden in Mikrosekunden
}

void loop() {
// Wird nie erreicht
}
Wichtig

Nach dem Deep Sleep startet der ESP neu. Der Code beginnt wieder bei setup(). Verwenden Sie ESP.getResetReason() um zu prüfen, ob der Reset durch Deep Sleep verursacht wurde.


Häufige Probleme und Lösungen

Problem: "Brownout detector was triggered"

Lösung

Dieser Fehler tritt auf, wenn die Spannungsversorgung nicht ausreicht:

  • Verwenden Sie ein hochwertiges USB-Kabel
  • Stellen Sie sicher, dass das Netzteil genug Strom liefert (mindestens 500mA)
  • Bei ESP32: Deaktivieren Sie den Brownout-Detector (nur für Tests!):
    #include "soc/soc.h"
    #include "soc/rtc_cntl_reg.h"

    void setup() {
    WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // Brownout-Detector deaktivieren
    // Rest des Codes
    }

Problem: WLAN verbindet sich nicht

Lösung
  • Überprüfen Sie SSID und Passwort
  • Stellen Sie sicher, dass das WLAN 2.4 GHz unterstützt (ESP unterstützt kein 5 GHz)
  • Prüfen Sie die Signalstärke
  • Versuchen Sie einen Reconnect mit Timeout:
    WiFi.begin(ssid, password);
    int timeout = 0;
    while (WiFi.status() != WL_CONNECTED && timeout < 20) {
    delay(500);
    Serial.print(".");
    timeout++;
    }

Problem: "Guru Meditation Error" oder Crashes

Lösung
  • Überprüfen Sie Array-Grenzen und Pointer
  • Verwenden Sie Serial.println() für Debugging
  • Prüfen Sie den Stack-Overflow (zu große lokale Variablen)
  • Verwenden Sie heap_caps_get_free_size() um den verfügbaren RAM zu prüfen

Best Practices

Non-Blocking Code

unsigned long previousMillis = 0;
const long interval = 1000; // 1 Sekunde

void loop() {
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Code hier ausführen
Serial.println("Timer!");
}

// Anderer Code kann hier ausgeführt werden
}

Watchdog Timer

#include <esp_task_wdt.h>  // ESP32

void setup() {
// Watchdog Timer aktivieren (5 Sekunden)
esp_task_wdt_init(5, true);
esp_task_wdt_add(NULL);
}

void loop() {
// Watchdog Timer zurücksetzen
esp_task_wdt_reset();

// Code hier
delay(1000);
}

Speicher-Management

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

// Verfügbaren Speicher prüfen
Serial.print("Freier Heap: ");
Serial.println(ESP.getFreeHeap());

// Fragmentierung prüfen
Serial.print("Größter freier Block: ");
Serial.println(ESP.getMaxFreeBlockSize());
}

OTA (Over-The-Air) Updates

#include <ArduinoOTA.h>

void setup() {
// WLAN verbinden...

ArduinoOTA.setHostname("ESP32-Device");
ArduinoOTA.setPassword("ota-password");

ArduinoOTA.begin();
}

void loop() {
ArduinoOTA.handle();
// Rest des Codes
}

Nützliche Ressourcen