Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Routeur solaire Arduino Uno + SSR25DA
#20
Bonjour,

(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 ... Smile

(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
  }
}
Répondre


Messages dans ce sujet
Routeur solaire Arduino Uno + SSR25DA - par bkvin38 - 14-08-2025, 01:09 PM
RE: Routeur solaire Arduino Uno + SSR25DA - par bkvin38 - Il y a 2 heures

Atteindre :


Utilisateur(s) parcourant ce sujet : 3 visiteur(s)