/****************************************************************************************************************************************
Projet Chronomètre et minuteur cyclique avec LCD 20X4 réalisé par: Daniel Talbot Technicien
Pour Ez-Weekend-Project au Club Technique des Laurentides
Dans le cadre du programme C.I.P.A.D. (Cours d'initiation à la Programmation Arduino pour Débutant(e)s) gratuit et sans inscription.
Copiez ce lien pour accéder à la vidéo concernant ce projet
https://www.youtube.com/watch?v=AWijKwh_13I
ou celui-ci pour accéder à toutes les leçons déjà publiées...
https://www.youtube.com/playlist?list=PLoffRtP427acSg1FbpFuH_g5ptz-aovFN
* *
****************************************************************************************************************************************/
#include <LiquidCrystal_I2C.h>
// déclaration des variables LCD
LiquidCrystal_I2C lcd1(0x25, 20, 4);
LiquidCrystal_I2C lcd2(0x26, 20, 4);
LiquidCrystal_I2C lcd3(0x27, 16, 2);
// déclaration des variables associées aux broches du contrôle joystick
const int btn_Select = 2, btn_Horz = A1, btn_Vert = A2 ;
/// déclaration des variables associées aux valeurs des positions du joystick
int select_Value = 0, horz_Value = 0, vert_Value = 0;
// Tableau de 7 chaines de caractères indexé de 0 à 7, 7 étant la valeur nulle pour fermer le tableau.
char* btn_press[7] = {"Select", // index [0]
" ", // index [1]
"Haut", // index [2]
"bas", // index [3]
"Gauche ", // index [4]
" Droite", // index [5]
" " // index [6]
}; // index [7]
// Fin de l'entête déclarative.===================================================
void setup() { // Initialisation.
lcd1.init(); lcd2.init(); lcd3.init(); //Initialise les 3 afficheurs LCD I2C
lcd1.backlight(); lcd2.backlight(); lcd3.backlight(); // Active le rétroéclairage des 3 afficheurs LCD I2C
pinMode(btn_Select, INPUT_PULLUP); // Mode INPUT_PULLUP pour le bouton central "Select"
lcdPrintCenter("Joystick", 1, 0); // Entête de LCD1
lcdPrintCenter("LCD3", 3, 0); // Entête de LCD3
}
void loop() { //Exécution: Placez votre code principal ici, à exécuter de manière répétée :
Fn_Joystick(); // Appel de la fonction perso "Fn_Joystick" dont le rôle est d'identifier le bouton pressé.
}
/***********************************************************************************
Fonction lcdPrintCenter(1er paramètre, 2e paramètre, 3e paramètre).
Fonction lcdPrintCenter(texte à afficher, choix de l'écran lcd, No de la ligne).
**********************************************************************************/
void lcdPrintCenter(String texte, int lcd, int ligne) {
//int wide = 20; // Défini le nombre de colonne par ligne.
int len = texte.length(); // Défini la longeur de la variable "texte"
switch (lcd) { // Commute vers l'afficheur correspondant à la variable "lcd"
case 1: // Sélectionne lcd1.
lcd1.setCursor((20 - len) / 2, ligne); // positionne le curseur au centre de la ligne choisie et soustrait la longeur du text à afficher
lcd1.print(texte); // Affiche le texte demandé sur lcd1.
break; // Quitte la case 1
case 2: // Sélectionne lcd2.
lcd2.setCursor((20 - len) / 2, ligne); // positionne le curseur au centre de la ligne choisie et soustrait la longeur du text à afficher
lcd2.print(texte); // Affiche le texte demandé sur lcd2.
break; // Quitte la case 2
case 3: // Sélectionne lcd3.
lcd3.setCursor((16 - len) / 2, ligne); // positionne le curseur au centre de la ligne choisie et soustrait la longeur du text à afficher
lcd3.print(texte); // Affiche le texte demandé sur lcd3.
break; // Quitte la case 3
} // Quitte la fonction switch.
} // Quitte la fonction lcdPrintCenter(texte à afficher, choix de l'écran lcd, No de la ligne).
/***************************************************************************************/
void Fn_Joystick() {
// Balaie en boucle l'état des boutons du Joystick.
select_Value = digitalRead(btn_Select);
horz_Value = analogRead(btn_Horz);
vert_Value = analogRead(btn_Vert);
// Affiche sur lcd2 la valeur des boutons select, Horz et Vert Avant et après chaque pression.
lcd2.setCursor(0, 0); lcdPrintCenter("Joystick value ", 2, 0); // entête de LCD2.
lcd2.setCursor(0, 1); lcd2.print("SELECT: "); lcd2.print(select_Value);
lcd2.setCursor(0, 2); lcd2.print("HORZ: "); lcd2.print(horz_Value);
lcd2.print(" "); //efface l'ancienne valeur Horizontale
lcd2.setCursor(0, 3); lcd2.print("VERT: "); lcd2.print(vert_Value);
lcd2.print(" "); //efface l'ancienne valeur verticale
// commutateur d'affichage sur l'écran lcd1. Affiche la position du bouton pressé.
switch (select_Value) { // commute vers la case correspondant à la valeur du bouton Select.
case 0: lcdPrintCenter(btn_press[select_Value], 1, 2); break; // 0 lorsque pressé.
case 1: lcdPrintCenter(btn_press[select_Value], 1, 2); break; // 1 par défaut
}
switch (vert_Value) { // commute vers la case correspondant à la valeur du bouton vertical.
case 0: lcdPrintCenter(btn_press[2], 1, 1); // Si pressé Haut affiche "haut" au centre de la 2e ligne
break;
case 512: // si aucun bouton pressé
lcdPrintCenter(btn_press[1], 1, 1); // efface la 2e ligne
lcdPrintCenter(btn_press[1], 1, 3); // efface la 4e ligne
break;
case 1023: lcdPrintCenter(btn_press[3], 1, 3); // si pressé bas affiche "bas" au centre de la 4e ligne.
break;
}
switch (horz_Value) { // commute vers la case correspondant à la valeur du bouton Horizontal.
case 0: lcdPrintCenter(btn_press[4], 1, 2); // Si pressé Gauche affiche "Gauche" à gauche de la 3e ligne
break;
case 512: delay(500); lcdPrintCenter(btn_press[6], 1, 2); // si aucun bouton pressé efface la 3e ligne
break;
case 1023: lcdPrintCenter(btn_press[5], 1, 2); // Si pressé Droite affiche "Droite" à droite de la 3e ligne
break;
}
}