//#include <LiquidCrystal_I2C.h> // biblio pour l'ecran
#include <LiquidCrystal.h>
#include <Rotary.h> // biblio pour lire la rotation de l'encodeur(Horaire/Antihoraire)
#include <OneButton.h>
#include <LiquidMenu.h>
// ************ Déclaration du Matériel (HARDWARE) *************
//LiquidCrystal_I2C lcd(0x27, 20, 4); // adresse I2c 0x3F pour puce NXP; ou 0x27 pour pucee Texas instrument, taille de l'écran 20 colonnes, 4 lignes
LiquidCrystal myLcd(12, 11, 4, 5, 6, 7);
//**** Les broches de l'encodeur sont S1, S2 et key:
Rotary myRotary = Rotary(2, 3); // Déclaration de l'objet myRotary (avec S1, S2 sur Pins 2,3)
OneButton myButton(8, true); // Déclaration du Bouton key sur Pins 8; active_low = true (pullup)
/* ----------------------------------------------------------------------------------------------- */
// création des Objets ligne de l'écran 1: LOGO ou Bienvenu (à 2 lignes)
LiquidLine ligne1_s1(0, 0, " Welcome To "); // (1ere ligne)= texte sur colonne 0, ligne 0 du LCD
LiquidLine ligne2_s1(0, 1, "Electronic Trucs"); // (2eme ligne)= texte sur colonne 0, ligne 1
LiquidLine ligne3_s1(0, 2, "ligne 3");
LiquidScreen logo_screen(ligne1_s1, ligne2_s1, ligne3_s1); // création de l'écran 1 contenant 3 lignes
// création des Objets ligne de l'écran 2
LiquidLine ligne1_s2(1, 0, " ECRAN_2: L1"); // 1ere ligne de l'écran: texte sur colonne 1, ligne 0 du LCD
LiquidLine ligne2_s2(1, 1, " ECRAN_2: L2"); // 2eme ligne de l'écran: texte sur colonne 1, ligne 1 du LCD
LiquidLine ligne3_s2(1, 2, " ECRAN_2: L3"); // 3eme ligne de l'écran
LiquidLine ligne4_s2(1, 3, " ECRAN_2: L4"); // 4eme ligne de l'écran
//LiquidLine ligne5_s2(1, 0, " ECRAN_2: L5"); // 5eme ligne de l'écran
//LiquidLine ligne6_s2(1, 1, " ECRAN_2: L6"); // 6eme ligne de l'écran
LiquidScreen screen_2(ligne1_s2,ligne2_s2,ligne3_s2,ligne4_s2); // écran avec 4 lignes maximum
// la 5eme et la 6eme lignes seront ajoutées plus tard
// création des Objets ligne de l'écran 3
LiquidLine ligne1_s3(1, 0, " S_3: L1");
LiquidLine ligne2_s3(1, 1, " S_3: L2");
LiquidLine ligne3_s3(1, 2, " S_3: L3");
LiquidLine ligne4_s3(1, 3, " S_3: L4");
//LiquidLine ligne5_s3(1, 0, " S_3: L5");
//LiquidLine ligne6_s3(1, 1, " S_3: L6");
LiquidScreen screen_3(ligne1_s3,ligne2_s3,ligne3_s3,ligne4_s3);
LiquidMenu myMenu(myLcd); // création de myMenu
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, LOW); // éteindre la LED_BUILTIN
myRotary.begin();
//---on decode la rotation à l'aide des interruptions (et la library "Rotary.h") ---
attachInterrupt(0, rotate, CHANGE); // appel de la function "rotate()" sur CHANGE
attachInterrupt(1, rotate, CHANGE); // fonction "rotate()" to be called on a change
//--------- les fonctions liées au bouton (click) (voir:"OneButton.h") ---------
myButton.attachClick(shortKeyPress); // fonction à appeler lors d'un simple click
myButton.attachLongPressStart(longKeyPress);
myLcd.begin(20,4); // initialise le LCD
// *********** Structuration du Menu à l'aide de la Biblio "<LiquidMenu.h>" *********
//------- ECRAN n°1: LOGO ou Bienvenu -------
myMenu.add_screen(logo_screen); // Ajout de l'écran n°1 au menu
myMenu.update(); // affiche la mise à jour
Serial.println("ecran1");
delay(3000); // pause
myMenu.init();
//----------------- ECRAN n°2 --------------
// ajout des 2 lignes (déja crées) à l'écran n°2
//screen_2.add_line(ligne5_s2); // 5eme ligne de l'écran
//screen_2.add_line(ligne6_s2); // 6eme ligne de l'écran
myMenu.add_screen(screen_2); // ajouter l'écran au menu.
ligne1_s2.attach_function(1, fonction1); // fonction liée
ligne2_s2.attach_function(1, fonction1); // fonction liée
ligne3_s2.attach_function(1, fonction1); // fonction liée
ligne4_s2.attach_function(1, fonction1); // fonction liée
//ligne5_s2.attach_function(1, fonction1);
//ligne6_s2.attach_function(1, fonction1);
screen_2.set_focusPosition(Position::LEFT); // Curseur pour toutes les lignes
//----------------- ECRAN n°3 --------------
// ajout des 2 lignes (déja crées) à l'écran n°2
//screen_3.add_line(ligne5_s3); // 5eme ligne de l'écran
//screen_3.add_line(ligne6_s3); // 6eme ligne de l'écran
myMenu.add_screen(screen_3); // ajouter l'écran au menu.
ligne1_s3.attach_function(1, fonction0);
ligne2_s3.attach_function(1, fonction0);
ligne3_s3.attach_function(1, fonction0);
ligne4_s3.attach_function(1, fonction0);
//ligne5_s3.attach_function(1, fonction0);
//ligne6_s3.attach_function(1, f_return); //
screen_3.set_focusPosition(Position::LEFT); // Curseur pour toutes les lignes
//------ Tous les ECRANS sont déclarés à 4 lignes (pour un lcd 20 x 4) --------
screen_2.set_displayLineCount(4);
screen_3.set_displayLineCount(4);
myMenu.change_screen(2); // on demarre sur ecran 2
myMenu.set_focusedLine(0); // pointeur sur la ligne_0
myMenu.update();
}
void loop() {
myButton.tick();
}
void rotate() { // ***** Interruption de l'encodeur ******
unsigned char result = myRotary.process(); // la biblio Rotary.h fait tout le travail
if (result == DIR_CW) { // rotation Horaire (Clockwise)
myMenu.switch_focus(true); // void LiquidMenu::switch_focus(bool forward = true);
Serial.println("CW");
}
else if (result == DIR_CCW) { // encodeur AntiClockwise
myMenu.switch_focus(false); // ...bouge le focus en arrière
Serial.println("CCW");
}
}
void shortKeyPress() {
myMenu.call_function(1); // appelle la fonction portant l'ID 1 (selon la ligne pointée)
Serial.println("shortkeypress");
delay(500);
}
void longKeyPress() {
myMenu.change_screen(2);
Serial.println("Longkeypress");
}
void f_return() {
myMenu.previous_screen(); // retour à l'écran 2...
}
void fonction0() {
return; // Rien à faire
}
void fonction1 () {
myMenu.change_screen(3); // aller à l'écran 2...
myMenu.set_focusedLine(0); // ...avec pointeur sur ligne_0
}