ESP spezifische Programmierung
Spezielle Tipps und Tricks für die Programmierung von ESP32 und ESP8266 Mikrocontrollern.
Inhaltsverzeichnis
- Erste Schritte
- ESP32 vs. ESP8266
- WLAN-Funktionalität
- Deep Sleep und Energieeffizienz
- Häufige Probleme und Lösungen
- Best Practices
Erste Schritte
ESP-Board in Arduino IDE einrichten
- Öffnen Sie die Arduino IDE
- Gehen Sie zu File > Preferences
- 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
- ESP32:
- Gehen Sie zu Tools > Board > Boards Manager
- 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
| Eigenschaft | ESP32 | ESP8266 |
|---|---|---|
| CPU-Kerne | Dual-Core (240 MHz) | Single-Core (80-160 MHz) |
| RAM | 520 KB | 80 KB |
| GPIOs | 34 | 17 |
| ADC | 12-Bit | 10-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
}