first try

for autosync-sekunde
This commit is contained in:
mxxxxb 2026-01-05 09:42:26 +01:00
parent afac1d50f5
commit af4fa9cbcf
4 changed files with 9569 additions and 9538 deletions

View File

@ -45,7 +45,8 @@ const int ADDR_STEPS_PER_REV = 48;
const int ADDR_RAINBOW_COLOR = 52; const int ADDR_RAINBOW_COLOR = 52;
const int ADDR_AUTO_SYNC_MINUTE = 56; const int ADDR_AUTO_SYNC_MINUTE = 56;
const int ADDR_SENSOR_TRIGGER_VALUE = 60; 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 ------------------- // ------------------- Globale Variablen -------------------
ESP8266WebServer server(80); ESP8266WebServer server(80);
@ -96,8 +97,8 @@ int analogBuffer[MEDIAN_SAMPLES] = { 0 };
int analogBufferIndex = 0; int analogBufferIndex = 0;
// Auto-Sync bei Sensor-Trigger // Auto-Sync bei Sensor-Trigger
int sensorTriggerValue = 1024; // Standardwert int sensorTriggerValue = 1024;
bool sensorTriggerAbove = true; // NEU: true=über dem Wert, false=unter dem Wert bool sensorTriggerAbove = true;
const int SENSOR_TOLERANCE = 5; const int SENSOR_TOLERANCE = 5;
bool lastSensorTriggered = false; bool lastSensorTriggered = false;
unsigned long lastAutoSync = 0; unsigned long lastAutoSync = 0;
@ -105,7 +106,9 @@ const unsigned long AUTO_SYNC_COOLDOWN = 300000;
unsigned long sensorTriggerStart = 0; unsigned long sensorTriggerStart = 0;
const unsigned long SENSOR_STABLE_TIME = 1000; const unsigned long SENSOR_STABLE_TIME = 1000;
bool sensorEnteredLog = false; bool sensorEnteredLog = false;
bool cooldownLogShown = false; // NEU: Verhindert Log-Spam
uint8_t autoSyncMinute = 32; uint8_t autoSyncMinute = 32;
uint8_t autoSyncSecond = 0; // NEU: Auto-Sync Sekunde
// Log-System // Log-System
const int MAX_LOG_ENTRIES = 50; const int MAX_LOG_ENTRIES = 50;
@ -160,8 +163,9 @@ void saveSettings() {
EEPROM.put(ADDR_STEPS_PER_REV, stepsPerRev); EEPROM.put(ADDR_STEPS_PER_REV, stepsPerRev);
EEPROM.put(ADDR_RAINBOW_COLOR, rainbowColor); EEPROM.put(ADDR_RAINBOW_COLOR, rainbowColor);
EEPROM.put(ADDR_AUTO_SYNC_MINUTE, autoSyncMinute); 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_VALUE, sensorTriggerValue);
EEPROM.put(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove); // NEU EEPROM.put(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove);
EEPROM.commit(); EEPROM.commit();
} }
@ -176,8 +180,9 @@ void loadSettings() {
EEPROM.get(ADDR_STEPS_PER_REV, stepsPerRev); EEPROM.get(ADDR_STEPS_PER_REV, stepsPerRev);
EEPROM.get(ADDR_RAINBOW_COLOR, rainbowColor); EEPROM.get(ADDR_RAINBOW_COLOR, rainbowColor);
EEPROM.get(ADDR_AUTO_SYNC_MINUTE, autoSyncMinute); 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_VALUE, sensorTriggerValue);
EEPROM.get(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove); // NEU EEPROM.get(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove);
if (brightness > 255) brightness = 128; if (brightness > 255) brightness = 128;
if (nightBrightness > 255) nightBrightness = 20; if (nightBrightness > 255) nightBrightness = 20;
@ -186,6 +191,7 @@ void loadSettings() {
if (nightEndHour > 23) nightEndHour = 6; if (nightEndHour > 23) nightEndHour = 6;
if (stepsPerRev < 1000UL || stepsPerRev > 2000000UL) stepsPerRev = 122870UL; if (stepsPerRev < 1000UL || stepsPerRev > 2000000UL) stepsPerRev = 122870UL;
if (autoSyncMinute > 59) autoSyncMinute = 32; if (autoSyncMinute > 59) autoSyncMinute = 32;
if (autoSyncSecond > 59) autoSyncSecond = 0; // NEU
if (sensorTriggerValue < 0 || sensorTriggerValue > 1024) sensorTriggerValue = 1024; if (sensorTriggerValue < 0 || sensorTriggerValue > 1024) sensorTriggerValue = 1024;
} }
@ -287,13 +293,11 @@ void checkAutoSync() {
int analogValue = getFilteredAnalogValue(); int analogValue = getFilteredAnalogValue();
// NEU: Prüfung abhängig vom Modus // Prüfung abhängig vom Modus
bool sensorTriggered; bool sensorTriggered;
if (sensorTriggerAbove) { if (sensorTriggerAbove) {
// Über dem Wert triggern
sensorTriggered = (analogValue >= sensorTriggerValue - SENSOR_TOLERANCE && analogValue <= sensorTriggerValue + SENSOR_TOLERANCE); sensorTriggered = (analogValue >= sensorTriggerValue - SENSOR_TOLERANCE && analogValue <= sensorTriggerValue + SENSOR_TOLERANCE);
} else { } else {
// Unter dem Wert triggern
sensorTriggered = (analogValue <= sensorTriggerValue + SENSOR_TOLERANCE && analogValue >= sensorTriggerValue - SENSOR_TOLERANCE); sensorTriggered = (analogValue <= sensorTriggerValue + SENSOR_TOLERANCE && analogValue >= sensorTriggerValue - SENSOR_TOLERANCE);
} }
@ -309,14 +313,16 @@ void checkAutoSync() {
if (now - lastAutoSync > AUTO_SYNC_COOLDOWN) { if (now - lastAutoSync > AUTO_SYNC_COOLDOWN) {
struct tm timeinfo; struct tm timeinfo;
if (getESP8266Time(&timeinfo)) { if (getESP8266Time(&timeinfo)) {
uint8_t minBefore = (autoSyncMinute > 0) ? (autoSyncMinute - 1) : 59; // Berechne Zeitdifferenz zur Sync-Zeit in Sekunden
uint8_t minAfter = (autoSyncMinute < 59) ? (autoSyncMinute + 1) : 0; int targetTotalSec = autoSyncMinute * 60 + autoSyncSecond;
int currentTotalSec = timeinfo.tm_min * 60 + timeinfo.tm_sec;
int minDiff = timeinfo.tm_min - autoSyncMinute; int secDiff = currentTotalSec - targetTotalSec;
if (minDiff < 0) minDiff += 60; if (secDiff < 0) secDiff += 3600; // Wrap around für vorherige Stunde
if (minDiff <= 13 || minDiff >= 47) { // Zeitfenster: ±13 Minuten = ±780 Sekunden
uint64_t sensorPosition = timeToStepIndex(timeinfo.tm_hour, autoSyncMinute, 0); 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 realStep = timeToStepIndex(timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
uint64_t delta = calcForwardDelta(sensorPosition, realStep); uint64_t delta = calcForwardDelta(sensorPosition, realStep);
uint64_t maxDelta = stepsPerRev / 2; uint64_t maxDelta = stepsPerRev / 2;
@ -327,9 +333,10 @@ void checkAutoSync() {
syncMoveStartStep = currentStep; syncMoveStartStep = currentStep;
startMove(delta, true); startMove(delta, true);
lastAutoSync = now; lastAutoSync = now;
char logMsg[120]; cooldownLogShown = false; // Reset für nächsten Cooldown
snprintf(logMsg, sizeof(logMsg), "Auto-Sync: Sensor bei %dmin, Ziel: %02d:%02d:%02d, Delta: %llu (%.1f Min)", char logMsg[140];
autoSyncMinute, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, 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); delta, (float)delta / (float)stepsPerRev * 60.0);
addLog(String(logMsg)); addLog(String(logMsg));
sensorEnteredLog = false; sensorEnteredLog = false;
@ -338,12 +345,17 @@ void checkAutoSync() {
sensorEnteredLog = false; sensorEnteredLog = false;
} }
} else { } 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; sensorEnteredLog = false;
} }
} }
} else { } else {
// Log nur einmal während Cooldown zeigen
if (!cooldownLogShown) {
addLog("Auto-Sync übersprungen: Cooldown aktiv"); addLog("Auto-Sync übersprungen: Cooldown aktiv");
cooldownLogShown = true;
}
} }
sensorTriggerStart = 0; sensorTriggerStart = 0;
} }
@ -351,6 +363,7 @@ void checkAutoSync() {
if (!sensorTriggered && lastSensorTriggered) { if (!sensorTriggered && lastSensorTriggered) {
addLog("Sensor verlassen"); addLog("Sensor verlassen");
cooldownLogShown = false; // Reset wenn Sensor verlassen wird
} }
lastSensorTriggered = sensorTriggered; lastSensorTriggered = sensorTriggered;
@ -585,7 +598,7 @@ void handleRoot() {
html += "<b>Zeitzone:</b> Europe/Berlin (CET/CEST)<br>"; html += "<b>Zeitzone:</b> Europe/Berlin (CET/CEST)<br>";
html += "<b>WLAN:</b> " + String(WiFi.status() == WL_CONNECTED ? "Verbunden" : "Getrennt") + "<br>"; html += "<b>WLAN:</b> " + String(WiFi.status() == WL_CONNECTED ? "Verbunden" : "Getrennt") + "<br>";
html += "<b>Analogwert:</b> <span id='analogVal'>--</span><br>"; html += "<b>Analogwert:</b> <span id='analogVal'>--</span><br>";
html += "<b>Auto-Sync Minute:</b> " + String(autoSyncMinute) + "<br>"; html += "<b>Auto-Sync Zeit:</b> " + String(autoSyncMinute) + ":" + String(autoSyncSecond) + "<br>";
html += "<b>Sensor-Triggerwert:</b> " + String(sensorTriggerValue) + " (" + String(sensorTriggerAbove ? "über" : "unter") + ")<br>"; html += "<b>Sensor-Triggerwert:</b> " + String(sensorTriggerValue) + " (" + String(sensorTriggerAbove ? "über" : "unter") + ")<br>";
html += "<b>OTA (IDE):</b> aktiv • <b>OTA (Web):</b> <a href='/update'>/update</a><br>"; html += "<b>OTA (IDE):</b> aktiv • <b>OTA (Web):</b> <a href='/update'>/update</a><br>";
html += "<b>Steps/Rev:</b> " + String(stepsPerRev) + "</div>"; html += "<b>Steps/Rev:</b> " + String(stepsPerRev) + "</div>";
@ -609,9 +622,9 @@ void handleRoot() {
html += "<div class='card'><h3>Auto-Sync Einstellungen</h3>" html += "<div class='card'><h3>Auto-Sync Einstellungen</h3>"
"<form onsubmit='return submitForm(this,\"/setautosync\")'>" "<form onsubmit='return submitForm(this,\"/setautosync\")'>"
"<label>Sensor-Minute (0-59):</label>" "<label>Sensor-Zeit (MM:SS):</label>"
"<input name='asm' type='number' min='0' max='59' value='" "<input name='ast' placeholder='z. B. 32:00' value='"
+ String(autoSyncMinute) + "'>" + String(autoSyncMinute) + ":" + (autoSyncSecond < 10 ? "0" : "") + String(autoSyncSecond) + "'>"
"<label>Sensor-Triggerwert (0-1024):</label>" "<label>Sensor-Triggerwert (0-1024):</label>"
"<input name='stv' type='number' min='0' max='1024' value='" "<input name='stv' type='number' min='0' max='1024' value='"
+ String(sensorTriggerValue) + "'>" + String(sensorTriggerValue) + "'>"
@ -877,12 +890,23 @@ void handleSetAutoSync() {
bool isResponse = server.hasArg("response"); bool isResponse = server.hasArg("response");
String msg = ""; String msg = "";
if (server.hasArg("asm")) { // Parse MM:SS Format
uint8_t newMinute = constrain(server.arg("asm").toInt(), 0, 59); if (server.hasArg("ast")) {
if (newMinute != autoSyncMinute) { String timeStr = server.arg("ast");
autoSyncMinute = newMinute; int mm = 0, ss = 0;
msg += "Auto-Sync Minute: " + String(autoSyncMinute) + "\n"; if (sscanf(timeStr.c_str(), "%d:%d", &mm, &ss) == 2) {
addLog("Auto-Sync Minute geändert auf: " + String(autoSyncMinute)); if (mm >= 0 && mm <= 59 && ss >= 0 && ss <= 59) {
if (mm != autoSyncMinute || ss != autoSyncSecond) {
autoSyncMinute = mm;
autoSyncSecond = ss;
msg += "Auto-Sync Zeit: " + String(autoSyncMinute) + ":" + (autoSyncSecond < 10 ? "0" : "") + String(autoSyncSecond) + "\n";
addLog("Auto-Sync Zeit geändert auf: " + String(autoSyncMinute) + ":" + String(autoSyncSecond));
}
} else {
msg += "✗ Ungültige Zeit (0-59:0-59)\n";
}
} else {
msg += "✗ Ungültiges Format (MM:SS)\n";
} }
} }