TuxCore Skillset

ESP32 / ESP8266 Arduino API Skill

skill esp Guld

skills/esp-arduino-api/SKILL.md

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:

Standardprincipper

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:

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:

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

Når TuxCore laver $esp $full

Lever som udgangspunkt:

  1. Komplet .ino fil.
  2. Biblioteker der skal installeres.
  3. Pin mapping.
  4. WiFi/API config øverst.
  5. Serial debug.
  6. Testtrin.
  7. Eventuel PHP/API endpoint hvis relevant.
  8. Home Assistant eksempel hvis relevant.

Når TuxCore laver $esp $patch

Lever kun:

  1. Hvilken fil/sektion der skal ændres.
  2. Den konkrete kodeændring.
  3. Hvor den skal indsættes.
  4. Kort forklaring.
  5. Testtrin via Serial Monitor.

Når TuxCore laver $esp $debug

Svar med:

  1. Hvad fejlen betyder.
  2. Mest sandsynlige årsag.
  3. Wiring/pin checks.
  4. Library checks.
  5. Serial Monitor tests.
  6. Minimal test sketch.
  7. Næste skridt.

Typiske fejl

WiFi forbinder ikke

Mulige årsager:

Test:

Serial.println(WiFi.status());

Fix:

I2C device findes ikke

Mulige årsager:

Fix:

HTTP request fejler

Mulige årsager:

Fix:

Board compiler ikke

Mulige årsager:

Fix:

Acceptkriterier

En ESP-løsning er godkendt når:

Tags

esp32, esp8266, arduino, ino, api, wifi, home-assistant, iot, pn532, gps, compass, tuxcore
esp32 esp8266 arduino api iot