[Non réglé]Besoin d'aide communication arduino

Bonjour à tous,

Cela fait 2,3 jours que j'ai commencé arduino (carte Uno) et j'aurai besoin un peu d'aide, J'aimerai pouvoir commander mon programme arduino de manière a ce que
sur mon moniteur il y ai marqué quelque chose du type "taper 'facile' pour commencer le niveau 1 ou 'difficile' pour commencer le niveau 2" et qu'en fonction de ce que je tape, cela m'envoie vers tel ou tel partie de mon programme

en m'inspirant de codes existants, j'étais partie sur un truc du genre:

String lu = "";
void setup() {
Serial.begin(9600);
}

void level1(){
  Serial.print("bonjour");}
void level2(){
  Serial.print("Aurevoir");}

  
void loop() {

  while (lu != "facile" || lu != "difficile") {
    lu= "";
  }
  while (Serial.available()>0){
    char ch= Serial.read();
    delay(30);
    lu += ch;
    Serial.print(lu);
  }
  if (lu == "facile"){
    level1();
      }
  if (lu =="difficile"){
        level2();
      }
  }

Mais rien de très convaincant, est ce que l'un de vous pourrais m'aider svp
Merci d'avance, bonne fin de week end

note: j'ai encore du mal avec l'utilisation de chaque type de variable ainsi que la syntaxe etc
avant que l'on me tombe dessus, je sais qu'il doit exister des topics posant peut etre exactement la meme question que moi mais je ne suis pas tombé dessus ou je n'ai pas réussi à comprendre les explications données...merci aux plus indulgents

Ajoute un Serial.println(lu) ; juste avant le delay pour voir ce qui est lu...

melmelmel:
Bonjour à tous

je demande un peu d'aide, J'aimerai pouvoir commander mon programme arduino de manière a ce que
sur mon moniteur il y ai marqué quelque chose du type "taper 'facile' pour commencer le niveau 1 ou 'difficile' pour commencer le niveau 2" et qu'en fonction de ce que je tape, en m'envoie vers tel ou tel partie de mon programme

en m'inspirant de codes existants, j'étais partie sur un truc du genre:

String lu = "";
void loop() {

while (lu != "facile" || lu != "difficile") {
lu = "";
while (Serial.available() > 0) { //tant qu'on a pas parcouru le mot tapé dans le moniteur??
char ch = Serial.read();
lu += ch;
delay (10); }
}
}

Mais rien de très convaincant, est ce que l'un de vous pourrais m'aider svp
Merci d'avance, bonne fin de week end

note: Je n'ai que 2,3 jours d'arduino j'ai encore du mal avec l'utilisation de chaque type de variable ainsi que la syntaxe etc
avant que l'on me tombe dessus, je sais qu'il doit exister des topics posant peut etre exactement la meme question que moi mais je ne suis pas tombé dessus ou je n'ai pas réussi à comprendre les explications données...merci aux plus indulgents

bonjour
Comme je suppose que tu n’a même pas pris le temps de le faire !
Il est surement tres urgent pour toi de lire cela :grin:

Artouste:
bonjour
Comme je suppose que tu n’a même pas pris le temps de le faire !
Il est surement tres urgent pour toi de lire cela :grin:

Bonjour Artouste,
il est vrai que dans "l'urgence" j'ai directement publié mon message sans avoir regardé les règles du forum
merci pour l'attention

Bonjour,

tu présentes 2 codes différents, lequel tu aimerais qu'on regarde ?

supercc:
Bonjour,

tu présentes 2 codes différents, lequel tu aimerais qu'on regarde ?

Oui désolé, j'avais modifié mon premier car il n'était même pas compilé
Celui que j'ai actuellement c'est celui lié au post suivant:

melmelmel:
Bonjour à tous,

Cela fait 2,3 jours que j'ai commencé arduino (carte Uno) et j'aurai besoin un peu d'aide, J'aimerai pouvoir commander mon programme arduino de manière a ce que
sur mon moniteur il y ai marqué quelque chose du type "taper 'facile' pour commencer le niveau 1 ou 'difficile' pour commencer le niveau 2" et qu'en fonction de ce que je tape, cela m'envoie vers tel ou tel partie de mon programme

en m'inspirant de codes existants, j'étais partie sur un truc du genre:

String lu = "";

void setup() {
Serial.begin(9600);
}

void level1(){
  Serial.print("bonjour");}
void level2(){
  Serial.print("Aurevoir");}

void loop() {

while (lu != "facile" || lu != "difficile") {
    lu= "";
  }
  while (Serial.available()>0){
    char ch= Serial.read();
    delay(30);
    lu += ch;
    Serial.print(lu);
  }
  if (lu == "facile"){
    level1();
      }
  if (lu =="difficile"){
        level2();
      }
  }




