comment faire une tempo pour un affichage

re bonjour.

Alors, tel quel ça fonctionne parfaitement.
Ensuite dans ma configuration/accessibilité c'est encore stable jusqu'à 150.

par contre
Je suis inquiet, je pense que je me suis engagé dans une voie sans réfléchir:
je me demande si je ne vais pas perturber le programme en le ralentissant trop.
Je n'arrive pas a trouver d'info fiable sur le temps d'un cycle du loop.
selon les sites et forums Je trouve entre 100 micros secondes et 20 millis secondes!!
j'ai bien essayé de trouver le temps d'exécution, mais mon serial.print sur la console série doit sans doute modifier le temps d'exécution.

c'est dommage je suis en train de suivre les cours d'Eskimo et je progresse pas trop mal mais je débute, et la insérer des tests avec tempo dans une routine que je comprends mais ne maitrise pas me perturbe. Sans doute mon coté pessimiste!!
Comme quoi c'est très difficile de vouloir sauter les étapes.
Heureusement avec vos presque 3000 post il y a du métier derrière.
en fait c'est ce genre de mesure que je fait.

j'ai bien essayé de trouver le temps d'exécution, mais mon serial.print sur la console série doit sans doute modifier le temps d'exécution.

Enregistre tes temps de passage dans loop() dans un tableau de variables (unsigned long) en incrémentant un index.
Quand le tableau est plein, envoie le sur la console.
Pas besoin d'un gros tableau, quelques éléments suffisent.

@+

OK, je comprends maintenant le problème lié au ralentissement. Désolé de n'avoir pas percuté plus vite.

Une solution toute simple est de mettre mon bout de code sous forme d'une fonction, qui ne serait appelée par le programme principal (le tien) que lorsqu'un appui sur une touche serait détecté.

Dans la loop, il faut mettre quelque part :

byte AppuiToucheDetecte = digitalRead(bouton1) + digitalRead(bouton2);
if (AppuiToucheDetecte < 2) GestionBoutons ();

Et la fonction devient :

void GestionBoutons () {
  unsigned long chrono = millis();
  boolean etatBouton1 = HIGH;
  boolean etatBouton2 = HIGH;
  while (millis()-chrono < temporisation) {
    if (etatBouton1 == HIGH) etatBouton1 = digitalRead(pinBouton1);
    if (etatBouton2 == HIGH) etatBouton2 = digitalRead(pinBouton2);
    }
  if (etatBouton1 == LOW && etatBouton2 == HIGH) Decrementation ();
  if (etatBouton1 == HIGH && etatBouton2 == LOW) Incrementation();
  if (etatBouton1 == LOW && etatBouton2 == LOW) AllumeEcran ();
}

Comme ça, tant que tu n'appuies pas sur un bouton, la temporisation n'est pas lancée et la mesure n'est pas ralentie. Et dès que tu appuies sur un bouton, on passe à la lecture des boutons et au changement de valeur de la variable.

Note que ta variable safetyMargin_watts doit être globale pour être accessible dans tes fonctions d'incrémentation / décrémentation.

Note que si tu préfères rester avec des variables booléennes, il faut faire

bool AppuiToucheDetecte = digitalRead(bouton1) & digitalRead(bouton2);
if (!AppuiToucheDetecte) GestionBoutons ();

bonjour

Je suis content d'être arrivé a me faire comprendre ce n'est pas toujours facile sur un forum.
déjà un gros point pour moi:
Je ne vais plus être aveugle cette idée me convient a ravir.

Enregistre tes temps de passage dans loop() dans un tableau de variables (unsigned long) en incrémentant un index.
Quand le tableau est plein, envoie le sur la console.
Pas besoin d'un gros tableau, quelques éléments suffisent.

et pour:

Désolé de n'avoir pas percuté plus vite.

surtout pas je suis très heureux que l'on m'aide et ce n'est toujours pas facile de s'expliquer.

Une solution toute simple est de mettre mon bout de code sous forme d'une fonction, qui ne serait appelée par le programme principal (le tien) que lorsqu'un appui sur une touche serait détecté.

Alors c'est l'idée que j'avais en premier.
Je l'ai testée, bien entendu avec des moyens de tests moins sophistiqués que ta routine.
Mais une fois dans la fonction je n'ai pas trouvé moyen d'en sortir simplement.

Du coups j'avais regardé les menus. Mais bon ça devenait bien trop compliqué pour juste incrémenter une variable.
Âpres réflexion j'avais imaginé "une sortie automatique" du mode réglage.
C'est a dire que lorsque je suis dans la fonction réglage j'avais imaginé lancer un compteur qui a son terme lancerais un genre de ExitSub.
Je ne sais pas si c'est réalisable ?
un peu du genre de nos appareils électronique qui sortent d'eux même quand on ne touche plus rien

Sinon quoi qu'il en soit j'ai appris un truc qui ne m'étais pas venu a l'esprit:
comment mesurer sommairement le temps d'exécution de mon code (sans me casser la tète avec des timers)
et ça j'en avais bien besoin.

Je pense qu'au final j'ai ce que je cherche car la gestion des boutons est fiable, reste a savoir si il est possible de sortir simplement de la procédure de réglage

et encore un sincère merci pour le coups de main.
Il faut beaucoup de patience des pro pour venir en aide a un débutant :wink:

