Bug code - Sortie de condition - NodeMCU + MAX7219

Bonjour,

Voilà j'ai depuis plusieurs mois un affichage (MAX7219 avec MD_Parola à base d'un NodeMCU) dans mon salon qui m'affiche des informations (température, consommation, heure).
Je suis passé recemment via MQTT, qui fonctionne très bien, et j'en ai profiter pour faire des petites optimisations. Mais au lieu d'optimiser, cela me provoque un dysfonctionnement.

Mon code permet d'éteindre mon affichage quand je ne suis pas là ( via information venant de Jeedom via MQTT) ou par un bouton.

Mais mon affichage ne se rallume pas toujours à mon retour, et ceci de manière aléatoire, et impossible aujourd'hui de reproduire systématiquement ce phénomène et donc d'avoir des sorties Serial. Je confirme que l'information via MQTT est la bonne (passage de 0 à 1) et mon bouton n'a pas bougé. Donc impossible de savoir la source de mon problème, mai je sais que je suis dans cette condition.

Après, je pensais réécrire ce bout de code avec un "while", mais ayant déjà eu des soucis avec ce type de boucle, je ne souhaitais pas. Enfin, est-ce que le P.displayClear(); a répétition ne génère pas un soucis ?

Voici le bout de code concerné (si vous en voulez plus pas de soucis) :

loop{
static uint8_t  display = 0;
....
if (proximite=="0" || buttonState == LOW){
P.displayClear();
Serial.print("Pause");
delay(5000);
  }
else
  {

  if (P.displayAnimate())
  {
    switch(display)
    {
      case 0: //Temp
      P.setTextEffect(0, PA_OPENING, PA_CLOSING);
      P.setPause(10000);
      display++;
      strcpy(szMesg,temperature);
      break;
.....
     }
   }
 }
}

Peut-être la question est de savoir comment je peux faire ma boucle, juste en vérifiant la variable sans faire d'action en boucle.

si proximite = 0
Faire une seule fois l'action "P.displayClear();" sans mettre de delay
Attendre un changement de la variable promixite pour changer la condition.

En espérant avoir était clair.

Merci de votre aide.

J'ai du mal à comprendre ce que tu dis.

Tu parles d'un afficheur MAX7219, ça c'est OK.
Ensuite tu parles d'un écran qui s'éteint : est-ce le même ou celui du PC auquel est relié ton NodeMCU ?

Je viens de corriger mon topic.

En gros mon écran s'éteint quand je suis pas là (via une valeur par MQTT) ou par un bouton et se rallume quand je reviens.

Alors, tu ne parles que de l'afficheur MAX7219 ici. Dans ce cas, je ne comprends pas cette phrase :

Mais mon écran ne se rallume pas toujours à mon retour, et ceci de manière aléatoire, et impossible aujourd'hui de reproduire systématiquement ce phénomène et donc d'avoir des sorties Serial.

Où est l'impossibilité d'avoir des sorties Serial ? Un Serial.print doit afficher sur la console série donc sur l'écran du PC, pas sur l'afficheur MAX7219.

écran = affichage (MAX7219)

En fait, je suis dans l'impossibilité d'avoir un serial brancher en permanence, car pas un PC allumé en permanence pour cela.
Ce qui est sûr, c'est que mon NodeMCU n'est pas figé, car j'ai des remontées d'information via MQTT qui continue de fonctionner.

Tu éteins le MAX7219 par quel moyen ?

Via la ligne “P.displayClear();”

Si tu veux faire un débug efficace, tu dois rebrancher un PC sur le NodeMCU pendant la période de débug, sinon ça sera compliqué.

Je suis d'accord, mais compliqué. Après, je me dis que je peux arranger aussi mon code, qui n'est pas forcement très propre pour l'usage (répétition du P.displayClear(); par exemple).

Tu peux y aller au hasard en espérant tomber un jour sur la solution... Ou tu peux chercher la cause du problème, mais il vaut mieux t'en donner les moyens

Je suis bien à d'accord avec toi.

Après, je recherchais aussi les "best practises" utilisées par la communauté pour des besoins aussi simple dans mon code (gestion du changement d'état, sans répétition de l'action) avant de déployer un PC connecté en permanence pour vérifier l'état, prévu à terme.

Le problème peut venir du if (P.displayAnimate()). MD_Parola semble bien documentée, voici ce qu'on trouve pour displayAnimate :

displayAnimate()
bool MD_Parola::displayAnimate ( void )
Animate the display.

Animate all the zones in the display using the currently specified text and animation parameters. This method needs to be invoked as often as possible to ensure smooth animation. The animation is governed by a time tick that is set by the setSpeed() method and it will pause between entry and exit using the time set by the setPause() method.

The calling program should monitor the return value for 'true' in order to either reset the zone animation or supply another string for display. A 'true' return value means that one or more zones have completed their animation.

Not all calls to this method result in an animation, as this is governed by the timing parameters set for the animation. To determine when an animation has advanced during the call, the user code can call the isAnimationAdvanced() method.

Returns
bool true if at least one zone animation has completed, false otherwise.

Tu mets un setPause de 10000 ms ce qui est peut-être trop long. Si tu appuies sur le bouton pendant ce temps, l'appui ne sera pas détecté.