From af4fa9cbcff1fa4f3175972eaa07beaabf1e33e1 Mon Sep 17 00:00:00 2001 From: mxxxxb Date: Mon, 5 Jan 2026 09:42:26 +0100 Subject: [PATCH] first try for autosync-sekunde --- Clock_TMC2208_RTC_ChatGPT_v3_with_magneto.ino | 90 +- ...MC2208_RTC_ChatGPT_v3_with_magneto.ino.bin | Bin 374672 -> 375456 bytes ...MC2208_RTC_ChatGPT_v3_with_magneto.ino.elf | Bin 6083188 -> 6092412 bytes ...MC2208_RTC_ChatGPT_v3_with_magneto.ino.map | 19017 ++++++++-------- 4 files changed, 9569 insertions(+), 9538 deletions(-) diff --git a/Clock_TMC2208_RTC_ChatGPT_v3_with_magneto.ino b/Clock_TMC2208_RTC_ChatGPT_v3_with_magneto.ino index 1f76687..7975331 100644 --- a/Clock_TMC2208_RTC_ChatGPT_v3_with_magneto.ino +++ b/Clock_TMC2208_RTC_ChatGPT_v3_with_magneto.ino @@ -45,7 +45,8 @@ const int ADDR_STEPS_PER_REV = 48; const int ADDR_RAINBOW_COLOR = 52; const int ADDR_AUTO_SYNC_MINUTE = 56; const int ADDR_SENSOR_TRIGGER_VALUE = 60; -const int ADDR_SENSOR_TRIGGER_MODE = 64; // NEU: 0=über, 1=unter +const int ADDR_SENSOR_TRIGGER_MODE = 64; +const int ADDR_AUTO_SYNC_SECOND = 68; // NEU: Sekunde für Auto-Sync // ------------------- Globale Variablen ------------------- ESP8266WebServer server(80); @@ -96,8 +97,8 @@ int analogBuffer[MEDIAN_SAMPLES] = { 0 }; int analogBufferIndex = 0; // Auto-Sync bei Sensor-Trigger -int sensorTriggerValue = 1024; // Standardwert -bool sensorTriggerAbove = true; // NEU: true=über dem Wert, false=unter dem Wert +int sensorTriggerValue = 1024; +bool sensorTriggerAbove = true; const int SENSOR_TOLERANCE = 5; bool lastSensorTriggered = false; unsigned long lastAutoSync = 0; @@ -105,7 +106,9 @@ const unsigned long AUTO_SYNC_COOLDOWN = 300000; unsigned long sensorTriggerStart = 0; const unsigned long SENSOR_STABLE_TIME = 1000; bool sensorEnteredLog = false; +bool cooldownLogShown = false; // NEU: Verhindert Log-Spam uint8_t autoSyncMinute = 32; +uint8_t autoSyncSecond = 0; // NEU: Auto-Sync Sekunde // Log-System const int MAX_LOG_ENTRIES = 50; @@ -160,8 +163,9 @@ void saveSettings() { EEPROM.put(ADDR_STEPS_PER_REV, stepsPerRev); EEPROM.put(ADDR_RAINBOW_COLOR, rainbowColor); EEPROM.put(ADDR_AUTO_SYNC_MINUTE, autoSyncMinute); + EEPROM.put(ADDR_AUTO_SYNC_SECOND, autoSyncSecond); // NEU EEPROM.put(ADDR_SENSOR_TRIGGER_VALUE, sensorTriggerValue); - EEPROM.put(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove); // NEU + EEPROM.put(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove); EEPROM.commit(); } @@ -176,8 +180,9 @@ void loadSettings() { EEPROM.get(ADDR_STEPS_PER_REV, stepsPerRev); EEPROM.get(ADDR_RAINBOW_COLOR, rainbowColor); EEPROM.get(ADDR_AUTO_SYNC_MINUTE, autoSyncMinute); + EEPROM.get(ADDR_AUTO_SYNC_SECOND, autoSyncSecond); // NEU EEPROM.get(ADDR_SENSOR_TRIGGER_VALUE, sensorTriggerValue); - EEPROM.get(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove); // NEU + EEPROM.get(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove); if (brightness > 255) brightness = 128; if (nightBrightness > 255) nightBrightness = 20; @@ -186,6 +191,7 @@ void loadSettings() { if (nightEndHour > 23) nightEndHour = 6; if (stepsPerRev < 1000UL || stepsPerRev > 2000000UL) stepsPerRev = 122870UL; if (autoSyncMinute > 59) autoSyncMinute = 32; + if (autoSyncSecond > 59) autoSyncSecond = 0; // NEU if (sensorTriggerValue < 0 || sensorTriggerValue > 1024) sensorTriggerValue = 1024; } @@ -287,13 +293,11 @@ void checkAutoSync() { int analogValue = getFilteredAnalogValue(); - // NEU: Prüfung abhängig vom Modus + // Prüfung abhängig vom Modus bool sensorTriggered; if (sensorTriggerAbove) { - // Über dem Wert triggern sensorTriggered = (analogValue >= sensorTriggerValue - SENSOR_TOLERANCE && analogValue <= sensorTriggerValue + SENSOR_TOLERANCE); } else { - // Unter dem Wert triggern sensorTriggered = (analogValue <= sensorTriggerValue + SENSOR_TOLERANCE && analogValue >= sensorTriggerValue - SENSOR_TOLERANCE); } @@ -309,14 +313,16 @@ void checkAutoSync() { if (now - lastAutoSync > AUTO_SYNC_COOLDOWN) { struct tm timeinfo; if (getESP8266Time(&timeinfo)) { - uint8_t minBefore = (autoSyncMinute > 0) ? (autoSyncMinute - 1) : 59; - uint8_t minAfter = (autoSyncMinute < 59) ? (autoSyncMinute + 1) : 0; + // Berechne Zeitdifferenz zur Sync-Zeit in Sekunden + int targetTotalSec = autoSyncMinute * 60 + autoSyncSecond; + int currentTotalSec = timeinfo.tm_min * 60 + timeinfo.tm_sec; + + int secDiff = currentTotalSec - targetTotalSec; + if (secDiff < 0) secDiff += 3600; // Wrap around für vorherige Stunde - int minDiff = timeinfo.tm_min - autoSyncMinute; - if (minDiff < 0) minDiff += 60; - - if (minDiff <= 13 || minDiff >= 47) { - uint64_t sensorPosition = timeToStepIndex(timeinfo.tm_hour, autoSyncMinute, 0); + // Zeitfenster: ±13 Minuten = ±780 Sekunden + if (secDiff <= 780 || secDiff >= 2820) { + uint64_t sensorPosition = timeToStepIndex(timeinfo.tm_hour, autoSyncMinute, autoSyncSecond); uint64_t realStep = timeToStepIndex(timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); uint64_t delta = calcForwardDelta(sensorPosition, realStep); uint64_t maxDelta = stepsPerRev / 2; @@ -327,9 +333,10 @@ void checkAutoSync() { syncMoveStartStep = currentStep; startMove(delta, true); lastAutoSync = now; - char logMsg[120]; - snprintf(logMsg, sizeof(logMsg), "Auto-Sync: Sensor bei %dmin, Ziel: %02d:%02d:%02d, Delta: %llu (%.1f Min)", - autoSyncMinute, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, + cooldownLogShown = false; // Reset für nächsten Cooldown + char logMsg[140]; + snprintf(logMsg, sizeof(logMsg), "Auto-Sync: Sensor bei %02d:%02d, Ziel: %02d:%02d:%02d, Delta: %llu (%.1f Min)", + autoSyncMinute, autoSyncSecond, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, delta, (float)delta / (float)stepsPerRev * 60.0); addLog(String(logMsg)); sensorEnteredLog = false; @@ -338,12 +345,17 @@ void checkAutoSync() { sensorEnteredLog = false; } } else { - addLog("Auto-Sync übersprungen: Minute " + String(timeinfo.tm_min) + " nicht im Bereich " + String(autoSyncMinute) + " ±13min"); + addLog("Auto-Sync übersprungen: Zeit " + String(timeinfo.tm_min) + ":" + String(timeinfo.tm_sec) + + " nicht im Bereich " + String(autoSyncMinute) + ":" + String(autoSyncSecond) + " ±13min"); sensorEnteredLog = false; } } } else { - addLog("Auto-Sync übersprungen: Cooldown aktiv"); + // Log nur einmal während Cooldown zeigen + if (!cooldownLogShown) { + addLog("Auto-Sync übersprungen: Cooldown aktiv"); + cooldownLogShown = true; + } } sensorTriggerStart = 0; } @@ -351,6 +363,7 @@ void checkAutoSync() { if (!sensorTriggered && lastSensorTriggered) { addLog("Sensor verlassen"); + cooldownLogShown = false; // Reset wenn Sensor verlassen wird } lastSensorTriggered = sensorTriggered; @@ -585,7 +598,7 @@ void handleRoot() { html += "Zeitzone: Europe/Berlin (CET/CEST)
"; html += "WLAN: " + String(WiFi.status() == WL_CONNECTED ? "Verbunden" : "Getrennt") + "
"; html += "Analogwert: --
"; - html += "Auto-Sync Minute: " + String(autoSyncMinute) + "
"; + html += "Auto-Sync Zeit: " + String(autoSyncMinute) + ":" + String(autoSyncSecond) + "
"; html += "Sensor-Triggerwert: " + String(sensorTriggerValue) + " (" + String(sensorTriggerAbove ? "über" : "unter") + ")
"; html += "OTA (IDE): aktiv • OTA (Web): /update
"; html += "Steps/Rev: " + String(stepsPerRev) + ""; @@ -609,11 +622,11 @@ void handleRoot() { html += "

Auto-Sync Einstellungen

" "
" - "" - "" - "" - "" + "" + "" "" "