Problème afficheur moniteur série sur écran LCD

Bonjour à tous,

Je suis actuellement sur un projet qui consiste à transmettre des données par infrarouge. Pour tester, j'envoie un texte ("Bonjour") avec un arduino Uno. Un Arduino Nano s'occupe de "lire" le message et de l'afficher sur le moniteur en série.
On a donc ça:

[Arduino Uno]--->[LED IR 940nm] - - - - -> [Photodiode IR 940nm]--->[Arduino Nano] ---> [Moniteur série]

Jusque là, tout marche très bien, j'ai bien le texte "bonjour" qui s'affiche dans le moniteur en série... Le problème, c'est quand je rajoute un afficheur 16*2: le moniteur en série affiche "BojuBojuBojuBojuBojuBojuBojuBoju..." et l'afficheur LCD affiche ceci... Je ne vois pas trop comment éviter cela (après je suis débutant, donc l'erreur est peut-être évidente). Pourriez-vous m'aider svp? Merci d'avance! :smiley:

Voici le code du récepteur SANS l'afficheur LCD:

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial XSERIAL =  SoftwareSerial(rxPin, txPin, false);

void setup()  
{
   XSERIAL.begin(9600);

   Serial.begin(9600);

   Serial.println("Patientez...");
}

void loop() 
{
  if (XSERIAL.available())
  {
      Serial.print((char)XSERIAL.read());
  }
}

Voici le code du récepteur AVEC l'afficheur LCD:

#include <SoftwareSerial.h>
#include "LiquidCrystal.h"

#define rxPin 2
#define txPin 3

SoftwareSerial XSERIAL =  SoftwareSerial(rxPin, txPin, false);

LiquidCrystal lcd(12,11,10,9,8,7);



void setup()  
{
   XSERIAL.begin(9600);

   Serial.begin(9600);

   Serial.println("Patientez...");

   lcd.begin(16,2);
}

void loop() 
{
  if (XSERIAL.available())
  {
      Serial.print((char)XSERIAL.read());
      lcd.print((char)XSERIAL.read());
      
  }
}

Si cela peut vous aider, voici le code de l'émetteur:

#include <SoftwareSerial.h>

#define rxPin 3  
#define txPin 4  

SoftwareSerial XSERIAL =  SoftwareSerial(rxPin, txPin);

void setup()  
{
     XSERIAL.begin(9600);
     pinMode(13, OUTPUT);
}

void loop() 
{ 
    XSERIAL.println("Bonjour");
    delay(950);  
    
   digitalWrite(13, HIGH);   
   delay(50);              
   digitalWrite(13, LOW);    
}

Vous pouvez télécharger la bibliothèque ici

P.S: j'ai testé l'afficheur avec un simple texte et il marche très bien. J'ai essayé de mettre un lcd.clear() mais ça fait encore plus n'importe quoi...

Dans votre récepteur quand vous avez reçu un caractère vous Le lisez deux fois par un XSERIAL.read()... ça ne va pas fonctionner car le premier read va enlever le caractère du buffer et donc s'il y en a déjà un autre arrivé Le second read va prendre le caractère suivant, sinon retourner -1 qui sera vu comme un 0xFF à afficher

Mettez dans une variable Le caractère lu quand il est dispo et ensuite envoyez cet variable sur la console et sur le LCD - comme cela il n'y aura qu'un seul read()

Merci beaucoup pour ton aide!

Finalement j'ai trouvé une solution qui m'évite d'utiliser le moniteur série.

Bonne journée