code-sammler-flat-room-group-03a — ESP32 simulation

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

Components

Sketch code

// ===================================================================
// Teil 2: PROTOKOLL-BIBLIOTHEKEN, VARIABLEN & CRC16-CHECKSUMME
// ===================================================================
#include <WiFi.h>
#include <esp_now.h>
#include <ArduinoJson.h>
#include <esp_task_wdt.h> 
#include "config.h"

#define WDT_TIMEOUT_SECONDS 5 

uint32_t myLocalSequenceNumber = 0;
uint32_t simSequenceCounter = 0; 

struct MsgFingerprint {
    uint16_t srcId;
    uint32_t seqNum;
};

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

// --- DATA INTEGRITY (CRC16-CCITT) ---
uint16_t calculateCRC16(const uint8_t* data, size_t length) {
    uint16_t crc = 0xFFFF;
    for (size_t i = 0; i < length; i++) {
        crc ^= (uint16_t)data[i] << 8;
        for (uint8_t bit = 0; bit < 8; bit++) {
            if (crc & 0x8000) {
                crc = (crc << 1) ^ 0x1021; 
            } else {
                crc <<= 1;
            }
        }
    }
    return crc;
}

void signPayload(LightControlPayload& payload) {
    payload.checksum = 0; 
    size_t lengthToCalculate = sizeof(LightControlPayload) - sizeof(payload.checksum);
    payload.checksum = calculateCRC16((const uint8_t*)&payload, lengthToCalculate);
}

bool validatePayload(const LightControlPayload& payload) {
    uint16_t receivedChecksum = payload.checksum;
    LightControlPayload temp = payload;
    temp.checksum = 0;
    size_t lengthToCalculate = sizeof(LightControlPayload) - sizeof(temp.checksum);
    return (receivedChecksum == calculateCRC16((const uint8_t*)&temp, lengthToCalculate));
}
// ===================================================================
// Teil 3: SYSTEM-REGISTRY & HARDWARE-INITIALISIERUNG
// ===================================================================
bool isNewMessage(uint16_t srcId, uint32_t seqNum) {
    for (uint8_t i = 0; i < MESH_HISTORY_SIZE; i++) {
        if (meshHistory[i].srcId == srcId && meshHistory[i].seqNum == seqNum) {
            return false; 
        }
    }
    meshHistory[meshHistoryIdx].srcId = srcId;
    meshHistory[meshHistoryIdx].seqNum = seqNum;
    meshHistoryIdx = (meshHistoryIdx + 1) % MESH_HISTORY_SIZE;
    return true; 
}

void initSerial() {
    Serial.begin(115200);
    delay(500); 
    Serial.println("--- System startet ---");
}

SystemConfig sysCfg;

struct IdState {
    uint16_t id;
    int16_t value;
};
IdState globalRegistry[20];
uint8_t registryCount = 0;

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; 
}

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++;
    

More projects by bmw550i