Go Down

Topic: Question sur La communication via l'usb (Read 934 times) previous topic - next topic

ounet

Bonjour, je suis nouveau sur l'utilisation de l'arduino et je suis confronté au problème suivant. Je passe via un plugins les "mots" suivant via l'usb de mon mac vers l'arduino : "Speedbrake Arm" ou "Speedbrake Full".

Ensuite l'arduino doir afficher sur l'ecran lcd 20*2 soit Speedbrake Arm ou Speedbrake Full.

Cela fonctionne mais pas de la manière que je souhaite.

En effet je dois activer le serial monitor de l'arduino, ensuite envoyer l'info Speedbrake Arm -> le lcd affiche bien Arm. Mais ensuite pour afficher Full je dois fermer le serial monitor et le relancer puis lorsque j'envoie Speedbrake Full alors full s'affiche correctement.

savez vous pourquoi ? comment faire pour que je puisse envoyer soit arm ou full afin d'afficher les bonne info sur l'afficheur ???? chaque fois que je le souhaite.

Voici le code si jamais qqu'un peu m'aider.

Merci

Ounet

#include <stdio.h>
#include <string.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ledPin = 13;
char indata[30];
int count = 0;

void setup ()
{
 pinMode(ledPin,OUTPUT);
 Serial.begin(115200);
 lcd.begin(20, 2);
 lcd.setCursor(0, 0);
 lcd.print("Speed Brake Value");
}

void loop()
{20
 digitalWrite(ledPin,LOW);
 while (Serial.available() > 0)
 {
   char incomingByte = Serial.read ();
   if(count < 29)
   {
      indata[count] = incomingByte;
      count ++;
     indata[count] = '\0';  
   }
 }
 if ( strcmp (indata,"Speedbrake Full") ==  0)
 {
   //Serial.println("full");
   lcd.setCursor(0, 1);
   lcd.print("Speedbrake Full");
   digitalWrite(ledPin,HIGH);
   delay(2000);
   digitalWrite(ledPin,LOW);
   count =0;
   indata[count] = '\0';
 }
 if ( strcmp (indata,"Speedbrake Arm") ==  0)
 {
   //Serial.println("arm");
   lcd.setCursor(0, 1);
   lcd.print("Speedbrake Arm");
   digitalWrite(ledPin,HIGH);
   delay(1000);
   digitalWrite(ledPin,LOW);
   delay(1000);
   digitalWrite(ledPin,HIGH);
   count =0;
   indata[count] = '\0';
 }
 indata[count] = '\0';
}

fdufnews

En première analyse le code semble bon. A une exception près, si pour une raison ou pour une autre indata atteint 29 caractères, tu ne fais plus rien.

N'y aurait-il pas un problème avec le serial monitor sur MAC?
Peux-tu essayer avec un autre programme d'émulation de terminal sur mac ou sur une autre machine?

Autre possibilité, tu te fais avoir par le retour chariot qui est envoyé à la fin de la première chaine. Il reste dans indata et tu envois la nouvelle chaine derrière. Donc le programme se bloque puisque le strcmp ne renvoie jamais 0. Et lorsque tu relances serial monitor tu reinitialises ta carte Arduino.

ounet

Merci beaucoup pour votre aide.

Voila le resultat

http://www.youtube.com/watch?v=FShAmHBxd_k

jean-marc

Go Up