EDIT
Je viens de penser:
puisque maintenant j'ai une fonction je n'ai plus besoin de "affiche écran."
des que je rentre dans la fonction j'affiche l'écran

et dans cette fonction Je n'ai besoin que de modifier ma variable donc bouton 1 et bouton 2 donc si je test mes 2 boutons dans cette fonction je peux décider de sortir avec un appuie sur ces deux boutons
Une idée pour sortir d'une procédure?
Quitte a faire un reset.

Je vais tester ça ce soir et reviens vers vous

En fait, ce n'est pas une fonction 'réglage', mais une fonction 'gestion des boutons' : elle ne se lance que si tu appuies sur un bouton et s'arrête toute seule au bout de la temporisation plus le temps éventuel mis par la fonction appelée (Decrementation () ou Incrementation()).

Ce n'est pas ce que tu observes ? Pour le vérifier tu peux la modifier comme suit :

void GestionBoutons () {
 Serial.print ("Debut gestion boutons ...");
 unsigned long chrono = millis();
 boolean etatBouton1 = HIGH;
 boolean etatBouton2 = HIGH;
 while (millis()-chrono < temporisation) {
   if (etatBouton1 == HIGH) etatBouton1 = digitalRead(pinBouton1);
   if (etatBouton2 == HIGH) etatBouton2 = digitalRead(pinBouton2);
   }
 if (etatBouton1 == LOW && etatBouton2 == HIGH) Decrementation ();
 if (etatBouton1 == HIGH && etatBouton2 == LOW) Incrementation();
//  if (etatBouton1 == LOW && etatBouton2 == LOW) AllumeEcran ();
 Serial.print (" Bouton 1 : "); Serial.print (etatBouton1);
 Serial.print (" Bouton 2 : "); Serial.print (etatBouton2);
 Serial.println ("  Fin gestion boutons !");
}

J'ai commenté l'appel à AllumeEcran si tu n'en as pas besoin.

bonjour

En fait, ce n'est pas une fonction 'réglage', mais une fonction 'gestion des boutons' : elle ne se lance que si tu appuies sur un bouton et s'arrête toute seule au bout de la temporisation plus le temps éventuel mis par la fonction appelée (Decrementation () ou Incrementation()).

Ah, désolé trop pressé je regarde ce soir a la maison

bonsoir

c'est super!!
ça marche parfaitement.
Je ne perçoit aucun ralentissement
Que du bonheur

Tout a l'heure je suis allé trop vite, je n'avais pas saisi le fonctionnement de la fonction.

voila une copie du moniteur série
Je reviens vers vous tout a l'heure

Marge watts = 20.00
energy in bucket = 3600.00
real Power = 74.26

Debut gestion boutons ... Bouton 1 : 0 Bouton 2 : 1  Fin gestion boutons !
Debut gestion boutons ... Bouton 1 : 0 Bouton 2 : 1  Fin gestion boutons !
Debut gestion boutons ... Bouton 1 : 0 Bouton 2 : 1  Fin gestion boutons !
Debut gestion boutons ... Bouton 1 : 0 Bouton 2 : 1  Fin gestion boutons !
Debut gestion boutons ... Bouton 1 : 0 Bouton 2 : 1  Fin gestion boutons !

Marge watts = 15.00
energy in bucket = 3600.00
real Power = 72.32

Marge watts = 15.00
energy in bucket = 3600.00
real Power = 71.96

Debut gestion boutons ... Bouton 1 : 1 Bouton 2 : 0  Fin gestion boutons !

Marge watts = 16.00
energy in bucket = 3600.00
real Power = 67.51






Marge watts = 17.00
energy in bucket = 3600.00
real Power = 70.77

Debut gestion boutons ... Bouton 1 : 1 Bouton 2 : 0  Fin gestion boutons !
Debut gestion boutons ... Bouton 1 : 1 Bouton 2 : 0  Fin gestion boutons !
Debut gestion boutons ... Bouton 1 : 1 Bouton 2 : 0  Fin gestion boutons !
Debut gestion boutons ... Bouton 1 : 1 Bouton 2 : 0  Fin gestion boutons !

Marge watts = 21.00
energy in bucket = 3600.00
real Power = 68.00

Marge watts = 21.00
energy in bucket = 3600.00
real Power = 67.43

Impec!

bonsoir

Oui Impec

je suis vraiment content et remercie Vraiment le moustachu au 3000 posts
Alain

Au passage, si tu n'utilises plus le double clic (appui simultané sur les deux boutons), la temporisation n'a plus aucun intérêt et te fait perdre des mesures. Tu devrais utiliser un simple

etatBouton1 = digitalRead(pinBouton1);
etatBouton2 = digitalRead(pinBouton2);

et implémenter un anti-rebond matériel, comme par exemple (résistance - capacité) :

... En veux-tu, en Koala ! ...

Bonsoir
Merci pour cette réponse.
Je ne l'avait pas vue: partie dans des pages plus lointaines.
Si, si j'utilise les deux boutons pour une autre fonction bien pratique (contrôle/enregistrement du comportement du Bucket selon certaines conditions)
Par contre je garde sous le coude cette idée au cas ou.
Encore merci
Alain (et Alph qui est mon cocker)