code-sammler-flat-room-group-06c — ESP32 simulation

ESP32-S3 Lichtsteuerung: Schalter/Taster-Eingänge, RGB-LED-Ausgang, Web-UI (ArduinoJson, WebServer). Board-Position korrigiert (war negativ).

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by bmw550i.

Components

Sketch code

//06b Funktionion i.O.
// "s" und "h" über systemLogf zeilenweise Ausgabe

// ===================================================================
// SKETCH.INO - TEIL 1 (Definitionen, Variablen & Prototypen)
// ===================================================================
#include <WiFi.h>
#include <WebServer.h>
WebServer server(80);

#include <esp_now.h>
#include <ArduinoJson.h>
#include <esp_task_wdt.h> 
#include "esp_mac.h" 
#include "config.h"
#include "webpage.h"
#include <stdarg.h> 

#define WDT_TIMEOUT_SECONDS 5 

uint32_t myLocalSequenceNumber = 0;
uint32_t simSequenceCounter = 0; 

bool logToSerialActive = true;    
bool logToEspNowActive = false;   
bool logToWebActive = true;    

#define WEB_LOG_MAX_LINES 15
String webLogBuffer[WEB_LOG_MAX_LINES];
uint8_t webLogBufferIdx = 0;

struct MsgFingerprint { uint16_t srcId; uint32_t seqNum; };
#define MESH_HISTORY_SIZE 20
MsgFingerprint meshHistory[MESH_HISTORY_SIZE];
uint8_t meshHistoryIdx = 0;

unsigned long lastWifiCheckTime = 0;
const unsigned long wifiCheckInterval = 10000; 

// --- COMPILER-FORWARD-PROTOTYPEN ---
void sendBroadcast(LightControlPayload &payload);
void processDebugCommand(const char* cmdStr);
void checkLocalInputs();
void evaluatePrioritiesAndOutputs();
void printSystemConfig(const SystemConfig& cfg);
void printGlobalRegistry();
void handleWebDebugCommand(const char* webCmdStr);
String webProcessor(const String& var);
void handleApiStatus();
void registerWebEndpoints();
void loadConfiguration();
void checkWifiBackgroundEngine();
void processReceivedPacket(const uint8_t* sourceMac, const LightControlPayload& packet);

// ===================================================================
// DYNAMISCHE FIX-LOG ENGINE (Verhindert 256-Zeichen-Kappung)
// ===================================================================
void systemLogf(const char* format, ...) {
    va_list args;
    va_start(args, format);
    
    // 1. Mathematisch exakte Länge des formatieren Textes ermitteln
    va_list args_copy;
    va_copy(args_copy, args);
    int needed_len = vsnprintf(NULL, 0, format, args_copy) + 1; // +1 für \0
    va_end(args_copy);

    // 2. Speicher dynamisch in exakter Größe anfordern
    char* dynamicBuffer = (char*)malloc(needed_len);
    if (!dynamicBuffer) {
        va_end(args);
        return; // Schutz falls RAM voll
    }

    // 3. Jetzt erst den Text formatiert hineinschreiben
    vsnprintf(dynamicBuffer, needed_len, format, args);
    va_end(args);

    // 4. Ungekürzte serielle Ausgabe
    if (logToSerialActive) { 
        Serial.print(dynamicBuffer); 
    }

    // 5. Übergabe an das Web-Interface Live-Terminal
    if (logToWebActive) {
        String cleanStr = String(dynamicBuffer);
        cleanStr.replace("\n", ""); 
        cleanStr.replace("\r", "");
        if(cleanStr.length() > 0) {
            webLogBuffer[webLogBufferIdx] = "[WEB-LOG] " + cleanStr;
            webLogBufferIdx = (webLogBufferIdx + 1) % WEB_LOG_MAX_LINES;
        }
    }

    // 

More projects by bmw550i