[résolu] problème étape bloquante qui ne fonctionne pas... une idée ?

bonjour à tous

j'ai un petit soucis que je n'arrive pas à solutionner sur le bout de code ci dessous.

l’étape digitalwrite "if (digitalRead(PIN_P) == LOW);" en rouge (bouton sur appuyé) passe toute seule sans action de ma part dessus et je ne comprend pas pourquoi....quand je reçois l'information VALIDAT le programme débute bien mais passe directement à la suite sans appuie et je ne sait pas pourquoi une idée ?

if (strncmp(message, "VALIDAT", 8) == 0){
LCD.clear(); // on efface l'écran
    LCD.print("Valid descente"); // on écrit un message
    LCD.setCursor(0,1); //on passe à la ligne suivante
    LCD.print("appuyer BP p"); // on finit d'écrire
   [color=red]if (digitalRead(PIN_P) == LOW);[/color]
      LCD.clear(); // on efface l'écran
  LCD.print("attente"); // on écrit un message
  LCD.setCursor(0,1); //on passe à la ligne suivante
  LCD.print("relachement"); // on finit d'écrire
  // Anti rebond et attente relachement bouton
  delay(100);
  while (digitalRead(PIN_P) == LOW);
      delay(1100);
    byte message[8] = "VALIDOK";                                                    // preparation du message de reception de donnée 
    Serial.println("envoie du message au recepteur !");                             // indication console d'action 
    Mirf.send(message);                                                             // On envoie le message montée p recu                   
    while(Mirf.isSending()); // On attend la fin de l'envoi
    delay(1100);
    Serial.println("fin de l'envoie");                                              // indication console d'action
    delay (1100);  
    LCD.clear(); // on efface l'écran
    LCD.print("Valise "); // on écrit un message
    LCD.setCursor(0,1); //on passe à la ligne suivante
    LCD.print("PRET"); // on finit d'écrire
    }

sinon le reste fonctionne

merci de votre aide :wink:

if (digitalRead(PIN_P) == LOW);

Il faut retirer le ; à la fin de la ligne. En l'état cette ligne ne fait rien.

bonsoir

merci de ta réponse je viens de tester et le programme passe encore sur cette ligne sans blocage

Cette portion de code, sortie de son contexte, on ne sait pas trop ce qui se passe avant.
Tout ce que l'on peut dire, c'est que si la ligne s'exécute c'est qu'alors la condition est remplie.
Maintenant peut-être que ce n'est pas le comportement que tu attends.

Bonjour,

Il faut tracer digitalRead(PIN_P) avec un Serial.print() afin de voir ce qu'il y a en entrée.

D'après les commentaires dans le code, j'ai l'impression que c'est une portion de code qui s'exécute suite à un appui bouton peut-être un problème de mauvaise gestion des rebonds.

bonjour

effectivement ce n'est qu'une partie du programme.

l’idée étant l'utilisation unique d'un bouton poussoir pour faire fonctionner un relais

pour faire la commande primaire c'est ce code la:

