Transmettre du texte Série -> LCD

Meilleur façon de s'y prendre ?

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Salut,

J'ai en projet actuellement de créer différents programmes (dans un but d'apprentissage) interfaçant une application écrite en C++ (avec Qt) et une carte Arduino (Uno), en utilisant la communication série.

J'aimerais ici pouvoir envoyer du texte depuis un UI vers un affichage LCD 16x2.

Du coup, au niveau de la programmation de la carte, pour l'instant j'ai ce programme, dont le but est de récupérer une chaîne de caractère et de l'afficher sur la 1ère ligne.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16, 2);

  Serial.begin(9600);

  lcd.print("Waiting..."); 


}

void loop()
{
   char data;
   String line1 = "";


   if(Serial.available())
   {
     // Tant que la chaine ne fait pas exactement la longueur de l'écran
     while(line1.length() < 16)
     {
       if(Serial.available())
       {
         data = Serial.read();
         line1 = String(line1 + data);   // On crée la chaine par concaténation succéssive
         line1.trim();                   // On retire les caratères invisibles, parce qu'ils sont bien chiant
         Serial.println(line1);          // Pour voir ce qui se passe
         Serial.println(line1.length()); // Idem
       }
     }
     Serial.read();

     line1.trim();  // On rappelle encore trim, juste au cas où.
     line1.replace('_', ' ');  // Pour pouvoir quand même afficher des espaces (qui sont enlevé avec trim), j'ai choisi de remplacer tout les '_' par des ' '
     Serial.println(line1); // Pour voir à quoi la chaine finale ressemble

     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print(line1);  // On affiche

     delay(500);
   }


   Serial.read();


}

Bon, ça marche, mais je me demande simplement s'il n'y a pas mieux comme solution, parce que celle-ci à des désavantages : - Si je veux écrire une chaine plus courte que 16 caractères, je dois "combler" jusqu'à en obtenir le bon nombre avec des '_' (ex : "Salut" -> "Salut_____") - si je veux pouvoir afficher sur la deuxième ligne, il me faudra un moyen de le dire (le code actuel ne prévoit rien)

En gros, je voudrais savoir s'il y a un moyen plus efficace de récupérer une chaîne de caractères avec la communication série que ce que je fais actuellement. Il y a des fonctions comme Serial.readByteUntil(), mais je ne comprend pas comment l'utiliser, elle ne parait pas répondre à ce que je veux.

Merci

+0 -0
Auteur du sujet

Yes, merci ! Je n'avais pas pensé à testé le dernier caractère de cette façon. La condition de mon while est donc maiontenant data != 13 (parce que data != '\n' ne marche pas, quand j'appuie sur entré ça fait un retour chariot ((13)10 selon ASCII, je ne sais pas à quoi correspond le '\n' exactement dans la table ASCII)). Ça marche bien.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/* ****************************************************** */
/* Envoie sur un écran LCD 16x2 une chaine de caractère   */
/* lu depuis la communication série                       */
/* Utilisation <line><messsage> (ex 1test_test_difie)     */
/* line = 0 ou 1, message = 16 caractères                 */
/* ****************************************************** */

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16, 2);
 
  Serial.begin(9600);
 
  lcd.print("Waiting..."); 
  
  
}

void loop()
{
   char data = ' ';
   byte line = 0;
   String line1 = "";

 
   if(Serial.available())
   {
     line = Serial.read() - 48;
     Serial.print("Line : ");
     Serial.println(line);
    
     
     while(data != 13)
     {
        if(Serial.available())
        {
          data = Serial.read();
          Serial.println(data, DEC);
          line1 = String(line1 + data);
          line1.trim();
          Serial.print(line1);            // Pour voir ce qui se passe
          Serial.print(" / ");            // Idem
          Serial.println(line1.length()); // Idem
        }
     }     
     
     
     Serial.read();
    
     line1.trim();  // On rappelle encore trim, juste au cas où.
     line1.replace('_', ' ');  // Pour pouvoir quand même afficher des espaces (qui sont enlevé avec trim), j'ai choisi de remplacer tout les '_' par des ' '
     Serial.print("Final string : ");
     Serial.println(line1); // Pour voir à quoi la chaine finale ressemble
     
     lcd.clear();
     lcd.setCursor(0, line);
     lcd.print(line1);  // On affiche
     
     delay(500);
   }
   
   
   Serial.read();
  
  
}

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte