Besoin d'aide sur fonction Serial.read()

Bonjour,
Pour débuter avec l’arduino, je suis parti sur la réalisation d’un distributeur de boisson. J’ai réussi à faire fonctionner la connexion bluetooth à l’arduino et les déclenchements des pompes suivants les cocktails commandés. MAIS car il y a un mais, je bloque sur une amélioration pour simplifier la transmission des données du smartphone à l’arduino. Mon code fonctionne bien si les cocktails sont codifiés 1, 2 3, ou a, b ,c , d mais je voudrais que la codification corresponde aux trois premières lettres du cocktail, exemple pour le cocktail Alabama dans MIT App la fonction est Appeler Bluetooth Envoyer Texte : ala, pour un moijto ce sera moj.
Mais ca ne marche pas. Mon erreur vient du parametrage dans le code arduino. Si j’ai bien compris le Serial.Read ne lit que le premier caractère et non pas les 3. Le Serial.readString ne fait un code erreur. J’ai besoin d’un coup de main pour m’aider pour pouvoir faire lire un groupe de 3 caractères à mon arduino pour qu’il suive un cycle de démarrage de pompe.
Voici mon code de test…qui ne fonctionne pas. Il ne doit pas manquer grand chose mais là je bloque. Merci d’avance de vos réponses.
Peut-etre le problème ne vient-il pas de Serail.read mais d’un autre ligne, je ne sais plus…

#include <SoftwareSerial.h>
SoftwareSerial HC05(0,1);




void setup()
{
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT); // led  sur sortie 10
 Serial.begin(9600); // blth en 9600


   digitalWrite(2,HIGH);
   digitalWrite(3,HIGH);
   digitalWrite(4,HIGH);
   digitalWrite(5,HIGH);
   digitalWrite(6,HIGH);
   digitalWrite(7,HIGH);
   digitalWrite(8,HIGH);
   digitalWrite(9,HIGH);
   //digitalWrite(ROUGE,HIGH);
}


void loop()
{


 while (Serial.available() == 0);
 char b = Serial.read();
 if (b == "ala")
 {
   digitalWrite(2, LOW);          //pompe 1
     delay(1000);
     digitalWrite(2, HIGH);
    delay(1500);
    digitalWrite(3, LOW);          //pompe 2
     delay(2000);
     digitalWrite(3, HIGH);
    delay(1500);
    digitalWrite(4, LOW);          //pompe 3
     delay(3000);
     digitalWrite(4, HIGH);
    delay(1500);
    digitalWrite(5, LOW);          //pompe 4
     delay(4000);
     digitalWrite(5, HIGH);
    delay(1500);
    digitalWrite(6, LOW);          //pompe 5
     delay(5000);
     digitalWrite(6, HIGH);
    delay(1500);
    digitalWrite(7, LOW);          //pompe 6
     delay(6000);
     digitalWrite(7, HIGH);
    delay(1500);
    digitalWrite(8, LOW);          //pompe 7
     delay(7000);
     digitalWrite(8, HIGH);
    delay(1500);
    digitalWrite(9, LOW);          //pompe 8
     delay(8000);
     digitalWrite(9, HIGH);
    delay(1500);
    digitalWrite(10, LOW);          //pompe 8
     delay(4000);
     digitalWrite(10, HIGH);
    delay(1500);
 }
 if (b == "moj")
 {
   digitalWrite(2, HIGH);          //pompe 1
     delay(544);
   digitalWrite(2, LOW);
    delay(1500);
    digitalWrite(3, HIGH);          //pompe 1
     delay(1088);
   digitalWrite(3, LOW);
    delay(1500);
    digitalWrite(6, HIGH);          //pompe 1
     delay(3000);
   digitalWrite(6, LOW);
    delay(1500);
    digitalWrite(8, HIGH);          //pompe 1
     delay(1750);
   digitalWrite(8, LOW);
    delay(1500);
 }
 delay(100);
}

Vous pouvez jeter un oeil à mon petit tuto sur le sujet. il y a du code pour écouter une entrée série "correctement"

———— SVP ————
corrigez votre post ci dessus et rajoutez les balises de code autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

(lisez les messages épinglés en haut du forum)

Salut,
Si tu sais que tu as toujours trois lettres pour définir ta boisson, tu peux essayer :

char rcpA, rcpB, rcpC;
int boucle = 0;

while (Serial.available() == 0);
{
  // on récupére les 3 lettres reçues
  while (boucle < 3)
  {
    if (boucle == 0)  { rcpA = Serial.read(); }
    if (boucle == 1)  { rcpB = Serial.read(); }
    if (boucle == 2)  { rcpC = Serial.read(); }
    boucle ++;
  }
}
// on concatène les trois lettres ensemble
String recepA = rcpA;
String recepB = rcpB;
String recepC = rcpC;
String reception = recepA + recepB + recepC;

// on les compare à tes choix
if (b == "ala")
{
...
}

mskna17:
Salut,
Si tu sais que tu as toujours trois lettres pour définir ta boisson, tu peux essayer....

Il ne faut faire read() que quand il ya quelque chose à lire... et un switch/case ne fonctionne pas sur le Strings... il faut une valeur numérique constante.

