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