Advertisement
TolentinoCotesta

MenuSetup

Oct 9th, 2017
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.71 KB | None | 0 0
  1. #include <EEPROM.h>
  2. #include <Wire.h>
  3. #include <LiquidCrystal_I2C.h>
  4. #include "SeqButton.h"
  5.  
  6. // Template per scrittura/lettura variabile su EEPROM interna
  7. // http://playground.arduino.cc/Code/EEPROMWriteAnything
  8. template <class T> int EEPROM_read(int ee, T& value){
  9.     byte* p = (byte*)(void*)&value;
  10.     unsigned int i;
  11.     for (i = 0; i < sizeof(value); i++)
  12.           *p++ = EEPROM.read(ee++);
  13.     return i;
  14. }
  15.  
  16. template <class T> int EEPROM_write(int ee, const T& value){        
  17.     const byte* p = (const byte*)(const void*)&value;
  18.     unsigned int i;
  19.     for (i = 0; i < sizeof(value); i++){      
  20.         EEPROM.write(ee++, *p++);
  21.     }
  22.     return i;    
  23. }
  24.  
  25.  
  26. // set the LCD address to 0x27 for a 20 chars and 4 line display
  27. LiquidCrystal_I2C lcd(0x27,20,4);  
  28.  
  29. // Istance per gestione eventi associati ai pulsanti
  30. SeqButton  ClickUP, ClickDOWN, ClickPROG, ShortPressPROG,  LongPressPROG;
  31.  
  32.  
  33. // Definizione degli ingressi
  34. const byte Up     = 2;
  35. const byte Down   = 3;
  36. const byte Prog   = 4;
  37.  
  38. // Definizione delle uscite
  39. const byte OutLED  = 13;
  40.  
  41. // Variabili modificabili dal menu utente
  42. uint16_t Var1 = 2000;      
  43. uint16_t Var2 = 500;           
  44. uint16_t Var3 = 10000;             
  45. uint16_t Var4 = 100;       
  46. uint16_t Var5 = 100;   
  47. uint16_t Var6 = 100;       
  48. uint16_t Var7 = 100;
  49.        
  50. #define TEMPO_PROG 2000
  51. #define TEMPO_SWITCH 500
  52.  
  53. // Altre variabili
  54. bool SetupMode = false;
  55.  
  56.  
  57. /////////////////////////// Ciclo di Setup //////////////////////////////////
  58. void setup(){      
  59.  
  60.   Serial.begin(9600);  
  61.   EEPROM_read(10, Var1);
  62.   EEPROM_read(12, Var2);
  63.   EEPROM_read(14, Var3);
  64.   EEPROM_read(16, Var4);
  65.   EEPROM_read(18, Var5);  
  66.   EEPROM_read(20, Var6);  
  67.   EEPROM_read(22, Var7);  
  68.  
  69.   pinMode(Up, INPUT_PULLUP);
  70.   pinMode(Down, INPUT_PULLUP);
  71.   pinMode(Prog, INPUT_PULLUP);
  72.      
  73.   // Associazione delle funzioni che verranno eserguite in seguito all'evento corrispondente del pulsante
  74.   ClickUP.init(Up, &funcUpClick, NULL, false, LOW, 50);
  75.   ClickDOWN.init(Down, &funcDownClick, NULL, false, LOW, 50);
  76.   ClickPROG.init(Prog, &funcProgClick, NULL, false, LOW, 50);
  77.   LongPressPROG.init(Prog, &f_ProgLongPress, NULL, false, LOW, TEMPO_PROG);  
  78.   ShortPressPROG.init(Prog, &f_ProgShortPress, NULL, false, LOW, TEMPO_SWITCH);  
  79.  
  80.   Serial.println("Compiled: " __DATE__ ", " __TIME__ ", " __VERSION__);
  81.   Serial.println(F("Versione 1.1"));
  82.   Serial.println("");
  83.   // Inizializzazione del display LCD
  84.   lcd.init();
  85.   lcd.backlight();
  86.   lcd.setCursor(0, 0);  
  87.   delay(2000);
  88. }
  89.  
  90.  
  91. /////////////////////////// Ciclo Principale ////////////////////////////////
  92. void loop(){    
  93.   // Gestione eventi associtai ai pulsanti
  94.   ClickUP.handler();
  95.   ClickDOWN.handler();
  96.   ClickPROG.handler();
  97.   LongPressPROG.handler();
  98.   ShortPressPROG.handler();
  99.    
  100.   if(SetupMode){  
  101.     mostraMenuProg();    
  102.   }
  103.   else {
  104.     // Fai quel che devi
  105.   }
  106.            
  107.    
  108. }
  109.  
  110. /////////////////////////////////////////////////////////////////////////////
  111. // Variabili usate per "navigare" all'interno del menu di setup
  112. uint8_t ProgRow = 0;
  113. uint8_t ProgCol = 19;
  114. uint8_t Pagina = 1;
  115. uint8_t oldPagina = 0;
  116. static char buf[10];
  117.  
  118. // Fine della programmazione. Procediamo a memorizzare i nuovi valori
  119. void ProgrammazioneFinita(){          
  120.   lcd.noBlink();  
  121.   lcd.clear();  
  122.   EEPROM_write(10, Var1);
  123.   EEPROM_write(12, Var2);
  124.   EEPROM_write(14, Var3);
  125.   EEPROM_write(16, Var4);
  126.   EEPROM_write(18, Var5);  
  127.   EEPROM_write(20, Var6);  
  128.   EEPROM_write(22, Var7);
  129.   SetupMode = false;
  130. }
  131.  
  132. // Funzione che mostra sul display le variabili utente modificabile nel menu setup
  133. void mostraMenuProg(){
  134.    if(Pagina != oldPagina){
  135.       oldPagina = Pagina;
  136.       switch (Pagina){
  137.      case 1:
  138.         lcd.clear();
  139.         ProgRow = 0;
  140.         ProgCol = 19;
  141.         lcd.setCursor(0, 0);        
  142.         lcd.print("Valore Var1:   "); sprintf(buf, "%05u", Var1 ); lcd.print(buf);
  143.         lcd.setCursor(0, 1);
  144.         lcd.print("Valore Var2:   "); sprintf(buf, "%05u", Var2 ); lcd.print(buf);
  145.         lcd.setCursor(0, 2);
  146.         lcd.print("Valore Var3:   "); sprintf(buf, "%05u", Var3 ); lcd.print(buf);
  147.         lcd.setCursor(0, 3);
  148.         lcd.print("Valore Var4:   "); sprintf(buf, "%05u", Var4 ); lcd.print(buf);      
  149.         break;
  150.      case 2:
  151.         lcd.clear();
  152.         ProgRow = 0;
  153.         ProgCol = 19;      
  154.         lcd.setCursor(0, 0);        
  155.         lcd.print("Valore Var5:   "); sprintf(buf, "%05u", Var5 ); lcd.print(buf);
  156.         lcd.setCursor(0, 1);
  157.         lcd.print("Valore Var6:   "); sprintf(buf, "%05u", Var6 ); lcd.print(buf);
  158.         lcd.setCursor(0, 2);
  159.         lcd.print("Valore Var7:   "); sprintf(buf, "%05u", Var7 ); lcd.print(buf);
  160.         lcd.setCursor(0, 3);
  161.         lcd.print("               SALVA");
  162.         break;
  163.      default:
  164.         break;
  165.       }
  166.    }
  167. }
  168.  
  169. // Gestione del cambio pagina (con solo due pagine รจ quasi ridondante)
  170. void CambioPagina(int dir){
  171.    if(dir > 0 ){
  172.       if (Pagina == 2)
  173.      Pagina = 1;
  174.       else
  175.      Pagina++;
  176.    }
  177.    
  178.    if(dir < 0 ){
  179.       if (Pagina == 1)
  180.      Pagina = 2;
  181.       else
  182.      Pagina--;    
  183.    }
  184. }
  185.  
  186. // Con questa funzione incremento/decremento la variabile  corrispondente alla posizione del cursore
  187. void updateVar(uint8_t ProgCol, uint8_t ProgRow,  uint8_t Pagina, int val){
  188.    int update_val = 1*val;
  189.    for(int i=0; i<(19-ProgCol); i++)
  190.       update_val *= 10;
  191.          
  192.    if(Pagina ==1)
  193.       switch (ProgRow){
  194.      case 0:
  195.         Var1 += update_val;
  196.         lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var1 ); lcd.print(buf);
  197.         break;
  198.      case 1:
  199.         Var2 += update_val;
  200.         lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var2 ); lcd.print(buf);
  201.         break;
  202.      case 2:
  203.         Var3 += update_val;
  204.         lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var3 ); lcd.print(buf);
  205.         break;
  206.      case 3:
  207.         Var4 += update_val;
  208.         lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var4 ); lcd.print(buf);
  209.         break;
  210.       }
  211.    if(Pagina == 2)
  212.       switch (ProgRow){
  213.      case 0:
  214.         Var5 += update_val;
  215.         lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var5 ); lcd.print(buf);
  216.         break;
  217.      case 1:
  218.         Var6 += update_val;
  219.         lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var6 ); lcd.print(buf);
  220.         break;
  221.      case 2:
  222.         Var7 += update_val;
  223.         lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var7 ); lcd.print(buf);
  224.         break;
  225.      case 3:       
  226.         break;
  227.       }  
  228.    // Ripristina posizione cursore
  229.    lcd.setCursor(ProgCol, ProgRow);  
  230. }
  231.  
  232. ///////////////// Azioni da eseguire alla pressione dei pulsanti  ///////////////////////
  233.  
  234. // Con la pressione prolungata (> TEMPO_PROG) del tasto PROG abilito/disabilito il menu di setup
  235. void f_ProgLongPress(){  
  236.    lcd.clear();
  237.    SetupMode = !SetupMode;    
  238.    Pagina = 1;
  239.    oldPagina = 0;
  240.    Serial.print(F("Modo Programmazione: "));
  241.    Serial.println(SetupMode);        
  242.    delay(1000);          
  243. }
  244.  
  245. // Con il click del tasto PROG abilito l'edit della variabile
  246. void funcProgClick(){
  247.    if(SetupMode){      
  248.       if(ProgCol < 19)
  249.      ProgCol++;
  250.       else
  251.      ProgCol = 15;
  252.       lcd.setCursor(ProgCol, ProgRow);
  253.       lcd.blink();          
  254.    }
  255. }
  256.  
  257. // Con un click prolongato (> TEMPO_SWITCH) cambio variabile da modificare
  258. void f_ProgShortPress(){
  259.    if(SetupMode){
  260.       if(ProgRow == 3){
  261.     if(Pagina == 2)
  262.        ProgrammazioneFinita();
  263.     else
  264.        Pagina++;
  265.        
  266.       }
  267.       else {      
  268.      ProgCol = 14;
  269.      if(ProgRow < 3)
  270.         ProgRow++;
  271.       }
  272.    }
  273. }
  274.  
  275.  
  276. // Con la pressione normale del tasto UP incremento la variabile
  277. void funcUpClick(){  
  278.    if(SetupMode)
  279.       updateVar(ProgCol, ProgRow, Pagina, +1);    
  280. }
  281. // Con la pressione normale del tasto DOWN decremento la variabile
  282. void funcDownClick(){  
  283.    if(SetupMode)
  284.       updateVar(ProgCol, ProgRow, Pagina, -1);
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement