Compare commits
No commits in common. "autosync-sekunde" and "main" have entirely different histories.
autosync-s
...
main
@ -45,8 +45,7 @@ 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;
|
const int ADDR_SENSOR_TRIGGER_MODE = 64; // NEU: 0=über, 1=unter
|
||||||
const int ADDR_AUTO_SYNC_SECOND = 68; // NEU: Sekunde für Auto-Sync
|
|
||||||
|
|
||||||
// ------------------- Globale Variablen -------------------
|
// ------------------- Globale Variablen -------------------
|
||||||
ESP8266WebServer server(80);
|
ESP8266WebServer server(80);
|
||||||
@ -97,8 +96,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;
|
int sensorTriggerValue = 1024; // Standardwert
|
||||||
bool sensorTriggerAbove = true;
|
bool sensorTriggerAbove = true; // NEU: true=über dem Wert, false=unter dem Wert
|
||||||
const int SENSOR_TOLERANCE = 5;
|
const int SENSOR_TOLERANCE = 5;
|
||||||
bool lastSensorTriggered = false;
|
bool lastSensorTriggered = false;
|
||||||
unsigned long lastAutoSync = 0;
|
unsigned long lastAutoSync = 0;
|
||||||
@ -106,10 +105,7 @@ 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
|
|
||||||
bool cooldownExitedLogShown = false;
|
|
||||||
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;
|
||||||
@ -164,9 +160,8 @@ 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);
|
EEPROM.put(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove); // NEU
|
||||||
EEPROM.commit();
|
EEPROM.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,9 +176,8 @@ 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);
|
EEPROM.get(ADDR_SENSOR_TRIGGER_MODE, sensorTriggerAbove); // NEU
|
||||||
|
|
||||||
if (brightness > 255) brightness = 128;
|
if (brightness > 255) brightness = 128;
|
||||||
if (nightBrightness > 255) nightBrightness = 20;
|
if (nightBrightness > 255) nightBrightness = 20;
|
||||||
@ -192,7 +186,6 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,11 +287,13 @@ void checkAutoSync() {
|
|||||||
|
|
||||||
int analogValue = getFilteredAnalogValue();
|
int analogValue = getFilteredAnalogValue();
|
||||||
|
|
||||||
// Prüfung abhängig vom Modus
|
// NEU: 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,16 +309,14 @@ 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)) {
|
||||||
// Berechne Zeitdifferenz zur Sync-Zeit in Sekunden
|
uint8_t minBefore = (autoSyncMinute > 0) ? (autoSyncMinute - 1) : 59;
|
||||||
int targetTotalSec = autoSyncMinute * 60 + autoSyncSecond;
|
uint8_t minAfter = (autoSyncMinute < 59) ? (autoSyncMinute + 1) : 0;
|
||||||
int currentTotalSec = timeinfo.tm_min * 60 + timeinfo.tm_sec;
|
|
||||||
|
|
||||||
int secDiff = currentTotalSec - targetTotalSec;
|
int minDiff = timeinfo.tm_min - autoSyncMinute;
|
||||||
if (secDiff < 0) secDiff += 3600; // Wrap around für vorherige Stunde
|
if (minDiff < 0) minDiff += 60;
|
||||||
|
|
||||||
// Zeitfenster: ±13 Minuten = ±780 Sekunden
|
if (minDiff <= 13 || minDiff >= 47) {
|
||||||
if (secDiff <= 780 || secDiff >= 2820) {
|
uint64_t sensorPosition = timeToStepIndex(timeinfo.tm_hour, autoSyncMinute, 0);
|
||||||
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;
|
||||||
@ -334,10 +327,9 @@ void checkAutoSync() {
|
|||||||
syncMoveStartStep = currentStep;
|
syncMoveStartStep = currentStep;
|
||||||
startMove(delta, true);
|
startMove(delta, true);
|
||||||
lastAutoSync = now;
|
lastAutoSync = now;
|
||||||
cooldownLogShown = false; // Reset für nächsten Cooldown
|
char logMsg[120];
|
||||||
char logMsg[140];
|
snprintf(logMsg, sizeof(logMsg), "Auto-Sync: Sensor bei %dmin, Ziel: %02d:%02d:%02d, Delta: %llu (%.1f Min)",
|
||||||
snprintf(logMsg, sizeof(logMsg), "Auto-Sync: Sensor bei %02d:%02d, Ziel: %02d:%02d:%02d, Delta: %llu (%.1f Min)",
|
autoSyncMinute, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec,
|
||||||
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;
|
||||||
@ -346,27 +338,19 @@ void checkAutoSync() {
|
|||||||
sensorEnteredLog = false;
|
sensorEnteredLog = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
addLog("Auto-Sync übersprungen: Zeit " + String(timeinfo.tm_min) + ":" + String(timeinfo.tm_sec) +
|
addLog("Auto-Sync übersprungen: Minute " + String(timeinfo.tm_min) + " nicht im Bereich " + String(autoSyncMinute) + " ±13min");
|
||||||
" 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;
|
|
||||||
cooldownExitedLogShown = false; // Reset für Log "Sensor verlassen"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sensorTriggerStart = 0;
|
sensorTriggerStart = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sensorTriggered && lastSensorTriggered) {
|
if (!sensorTriggered && lastSensorTriggered) {
|
||||||
if(!cooldownExitedLogShown) addLog("Sensor verlassen");
|
addLog("Sensor verlassen");
|
||||||
cooldownExitedLogShown = true; // Log nur einmal während Cooldown zeigen
|
|
||||||
cooldownLogShown = false; // Reset wenn Sensor verlassen wird
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lastSensorTriggered = sensorTriggered;
|
lastSensorTriggered = sensorTriggered;
|
||||||
@ -601,10 +585,10 @@ 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 Zeit:</b> <span id='autoSyncTime'>" + String(autoSyncMinute) + ":" + (autoSyncSecond < 10 ? "0" : "") + String(autoSyncSecond) + "</span><br>";
|
html += "<b>Auto-Sync Minute:</b> " + String(autoSyncMinute) + "<br>";
|
||||||
html += "<b>Sensor-Triggerwert:</b> <span id='sensorTrigger'>" + String(sensorTriggerValue) + " (" + String(sensorTriggerAbove ? "über" : "unter") + ")</span><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> <span id='stepsPerRev'>" + String(stepsPerRev) + "</span></div>";
|
html += "<b>Steps/Rev:</b> " + String(stepsPerRev) + "</div>";
|
||||||
|
|
||||||
html += "<div class='card'><h3>System-Log</h3>";
|
html += "<div class='card'><h3>System-Log</h3>";
|
||||||
html += "<pre id='logBox' style='max-height:200px;overflow-y:auto;background:#1e1e2f;padding:8px;border-radius:6px;margin:0'>";
|
html += "<pre id='logBox' style='max-height:200px;overflow-y:auto;background:#1e1e2f;padding:8px;border-radius:6px;margin:0'>";
|
||||||
@ -625,9 +609,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-Zeit (MM:SS):</label>"
|
"<label>Sensor-Minute (0-59):</label>"
|
||||||
"<input name='ast' placeholder='z. B. 32:00' value='"
|
"<input name='asm' type='number' min='0' max='59' value='"
|
||||||
+ String(autoSyncMinute) + ":" + (autoSyncSecond < 10 ? "0" : "") + String(autoSyncSecond) + "'>"
|
+ String(autoSyncMinute) + "'>"
|
||||||
"<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) + "'>"
|
||||||
@ -690,7 +674,7 @@ void handleRoot() {
|
|||||||
"setTimeout(()=>{"
|
"setTimeout(()=>{"
|
||||||
"fetch(path,{method:'POST',body:new URLSearchParams(formData)})"
|
"fetch(path,{method:'POST',body:new URLSearchParams(formData)})"
|
||||||
".then(r=>r.text())"
|
".then(r=>r.text())"
|
||||||
".then(t=>{showInfo(t);updateAnalog();updateLog();updateTime();updateStatus();})"
|
".then(t=>{showInfo(t);updateAnalog();updateLog();updateTime();})"
|
||||||
".catch(e=>showInfo('Fehler: '+e));"
|
".catch(e=>showInfo('Fehler: '+e));"
|
||||||
"},100);"
|
"},100);"
|
||||||
"return true;"
|
"return true;"
|
||||||
@ -705,13 +689,6 @@ void handleRoot() {
|
|||||||
"try{const r=await fetch('/time');document.getElementById('curTime').innerText=await r.text();}catch(e){}"
|
"try{const r=await fetch('/time');document.getElementById('curTime').innerText=await r.text();}catch(e){}"
|
||||||
"try{const r2=await fetch('/ntptime');document.getElementById('ntpTime').innerText=await r2.text();}catch(e){}"
|
"try{const r2=await fetch('/ntptime');document.getElementById('ntpTime').innerText=await r2.text();}catch(e){}"
|
||||||
"}"
|
"}"
|
||||||
"async function updateStatus(){"
|
|
||||||
"try{"
|
|
||||||
"const r1=await fetch('/status/autosync');document.getElementById('autoSyncTime').innerText=await r1.text();"
|
|
||||||
"const r2=await fetch('/status/trigger');document.getElementById('sensorTrigger').innerText=await r2.text();"
|
|
||||||
"const r3=await fetch('/status/stepsperrev');document.getElementById('stepsPerRev').innerText=await r3.text();"
|
|
||||||
"}catch(e){}"
|
|
||||||
"}"
|
|
||||||
"setInterval(updateAnalog,1000);"
|
"setInterval(updateAnalog,1000);"
|
||||||
"setInterval(updateLog,2000);"
|
"setInterval(updateLog,2000);"
|
||||||
"setInterval(updateTime,1000);"
|
"setInterval(updateTime,1000);"
|
||||||
@ -900,23 +877,12 @@ void handleSetAutoSync() {
|
|||||||
bool isResponse = server.hasArg("response");
|
bool isResponse = server.hasArg("response");
|
||||||
String msg = "";
|
String msg = "";
|
||||||
|
|
||||||
// Parse MM:SS Format
|
if (server.hasArg("asm")) {
|
||||||
if (server.hasArg("ast")) {
|
uint8_t newMinute = constrain(server.arg("asm").toInt(), 0, 59);
|
||||||
String timeStr = server.arg("ast");
|
if (newMinute != autoSyncMinute) {
|
||||||
int mm = 0, ss = 0;
|
autoSyncMinute = newMinute;
|
||||||
if (sscanf(timeStr.c_str(), "%d:%d", &mm, &ss) == 2) {
|
msg += "Auto-Sync Minute: " + String(autoSyncMinute) + "\n";
|
||||||
if (mm >= 0 && mm <= 59 && ss >= 0 && ss <= 59) {
|
addLog("Auto-Sync Minute geändert auf: " + String(autoSyncMinute));
|
||||||
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";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -987,21 +953,6 @@ void handleDebugTime() {
|
|||||||
server.send(200, "text/plain", out);
|
server.send(200, "text/plain", out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleStatusAutoSync() {
|
|
||||||
char buf[10];
|
|
||||||
snprintf(buf, sizeof(buf), "%d:%02d", autoSyncMinute, autoSyncSecond);
|
|
||||||
server.send(200, "text/plain", String(buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleStatusTrigger() {
|
|
||||||
String msg = String(sensorTriggerValue) + " (" + String(sensorTriggerAbove ? "über" : "unter") + ")";
|
|
||||||
server.send(200, "text/plain", msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleStatusStepsPerRev() {
|
|
||||||
server.send(200, "text/plain", String(stepsPerRev));
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------- NTP -------------------
|
// ------------------- NTP -------------------
|
||||||
void syncTimeFromNTP() {
|
void syncTimeFromNTP() {
|
||||||
if (WiFi.status() != WL_CONNECTED) {
|
if (WiFi.status() != WL_CONNECTED) {
|
||||||
@ -1088,9 +1039,6 @@ void setup() {
|
|||||||
server.on("/setautosync", HTTP_POST, handleSetAutoSync);
|
server.on("/setautosync", HTTP_POST, handleSetAutoSync);
|
||||||
server.on("/ntptime", HTTP_GET, handleNtpTime);
|
server.on("/ntptime", HTTP_GET, handleNtpTime);
|
||||||
server.on("/debugtime", HTTP_GET, handleDebugTime);
|
server.on("/debugtime", HTTP_GET, handleDebugTime);
|
||||||
server.on("/status/autosync", HTTP_GET, handleStatusAutoSync);
|
|
||||||
server.on("/status/trigger", HTTP_GET, handleStatusTrigger);
|
|
||||||
server.on("/status/stepsperrev", HTTP_GET, handleStatusStepsPerRev);
|
|
||||||
|
|
||||||
server.begin();
|
server.begin();
|
||||||
addLog("Webserver gestartet");
|
addLog("Webserver gestartet");
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user