coder un yoyo horraire

Bonjour ,

je voudrais faire un bout de code qui permette de faire un yoyo journalier :

je voudais qu ' une pin passe de LOW a HIGH de 6 a 12 Heures , puis s' active de 12 H a 14 H ( donc etat LOW )
puis se desactive ( HIGH ) de 14 heure a minuit et s' active de minuit a 6 H .

j ' ai donc nommé une variable booleene bool RHC ;
et ecrit une fonction :

void relaisHeureCreuse () {
	if ( RTC.heure() >= 0 && RTC.heure() < 6 || RTC.heure() >= 12 && RTC.heure() < 14 ) {
		DEBUG_PRINT(F(" relais heures creuses active" ));
		RHC = true;
	}
	else {
		
		DEBUG_PRINT(F(" relais heures creuses desactive" ));
		RHC = false;
	}
}

le probleme c ' est que ca print en boucle , je voudrais faire un truc qui print que quand ca change d' etat genre :
si etat precedent != etat actuel en me servant de la variable RHC , des idees ?

Je dirais ça (pas testé) :

void relaisHeureCreuse () {
  static bool oldRHC = false;
  if ( (RTC.heure() >= 0  && RTC.heure() < 6) ||
       (RTC.heure() >= 12 && RTC.heure() < 14 )) {
    RHC = true;
    if (RHC != oldRHC) DEBUG_PRINT(F(" relais heures creuses active" ));
  }
  else {
    RHC = false;
    if (RHC != oldRHC) DEBUG_PRINT(F(" relais heures creuses desactive" ));
  }
  oldRHC = RHC;
}

lesept:
Je dirais ça (pas testé) :

void relaisHeureCreuse () {

static bool oldRHC = false;
  if ( (RTC.heure() >= 0  && RTC.heure() < 6) ||
      (RTC.heure() >= 12 && RTC.heure() < 14 )) {
    RHC = true;
    if (RHC != oldRHC) DEBUG_PRINT(F(" relais heures creuses active" ));
  }
  else {
    RHC = false;
    if (RHC != oldRHC) DEBUG_PRINT(F(" relais heures creuses desactive" ));
  }
  oldRHC = RHC;
}

ah !!! merci beaucoup c ' est ce que je cherchais , le truc avec la variable old !

merci lesept !!

du coup voilà ce que j ' ai mis dans ma fonction :

void relaisHeureCreuse () {
	static bool oldRHC = -1; // jamais lu
	static unsigned long chrono = 0;
	
	if ((oldRHC == -1) || (millis() - chrono > TIMER_V )) { // si jamais lue ou lue depuis plus de 30 secondes
		if ( (RTC.heure() >= 0  && RTC.heure() < 6) || (RTC.heure() >= 12 && RTC.heure() < 14 )) {
			RHC = true;
			if (DEBUG) Serial.println (F(" relais heures creuses active" ));
		}
		else {
			RHC = false;
			if (DEBUG) Serial.println (F(" relais heures creuses desactive" ));
		}
		
		if ( oldRHC != RHC ) inverseRelais(23);
		oldRHC = RHC;
		chrono = millis();
	}
}

il verifie toutes les 30 sec le creneau horaire , merci .
y a un warning a la compilation : boolean = -1 toujours vrai , mais c ' est justement ce qu on recherche a faire :
on verifie des le depart , puis toutes les 30 sec .
une fois la 1ere verif faite , oldRHC est soit a true soit a false .

Il râle parce qu'un booléen attend un 0 ou un 1, pas un -1.

bon ben j ' ai mis 2 , il rale plus MDR ;D

void relaisHeureCreuse () {
	static bool oldRHC = 2;
	static unsigned long chrono = 0;
	
	if (( oldRHC ) || (millis() - chrono > TIMER_V )) { // si jamais lue ou lue depuis plus de 30 secondes
		if ( (RTC.heure() >= 0  && RTC.heure() < 6) || (RTC.heure() >= 12 && RTC.heure() < 14 )) {
			RHC = true;
			if (DEBUG) Serial.println (F(" relais heures creuses active" ));
		}
		else {
			RHC = false;
			if (DEBUG) Serial.println (F(" relais heures creuses desactive" ));
		}
		if ( oldRHC != RHC ) { // inverseRelais(23); pas mis car active gestionnaire de tache ..
			tableau_Etat_Relais[23] = ! tableau_Etat_Relais[23]; //on affiche le nouvel état du relais
			if ( ! TEST ) digitalWrite(tableau_Pin_Relais[23], tableau_Etat_Relais[23]); //on effectue la mise à jour du pin
			oldRHC = RHC;
			if (DEBUG) Serial.println (F(" relais heures creuses changement etat" ));
		}
		chrono = millis();
	}
}

en tout cas , grand merci !