Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <EEPROM.h>
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- #include "SeqButton.h"
- // Template per scrittura/lettura variabile su EEPROM interna
- // http://playground.arduino.cc/Code/EEPROMWriteAnything
- template <class T> int EEPROM_read(int ee, T& value){
- byte* p = (byte*)(void*)&value;
- unsigned int i;
- for (i = 0; i < sizeof(value); i++)
- *p++ = EEPROM.read(ee++);
- return i;
- }
- template <class T> int EEPROM_write(int ee, const T& value){
- const byte* p = (const byte*)(const void*)&value;
- unsigned int i;
- for (i = 0; i < sizeof(value); i++){
- EEPROM.write(ee++, *p++);
- }
- return i;
- }
- // set the LCD address to 0x27 for a 20 chars and 4 line display
- LiquidCrystal_I2C lcd(0x27,20,4);
- // Istance per gestione eventi associati ai pulsanti
- SeqButton ClickUP, ClickDOWN, ClickPROG, ShortPressPROG, LongPressPROG;
- // Definizione degli ingressi
- const byte Up = 2;
- const byte Down = 3;
- const byte Prog = 4;
- // Definizione delle uscite
- const byte OutLED = 13;
- // Variabili modificabili dal menu utente
- uint16_t Var1 = 2000;
- uint16_t Var2 = 500;
- uint16_t Var3 = 10000;
- uint16_t Var4 = 100;
- uint16_t Var5 = 100;
- uint16_t Var6 = 100;
- uint16_t Var7 = 100;
- #define TEMPO_PROG 2000
- #define TEMPO_SWITCH 500
- // Altre variabili
- bool SetupMode = false;
- /////////////////////////// Ciclo di Setup //////////////////////////////////
- void setup(){
- Serial.begin(9600);
- EEPROM_read(10, Var1);
- EEPROM_read(12, Var2);
- EEPROM_read(14, Var3);
- EEPROM_read(16, Var4);
- EEPROM_read(18, Var5);
- EEPROM_read(20, Var6);
- EEPROM_read(22, Var7);
- pinMode(Up, INPUT_PULLUP);
- pinMode(Down, INPUT_PULLUP);
- pinMode(Prog, INPUT_PULLUP);
- // Associazione delle funzioni che verranno eserguite in seguito all'evento corrispondente del pulsante
- ClickUP.init(Up, &funcUpClick, NULL, false, LOW, 50);
- ClickDOWN.init(Down, &funcDownClick, NULL, false, LOW, 50);
- ClickPROG.init(Prog, &funcProgClick, NULL, false, LOW, 50);
- LongPressPROG.init(Prog, &f_ProgLongPress, NULL, false, LOW, TEMPO_PROG);
- ShortPressPROG.init(Prog, &f_ProgShortPress, NULL, false, LOW, TEMPO_SWITCH);
- Serial.println("Compiled: " __DATE__ ", " __TIME__ ", " __VERSION__);
- Serial.println(F("Versione 1.1"));
- Serial.println("");
- // Inizializzazione del display LCD
- lcd.init();
- lcd.backlight();
- lcd.setCursor(0, 0);
- delay(2000);
- }
- /////////////////////////// Ciclo Principale ////////////////////////////////
- void loop(){
- // Gestione eventi associtai ai pulsanti
- ClickUP.handler();
- ClickDOWN.handler();
- ClickPROG.handler();
- LongPressPROG.handler();
- ShortPressPROG.handler();
- if(SetupMode){
- mostraMenuProg();
- }
- else {
- // Fai quel che devi
- }
- }
- /////////////////////////////////////////////////////////////////////////////
- // Variabili usate per "navigare" all'interno del menu di setup
- uint8_t ProgRow = 0;
- uint8_t ProgCol = 19;
- uint8_t Pagina = 1;
- uint8_t oldPagina = 0;
- static char buf[10];
- // Fine della programmazione. Procediamo a memorizzare i nuovi valori
- void ProgrammazioneFinita(){
- lcd.noBlink();
- lcd.clear();
- EEPROM_write(10, Var1);
- EEPROM_write(12, Var2);
- EEPROM_write(14, Var3);
- EEPROM_write(16, Var4);
- EEPROM_write(18, Var5);
- EEPROM_write(20, Var6);
- EEPROM_write(22, Var7);
- SetupMode = false;
- }
- // Funzione che mostra sul display le variabili utente modificabile nel menu setup
- void mostraMenuProg(){
- if(Pagina != oldPagina){
- oldPagina = Pagina;
- switch (Pagina){
- case 1:
- lcd.clear();
- ProgRow = 0;
- ProgCol = 19;
- lcd.setCursor(0, 0);
- lcd.print("Valore Var1: "); sprintf(buf, "%05u", Var1 ); lcd.print(buf);
- lcd.setCursor(0, 1);
- lcd.print("Valore Var2: "); sprintf(buf, "%05u", Var2 ); lcd.print(buf);
- lcd.setCursor(0, 2);
- lcd.print("Valore Var3: "); sprintf(buf, "%05u", Var3 ); lcd.print(buf);
- lcd.setCursor(0, 3);
- lcd.print("Valore Var4: "); sprintf(buf, "%05u", Var4 ); lcd.print(buf);
- break;
- case 2:
- lcd.clear();
- ProgRow = 0;
- ProgCol = 19;
- lcd.setCursor(0, 0);
- lcd.print("Valore Var5: "); sprintf(buf, "%05u", Var5 ); lcd.print(buf);
- lcd.setCursor(0, 1);
- lcd.print("Valore Var6: "); sprintf(buf, "%05u", Var6 ); lcd.print(buf);
- lcd.setCursor(0, 2);
- lcd.print("Valore Var7: "); sprintf(buf, "%05u", Var7 ); lcd.print(buf);
- lcd.setCursor(0, 3);
- lcd.print(" SALVA");
- break;
- default:
- break;
- }
- }
- }
- // Gestione del cambio pagina (con solo due pagine รจ quasi ridondante)
- void CambioPagina(int dir){
- if(dir > 0 ){
- if (Pagina == 2)
- Pagina = 1;
- else
- Pagina++;
- }
- if(dir < 0 ){
- if (Pagina == 1)
- Pagina = 2;
- else
- Pagina--;
- }
- }
- // Con questa funzione incremento/decremento la variabile corrispondente alla posizione del cursore
- void updateVar(uint8_t ProgCol, uint8_t ProgRow, uint8_t Pagina, int val){
- int update_val = 1*val;
- for(int i=0; i<(19-ProgCol); i++)
- update_val *= 10;
- if(Pagina ==1)
- switch (ProgRow){
- case 0:
- Var1 += update_val;
- lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var1 ); lcd.print(buf);
- break;
- case 1:
- Var2 += update_val;
- lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var2 ); lcd.print(buf);
- break;
- case 2:
- Var3 += update_val;
- lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var3 ); lcd.print(buf);
- break;
- case 3:
- Var4 += update_val;
- lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var4 ); lcd.print(buf);
- break;
- }
- if(Pagina == 2)
- switch (ProgRow){
- case 0:
- Var5 += update_val;
- lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var5 ); lcd.print(buf);
- break;
- case 1:
- Var6 += update_val;
- lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var6 ); lcd.print(buf);
- break;
- case 2:
- Var7 += update_val;
- lcd.setCursor(15, ProgRow); sprintf(buf, "%05u", Var7 ); lcd.print(buf);
- break;
- case 3:
- break;
- }
- // Ripristina posizione cursore
- lcd.setCursor(ProgCol, ProgRow);
- }
- ///////////////// Azioni da eseguire alla pressione dei pulsanti ///////////////////////
- // Con la pressione prolungata (> TEMPO_PROG) del tasto PROG abilito/disabilito il menu di setup
- void f_ProgLongPress(){
- lcd.clear();
- SetupMode = !SetupMode;
- Pagina = 1;
- oldPagina = 0;
- Serial.print(F("Modo Programmazione: "));
- Serial.println(SetupMode);
- delay(1000);
- }
- // Con il click del tasto PROG abilito l'edit della variabile
- void funcProgClick(){
- if(SetupMode){
- if(ProgCol < 19)
- ProgCol++;
- else
- ProgCol = 15;
- lcd.setCursor(ProgCol, ProgRow);
- lcd.blink();
- }
- }
- // Con un click prolongato (> TEMPO_SWITCH) cambio variabile da modificare
- void f_ProgShortPress(){
- if(SetupMode){
- if(ProgRow == 3){
- if(Pagina == 2)
- ProgrammazioneFinita();
- else
- Pagina++;
- }
- else {
- ProgCol = 14;
- if(ProgRow < 3)
- ProgRow++;
- }
- }
- }
- // Con la pressione normale del tasto UP incremento la variabile
- void funcUpClick(){
- if(SetupMode)
- updateVar(ProgCol, ProgRow, Pagina, +1);
- }
- // Con la pressione normale del tasto DOWN decremento la variabile
- void funcDownClick(){
- if(SetupMode)
- updateVar(ProgCol, ProgRow, Pagina, -1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement