Arduino + écran LCD = amour
Pour celles et ceux nés dans les années 80 les cristaux liquides auront toujours ce doux parfum des premiers jeux électroniques de poche. L’écran LCD (HD44780) du starter kit Arduino s’est ainsi révélé pour moi un composant des plus fantasmant.
Outre son coût relativement faible, sont utilisation via Arduino s’avère enfantine une fois importée la librairie LiquidCrystal.h.
Avec un affichage de 16 colonnes sur 2 lignes, votre Arduino a là de quoi communiquer avec tout le respect eu égard à son maître grâce à une bibliothèque de caractères ASCII intégrée (avec quelques caractères exotiques en fonction de la provenance du composant).
Mais la magie de ce HD44780 réside dans la possibilité d’intégrer jusqu’à 8 nouveaux caractères. 8 vous me direz c’est peu, mais c’est en fait une contrainte assez chouette à contourner pour transformer ce simple afficheur texte en un afficheur graphique.
Pour exemple, on peut essayer de composer de grands chiffres de 2 lignes de haut, utilisant 8 caractères « custom » qui combinés d’une certaine manière vont dessiner nos 10 chiffres.
Nos 8 briques qui composeront les grands chiffres
Nos chiffres de 2 lignes de haut utilisant nos 8 caractères « custom »
Un lien bien utile pour composer vos caractères perso : http://mikeyancey.com/hamcalc/lcd_characters.php
Ci-après un code pour afficher un timer utilisant ces grands chiffres sur votre écran LCD (se référer aux branchements du projet 11 Crystal Ball du guide starter kit Arduino) :
/* A set of custom made large numbers for a 16x2 LCD using the LiquidCrystal librabry. Works with displays compatible with the Hitachi HD44780 driver. Christophe Sivadier Inspired by : Ronivaldo Sampaio Michael Pilcher character created using: http://mikeyancey.com/hamcalc/lcd_characters.php */ // include the library #include <LiquidCrystal.h> // initialize the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // the 8 arrays that form each segment of the custom numbers byte brique1[8] = { B00011, B00011, B00011, B00011, B00011, B00011, B00011, B00011 }; byte brique2[8] = { B01110, B10011, B11011, B11011, B00011, B00011, B00011, B00010 }; byte brique3[8] = { B00100, B01000, B01000, B11000, B11000, B11001, B11001, B11111 }; byte brique4[8] = { B01111, B00011, B00011, B00011, B11011, B11011, B10011, B01110 }; byte brique5[8] = { B01110, B11001, B11011, B11011, B11000, B11000, B11000, B11110 }; byte brique6[8] = { B11011, B11011, B11011, B11011, B11011, B11011, B11011, B01110 }; byte brique7[8] = { B01110, B11011, B11011, B11011, B11011, B11011, B11011, B11011 }; byte brique8[8] = { B01110, B11011, B11011, B11011, B11011, B11011, B11011, B01110 }; void setup() { // assignes each segment a write number lcd.createChar(1,brique1); lcd.createChar(2,brique2); lcd.createChar(3,brique3); lcd.createChar(4,brique4); lcd.createChar(5,brique5); lcd.createChar(6,brique6); lcd.createChar(7,brique7); lcd.createChar(8,brique8); // sets the LCD's rows and colums: lcd.begin(16, 2); } // define segments to build the number 0 void big0(int col) { lcd.setCursor(col, 0); lcd.write(7); lcd.setCursor(col, 1); lcd.write(6); } // define segments to build the number 1 void big1(int col) { lcd.setCursor(col, 0); lcd.write(1); lcd.setCursor(col, 1); lcd.write(1); } // define segments to build the number 2 void big2(int col) { lcd.setCursor(col, 0); lcd.write(2); lcd.setCursor(col, 1); lcd.write(3); } // define segments to build the number 3 void big3(int col) { lcd.setCursor(col, 0); lcd.write(2); lcd.setCursor(col, 1); lcd.write(4); } // define segments to build the number 4 void big4(int col) { lcd.setCursor(col, 0); lcd.write(3); lcd.setCursor(col, 1); lcd.write(1); } // define segments to build the number 5 void big5(int col) { lcd.setCursor(col, 0); lcd.write(5); lcd.setCursor(col, 1); lcd.write(4); } // define segments to build the number 6 void big6(int col) { lcd.setCursor(col, 0); lcd.write(5); lcd.setCursor(col, 1); lcd.write(6); } // define segments to build the number 7 void big7(int col) { lcd.setCursor(col, 0); lcd.write(7); lcd.setCursor(col, 1); lcd.write(1); } // define segments to build the number 8 void big8(int col) { lcd.setCursor(col, 0); lcd.write(8); lcd.setCursor(col, 1); lcd.write(8); } // define segments to build the number 9 void big9(int col) { lcd.setCursor(col, 0); lcd.write(7); lcd.setCursor(col, 1); lcd.write(4); } void printNumber(int value, int col) { if (value == 0) {big0(col);} if (value == 1) {big1(col);} if (value == 2) {big2(col);} if (value == 3) {big3(col);} if (value == 4) {big4(col);} if (value == 5) {big5(col);} if (value == 6) {big6(col);} if (value == 7) {big7(col);} if (value == 8) {big8(col);} if (value == 9) {big9(col);} } void printTIMER(int time) { int m , c, d, u, number; number = time; if (number > 999) { m = (number - (number % 1000)) / 1000; number = number % 1000; } else { m = 0; } if (number > 99) { c = (number - (number % 100)) / 100; number = number % 100; } else { c = 0; } if (number > 9) { d = (number - (number % 10)) / 10; number = number % 10; } else { d = 0; } u = number; // define cursor position (column) for each units printNumber(m, 4); printNumber(c, 6); printNumber(d, 8); printNumber(u, 10); } void loop() { // print the number of seconds since reset: printTIMER(millis()/1000); }
Laisser un commentaire
Vous devez vous connecter pour publier un commentaire.