Comment remplacer des "delay" par "millis" dans certains cas ?

Bonjour à tous,

Voilà, je me sers beaucoup d'arduino dans le cadre de ma domotique. J'ai un affichage dans mon salon, basé sur un arduino, qui va récupérer des valeurs sur mon outil de domotique (Jeedom) pour afficher de manière continue de cette façon :
Température + delay de 5s --> Consommation + delay de 10s --> Humidité + delay de 5s --> Heure + delay de 10s.

Comme vous pouvez le voir, j'utilise que des delay, par simplicité et surtout que je n'ai pas trouvé une solution pour éviter ce genre d'exemple (Exemple) en utilisant la fonction millis.

Je cherche à passer en millis, car avec les delay pas d'OTA, pas de gestion d'interruption par d'autre élément...

Si vous avez la moindre idée, je reste à disposition. Merci à tous

Bonjour
C'est une question assez récurrente donc tu trouveras beaucoup de messages qui la traitent sur le forum. Cherche le mot clé "chrono" par exemple.

Le principe est le même que celui d'un chronomètre : lorsque la course démarre, tu lances le chrono. A chaque tour, tu notes le temps du chrono, et ça continue. Si tu as plusieurs coureurs, tu utilises plusieurs chronos.

Ici, tu vas utiliser 4 chronos, qu'il faut déclarer et initialiser :

Déclaration :

unsigned long ChronoTemp = 0;
unsigned long ChronoConso = 0;
unsigned long ChronoHumi= 0;
unsigned long ChronoHeure = 0;

Ainsi que les durées auxquelles tu veux regarder les chronos :

unsigned long DureeTemp = 0;  // ms
unsigned long DureeConso = 0;
unsigned long DureeHumi = 0;
unsigned long DureeHeure = 0;

Tu les initialises à la fin du setup :

ChronoTemp = millis();
ChronoConso = ChronoTemp;
ChronoHumi = ChronoTemp;
ChronoHeure = ChronoTemp;

Et dans la loop, tu observes tes chronos et lances les actions adéquates :

if (millis() - ChronoTemp > DureeTemp) {
  ChronoTemp = millis();
  // Mettre les actions à faire pour la mesure et l'affichage

Sinon, il y a plus simple : une bibliothèque proposée par Bricoleau peut faire le boulot pour toi...

Boinjour weado

Peut être un petit truc comme ceci?

enum sequencesIndex {sequTemperature, sequConsommation, sequHumidite, sequHeure, sequNombre};      // Indexation des fonction pour des raisons pratiques
String sequencesNoms[sequNombre] = {"Temperature", "Consommation", "Humidite", "Heure   "};        // Tableau des noms de fonctions
String sequencesEchelle[sequNombre] = {"degr.", "L/min", "H%", "H."};                              // Tableau des échelles
int sequencesTemps[] = {5, 10, 5, 10};                                                             // Temps des séquences en secondes

int sequenceEnCours = 0;
int sequenceTempsMillis = 0;
unsigned long sequenceDebut = 0;

void setup()
{
	Serial.begin(115200);
	sequenceDebut = millis();                                                             // On enregistre le temps du début de la séquence           
}

void loop()
{
	if (millis() - sequenceDebut > sequenceTempsMillis)                                  // Le délais de la séquence en cours est arrivé à échéance
	{
		sequenceExecution(sequenceEnCours);
		sequenceEnCours ++;                                                              // On passe à la suivante
		if (sequenceEnCours >= sequNombre)
		{
			sequenceEnCours = 0;
		}
		sequenceTempsMillis = sequencesTemps[sequenceEnCours]*1000;
		sequenceDebut = millis();                                                        // On prends le délais suivant mis en millisecondes
	}
}

//------------------------------------- Exécution de la séquence c'est ici que sont remises à jour les valeurs à afficher
void sequenceExecution( int sequIndex)
{
	int sequValeur = 0;
	
	switch(sequIndex)                                                                    // Execution de la commande en fonction de son index
	{
		case sequTemperature:						                
			sequValeur = 27;
			break;
		case sequConsommation:						                         
			sequValeur = 12;
			break;
		case sequHumidite:
			sequValeur = 32;
			break;
		case sequHeure:
			sequValeur = 17;
			break;
	}
	Serial.print(sequencesNoms[sequIndex] + "\t" + String(sequencesTemps[sequIndex]) + " sec.  \t");
	Serial.println(String(sequValeur) + " " + sequencesEchelle[sequIndex]);
}

Cordialement
jpbbricole

Bonjour,

Il faut que tu respectés le schéma millis()-(temps au départ) > (durée à attendre) dans la condition de test.

La fonction millis() est un compteur qui recommence à compter depuis 0 après environ 50 jours car son format de stockage ne lui permet pas de compter au delà. En utilisant la soustraction, on évite des erreurs de calcul lors de la transition.

Ici pour plus d'explications

Super Zlika, merci de l'information, je ne connaissais pas, je corrigerai demain.

Cordialement
jpbricole

Bonjour à tous

Zlika:
Il faut que tu respectés le schéma millis()-(temps au départ) > (durée à attendre) dans la condition de test.

C'est corrigé

Bonne bricole et bonne journée
jpbbricole

Merci pour tous vos retours, effectivement, je comprenais pas le principe, je test ça rapidement !