|
|
|
@ -28,6 +28,7 @@ int preheatTemp = 0, preheatTime = 0; |
|
|
|
int soakTemp = 0, soakTime = 0; |
|
|
|
int soakTemp = 0, soakTime = 0; |
|
|
|
int reflowTemp = 0, reflowTime = 0; |
|
|
|
int reflowTemp = 0, reflowTime = 0; |
|
|
|
bool autoProfileActive = false; |
|
|
|
bool autoProfileActive = false; |
|
|
|
|
|
|
|
bool manualPreheatActive = false; |
|
|
|
unsigned long profileStartTime = 0; |
|
|
|
unsigned long profileStartTime = 0; |
|
|
|
int profileStep = 0; |
|
|
|
int profileStep = 0; |
|
|
|
|
|
|
|
|
|
|
|
@ -134,6 +135,7 @@ void setup() { |
|
|
|
server.on("/action/stop", HTTP_POST, [](AsyncWebServerRequest *request){ |
|
|
|
server.on("/action/stop", HTTP_POST, [](AsyncWebServerRequest *request){ |
|
|
|
setpoint = 0; |
|
|
|
setpoint = 0; |
|
|
|
autoProfileActive = false; |
|
|
|
autoProfileActive = false; |
|
|
|
|
|
|
|
manualPreheatActive = false; |
|
|
|
profileStep = 0; |
|
|
|
profileStep = 0; |
|
|
|
Serial.println("Arrêt demandé : setpoint PID à 0°C"); |
|
|
|
Serial.println("Arrêt demandé : setpoint PID à 0°C"); |
|
|
|
request->send(200, "text/plain", "OK"); |
|
|
|
request->send(200, "text/plain", "OK"); |
|
|
|
@ -152,6 +154,7 @@ void setup() { |
|
|
|
Serial.println("Mode automatique désactivé (chauffe manuelle)"); |
|
|
|
Serial.println("Mode automatique désactivé (chauffe manuelle)"); |
|
|
|
} |
|
|
|
} |
|
|
|
setpoint = request->arg("temp").toDouble(); |
|
|
|
setpoint = request->arg("temp").toDouble(); |
|
|
|
|
|
|
|
manualPreheatActive = true; |
|
|
|
Serial.printf("Chauffe manuelle demandée : %.1f°C (setpoint PID fixé)\n", setpoint); |
|
|
|
Serial.printf("Chauffe manuelle demandée : %.1f°C (setpoint PID fixé)\n", setpoint); |
|
|
|
request->send(200, "text/plain", "OK"); |
|
|
|
request->send(200, "text/plain", "OK"); |
|
|
|
}); |
|
|
|
}); |
|
|
|
@ -172,6 +175,7 @@ void setup() { |
|
|
|
reflowTime = request->arg("reflowTime").toInt(); |
|
|
|
reflowTime = request->arg("reflowTime").toInt(); |
|
|
|
// Démarrage du profil automatique
|
|
|
|
// Démarrage du profil automatique
|
|
|
|
autoProfileActive = true; |
|
|
|
autoProfileActive = true; |
|
|
|
|
|
|
|
manualPreheatActive = false; |
|
|
|
profileStep = 0; |
|
|
|
profileStep = 0; |
|
|
|
profileStartTime = millis(); |
|
|
|
profileStartTime = millis(); |
|
|
|
setpoint = preheatTemp; |
|
|
|
setpoint = preheatTemp; |
|
|
|
@ -180,6 +184,32 @@ void setup() { |
|
|
|
request->send(200, "text/plain", "OK"); |
|
|
|
request->send(200, "text/plain", "OK"); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Endpoint pour renvoyer l'état actuel (utile pour réactualiser l'UI après reload)
|
|
|
|
|
|
|
|
server.on("/state", HTTP_GET, [](AsyncWebServerRequest *request){ |
|
|
|
|
|
|
|
int pct = 0; |
|
|
|
|
|
|
|
if (output > 0) { |
|
|
|
|
|
|
|
pct = (int)round((output * 100) / PWM_PERIOD); |
|
|
|
|
|
|
|
if (pct > 100) pct = 100; |
|
|
|
|
|
|
|
if (pct < 0) pct = 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
int preheatProgress = 0; |
|
|
|
|
|
|
|
if (autoProfileActive && profileStep == 0 && preheatTime > 0) { |
|
|
|
|
|
|
|
unsigned long elapsed = (millis() - profileStartTime) / 1000; |
|
|
|
|
|
|
|
unsigned long prog = (elapsed * 100UL) / (unsigned long)preheatTime; |
|
|
|
|
|
|
|
if (prog > 100) prog = 100; |
|
|
|
|
|
|
|
preheatProgress = (int)prog; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
String json = String("{") |
|
|
|
|
|
|
|
+ "\"manual\":" + (manualPreheatActive ? "true" : "false") |
|
|
|
|
|
|
|
+ ",\"auto\":" + (autoProfileActive ? "true" : "false") |
|
|
|
|
|
|
|
+ ",\"power\":" + String(pct) |
|
|
|
|
|
|
|
+ ",\"setpoint\":" + String(setpoint, 1) |
|
|
|
|
|
|
|
+ ",\"preheatProgress\":" + String(preheatProgress) |
|
|
|
|
|
|
|
+ ",\"step\":" + String(profileStep) |
|
|
|
|
|
|
|
+ "}"; |
|
|
|
|
|
|
|
request->send(200, "application/json", json); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// Connexion WiFi ou démarrage AP si ssid/pwd vides
|
|
|
|
// Connexion WiFi ou démarrage AP si ssid/pwd vides
|
|
|
|
if (strlen(ssid) == 0 || strlen(password) == 0) { |
|
|
|
if (strlen(ssid) == 0 || strlen(password) == 0) { |
|
|
|
Serial.println("SSID ou mot de passe vide, démarrage en mode AP"); |
|
|
|
Serial.println("SSID ou mot de passe vide, démarrage en mode AP"); |
|
|
|
@ -299,6 +329,7 @@ void loop() { |
|
|
|
if (elapsed >= (unsigned long)reflowTime) { |
|
|
|
if (elapsed >= (unsigned long)reflowTime) { |
|
|
|
profileStep = 3; |
|
|
|
profileStep = 3; |
|
|
|
autoProfileActive = false; |
|
|
|
autoProfileActive = false; |
|
|
|
|
|
|
|
setpoint = 0; // Reflow terminé -> couper la chauffe
|
|
|
|
Serial.println("Profil terminé"); |
|
|
|
Serial.println("Profil terminé"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -328,7 +359,13 @@ void loop() { |
|
|
|
pct = (int)round((output * 100) / PWM_PERIOD); |
|
|
|
pct = (int)round((output * 100) / PWM_PERIOD); |
|
|
|
if (pct > 100) pct = 100; |
|
|
|
if (pct > 100) pct = 100; |
|
|
|
} |
|
|
|
} |
|
|
|
String json = String("{\"temp\":") + String(input, 1) + ",\"setpoint\":" + String(setpoint, 1) + ",\"output\":" + String(pct) + "}"; |
|
|
|
String json = String("{\"temp\":") + String(input, 1) |
|
|
|
|
|
|
|
+ ",\"setpoint\":" + String(setpoint, 1) |
|
|
|
|
|
|
|
+ ",\"output\":" + String(pct) |
|
|
|
|
|
|
|
+ ",\"manual\":" + (manualPreheatActive ? "true" : "false") |
|
|
|
|
|
|
|
+ ",\"auto\":" + (autoProfileActive ? "true" : "false") |
|
|
|
|
|
|
|
+ ",\"step\":" + String(profileStep) |
|
|
|
|
|
|
|
+ "}"; |
|
|
|
Serial.println("Température: " + String(input, 1) + " °C | Setpoint: " + String(setpoint, 1) + " | Output PID: " + String(output) + " | Puissance: " + String(pct) + "%"); |
|
|
|
Serial.println("Température: " + String(input, 1) + " °C | Setpoint: " + String(setpoint, 1) + " | Output PID: " + String(output) + " | Puissance: " + String(pct) + "%"); |
|
|
|
ws.textAll(json); |
|
|
|
ws.textAll(json); |
|
|
|
} |
|
|
|
} |
|
|
|
|