Controler led à partir du terminal serie

Bonjour à tous,
c'est mon premier post sur le forum, j'aimerais que vous m'aidiez a faire marcher le code pour controler une led à partir du terminal serie

int octetReception=0;
char caractereReception=0;
String chaineReception=" ";
const int LED=2;

void setup(){
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop(){
  while (Serial.available()>0) {
    octetReception=Serial.read();
    if (octetReception==10){
      Serial.print("saut de ligne : ");
      Serial.println ("chaine recue = "+chaineReception);
      
      if (chaineReception=="LED=ON"){
        digitalWrite(LED, HIGH);
        Serial.println("Allume led !");
      }
      if (chaineReception=="LED=OFF"){
        digitalWrite(LED, LOW);
        Serial.println("Eteint led ");
        
        chaineReception=" ";
        delay(1000);
        break;
      }
      else{
        caractereReception=char(octetReception);
        chaineReception=chaineReception+caractereReception;
        delay(1);
      }
    }
  }
}

Mon but est de controler la led à partir du terminal serie.
j'ai testé le programme, il bloque a ce niveau la je pense

 Serial.println ("chaine recue = "+chaineReception);

je vous remercie d'avance pour vos reponses.

Salut, alors essaye avec ce code, je l’ai testé et il est fait par moi:

const int LED = 2;
int i = 0;
      
void setup(){
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop(){
  while(Serial.available()) {

    String cmd = Serial.readString();
    Serial.print("Commande : ");
    Serial.println(cmd);

    if(cmd.equalsIgnoreCase("ON")) {
      digitalWrite(LED, HIGH);
    }

    if(cmd.equalsIgnoreCase("OFF")) {
      digitalWrite(LED, LOW);
    }

    String cmdBlink = getValue(cmd, ',', 0);
    String time = getValue(cmd, ',', 1);
    String repeat = getValue(cmd, ',', 2);

    if(cmdBlink.equalsIgnoreCase("BLINK")) {
      while(i < repeat.toInt() ) {
        digitalWrite(LED, HIGH);
        delay(time.toInt());
        digitalWrite(LED, LOW);
        delay(time.toInt());
        i++;
      }
    }

  }
}

/* Thanks => http://arduino.stackexchange.com/questions/1013/how-do-i-split-an-incoming-string */
String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {
    0, -1    };
  int maxIndex = data.length()-1;
  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
      found++;
      strIndex[0] = strIndex[1]+1;
      strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  }
  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

le .equalsIgnoreCase() sert à comparer les deux chaînes, si celle reçu contient bien ON/OFF et ne prend pas en compte les majuscules ou minuscules.

En prime je t’ai rajouté un système de blink, il marche comme ça, BLINK,DELAY,NBR_FOIS (BLINK,10,20) [la fonction getValue n’est pas de moi]

Merci pour vos codes.
Cependant je n'arrive pas a le faire fonctionner lorsque j'inscris ON ou OFF dans le terminal série cela n'a aucune action sur la led. Dans le terminal serie il indique commande: ON mai rien ne se passe au niveau de l'état de la led.
Je ne doute pas que votre code fonctionne mais je dois faire quelque chose qu'il ne faut pas pour pas que ça marche.

Tout simplement parce que tu ne peux pas faire des comparaisons de chaines comme ça :

if (chaineReception=="LED=OFF")

Il faut utiliser strcmp() :

if (strcmp(chaineReception,"LED=OFF")==0)

Ensuite il faut récupérer la chaine caractère par caractère, dans ton premier code c’est du n’importe quoi :

if(Serial.available()) {

delay(5);

char Machaine[10];
int i=0;
while(Serial.available()) Machaine[i++] = Serial.read();

if (strcmp(Machaine,"LED=OFF")==0) digitalWrite(LED,LOW);
if (strcmp(Machaine,"LED=ON")==0) digitalWrite(LED,HIGH);

}

Je ne comprend pas tout qu'elle doit être mon code final?
je dois rajouter des lignes au programmes?

Bin le denrier code je t'ai tout mâcher ... Tu peux le mettre dans le loop() directement ça marchera (enfin si j'ai pas écrit d'erreur)

int octetReception=0;
char caractereReception=0;
String chaineReception=" ";
const int LED=2;

void setup(){
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop(){
  while (Serial.available()>0) {
    octetReception=Serial.read();
    if (octetReception==10){
      Serial.print("saut de ligne : ");
      Serial.println ("chaine recue = "+chaineReception);
      
      if (chaineReception=="LED=ON"){
        digitalWrite(LED, HIGH);
        Serial.println("Allume led !");
      }
      if (chaineReception=="LED=OFF"){
        digitalWrite(LED, LOW);
        Serial.println("Eteint led ");
        
        chaineReception=" ";
        delay(1000);
        break;
      }
      else{
        caractereReception=char(octetReception);
        chaineReception=chaineReception+caractereReception;
        delay(1);
        if (chaineReception=="LED=OFF")

        if(Serial.available()) {

delay(5);

char Machaine[10];
int i=0;
while(Serial.available()) Machaine[i++] = Serial.read();

if (strcmp(Machaine,"LED=OFF")==0) digitalWrite(LED,LOW);
if (strcmp(Machaine,"LED=ON")==0) digitalWrite(LED,HIGH);

}
      }
    }
  }
}

Je n'arrive pas à le faire fonctionner avec ce code

nan mais vire ton code d’avant dans la loop() …

Peut tu me donner le code entièrement
j'ai essay ce que tu ma dis mais je n'arrive pas à le faire fonctionner

const int LED=2;

void setup(){
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop() {

if(Serial.available()) {

delay(5);

char Machaine[10];
int i=0;
while(Serial.available()) Machaine[i++] = Serial.read();

if (strcmp(Machaine,"LED=OFF")==0) digitalWrite(LED,LOW);
if (strcmp(Machaine,"LED=ON")==0) digitalWrite(LED,HIGH);

}

}

J'ai esayé ton code
cela ne marche pas

tu utilise quelle Arduino, une mega, une uno, regarde si c'est la bonne référence de carte que tu compile

moi j'ai une mega donc

Pour ceux qui demande, le theme viens de moi :slight_smile:

si tu as une uno séléctionne Uno

C'est une carte arduino uno en mettant ce code la cela ne marche pas

const int LED=2;

void setup(){
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop() {

if(Serial.available()) {

delay(5);

char Machaine[10];
int i=0;
while(Serial.available()) Machaine[i++] = Serial.read();

if (strcmp(Machaine,"LED=OFF")==0) digitalWrite(LED,LOW);
if (strcmp(Machaine,"LED=ON")==0) digitalWrite(LED,HIGH);

}

}

"Ca ne marche pas" ça veut rien dire. C'est quoi qui ne marche pas ?

Salut,
voici un code qui marche chez moi (arduino uno), essaye :

int octetReception=0;
char caractereReception=0;
String chaineReception=" ";

//const int LED=2;

void setup(){
  Serial.begin(9600);
  //pinMode(LED, OUTPUT);
}

void loop(){

while (Serial.available()>0) {

        octetReception=Serial.read();
       
        if (octetReception==10) {
          Serial.print('\n');
          Serial.print("message : ");
          Serial.println(chaineReception);
          if (chaineReception=="LED=ON"){
                      //digitalWrite(LED, HIGH);
                      Serial.println("La led s'allume !");}
  
          if (chaineReception=="LED=OFF"){
                   //digitalWrite(LED, LOW);
                     Serial.println("La led s'eteint !");}
                     
          chaineReception="";
          break;}
        
        
        else { 
           caractereReception=char(octetReception);
           chaineReception=chaineReception+String(caractereReception);}
}


}

Par contre lorsque tu lui envoie "LED=ON" ou "LED=OFF", le tout premier message au lancement du programme ne marche pas...bizarre :roll_eyes: . Mais après tout fonctionne.

Dans ton code de départ t'as des "{" et "}" qui sont mal placés je crois.

salut merci pour ton code mais je n'arrive pas à le faire fonctionner
Lorsque je demande LED=ON plusieurs fois dans le terminal serie il inscrit bien mesage = led+on mais il ne l'allume pas???

Si tu as recopié la code sans essayer de le comprendre c'est pas trop étonnant qu'il ne fonctionne pas. Toutes les lignes concernant la LED sont en commentaire.
Et il attend la commande en majuscule.

Non j’ai enlevé les commentaire et le programme me semble juste
mais il ne fonctionne

Faut un peu chercher pourquoi il ne fonctionne pas.
Si par exemple tu mettais des Serial.print dans la partie construction de la chaîne comme ça

        else { 
           caractereReception=char(octetReception);
           Serial.println(caractereReception,HEX);
           chaineReception=chaineReception+String(caractereReception);
           Serial.println(chaineReception);}

Tu comprendrais peut être ce qui ne va pas.
Tu verrais que tu ne reçois jamais le caractère nouvelle ligne (10) qui est attendu pour marquer la fin de ligne par ce que le terminal et configuré par défaut pour envoyer le retour chariot (13).
Ce qui amène à la correction suivante

        if ((octetReception==10)||(octetReception==13)) {

Maintenant on interprète le message qu'il se termine par 10 ou par 13.

Ensuite pour le premier message qui n'est pas reconnu c'est par ce qu'il à un espace en trop au début. Conséquence de la création de la variable chaineReception avec un espace dedans.
Le programme corrigé

int octetReception=0;
char caractereReception=0;
String chaineReception="";

const int LED=13;

void setup(){
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop(){

  while (Serial.available()>0) {
    octetReception=Serial.read();

    if ((octetReception==10)||(octetReception==13)) {
      Serial.print('\n');
      Serial.print("message : ");
      Serial.println(chaineReception);
      if (chaineReception=="LED=ON"){
        digitalWrite(LED, HIGH);
        Serial.println("La led s'allume !");
      }

      if (chaineReception=="LED=OFF"){
        digitalWrite(LED, LOW);
        Serial.println("La led s'eteint !");
      }

      chaineReception="";
      break;
    }


    else { 
      caractereReception=char(octetReception);
      //Serial.println(caractereReception,HEX);
      chaineReception=chaineReception+String(caractereReception);
      //Serial.println(chaineReception);
    }
  }
}

Merci ton code marche
je ne comprend pas a quoi sert octet reception==13 enfin il fait marcher le programme ok mais à a quoi correspond t-il