Serial avec un écran lcd

Bonsoir,

Je réalise ne se moment un project avec un arduino uno, 2 boutons poussoir et un écran lcd.

L'idée c'est que lorsque j'appui sur un bouton, il envoi sur le port de série un chiffre ex(65), puis l'arduino récupère ce chiffre sur le port de série puis l'affiche sur l'ecran lcd.

Le souci c'est que je vois sur le moniteur de série que les boutons transmettent l'info au port de série mais les infos ne s'affiche pas sur l'écran lcd. Il s'affiche uniquement si je tape une commande dans le moniteur de série.

Pourquoi ?
Es ce que 1 seul arduino peut envoyer une info sur le port série et la récupérer l'utilisé ?
Avez-vous une idée?

Voici une parti du code:

 void setup() {            // debut de la fonction setup() 

      pinMode (led1, OUTPUT);
      pinMode (led, OUTPUT);
      pinMode (bouton1Pin, INPUT);
      pinMode (bouton2Pin, INPUT);
      Serial.begin(9600);
      
       
      lcd.begin(16, 2);        // Initialise le LCD avec 16 colonnes x 2 lignes 
      delay(10);                  // pause rapide pour laisser temps de l'initialisation 
      
      // Test de l'afficheur
      lcd.setCursor(0,0); 
      lcd.print(" Initialisation ") ; 
      lcd.setCursor(0,1);
      lcd.print("       OK       ");
      delay(2000);              // pause de 2 secondes 
      lcd.clear();                // efface l'écran et met le curseur en haut à gauche 
      delay(10);            // pour laisser temps d'exécuter le Clear()
                                                                               
     }            
      
      void loop(){
        if(Serial.available()>0){

          char info = Serial.read();
          lcd.clear();
          lcd.setCursor(6,1);
          lcd.print(info);
          lcd.setCursor(0,0);
          lcd.print(" Transmission ");
          digitalWrite(led1, HIGH);
          delay(1000);
          lcd.clear();
          delay(10);

          if (info == 60){
              digitalWrite(led, HIGH);
              delay(100);
              digitalWrite(led, LOW);
              delay(100);
              digitalWrite(led, HIGH);
              delay(100);
              digitalWrite(led, LOW);
              delay(100);
              digitalWrite(led, HIGH);
              delay(100);
              digitalWrite(led, LOW);
              delay(100);
              digitalWrite(led, HIGH);
              lcd.print("   Connecter !   ");
              delay(2000);
              lcd.clear();
              delay(10);            
          }
        }
          else{
          digitalWrite(led1, LOW);
          lcd.setCursor(0,1);
          lcd.print("    Lecture    ");
          }
          

  bouton1etat = digitalRead(bouton1Pin);
  if(bouton1etat != lastbouton1etat){
    
  if(bouton1etat==HIGH){
  Serial.write(65); // send a byte with the value 65
  }
  else{
  Serial.write(66);
  }
  lastbouton1etat = bouton1etat;
  }

Salut

Je ne comprends vraiment pas ce que tu cherches à faire.
Tu appuies sur un bouton. OK. Tu envoies 65 (A) sur la ligne série. OK.

Et puis après ? ce n'est pas parce que l'ARDUINO envoie un caractère sur la ligne série qu'il va le recevoir en retour.
Une ligne série comporte deux fils. Un fil de transmission et un fil de réception.
Je suppose qu'à l'autre bout de la ligne série il y a ton PC avec un moniteur série ou un terminal ?

Ce qui est transmis par l'ARDUINO est reçu par le terminal, qui l'affiche, point final. Cela s'arrête là.
A moins que le terminal soit configuré pour faire l'écho et renvoyer ce qu'il reçoit ...
Mais le moniteur série ARDUINO ne sait pas faire ça.

Sois plus clair sur ce que tu cherches à réaliser.

@+

Il ne faut pas 10ms au clear pour s’executerdelay(10);            // pour laisser temps d'exécuter le Clear(). Ce delay ne sert à rien

Sinon +1 avec hbachetti - ce que vous envoyez sur le port série ne revient pas sauf si vous avez mis Rx sur Tx…

Merci pour ta réponse, effectivement, le moniteur de série ne fait pas echo donc cela ne peut pas fonctionner.

Je voulais juste s'avoir si c'était possible avec un seul arduino, d'envoyer une info sur le port de série puis de la récupérer. Mais en réfléchissent un peu plus ça me parait logique !

Mais lorsque je réalise le montage avec 2 arduino, il suffit programmer le second arduino pour qu'il revoie l'info reçu sur le port de série. Puis le premier arduino traite l'info pour l'afficher sur l'écran lcd.

Pas de problème.
Avec ou sans PC ?
Sans PC il suffit de relier ensemble RX et TX comme JML le dit.
Sinon, avec un PC, il faut utiliser un vrai terminal et activer la fonction ECHO.
Sinon, laisse le deuxième ARDUINO, il fera la même chose.

C'était sans PC, donc il fallait que je relier les broche Tx et Rx. Et ça fonctionne !

Dite-moi, c'est possible d'afficher plusieurs caractères à la suite sur l'écran lcd ? Car si on écrit "bonjour" dans le moniteur de série, il affiche sur l'écran lettre par lettre : b puis o puis n puis j ect...

Oui mais il faudrait que tu stockes dans une chaîne les caractères au fur et à mesure que tu les reçois jusqu'à recevoir le dernier, et envoyer la chaîne à l'afficheur.
Et la seule manière de signaler que c'est le dernier caractère est d'en envoyer un de plus : le retour chariot (la touche entrée sur le clavier).

Lorsque j'écrit Arduino dans moniteur de série, il l'affiche sur l'écran lettre par lettre.

Video ici - V_20180918_235217.mp4 - Google Drive

Il faut stocker, et envoyer sur réception du retour chariot :

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

char buffer[32];
int index;

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available() > 0) {
    char c = Serial.read();
    if (c == '\r') {
      Serial.print("buffer=");
      Serial.println(buffer);
      memset(buffer, 0, 32);
      index = 0;
    }
    else if (index < 32) {
      buffer[index++] = c;
    }
  }
}

