Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Exception jours rouges
#11
Non, ça ne fonctionnera pas.
Par défaut, une action est OFF, et elle s'active si les conditions sont valides.
Si on a 2 actions sur le même GPIO, l'absence de condition valide, signifie donc OFF.
C'est la dernière action dans la liste qui va donc imposer son résultat.
On ne peut donc pas avoir 2 actions valides sur le même GPIO; il va falloir manuellement rendre "inactive" une des 2.
Répondre

#12
(04-11-2025, 02:20 PM)Ludovic35 a écrit : Non, ça ne fonctionnera pas.
Par défaut, une action est OFF, et elle s'active si les conditions sont valides.
Si on a 2 actions sur le même GPIO, l'absence de condition valide, signifie donc OFF.
C'est la dernière action dans la liste qui va donc imposer son résultat.
On ne peut donc pas avoir 2 actions valides sur le même GPIO; il va falloir manuellement rendre "inactive" une des 2.

Alors tu as raison, je viens de faire l'essai, le fait est qu'en ajoutant une condition sur le même GPIO mais non valide, ce GPIO se coupe.
Avec une remarque tout de même, le graph montre qu'il route encore sur la condition valide ... sans pour autant envoyer de la puissance sur le triac

Mon test en gros, sur mon gpio 17 qui a une condition jour bleue et blanc et une autre condition pour ce même gpio 17 en jour rouge. Un jour bleu le routeur fait exactement comme s'il routait sur la condition bleu/blanc mais ne donne aucune puissance.
Si je désactive la deuxième condition (rouge) tout revient en ordre mais ca reste du manuel.

Si je tente de comprendre cette logique, il semblerait que toute action liée à un gpio entraine un off de celui-ci avant même de savoir ce qu'il a a faire ou même s'il doit faire quelque chose. 
Non, j'ai finalement du mal avec cette logique, une action non replie devrait simplement ne rien faire  Confused
Electronicien et spécialiste en impression 3D FDM
https://www.premium-forum.fr/index.php
Répondre

#13
effectivement, la bagnole n'a pas chargé, car j'avais la 2d ligne d'action (non valide, car noté uniquement jour rouge), mais le gpio est resté à zero.
Répondre

#14
Dans le code, le gpio est positionné par chaque action par 1 (ON) ou 0 (OFF).
Il n'y a pas d'état haute impédance 'Z' sur la sortie (ie, non résolu); ça existe pour des bus externes, mais pas dans ce cas.
Chaque action va donc piloter son gpio de manière séquentielle; le dernier à faire le changement "gagnera".

Allez voir la fonction byte Action::TypeEnCours du fichier Actions.cpp.

Par défaut, la sortie S est à 1 (le contraire de ce que j'avais écrit); les conditions viennent désactiver l'état de S.

Code :
byte Action::TypeEnCours(int Heure, float Temperature, int Ltarfbin, int Retard) {  //Retourne type d'action  active à cette heure et test temperature OK
  byte S = 1;
  int16_t Tempx10 = int(Temperature * 10.0);  //Température en dixième de degré                                                                  //Equivalent à Action Off
  bool ConditionsOk;
  for (int i = 0; i < NbPeriode; i++) {
    if (Heure >= Hdeb[i] && Heure <= Hfin[i]) {
      ConditionsOk = true;
      if (Temperature > -100.0) {
        if (Tinf[i] < 1500 && Tsup[i] < 1500 && Tinf[i] < Tsup[i]) {  // on applique un hystérésis dont les valeurs sont Tinf et Tsup
          if (Tempx10 > Tinf[i] && Tempx10 > Tsup[i]) Tseuil = Tinf[i];
          if (Tempx10 < Tinf[i] && Tempx10 < Tsup[i]) Tseuil = Tsup[i];
          if (Tempx10 > Tseuil) { ConditionsOk = false; }
        } else {
          if (Tinf[i] <= 1000 && Tempx10 > Tinf[i]) { ConditionsOk = false; }
          if (Tsup[i] <= 1000 && Tempx10 < Tsup[i]) { ConditionsOk = false; }
        }
      }
      if (Ltarfbin > 0 && (Ltarfbin & Tarif[i]) == 0) ConditionsOk = false;
      if (SelAct[i] != 255) {  //On conditionne à une autre action
        if (Hmin[i] != 0 && (Hmin[i] > ExtHequiv || ExtValide == 0)) ConditionsOk = false;
        if (Hmax[i] != 0 && (Hmax[i] < ExtHequiv || ExtValide == 0)) ConditionsOk = false;
        if (Ooff[i] != 0 && ((int(Ooff[i]) >= ExtOuvert && Retard != 100) || ExtValide == 0)) ConditionsOk = false;  //Inferieur au seuil bas
        if (O_on[i] != 0 && ((int(O_on[i]) > ExtOuvert && Retard == 100) || ExtValide == 0)) ConditionsOk = false;   //Inferieur au seuil haut et pas encore ouvert
      }
      if (ConditionsOk) S = Type[i];
    }
  }

  if (tOnOff > 0) S = 2;  // Force On
  if (tOnOff < 0) S = 1;  // Force Off
  return S;               //0=NO (pas utilisé),1=OFF,2=ON,3=PW,4=Triac
}
byte Action::SelActEnCours(int Heure) {
  int S = 255;
  for (int i = 0; i < NbPeriode; i++) {
    if (Heure >= Hdeb[i] && Heure <= Hfin[i]) {
      S = SelAct[i];
    }
  }
  return S;
}

Ensuite, ce résultat est utilisé dans GestionOverproduction() pour calculer les valeurs RetardF[i].
RetardF[i] est ensuite converti en PulseComptage[i] et PulseTotal[i].

Ce qui permet de piloter les gpio pour chaque action dans la fonction void GestionIT_10ms().
Voir ici le parcours de toutes les actions (en partant de 0); chaque action active va donc modifier son gpio par un 1 ou 0:
Code :
void GestionIT_10ms() {
  CptIT = CptIT + StepIT;
  Phase230V = !Phase230V;
  for (int i = 0; i < NbActions; i++) {
    switch (Actif[i]) {  //valeur en RAM
Répondre

#15
La question haute impédance ne se pose pas sur un seul GPIO qui n'est que le bout de la chaine d'ordres finalement. Il n'y a aucune raison technique que deux routines de code ne puissent faire référence au même gpio. On le voit souvent d'ailleurs en programmation de chauffage ou l'on peut involontaire donner ordre et contre ordre par des actions mal coordonnées. D'ailleurs si l'on positionne l'action comme inactive ca fonctionne bien.
Peut-être qu'il faudrait mettre les coches "jours" sur l'interface globale de l'action mais se posera alors le problème du "jour" qui commence à 6h pour se terminer à 6h le lendemain...

Après, c'est fait comme ca pour des raisons que j'ignore et probablement valables, je vais faire avec (ou plutôt sans)
Electronicien et spécialiste en impression 3D FDM
https://www.premium-forum.fr/index.php
Répondre

#16
C'est peut-être pas une bonne idée, vous me direz Smile mais est ce que ça pourrait marcher d'avoir en plus de la première action (active si jour bleu ou blanc) une deuxième action active que si jour rouge mais sur un autre GPIO et de connecter ce GPIO avec le GPIO de la première action ?
Répondre

#17
(05-11-2025, 09:18 PM)Mike a écrit : C'est peut-être pas une bonne idée, vous me direz Smile mais est ce que ça pourrait marcher d'avoir en plus de la première action (active si jour bleu ou blanc) une deuxième action active que si jour rouge mais sur un autre GPIO et de connecter ce GPIO avec le GPIO de la première action ?
C'est à ce moment qu'il faudrait une sortie gpio haute impédance qui n'existe pas.
En ajoutant quelques composants on peut quand même arriver à un ou logique entre les deux sorties
Electronicien et spécialiste en impression 3D FDM
https://www.premium-forum.fr/index.php
Répondre



Atteindre :


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

Moteur MyBB, © 2002-2025 Melroy van den Berg.