ESP32 / ESP8266 Arduino API Skill
Formål
Denne skill bruges når TuxCore hjælper Thomas med ESP32, ESP8266, Arduino .ino kode, sensorer, displays, RFID/NFC, GPS, kompas og integrationer til Home Assistant eller egne PHP/API-systemer.
Den er relevant for:
- ESP32
- ESP8266 / NodeMCU
- ESP32-C6
- Arduino
.ino - PN532 RFID/NFC
- NEO-6M GPS
- HMC5883L kompas
- GY-91 / IMU sensorer
- TFT displays
- Home Assistant integrationer
- REST API / webhook integration
- Lokale dashboards
- IoT prototyper
Standardprincipper
- Brug Arduino
.inoformat. - Brug ikke ESPHome som standard.
- Undgå MQTT, når brugeren ønsker API-baseret integration.
- Brug WiFi config øverst i filen.
- Brug tydelig pin mapping øverst.
- Brug
Serialdebug som standard. - Gør kode copy/paste-klar.
- Skriv kommentarer hvor brugeren skal ændre værdier.
- Lav robust reconnect til WiFi.
- Brug HTTP/REST API eller webhooks til integration.
- Undgå hardcodede secrets i kode, hvis projektet skal deles offentligt.
Standard struktur i .ino
En god ESP .ino bør typisk have:
#include <Arduino.h>
// Libraries
#include <WiFi.h>
#include <HTTPClient.h>
// =====================
// CONFIG
// =====================
const char* WIFI_SSID = "CHANGE_ME";
const char* WIFI_PASSWORD = "CHANGE_ME";
const char* API_ENDPOINT = "http://192.168.2.124/api/esp";
const char* DEVICE_ID = "esp-device-01";
// =====================
// PIN MAPPING
// =====================
const int LED_PIN = 2;
// =====================
// STATE
// =====================
unsigned long lastSend = 0;
const unsigned long sendIntervalMs = 10000;
// =====================
// SETUP
// =====================
void setup() {
Serial.begin(115200);
delay(500);
pinMode(LED_PIN, OUTPUT);
connectWiFi();
}
// =====================
// LOOP
// =====================
void loop() {
ensureWiFi();
if (millis() - lastSend >= sendIntervalMs) {
lastSend = millis();
sendStatus();
}
}
WiFi reconnect standard
ESP-kode bør have robust WiFi reconnect:
void connectWiFi() {
Serial.println();
Serial.print("Connecting to WiFi: ");
Serial.println(WIFI_SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
unsigned long startAttempt = millis();
while (WiFi.status() != WL_CONNECTED && millis() - startAttempt < 20000) {
delay(500);
Serial.print(".");
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
Serial.print("WiFi connected. IP: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("WiFi connection failed.");
}
}
void ensureWiFi() {
if (WiFi.status() == WL_CONNECTED) {
return;
}
Serial.println("WiFi lost. Reconnecting...");
WiFi.disconnect();
delay(1000);
connectWiFi();
}
HTTP POST standard
Når ESP sender data til API:
bool postJson(const String& jsonPayload) {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Cannot POST: WiFi not connected");
return false;
}
HTTPClient http;
http.begin(API_ENDPOINT);
http.addHeader("Content-Type", "application/json");
int httpCode = http.POST(jsonPayload);
String response = http.getString();
Serial.print("HTTP code: ");
Serial.println(httpCode);
Serial.print("Response: ");
Serial.println(response);
http.end();
return httpCode >= 200 && httpCode < 300;
}
JSON payload standard
Eksempel:
void sendStatus() {
String payload = "{";
payload += "\"device_id\":\"" + String(DEVICE_ID) + "\",";
payload += "\"uptime_ms\":" + String(millis()) + ",";
payload += "\"wifi_rssi\":" + String(WiFi.RSSI());
payload += "}";
postJson(payload);
}
HTTP GET standard
Når ESP henter config eller kommandoer:
String getApiData(const char* url) {
if (WiFi.status() != WL_CONNECTED) {
return "";
}
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
String response = "";
if (httpCode > 0) {
response = http.getString();
}
Serial.print("GET code: ");
Serial.println(httpCode);
Serial.println(response);
http.end();
return response;
}
API integration
Når TuxCore laver API-integration til ESP, bør flowet typisk være:
ESP device
→ WiFi
→ HTTP POST/GET
→ PHP/Python/API endpoint
→ database/Home Assistant/dashboard
Eksempel endpoints:
POST /api/device-status.php
POST /api/rfid-scan.php
POST /api/sensor-data.php
GET /api/device-config.php?id=esp-device-01
GET /api/device-command.php?id=esp-device-01
Home Assistant integration uden MQTT
Hvis MQTT skal undgås, brug typisk:
- Home Assistant webhook
- REST command
- ESP som lille webserver
- HA
restsensor - HA automation der kalder ESP endpoint
Eksempel ESP endpoint:
http://esp-ip/relay/on
http://esp-ip/relay/off
http://esp-ip/status
ESP webserver eksempel:
#include <WebServer.h>
WebServer server(80);
void setupWebServer() {
server.on("/status", HTTP_GET, []() {
String json = "{";
json += "\"device_id\":\"" + String(DEVICE_ID) + "\",";
json += "\"uptime_ms\":" + String(millis()) + ",";
json += "\"rssi\":" + String(WiFi.RSSI());
json += "}";
server.send(200, "application/json", json);
});
server.on("/relay/on", HTTP_GET, []() {
digitalWrite(LED_PIN, HIGH);
server.send(200, "application/json", "{\"ok\":true,\"relay\":\"on\"}");
});
server.on("/relay/off", HTTP_GET, []() {
digitalWrite(LED_PIN, LOW);
server.send(200, "application/json", "{\"ok\":true,\"relay\":\"off\"}");
});
server.begin();
}
I loop():
server.handleClient();
Pin mapping
TuxCore skal altid forsøge at vise tydelig pin mapping.
Eksempel:
ESP32
GPIO21 = SDA
GPIO22 = SCL
GPIO18 = SPI SCK
GPIO19 = SPI MISO
GPIO23 = SPI MOSI
GPIO5 = SPI CS
GPIO2 = onboard LED
For ESP8266/NodeMCU:
D1 = GPIO5 = SCL
D2 = GPIO4 = SDA
D5 = GPIO14 = SCK
D6 = GPIO12 = MISO
D7 = GPIO13 = MOSI
D8 = GPIO15 = CS
I2C standard
Ved I2C-sensorer:
#include <Wire.h>
#define I2C_SDA 21
#define I2C_SCL 22
void setupI2C() {
Wire.begin(I2C_SDA, I2C_SCL);
Serial.println("I2C started");
}
I2C scanner bør bruges ved fejl:
void scanI2C() {
byte error, address;
int devices = 0;
Serial.println("Scanning I2C...");
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
devices++;
}
}
if (devices == 0) {
Serial.println("No I2C devices found");
}
}
Serial debug
Standard baudrate:
Serial.begin(115200);
Debug output bør vise:
- Boot
- WiFi status
- IP-adresse
- Sensorstatus
- API statuskode
- Fejlbeskeder
- Reconnect events
Timing
Undgå lange delay() i loop, medmindre det er meget simpelt testkode.
Brug millis():
unsigned long lastRun = 0;
const unsigned long interval = 5000;
void loop() {
if (millis() - lastRun >= interval) {
lastRun = millis();
// run task
}
}
Sikkerhed
- Del ikke WiFi-passwords i offentlige repoer.
- Brug tokens/API keys kun hvis nødvendigt.
- Tokens må ikke printes i Serial logs.
- API endpoints bør validere device ID/token.
- ESP bør kun være tilgængelig på lokalnet, medmindre der er en klar grund.
- Brug HTTPS hvis ESP’en sender følsomme data over internettet.
Når TuxCore laver $esp $full
Lever som udgangspunkt:
- Komplet
.inofil. - Biblioteker der skal installeres.
- Pin mapping.
- WiFi/API config øverst.
- Serial debug.
- Testtrin.
- Eventuel PHP/API endpoint hvis relevant.
- Home Assistant eksempel hvis relevant.
Når TuxCore laver $esp $patch
Lever kun:
- Hvilken fil/sektion der skal ændres.
- Den konkrete kodeændring.
- Hvor den skal indsættes.
- Kort forklaring.
- Testtrin via Serial Monitor.
Når TuxCore laver $esp $debug
Svar med:
- Hvad fejlen betyder.
- Mest sandsynlige årsag.
- Wiring/pin checks.
- Library checks.
- Serial Monitor tests.
- Minimal test sketch.
- Næste skridt.
Typiske fejl
WiFi forbinder ikke
Mulige årsager:
- Forkert SSID/password
- 5 GHz netværk på ESP8266
- Dårligt signal
- Specialtegn i SSID/password
- Forkert WiFi mode
Test:
Serial.println(WiFi.status());
Fix:
- Brug 2.4 GHz
- Tjek credentials
- Print status i Serial Monitor
I2C device findes ikke
Mulige årsager:
- Forkert SDA/SCL
- Manglende fælles GND
- Forkert spænding
- Dårlige ledninger
- Forkert adresse
Fix:
- Kør I2C scanner
- Tjek wiring
- Tjek 3.3V/5V kompatibilitet
HTTP request fejler
Mulige årsager:
- Forkert endpoint
- ESP er ikke på samme net
- Server svarer ikke
- HTTPS-certifikatproblem
- Firewall
Fix:
- Test URL fra browser
- Test med HTTP lokalt
- Print HTTP statuskode
- Print response body
Board compiler ikke
Mulige årsager:
- Forkert board valgt
- Manglende library
- Forkert include
- ESP32-kode kompileres som ESP8266 eller omvendt
Fix:
- Vælg korrekt board
- Installer manglende libraries
- Brug board-specifikke includes
Acceptkriterier
En ESP-løsning er godkendt når:
- Koden kompilerer i Arduino IDE.
- Board og libraries er angivet.
- Pin mapping er tydelig.
- Serial Monitor viser boot og status.
- WiFi reconnect virker.
- API/endpoint kan testes.
- Ingen MQTT bruges, hvis API er kravet.
- Koden er copy/paste-klar.
- Der er klare testtrin.
Tags
esp32, esp8266, arduino, ino, api, wifi, home-assistant, iot, pn532, gps, compass, tuxcore