
/*   Étude des méthodes de U8glib. Gestion de l'affichage d'un MENU.
   • On utilise ici un clavier à 5 touches. Pour simplifier l'affichage seuls
     quatre items sont prévus. (Avec 5 il faudrait des textes plus petits.)
   • Du coup "Gauche" et "Droite ont même effet : Réveiller l'afficheur.
   • Le bouton central sert à mettre OLED en sommeil. (Comme j'utilise souvent ce type
     de clavier avec veille au centre, c'est pour ça que la touche est noire.
     Le BP "Haut" déplace le curseur vers le haut dans le menu.
     Le BP "Bas" déplace le curseur vers le bas dans le menu.
   • Pour contrôle, les données du BP cliqué sont affichées sur le Moniteur de l'IDE si dans
     #define Aff_BP cette option est à true. Toute action sur un BP allume la LED de D13.
   • SDA est branché sur A4. SCL est branché sur A5
     
                                            PGM                 RAM dynamique
Compilateur v1.7.9 :                  10226 Octets (31%)          511 Octets (24%)   */

//------------- Définition des broches d'entrées analogiques ----------------
#define Ligne_trois_touches 14 // A0 pour lire le clavier à 3 BP. 
#define Ligne_deux_touches 15  // A1 pour lire le clavier à 2 BP.

//-------------- Définition des broches de sorties Binaires -----------------
#define LED_Arduino 13

//------------------------ Constantes du programme --------------------------
#define Version "22/08/2024" // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define NB_tests_antirebonds 250 // Nombre de tests de stabilisation B.P. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define Aff_BP true // Affiche les paramètres d'une saisie sur le clavier @@@@@@@@@@@@@@@@@@@@@@@@@@@@@

#include "U8glib.h"
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // Usage de la ligne I2C (Two Wire Interface)

const char *MENU[4] = { "Premiere fonction.", "Deuxieme option.", "Item 3.", "Item position 4." };

//------------------------- Variables du programme --------------------------
byte Item_actuel = 0;
byte Num_BP;
long PTR, U_mesuree, U_sur_A0, U_sur_A1;

//-------------------------------------------------------------------------------------

void setup() {
  Serial.begin(57600);
  u8g.setFont(u8g_font_6x13); // Choix de la police de caractères utilisée.
  u8g.setFontRefHeightText(); u8g.setFontPosTop(); Affiche_page_ecran();
  pinMode(LED_Arduino, OUTPUT); digitalWrite(LED_Arduino, LOW);}

void loop() {Tester_le_Clavier(); if (Num_BP > 0) Lecture_du_clavier();}

//======================== Procédures de servitude =============================
  
void Pointe_Item_suivant() {Item_actuel++; if (Item_actuel > 3) Item_actuel = 0;}

void Pointe_Item_precedent() {if (Item_actuel > 0) Item_actuel--; else Item_actuel = 3;}

void Construire_page_ecran() {
  byte I, Marge;
  for(I = 0; I < 4; I++) {
    Marge = (128-u8g.getStrWidth(MENU[I]))/2;
    //---------- Afficher le rectangle de "surlignage" ----------
    u8g.setDefaultForegroundColor();
    if (I == Item_actuel) {
      u8g.drawBox(0, I*13, 128, 13); u8g.setDefaultBackgroundColor();}
    //-----------------------------------------------------------
    u8g.drawStr(Marge, I*13, MENU[I]);}} // Écrire la ligne de l'Item.

void Affiche_page_ecran() {u8g.firstPage(); do {Construire_page_ecran();} while(u8g.nextPage());}

void Lecture_du_clavier() {
  switch (Num_BP) {
    case 1 : {u8g.sleepOff(); break;}
    case 2 : {u8g.sleepOn(); break;}
    case 3 : {u8g.sleepOff(); break;}
    case 4 : {Pointe_Item_precedent(); Affiche_page_ecran(); break;}
    case 5 : {Pointe_Item_suivant(); Affiche_page_ecran();}}}

//======================== Procédures de servitude =============================
 
void ATTENDRE_le_relacher() {
  byte Nb_comptages_OK = 0;
  U_sur_A0 = analogRead(Ligne_trois_touches); // Attendre sur la ligne à 3 touches.
  while (Nb_comptages_OK < NB_tests_antirebonds) {
         U_mesuree = analogRead(Ligne_trois_touches);
         if (U_mesuree > 900) Nb_comptages_OK++; else Nb_comptages_OK = 0;}
  U_sur_A1 = analogRead(Ligne_deux_touches); // Attendre sur la ligne à 2 touches.
  Nb_comptages_OK = 0;
  while (Nb_comptages_OK < NB_tests_antirebonds) {
         U_mesuree = analogRead(Ligne_deux_touches);
         if (U_mesuree > 900) Nb_comptages_OK++; else Nb_comptages_OK = 0;}     
  digitalWrite(LED_Arduino, LOW);}
  
void Tester_le_Clavier() {// Les valeurs tiennent compte de VCC = 4V car fourni par la carte NANO.
  byte Nb_comptages_OK = 0;
  U_sur_A0 = 0; U_sur_A1 = 0; Num_BP = 0; // Signale aucun B.P. utilisé.
  U_sur_A0 = analogRead(Ligne_trois_touches); U_sur_A1 = analogRead(Ligne_deux_touches);
  if (U_sur_A0 < 900) {// L'une des 3 touches a été cliqué.
      digitalWrite(LED_Arduino, HIGH);
      while (Nb_comptages_OK < NB_tests_antirebonds) {
             U_mesuree = analogRead(Ligne_trois_touches);
             if (U_mesuree < 900) {U_sur_A0 = U_sur_A0 + U_mesuree; Nb_comptages_OK++;}
             else {U_sur_A0 = 0; Nb_comptages_OK = 0;}}
             U_sur_A0 = U_sur_A0 / NB_tests_antirebonds;
      if (U_sur_A0 < 230) Num_BP = 3;
      if ((U_sur_A0 < 485) && (U_sur_A0 > 230)) Num_BP = 2;     
      if ((U_sur_A0 < 807) && (U_sur_A0 > 485)) Num_BP = 1;}
  if (U_sur_A1 < 900) {// L'une des 2 touches a été cliqué.
      digitalWrite(LED_Arduino, HIGH);
      while (Nb_comptages_OK < NB_tests_antirebonds) {
             U_mesuree = analogRead(Ligne_deux_touches);
             if (U_mesuree < 900) {U_sur_A1 = U_sur_A1 + U_mesuree; Nb_comptages_OK++;}
             else {U_sur_A1 = 0; Nb_comptages_OK = 0;}}
             U_sur_A1 = U_sur_A1 / NB_tests_antirebonds;
      if (U_sur_A1 < 315) Num_BP = 5;
      if ((U_sur_A1 < 764) && (U_sur_A1 > 315)) Num_BP = 4;}  
 if ((Num_BP > 0) && (Aff_BP))  {
     Serial.print("D0 = "); Serial.print(U_sur_A0); Serial.print(" D1 = "); Serial.print(U_sur_A1);
     Serial.print(" soit BP"); Serial.println(Num_BP);}
     if (Num_BP > 0) ATTENDRE_le_relacher();}