Merci d'avance

Tu ne passes jamais ta première boucle car le test est et restera toujours vrai.

while (lu != "facile" || lu != "difficile") {
   lu= "";
}
[/quode]

Je pense que tu voulais écrire :

[code] 
if (lu != "facile" || lu != "difficile") {
   lu= "";
}
[/quode]

+1 avec supercc. Je pense qu'on peut simplifier comme suit :

void loop() {
  while (Serial.available()>0){
    char ch= Serial.read();
    delay(30);
    lu += ch;
    Serial.print(lu);
  }
  if (lu == "facile"){
    level1();
    lu = "";
      }
  if (lu =="difficile"){
    level2();
    lu = "";
      }
  }

supercc:
Tu ne passes jamais ta première boucle car le test est et restera toujours vrai.

En effet, Supercc, tu as raison le while n'est pas adapté ici :roll_eyes: merci à toi

Merci Lesept pour l'arrangement du code

lesept:
+1 avec supercc. Je pense qu'on peut simplifier comme suit :

void loop() {

while (Serial.available()>0){
    char ch= Serial.read();
    delay(30);
    lu += ch;
    Serial.print(lu);
  }
  if (lu == "facile"){
    level1();
    lu = "";
      }
  if (lu =="difficile"){
    level2();
    lu = "";
      }
  }

Je viens de le tester, mais je ne sais pas pourquoi je n'arrive toujours pas à appeler mon niveau 1 et 2.
Lorsque je tape un mot, par exemple "ok" cela me double les lettres et me renvoie "ook" ou bien plusieurs lignes de "oookkk"
De meme lorsque je tape "difficile" ou "facile" j'ai ce meme probleme de doublage delettre et non l'appel des fonctions void level1() et void level2()
A quoi est ce du, et comment y remédier?

vous devriez séparer l’entrée de la commande de son traitement

→ lire éventuellement mon tuto Ecouter le Port Série ça devrait vous permettre de réaliser ce que vous voulez très simplement avec le code du post #5

En parallèle de la bonne manière de gérer la lecture sur le port série proposée par J-M-L, je vais continuer à corriger ton programme, ou du moins mettre le doigt là où il "coince" (aie !).

  1. si tu rentres un mauvais mot, lu ne sera pas vidé ("") et tu ne feras qu'ajouter des caractères à lu. Pour corriger cela initialise lu à "" avant d'entrée dans la boucle de lecture

  2. en fait, en fonction de comment tu as configuré la fin de ligne dans le moniteur série sous arduino 0, 1 ou plusieurs caractères sont ajoutés comme marque de fin de ligne (et donc dans le mot lu). Dans ton cas il suffit de configurer "Pas de fin de ligne" puisque tu ne les gères pas du coté arduino.

Ton programme va fonctionner mais il ne sera pas optimal.

melmelmel:
Lorsque je tape un mot, par exemple "ok" cela me double les lettres et me renvoie "ook" ou bien plusieurs lignes de "oookkk"

C’est tout à fait normal puisque vous affichez la variable lu à chaque fois que vous y ajoutez un caractère et vous avez rentré j’imagine votre mot d’un coup

Par exemple si vous tapez OK et que vous validez

La boucle voit un caractère au moins et lit le O et afffiche O
La boucle voit encore un caractère et lit le K et affiche OK
Mais comme vous n’avez Pas de passage à la ligne et que ça va super vite vous voyez dans la console OOK —> sans les couleurs bien sûr ça correspond au [b]OOK[/b] que vous voyez

Compris ?

J-M-L:
vous devriez séparer l'entrée de la commande de son traitement

Qu'entendez vous par là?

supercc:

  1. si tu rentres un mauvais mot, lu ne sera pas vidé ("") et tu ne feras qu'ajouter des caractères à lu. Pour corriger cela initialise lu à "" avant d'entrée dans la boucle de lecture

Merci pour l'indication, il est vrai je n'avais pas réalisé qu'avec Serial.read() j'empilais les lettres une a une tout en affichant le tout a chaque tour de boucle.

J-M-L:
La boucle voit un caractère au moins et lit le O et afffiche O
La boucle voit encore un caractère et lit le K et affiche OK
Mais comme vous n’avez Pas de passage à la ligne et que ça va super vite vous voyez dans la console OOK —> sans les couleurs bien sûr ça correspond au [b]OOK[/b] que vous voyez

Ce que justement vous, J-M-L, m'avez parfaitement illustré

melmelmel:
Qu'entendez vous par là?

Lisez mon tuto pointé plus haut