Il y a 2 heures
Bonjour,
si je démarre un cycle de 990ms à 40%, je vais donc envoyer HIGH 396ms et donc quand je vais enclencher le HIGH si je ne le cale pas au début d'un cycle ZC je vais louper peut être une 1/2 période. Je me fais peut être des nœuds au cerveau ...
j'envoie toujours un entier entre 0 et 100 sinon un -99 pour dire continue pas besoin de changer de %
c'est géré côté serveur, avec le -99. Pour moi l'arduino ne fait que commandé on/off. Le serveur gère l'intelligence.
c'est la fonction millis() appelé à chaque début loop
(Il y a 3 heures)michy a écrit : que souhaitez vous faire avec l'info ZC ? (1 signal ZC toutes les 10ms en 50Hz pour une régul on/off sur un cycle de 990ms, il n'y a pas de syncro a gérer, le SSR fera le job de manière transparente)
si je démarre un cycle de 990ms à 40%, je vais donc envoyer HIGH 396ms et donc quand je vais enclencher le HIGH si je ne le cale pas au début d'un cycle ZC je vais louper peut être une 1/2 période. Je me fais peut être des nœuds au cerveau ...

(Il y a 3 heures)michy a écrit : Dans le bout de code Arduino, la ligne " unsigned long onTime = (WINDOW_MS * (unsigned long)powerPercent) / 100;"
powerPercent est un nombre float entre 0.0 et 100.0?
j'envoie toujours un entier entre 0 et 100 sinon un -99 pour dire continue pas besoin de changer de %
(Il y a 3 heures)michy a écrit : comme vous recalculer onTime a chaque itération (pour actualiser l'état du gpio) , il faudrait pas que powerPercent change plusieurs fois de manière extrême pendant le cycle de 990ms
c'est géré côté serveur, avec le -99. Pour moi l'arduino ne fait que commandé on/off. Le serveur gère l'intelligence.
Code :
public static function estOKDeclenchementChauffeEau(float $production, float $consumption): int
{
// *** gestion données à 0
if($production <= 0 || $consumption <= 0){
return 0;
}
$surplus = round($production - $consumption,1);
$percent = 0;
// *** on produit plus qu'on consomme
if($surplus > 0){
// *** assez pour lancer le chauffe eau
if($surplus >= Site::$ChauffeEauSeuilDeclenchement) {
// *** on est entre la consommation et 100%
if($surplus <= Site::$ChauffeEauPuissance){
$percent = round(($surplus / Site::$ChauffeEauPuissance) * 100);
} else {
// *** on est à au moins 100%
$percent = 100;
}
} else {
// *** mais pas assez pour lancer le chauffe eau
$percent = -99;
}
} else {
if($surplus <= Site::$ChauffeEauSeuilDeclenchementHaut*-1){
// *** on coupe car on dépasse la production + limite
$percent = 0;
} else {
// *** on est dans la limite autorisé
$percent = -99;
}
}
// *** on ne prend que 90% de la valeur
if($percent > 0){
$percent = $percent * 0.9;
}
return $percent;
}
(Il y a 3 heures)michy a écrit : now c'est la fonction now() ou c'est une variable actualisée ailleurs?
c'est la fonction millis() appelé à chaque début loop
Code :
void loop() {
unsigned long now = millis();
if (now - lastApiCall >= API_INTERVAL) {
lastApiCall = now;
if (client.connect(server, serverPort)) {
// Envoi de la requête HTTP GET
client.print(String("GET ") + apiPath + " HTTP/1.1\r\n" +
"Host: " + ipToString(server) + "\r\n" +
"Connection: close\r\n\r\n");
} else {
Serial.println("Connexion échouée");
}
// Attente de la réponse
String payload = "";
while (client.connected() || client.available()) {
if (client.available()) {
char c = client.read();
payload += c;
}
}
client.stop();
// Extraction du JSON (dans le corps HTTP)
int jsonStart = payload.indexOf("{");
if (jsonStart >= 0) {
String jsonString = payload.substring(jsonStart);
Serial.println("Réponse API : " + jsonString);
StaticJsonDocument<200> doc;
DeserializationError err = deserializeJson(doc, jsonString);
if (!err) {
int val = doc["surplus_chauffeeau"];
if (val >= 0 && val <= 100) {
powerPercent = val;
Serial.print("Nouveau powerPercent = ");
Serial.println(powerPercent);
}
} else {
Serial.println("Erreur parsing JSON");
}
}
}
if (now - windowStart >= WINDOW_MS) {
windowStart += WINDOW_MS;
}
unsigned long onTime = (WINDOW_MS * (unsigned long)powerPercent) / 100;
if ((now - windowStart) < onTime) {
digitalWrite(SSR_PIN, HIGH); // cycles ON
} else {
digitalWrite(SSR_PIN, LOW); // cycles OFF
}
}