// Si le bouton P est appuyé
if (digitalRead(PIN_P) == LOW) {
  LCD.clear(); // on efface l'écran
  LCD.print("attente"); // on écrit un message
  LCD.setCursor(0,1); //on passe à la ligne suivante
  LCD.print("relachement"); // on finit d'écrire
  // Anti rebond et attente relachement bouton
  delay(100);
  while (digitalRead(PIN_P) == LOW);
  LCD.clear(); // on efface l'écran
  LCD.print("commande "); // on écrit un message

pour ce code pas de problème j'appuie sur le bouton et si je reste appuyé ça me demande de relâche et ensuite une fois relâche le code s'envoie vers le récepteur et l'action se fait

pour la suite si jamais le relais est activé après envoie de la routine le récepteur envoie un message a l’émetteur en demandant a l'utilisateur d'appuyer de nouveau sur le BP mais c'est la que ça ne fonctionne pas et qu'il saute l'action sur le BP et je ne comprend pas pourquoi... même en retirant le " ; "

if (strncmp(message, "VALIDAT", 8) == 0){ 
  
    // Confirmation reçu, ajouter ici le code qui va bien pour prévenir l'utilisateur
  
  LCD.clear(); // on efface l'écran
    LCD.print("Valid descente"); // on écrit un message
    LCD.setCursor(0,1); //on passe à la ligne suivante
    LCD.print("appuyer BP p"); // on finit d'écrire
    if (digitalRead(PIN_P) == LOW);
      LCD.clear(); // on efface l'écran
  LCD.print("attente"); // on écrit un message
  LCD.setCursor(0,1); //on passe à la ligne suivante
  LCD.print("relachement"); // on finit d'écrire
  // Anti rebond et attente relachement bouton
  delay(100);
  while (digitalRead(PIN_P) == LOW);
      delay(1100);
    byte message[8] = "VALIDOK";                                                    // preparation du message de reception de donnée 
    Serial.println("envoie du message au recepteur !");                             // indication console d'action 
    Mirf.send(message);                                                             // On envoie le message montée p recu                   
    while(Mirf.isSending()); // On attend la fin de l'envoi
    delay(1100);
    Serial.println("fin de l'envoie");                                              // indication console d'action
    delay (1100);  
    LCD.clear(); // on efface l'écran
    LCD.print("Valise "); // on écrit un message
    LCD.setCursor(0,1); //on passe à la ligne suivante
    LCD.print("PRET"); // on finit d'écrire
    }

pour l'affichage console on vois clairement que le programme passe dessus direct car le message appuyer sur BP reste affiché quand je lui met un delay derrière (par exemple 4sec) et idem avec le message en attente de relâchement si je met du delay...
pour la suite le récepteur reçois l'info, m'envoie un accusé de réception et désactive la sortie...

je ne comprend vraiment pas ou est le soucis car la boucle est écrite comme sur la première fonction...

petite precision la sortie est configuré en pullup et c'est bien un bouton poussoir pas un interrupteur

Bonjour DD91,

DD91:
bonjour

effectivement ce n'est qu'une partie du programme.

Pour une analyse et une aide sérieuse il FAUT la TOTALITÉ du code !!!

Cordialement,
bidouilleelec

J'insiste cette ligne ne fait rien
    if (digitalRead(PIN_P) == LOW); puisque quelque soit l'état de PIN_P il n'y a aucun code à exécuter. Je pense même que la ligne doit être supprimée par le compilateur.
Lorsque tu retires le ;

  • la ligne suivante est exécutée si la condition est remplie et alors l'écran est effacé. Cela ne génère aucune attente et donc tu ne vois pas le message.
  • Si la condition n'est pas remplie tu continues en affichant "attente" et "relachement" mais comme le bouton est déjà relâché tu continues ton code.

Je ne comprends pas tout du déroulement attendu de ton soft mais je pense qu'il doit y avoir quelque part une erreur de raisonnement. Tu devrais faire un petit diagramme d'état avec les conditions de passage d'un état à l'autre pour voir où ça foire.

d'accord pour cette ligne qui ne sert à rien

Pour mettre le code en entier c'est compliqué car le forum est limité en longueur

pour le fonctionnement de cette routine du programme textuellement c'est ça:

-on reçois le message VALIDAT

  • on affiche le message LCD "valide descente appuyer sur BP

  • on attend un appuie utilisateur sur le BP-P pour faire continuer le programme (la fameuse ligne qui ne sert pas)

  • on attend que l'utilisateur relâche le bouton avec la boucle while

  • et on renvoie un message VALIDOK via le NRF

les même routines sans la validation BP fonctionne bien et les cartes échanges correctement

c'est vraiment cette histoire de validation par appuie sur le BP qui déconne

DD91:
d'accord pour cette ligne qui ne sert à rien

Pour mettre le code en entier c'est compliqué car le forum est limité en longueur

Vous pouvez toujours
soit poster une version réduite qui présente le même problème,
soit transmettre le code en pièce jointe.

Cordialement,
bidouilleelec

  • on attend un appuie utilisateur sur le BP-P pour faire continuer le programme

Je ne vois pas cette attente

(la fameuse ligne qui ne sert pas)

Et bien justement cette ligne ne fait pas une attente elle exécute une action si le poussoir est appuyé sinon elle ne fait rien.

Si tu veux attendre un appui, il faut faire une boucle while qui va boucler tant que le bouton est ouvert

  while (digitalRead(PIN_P) == HIGH);

bonjour

super c’était effectivement ça qui manquait, merci pour votre aide ça m'a permis de finir mon programme et tout fonctionne correctement :slight_smile:

encore merci pour tout à tous :slight_smile: