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
}
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.
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.
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...
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.