code-sammler-flat-room-group-02d — 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"

uint32_t myLocalSequenceNumber = 0;
uint32_t simSequenceCounter = 0; // Globaler Zähler für simulierte Funk-Pakete

// Struktur für den Fingerabdruck
struct MsgFingerprint {
    uint16_t srcId;
    uint32_t seqNum;
};

#define MESH_HISTORY_SIZE 20
MsgFingerprint meshHistory[MESH_HISTORY_SIZE];
uint8_t meshHistoryIdx = 0;

// Prüft, ob Nachricht neu ist. Wenn ja, wird sie gespeichert.
bool isNewMessage(uint16_t srcId, uint32_t seqNum) {
    // 1. Historie durchsuchen, ob dieser Fingerabdruck schon bekannt ist
    for (uint8_t i = 0; i < MESH_HISTORY_SIZE; i++) {
        if (meshHistory[i].srcId == srcId && meshHistory[i].seqNum == seqNum) {
            return false; // Duplikat gefunden!
        }
    }
    
    // 2. Wenn neu: In den Ringspeicher schreiben (überschreibt das älteste Element)
    meshHistory[meshHistoryIdx].srcId = srcId;
    meshHistory[meshHistoryIdx].seqNum = seqNum;
    
    // Index weiterschalten (Ringspeicher-Prinzip)
    meshHistoryIdx = (meshHistoryIdx + 1) % MESH_HISTORY_SIZE;
    
    return true; // Nachricht ist neu und darf verarbeitet werden
}


// 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

More projects by bmw550i