Mais c’est un moyen parmi d’autres.

@+

JustinPirolley:
Lorsque j'écrit Arduino dans moniteur de série, il l'affiche sur l'écran lettre par lettre.

Bonjour,

C'est normal car dans ton programme tu as mis un delai d'une seconde entre chaque réception de caractère.

Bonjour,

Merci pour le code hybachetti.
J’essai de le comprendre mais il y a 2 fonctions que je n’arrive pas a traduire.

if (c == '\r')
else if (index < 32) {
      buffer[index++] = c;
    }

JustinPirolley:
J’essaye de le comprendre mais il y a 2 fonctions que je n’arrive pas a traduire.

if (c == '\r')

→ si le caractère reçu est un retour chariot alors… (quand on tape sous le moniteur série bien souvent il est configuré pour envoyer un retour chariot et une nouvelle ligne (2 caractères) à la fin quand vous pressez “enter”

JustinPirolley:

else if (index < 32) {

buffer[index++] = c;
    }

c’est pour ne pas dépasser la place réservée dans le buffer. si l’index où je vais écrire est plus petit que celui de la dernière case disponible, alors j’écris dans cette case le caractère, puis j’incrémente index

Le ++ après la variable dit d’utiliser l’ancienne valeur dans le tableau mais d’augmenter index

Super ! j'ai compris :wink:

Il me semble que le moniteur de l'IDE n'envoie les caractères que lors de l'appui sur ENTER, ce qui normalement devrait te dispenser de stocker les caractères en attendant l'appui sur ENTREE.
Par contre un vrai terminal envoie les caractères au fur et à mesure qu'ils sont entrés, et là cela devient obligatoire.
En tous cas supprime

Il y a par contre un point que je comprends pas.
Tu envoies des caractères depuis le moniteur série, caractères qui sont reçus par l'ARDUINO. OK.
D'un autre côté lors de l'appui sur un bouton tu envoies 65 (A). Si le bouton est relâché tu envoies 66 (B), ceci en rafale puisque la loop ne va pas arrêter d'envoyer l'un ou l'autre.

Comme je le disais plus haut :

Sois plus clair sur ce que tu cherches à réaliser.

@+

L'arduino ne lit pas en rafale l'état du bouton car il sauvegarde l'état du bouton et fait une comparaison par rapport au dernier état du bouton lu.

Il y a quelque mois de cela, j'ai fait un topic car j'avais pour project de crée une table de tir avec une module emetteur (avec 40 boutons) et et module recepteur (avec 40 relais) tout cela relié en liaison série. Liaison I2C entre arduino et carte relais - Français - Arduino Forum

On m'avais dit que pour ne pas envoyer en rafale (65), il fallait sauvegarder l'état du bouton.
Après quelques recherche j'ai trouver un code qui permet de faire cela :

  bouton1etat = digitalRead(bouton1Pin);
  if(bouton1etat != lastbouton1etat){
    
  if(bouton1etat==HIGH){
  Serial.write(65); // send a byte with the value 65
  }
  else{
  Serial.write(66);
  }
  lastbouton1etat = bouton1etat;
  }

J'ai pour but finale, d'incorporer l'écran lcd dans le module émetteur. Les informations transmisent sur l'écran seront :

  • la liaison établie ou pas avec le ou les modules récepteur
  • le mode 'TIR' du ou des modules récepteur activé ou pas
  • la dernière ligne que j'ai tiré avec un chrono

Au rebonds près. OK.

Bonjour, comment je peux utiliser un afficheur lcd NHD-0216B3Z-FL-GBW-V3 sur arduino?
sachant que j'utilise 3 pins seulement de mon afficheur (GND, Vcc et Rx)?

À lire la doc en diagonale, le composant série supporte SPI, I2C ou ce qu’ils appellent RS-232(TTL) apparement

Jetez un oeil à cette librairie ou à cette discussion

D'accord, merci :slight_smile: