Arduino + écran LCD = amour

Ecran_LCD
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).
18
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
Briques

Nos chiffres de 2 lignes de haut utilisant nos 8 caractères “custom”

Chiffres_composition
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