Afficher une valeur sur un écran LCD

Dans un dispositif technique, on a souvent besoin d’avoir une visibilité sur une valeur.

Cela peut être la température, la pression, le taux d’humidité, la vitesse d’un moteur, …

Et quoi de mieux que d’afficher ce résultat sur un écran LCD.

Vue d’ensemble

Et cela tombe bien, car avec Arduino, il y a un module très courant, qui est le module LCD1602.

Comme son nom l’indique, il s’agit d’un écran LCD avec 2 lignes et 16 colonnes.

Ce qui est bien avec ce module, c’est qu’il est très pratique à utiliser avec un Arduino.

Il y a 2 modes d’utilisation :

  • 8 bits
  • 4 bits

Le mode 4 bits nécessite moins de branchement, ce qui est pratique, donc je partirai sur ce mode.

De toute façon la plupart des ressources sur internet utilisent ce mode là, donc on ne vas pas se complexifier la vie. À savoir qu’il est possible d’utiliser encore moins de broches avec un module I2C.

Les choses sont principalement très simple, car une bibliothèque gère toute la complexité. Il faut donc l’ajouter à notre projet :

#include <LiquidCrystal.h>

Donc le but va être de récupérer la température grâce à un capteur, dans notre cas une thermistance de type NTC (Negative Temperature Coefficient). Pour ceux qui ne savent pas, une thermistance est un composant dont la résistance évolue en fonction de la température. Le fait qu’elle soit de type NTC fait que résistance diminue quand la température augmente.

Thermistance

Cette dernière est reliée à une résistance de 10 kOhms et est branché à la broche A0 (qui est un port analogique de l’Arduino).

Broche A0

Il est nécessaire de régler le contraste pour s’assurer de pouvoir lire le texte. Pour cela on branche un potentiomètre de 10 kOhms à notre écran LCD (sur la broche VO), les autres branches du potentiomètre étant branchées sur l’alimentation et la masse.

Potentiomètre de 10 kOhms

Ce n’est pas un point optionnel, car lorsque vous utiliserez l’écran LCD, vous verrez un écran tout bleu, alors que du texte est censé être écrit. En faisant varier le potentiomètre, on peut ainsi voir le texte apparaître.

Maintenant on va parler du branchement de notre écran LCD.

Branchements

On a bien sur l’alimentation (VDD et A) et la masse (VSS, RW et K). Pour rappel, l’alimentation repose sur la broche 5V.

Aussi je ne l’ai pas mis sur mon montage, mais en faisant de recherche avant l’écriture de cet article, j’ai appris qu’on pouvait diminuer le rétroéclairage en mettant une résistance entre 50 et 100 Ohms entre la borne K et la masse.

Puis on a RS et ENABLE, qui sont respectivement branché aux bornes 7 et 8 de l’Arduino.

Ensuite on a les broches de données (de D4 à D7, pour rappel on est en mode 4 bits) qui sont branchées respectivement aux broches de 9 à 12 sur l’Arduino.

On va récapituler tout ceci grâce à la déclaration de nos constantes et à l’initialisation de notre écran LCD :

#define RS 7
#define ENABLE 8
#define D4 9
#define D5 10
#define D6 11
#define D7 12
#define ROWS 2
#define COLS 16
#define TEMP 0

LiquidCrystal lcd(RS, ENABLE, D4, D5, D6, D7);

Lors du setup(), il sera nécessaire de définir le nombre de lignes et de colonnes de notre écran LCD. Pour les besoins du débogage j’ai aussi initialiser le moniteur de série.

void setup() {
  pinMode(TEMP, INPUT);
  Serial.begin(9600);
  // On renseigne sur le nombre de colonnes et de lignes
  lcd.begin(COLS, ROWS);
}

Maintenant nous allons traiter de ce qu’il se passe dans notre fonction loop(). Nous récupérons une valeur que nous renvoi la thermistance. On réalise une formule qui permet de transcrire la valeur relevée en degrés Kelvin.

J’ai trouvé différentes formules sur internet, et j’ai gardé la formule qui me donnait les résultats les plus précis. Je ne pourrai donc pas vous préciser exactement pourquoi la formule que j’ai utilisée fonctionne, si ce n’est vous renvoyer aux formules de conversion des thermistance NTC.

int sensorValue = analogRead(TEMP);
Serial.println(sensorValue);
float tempK = log(10000.0 * ((1024.0 / sensorValue - 1)));
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );

Une fois qu’on a notre température en Kelvin, on convertit notre température en degré Celsius :

float tempC = tempK - 273.15;

Ensuite on positionne le curseur sur la 1ère ligne et la 1ère colonne pour afficher le texte, puis à la 6ème colonne pour afficher la température en Celsius.

// Affichage température en Celsius
lcd.setCursor(0, 0);
lcd.print("Temp         C  ");
lcd.setCursor(6, 0);
lcd.print(tempC);

Pour le débogage on finit par afficher les valeurs qu’on a calculées. En effet, si l’affichage ne fonctionne pas sur l’écran LCD dysfonctionne, on pourra vérifier la véracité des calculs grâce au moniteur de série.

Serial.println(tempK);
Serial.println(tempC);
Serial.println("---");
Moniteur de série

Finalement on affiche sur la seconde ligne la température en Kelvin. En informatique, on compte souvent à partir de 0. Donc l’index de la première ligne est 0, et celui de la seconde ligne est 1.

// Affichage température en Kelvin
lcd.setCursor(0, 1);
lcd.print("Temp         K  ");
lcd.setCursor(6, 1);
lcd.print(tempK);

Voici ce que cela nous donne :

Affichage température

Puis pour que le rafraîchissement ne se fasse pas de façon trop abrupte, on réalise une pause de 500 millisecondes.

delay(500);

Voici le code complet :

#include <LiquidCrystal.h>
#define RS 7
#define ENABLE 8
#define D4 9
#define D5 10
#define D6 11
#define D7 12
#define ROWS 2
#define COLS 16
#define TEMP 0

LiquidCrystal lcd(RS, ENABLE, D4, D5, D6, D7);

void setup() {
  pinMode(TEMP, INPUT);
  Serial.begin(9600);
  // On renseigne sur le nombre de colonnes et de ligne
  lcd.begin(COLS, ROWS);
  lcd.print("hello world !");
}

void loop() {
  int sensorValue = analogRead(TEMP);
  Serial.println(sensorValue);
  float tempK = log(10000.0 * ((1024.0 / sensorValue - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );
  float tempC = tempK - 273.15;
  // Affichage température en Celsius
  lcd.setCursor(0, 0);
  lcd.print("Temp         C  ");
  lcd.setCursor(6, 0);
  lcd.print(tempC);

  // Affichage température en Kelvin
  Serial.println(tempK);
  Serial.println(tempC);
  Serial.println("---");
  lcd.setCursor(0, 1);
  lcd.print("Temp         K  ");
  lcd.setCursor(6, 1);
  lcd.print(tempK);

  delay(500);
}
Pour marque-pages : Permaliens.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *