code-sammler-flat-room-group-02b — ESP32 simulation

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

Components

Sketch code

//Teil 2 ---------------------------------------------------------------
#include <WiFi.h>
#include <esp_now.h>
#include <ArduinoJson.h>
//#include <LittleFS.h>
#include "config.h"

// Diese Funktion wird im echten setup() ganz oben aufgerufen
void initSerial() {
  Serial.begin(115200);
  delay(500); // Kurze Pause, damit der Serielle Monitor bereit ist
  Serial.println("--- System startet ---");
}

// Globale Konfigurationsinstanz
SystemConfig sysCfg;

// Speicher für die aktuellen Werte ALLER bekannten IDs (lokal & remote)
// Im Echtbetrieb empfiehlt sich hier ein dynamischeres Mapping, für die Übersichtlichkeit nutzen wir feste ID-Zustände.
struct IdState {
    uint16_t id;
    int16_t value;
};
IdState globalRegistry[20];
uint8_t registryCount = 0;

// Helfer: Wert einer ID aus der globalen Liste holen
int16_t getRegisterValue(uint16_t id) {
    for (uint8_t i = 0; i < registryCount; i++) {
        if (globalRegistry[i].id == id) return globalRegistry[i].value;
    }
    return 0; // Standardmäßig aus
}

// Helfer: Wert einer ID in der globalen Liste aktualisieren
void setRegisterValue(uint16_t id, int16_t value) {
    for (uint8_t i = 0; i < registryCount; i++) {
        if (globalRegistry[i].id == id) {
            globalRegistry[i].value = value;
            return;
        }
    }
    if (registryCount < 20) {
        globalRegistry[registryCount] = {id, value};
        registryCount++;
    }
}

void loadConfiguration() {
    Serial.println(F("[DEBUG] Starte loadConfiguration()")); Serial.flush();
    loadFallbackConfig();
    
    // 1. GPIOs für die Eingänge vorbereiten
    Serial.printf("[DEBUG] Bearbeite %d Eingaenge...\n", sysCfg.inputCount); Serial.flush();
    for (uint8_t i = 0; i < sysCfg.inputCount; i++) {
        Serial.printf("[DEBUG] Eingang %d: ID=%d, PinA=%d, PinB=%d\n", i, sysCfg.inputs[i].id, sysCfg.inputs[i].pinA, sysCfg.inputs[i].pinB); Serial.flush();
        
        if (sysCfg.inputs[i].pinA < 48) { // Gültige ESP32-S3 Pins prüfen
            pinMode(sysCfg.inputs[i].pinA, INPUT_PULLUP);
        } else {
            Serial.printf("[WARNUNG] Ungueltiger PinA (%d) an Eingang Index %d!\n", sysCfg.inputs[i].pinA, i); Serial.flush();
        }
        
        if (sysCfg.inputs[i].pinB != 255 && sysCfg.inputs[i].pinB < 48) {
            pinMode(sysCfg.inputs[i].pinB, INPUT_PULLUP);
        }
    }

    // 2. 12-BIT PWM INITIALISIERUNG FÜR ALLE HARDWARE-KANÄLE
    Serial.printf("[DEBUG] Bearbeite %d Gruppen-Ausgaenge (12-Bit Mehrkanal)...\n", sysCfg.groupCount); Serial.flush();
    
    uint8_t globalChannelIndex = 0; // Fortlaufender Zähler für die Hardware-PWM-Kanäle (0-15)

    for (uint8_t g = 0; g < sysCfg.groupCount; g++) {
        // Hilfs-Array, um die konfigurierten Pins der Gruppe in einer Schleife zu durchlaufen
        uint8_t channelsPins[5] = {
            sysCfg.groups[g].pinR,
            sysCfg.groups[g].pinG,
            sysCfg.groups[g].pinB,
            sysCfg.groups[g].pinCW,
            sysCfg.groups[

More projects by bmw550i