donc non...

Merci JML, j'ai corrigé mon post et je vais essayer de comprendre les tutos mais je débuté et il y a des termes que je n'ai pas encore bien acquis.
Merci mskna17 de ta réponse. Oui j'aurais toujours 3 lettres mais d'après JML ta solution ne pourra pas fonctionner.

Je viens de le modifier pour me corriger, si tu veux tester …

mskna17:
Je viens de le modifier pour me corriger, si tu veux tester …

c’est pas cool de modifier un code après qu’il y ait eu des commentaires car on ne peut plus suivre le fil de discussion.

votre code est incomplet, il faudra appeler la fonction de lecture que quand il y aura 3 données à lire (read() n’est pas bloquant)…

le plus simple serait que l’émission de la demande soit terminée par un passage à la ligne par exemple, comme cela ça permet à l’arduino de savoir qu’il a reçu l’intégralité de la commande et il n’ya pas besoin de se limiter à 3 caractères, commander un Alabama pourrait se faire en envoyant “Alabama\n”

#include <SoftwareSerial.h>
SoftwareSerial HC05(2, 3);


const byte tailleMessageMax = 50;
char message[tailleMessageMax + 1]; // +1 car on doit avoir un caractère de fin de chaîne en C, le '\0'
const char marqueurDeFin = '\n';

boolean commandeDisponible()
{
  static byte indexMessage = 0; // static pour se souvenir de cette variable entre 2 appels consécutifs. initialisée qu'une seule fois.
  boolean messageEnCours = true;

  while (HC05.available() && messageEnCours) {
    int c = HC05.read();
    if (c != -1) {
      switch (c) {
        case marqueurDeFin:
          message[indexMessage] = '\0'; // on termine la c-string
          indexMessage = 0; // on se remet au début pour la prochaine fois
          messageEnCours = false;
          break;
        case '\r': break; // ignoré
        default:
          if (indexMessage <= tailleMessageMax - 1) message[indexMessage++] = (char) c; // on stocke le caractère et on passe à la case suivante
          break;
      }
    }
  }
  return !messageEnCours;
}

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

void loop() {
  if (commandeDisponible()) {
    Serial.print(F("Commande à Analyser: "));
    Serial.println(message);
  }
}

à noter que c’est idiot de faire

#include <SoftwareSerial.h>
SoftwareSerial HC05(0, 1);

car les pins 0 et 1 sont le port série matériel Serial… donc si vous voulez conserver le port série lié à l’USB, passez les en 2 et 3 par exemple

#include <SoftwareSerial.h>
SoftwareSerial HC05(0, 1);
String commande;

bool lectureCommande()
{
  // à écrire
}


void setup() {
  commande.reserve(50);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT); // led  sur sortie 10
  Serial.begin(9600); // blth en 9600

  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  //digitalWrite(ROUGE,HIGH);
}


void loop()
{
  if (lectureCommande()) 
  {
    if (commande == "alabama") 
    {
      digitalWrite(2, LOW);          //pompe 1
      delay(1000);
      digitalWrite(2, HIGH);
      delay(1500);
      digitalWrite(3, LOW);          //pompe 2
      delay(2000);
      digitalWrite(3, HIGH);
      delay(1500);
      digitalWrite(4, LOW);          //pompe 3
      delay(3000);
      digitalWrite(4, HIGH);
      delay(1500);
      digitalWrite(5, LOW);          //pompe 4
      delay(4000);
      digitalWrite(5, HIGH);
      delay(1500);
      digitalWrite(6, LOW);          //pompe 5
      delay(5000);
      digitalWrite(6, HIGH);
      delay(1500);
      digitalWrite(7, LOW);          //pompe 6
      delay(6000);
      digitalWrite(7, HIGH);
      delay(1500);
      digitalWrite(8, LOW);          //pompe 7
      delay(7000);
      digitalWrite(8, HIGH);
      delay(1500);
      digitalWrite(9, LOW);          //pompe 8
      delay(8000);
      digitalWrite(9, HIGH);
      delay(1500);
      digitalWrite(10, LOW);          //pompe 8
      delay(4000);
      digitalWrite(10, HIGH);
      delay(1500);
    } else if (commande == "mojito") 
    {
      digitalWrite(2, HIGH);          //pompe 1
      delay(544);
      digitalWrite(2, LOW);
      delay(1500);
      digitalWrite(3, HIGH);          //pompe 1
      delay(1088);
      digitalWrite(3, LOW);
      delay(1500);
      digitalWrite(6, HIGH);          //pompe 1
      delay(3000);
      digitalWrite(6, LOW);
      delay(1500);
      digitalWrite(8, HIGH);          //pompe 1
      delay(1750);
      digitalWrite(8, LOW);
      delay(1500);
    }
  }
}

JML, merci pour votre coup de main. J’essaie de comprendre le code mais je débute vraiment. J’ai compris la ligne .reserve mais je ne sais pas ce que je dois écrire dans le bool lectureCommande. Ci-dessus mon adaptation de votre code tel que je comprends mais sans le boll. Le reste est juste? Merci.

il faudrait lire le tuto...

relisez le post 6 car j'avais posté un autre code et fait une remarque

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.