Problème send message en boucle

Bonjour à tous,

Je suis entrain de créer un sketch qui après 2 validation de boutons doit enclencher une séquence LED.

Pour avoir la main dessus je connecte l'arduino en série sur node red via un raspberry pi.

Le problème c'est quand la validation est faite (les 2 boutons activés) j'ai le message qui est envoyé à l'infini à node red et qui me fait rebooter l'arduino. J'aimerai qu'il ne soit envoyé qu'une seule fois après la validation des 2 boutons.

Voici mon Sketch :

> #include <NeoPixelBrightnessBus.h> // instead of NeoPixelBus.h
> #include "leds.h"
> 
> //const int in_Coeur = 8;
> //const int in_Couteau = 9;
> //TEST /////////////////////////////////////////////////////
> const int led1 = 10;
> const int led2 = 11;
> const int led3 = 12;
> const int b1 = 5;
> const int b2 = 6;
> 
> //TEST /////////////////////////////////////////////////////
> 
> String command;
> 
> int phase = 0;
> int on_position = 0;
> 
> 
> void setup() {
>   Serial.begin(57600);
>   //pinMode(in_Coeur, INPUT);
>   //pinMode(in_Couteau, INPUT);
>   //Coeur = LOW;
>   //Couteau = LOW;
> 
>   pinMode(led1, OUTPUT);
>   pinMode(led2, OUTPUT);
>   pinMode(led3, OUTPUT);
>   pinMode(b1, INPUT_PULLUP);
>   pinMode(b2, INPUT_PULLUP);
>   digitalWrite(b1, HIGH);
>   digitalWrite(b2, HIGH);
>   digitalWrite(led1, LOW);
>   digitalWrite(led2, LOW);
>   digitalWrite(led3, LOW);
>   setup_leds();
> 
> }
> 
> void sendMessage(String mesg) {
>   char charBuf[50];
>   mesg.toCharArray(charBuf, 50);
>   Serial.println(mesg);
> }
> 
> void loop() {
> int b = 1;
> int d = 1;
> int a = digitalRead(5);
> int c = digitalRead(6);
> 
>   if (a == b) {
>     digitalWrite(led1, HIGH);
>   }
>   else {
>     digitalWrite(led1, LOW);
>   }
>   if (c == d) {
>     digitalWrite(led2, HIGH);
>   }
>   else {
>     digitalWrite(led2, LOW);
>   }
> 
>   if ((a == b) && (c == d)) {
>     digitalWrite(led3, HIGH);
>     sendMessage("AUT*BLOODSTART");
>   }
>   else {
>     digitalWrite(led3, LOW);
>   }
> 
>   /*if ((Couteau = HIGH) && (Coeur = HIGH)) {
>       bloodStart();
>       }
>       else {
>       bloodOff();
>       }
>   */
> 
> }

Je ne comprends pas pourquoi le message est envoyé à l'infini... Pourtant dans mes autres sketchs cela fonctionne. Peut-être un problème lié aux boutons ?

Merci d'avance.

En l'état, le code émet le message tant que l'égalité "if ((a == b) && (c == d)) " est vrai donc tant que les boutons sont tenus.
Pour n'envoyer le message qu'une fois il faudrait utiliser une variable intermédiaire qui mémorise le fait que le message a été envoyé et qui ne soit effacée que lorsque les boutons sont relâchés pour autoriser un nouvel envoi de message.

Merci fdufnews, en effet, ça fonctionne mieux maintenant. MAIS !

j'ai maintenant ceci :

#include <NeoPixelBrightnessBus.h> // instead of NeoPixelBus.h
#include "leds.h"

//const int in_Coeur = 8;
//const int in_Couteau = 9;
//TEST /////////////////////////////////////////////////////
const int led1 = 10;
const int led2 = 11;
const int led3 = 12;
const int b1 = 5;
const int b2 = 6;
bool stringComplete = false;
String command;
String message = "";
bool MessageSent = false;

//TEST /////////////////////////////////////////////////////

void setup() {
  Serial.begin(57600);
  //pinMode(in_Coeur, INPUT);
  //pinMode(in_Couteau, INPUT);
  //Coeur = LOW;
  //Couteau = LOW;

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(b1, INPUT_PULLUP);
  pinMode(b2, INPUT_PULLUP);
  digitalWrite(b1, HIGH);
  digitalWrite(b2, HIGH);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  setup_leds();

}

void sendMessage(String mesg) {
  char charBuf[50];
  mesg.toCharArray(charBuf, 50);
  Serial.println(mesg);
}

void loop() {
int b = 1;
int d = 1;
int a = digitalRead(5);
int c = digitalRead(6);

  if (a == b) {
    digitalWrite(led1, HIGH);
  }
  else {
    digitalWrite(led1, LOW);
  }
  if (c == d) {
    digitalWrite(led2, HIGH);
  }
  else {
    digitalWrite(led2, LOW);
  }

  if ((a == b) && (c == d) && (MessageSent == false)) {
    digitalWrite(led3, HIGH);
    sendMessage("AUT*BLOODSTART");
    MessageSent = true;
  }
  else {
    digitalWrite(led3, LOW);
  }

   if ((a != b) && (c != d) && (MessageSent == true)) {
    digitalWrite(led3, LOW);
    MessageSent = false;
    Serial.println("Init");
  }

  /*if ((Couteau = HIGH) && (Coeur = HIGH)) {
      bloodStart();
      }
      else {
      bloodOff();
      }
  */

}

void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    message += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

Le problème c'est que comme ma condition devient fausse avec le MessageSent= false qui devient = true car le message à été envoyé ... Ma led s'éteint....

Il faut donc que j'arrive à dire :
Le message à été envoyé ok, mais tu laisses la diode allumée.... Et là, je vois pas comment faire...

devient

  if ((a == b) && (c == d)) {
    digitalWrite(led3, HIGH);
    if (MessageSent == false){
      sendMessage("AUT*BLOODSTART");
      MessageSent = true;
    }
  }
  else {
    digitalWrite(led3, LOW);
  }