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 += "