Connexions de l'afficheur au Pinguino
J'ai utilisé le mode 4 bits, question d'économiser quelques pins sur le Pinguino, ça peut toujours être utile pour brancher autre chose.
Tel qu'illustré ci-dessus, les branchements sont:
LCD GND - Pinguino GND
LCD Vcc - Pinguino 5 V
LCD V0 - Curseur d'un potentiomètre allant de 0 à 5 V (ajustement du contraste)
LCD Rs - Pinguino pin 0
LCD R/W - Pinguino GND
LCD E - Pinguino pin 1
LCD D0 - pas branché
LCD D1 - pas branché
LCD D2 - pas branché
LCD D3 - pas branché
LCD D4 - Pinguino pin 2
LCD D5 - Pinguino pin 3
LCD D6 - Pinguino pin 4
LCD D7 - Pinguino pin 5
Pour connaître la numérotation des entrées/sorties de votre modèle de Pinguino, référez-vous au site pinguino.cc (pour cette expérience, j'ai utilisé un Pinguino 4550).
Côté logiciel, un sketch destiné à l'Arduino ne nécessitera que quelques rares modifications pour fonctionner correctement avec le Pinguino. La principale différence, à mon avis, c'est qu'avec Pinguino la fonction lcd.print ne fonctionne que pour afficher des strings, alors qu'avec Arduino on peut tout aussi bien lui passer un nombre en argument. Il existe pour Pinguino la fonction lcd.printNumber, mais d'après ce que j'ai constaté elle ne fonctionne que pour des nombres entiers.
Pour afficher une valeur décimale non-entière, on doit donc utiliser la fonction lcd.printf. Les programmeurs expérimentés en langage C sont familiers avec printf, dont la syntaxe est loin d'être conviviale, à mon avis. Ainsi, pour afficher "Tension: 2,01 V" , où 2,01 est le contenu d'une variable de type float intitulée "nombre", j'ai dû écrire:
lcd.printf("Tension: %04f V", nombre);
Le symbole "%" indique l'endroit où le contenu de la variable sera inséré à l'intérieur du string, "04" permet de régler le nombre de décimales qui seront affichées, et "f" indique que la variable est de type float.
Ça fonctionne, mais sur cet aspect je préfère de loin la convivialité de la syntaxe Arduino!
Voici donc l'adaptation pour le Pinguino d'un sketch que j'avais utilisé pour l'Arduino il y a quelques années: l'afficheur LCD indique en volts la tension à l'entrée analogique 1 du Pinguino. Sur la deuxième ligne, une jauge de type "bar graph" ajoute une information visuelle supplémentaire.
La tension à l'entrée analogique 1 du Pinguino peut provenir, par exemple, d'un potentiomètre.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************** | |
LCD Bargraph | |
La tension mesurée sur la pin A0 du Pinguino est affichée sur un LCD | |
16 X 2. Un bargraphe offre également une représentation visuelle de | |
la mesure. | |
Branchements du LCD: | |
* LCD RS pin : digital pin 0 | |
* LCD E pin : digital pin 1 | |
* LCD D4 pin : digital pin 2 | |
* LCD D5 pin : digital pin 3 | |
* LCD D6 pin : digital pin 4 | |
* LCD D7 pin : digital pin 5 | |
* LCD R/W pin : ground | |
* Potentiometre 10K: curseur à digital pin 3 | |
* | |
* Plus de détails: | |
* http://electroniqueamateur.blogspot.com/2014/09/pinguino-et-afficheur-lcd.html | |
* | |
********************************************************************/ | |
float vieilleJauge = 0; // valeur précédente de la jauge | |
void setup() | |
{ | |
// initialisation du LCD en mode 4 bits | |
lcd.pins(0, 1, 2, 3, 4, 5, 0, 0, 0, 0); | |
// 16 colonnes, 2 lignes | |
lcd.begin(16, 2); | |
} | |
void loop() | |
{ | |
int i; | |
float nombre = analogRead(A0); // on récupère le voltage sur la broche 2 | |
float jauge = map(nombre, 0, 1023, 0, 16); // on sépare la valeur en 16 morceaux pour le bargraph | |
nombre = nombre / 1023.0 * 5.0; // conversion en volts | |
// on place le curseur pour écrire au début de la première ligne | |
lcd.setCursor(0, 0); | |
lcd.printf("Tension: %04f V", nombre); | |
if (jauge > vieilleJauge) { // on vérifie si le nombre a augmenté | |
for (i = 0; jauge >= i; i++) { | |
lcd.setCursor(i, 1); // curseur dans la deuxième ligne | |
lcd.write(1023); // écriture d'un rectangle noir | |
} | |
} | |
if (jauge <= vieilleJauge) { // si le nombre a diminué | |
for (i = 15; jauge <= i; i--) { //compte à rebours | |
lcd.setCursor(i, 1); // curseur dans la deuxième ligne | |
lcd.write(1022); // écriture d'un rectangle blanc | |
} | |
} | |
vieilleJauge = jauge; | |
delay(200); | |
} |