Buongiorno a tutti,
innanzitutto ringrazio chi mi ha aiutato la scorsa volta, il programma funziona e sta facendo il suo dovere!
Vorrei implementare il circuito con dei pulsanti (3 o 4) e dei menu che mi permettano di settare i parametri di funzionamento dell'Arduino senza dover smontare tutto ogni volta.
L'lcd mentre è in standby dovrebbe mostrare le informazioni in tempo reale (temperatura e altro). Cliccando un tasto dovremmo accedere al menu dei parametri, in totale 5 voci. Per ciascun parametro ho dei valori già noti che vorrei poter impostare (vedi array fTemp, cStartup e cIdle sotto).
Cercando sul web trovavo menu realizzati con librerie già pronte, delle quali capisco ben poco.
Ho trovato QUESTO esempio molto interessante. Ho provato a modificarlo per il keypad lcd, però non sono riuscito a farlo funzionare.
Innanzitutto, riesco a fare tutto utilizzando soli 3 pulsanti?
Lo schema logico dell'esempio al link sopra può funzionare nel mio caso?
#include <LiquidCrystal.h>
#define BUTTON A0
#define BACKLIGHT 10
LiquidCrystal lcd(8,9,4,5,6,7);// inizializzazione display lcd
int val_up[]={120,160};
int val_down[]={300,350};
int val_sel[]={720,760};
int val_left[]={480,520};
int val_right[]={0,20};
int button=0;
int sets=0;
int selection=0;
int x=0;
float fermentationTemp=19; //variabile di temperatura predefinita
unsigned long coldStartup=9000; //variabile di tempo di accensione predefinita
unsigned long coldIdle=60000; //variabile di tempo di standby predefinita
float fTemp[31]={0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.5,19,19.5,20,20.5,21,21.5,22,22.5,23,24,25,26,27,28}; //array con valori di temperatura in gradi celsius
unsigned long cStartup[16]={40000,50000,60000,70000,80000,90000,100000,110000,120000,130000,140000,150000,180000,360000,720000,1440000}; //array con valori di tempo di accensione in millisecondi
unsigned long cIdle[16]={480000,540000,600000,660000,720000,780000,840000,900000,960000,1020000,1080000,1140000,1200000,1500000,1800000,2400000}; //array con valori di tempo di standby in millisecondi
unsigned long timer=0; //timer per tempo di rimbalzo quando si preme un pulsante
unsigned long debounce=150; //tempo di rimbalzo
void setup(){
pinMode(BACKLIGHT,OUTPUT);
pinMode(BUTTON,INPUT);
digitalWrite(BACKLIGHT,HIGH);
lcd.begin(16,2);
}
void loop(){
button=analogRead(A0);
if(val_down[0]<=button&&button<=val_down[1]&&millis()-timer>=debounce){
sets++;
}
else if(val_up[0]<=button&&button<=val_up[1]&&millis()-timer>=debounce){
sets--;
}
if(selection==0){
while(x==0){
x++;
}
lcd.setCursor(0,0);
lcd.print("TEMPERATURE");
lcd.setCursor(0,1);
lcd.print(fTemp[sets]);
button=analogRead(A0);
if(sets<1){
lcd.setCursor(0,1);
lcd.print(' ');
lcd.setCursor(1,1);
lcd.print(' ');
lcd.setCursor(2,1);
lcd.print(' ');
lcd.setCursor(3,1);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(fTemp[sets]);
if(val_sel[0]<=button&&button<=val_sel[1]&&millis()-timer>=debounce){
fermentationTemp=fTemp[sets];
selection=1;
}
}
else if(sets<2){
lcd.setCursor(0,1);
lcd.print(' ');
lcd.setCursor(1,1);
lcd.print(' ');
lcd.setCursor(2,1);
lcd.print(' ');
lcd.setCursor(3,1);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(fTemp[sets]);
if(val_sel[0]<=button&&button<=val_sel[1]&&millis()-timer>=debounce){
fermentationTemp=fTemp[sets];
selection=1;
}
}
else if(sets<3){
lcd.setCursor(0,1);
lcd.print(' ');
lcd.setCursor(1,1);
lcd.print(' ');
lcd.setCursor(2,1);
lcd.print(' ');
lcd.setCursor(3,1);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(fTemp[sets]);
if(val_sel[0]<=button&&button<=val_sel[1]&&millis()-timer>=debounce){
fermentationTemp=fTemp[sets];
selection=1;
}
}
if(sets>=3||sets<=0){
sets=0;
}
}
else if(selection=1){
for(int x=0;x<1;x++){
lcd.clear();
sets=0;
selection=2;
}
}
else if(selection==2){
lcd.setCursor(0,0);
lcd.print("COLD STARTUP");
lcd.setCursor(0,1);
lcd.print(cStartup[sets]);
button=analogRead(A0);
if(sets<1){
lcd.setCursor(0,1);
lcd.print(' ');
lcd.setCursor(1,1);
lcd.print(' ');
lcd.setCursor(2,1);
lcd.print(' ');
lcd.setCursor(3,1);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(cStartup[sets]);
if(val_sel[0]<=button&&button<=val_sel[1]&&millis()-timer>=debounce){
coldStartup=cStartup[sets];
selection=3;
}
}
else if(sets<2){
lcd.setCursor(0,1);
lcd.print(' ');
lcd.setCursor(1,1);
lcd.print(' ');
lcd.setCursor(2,1);
lcd.print(' ');
lcd.setCursor(3,1);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(cStartup[sets]);
if(val_sel[0]<=button&&button<=val_sel[1]&&millis()-timer>=debounce){
coldStartup=cStartup[sets];
selection=3;
}
}
else if(sets<3){
lcd.setCursor(0,1);
lcd.print(' ');
lcd.setCursor(1,1);
lcd.print(' ');
lcd.setCursor(2,1);
lcd.print(' ');
lcd.setCursor(3,1);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(cStartup[sets]);
if(val_sel[0]<=button&&button<=val_sel[1]&&millis()-timer>=debounce){
selection=3;
}
}
if(sets>=3||sets<=0){
sets=0;
}
}
else if(selection=3){
for(int x=0;x<1;x++){
lcd.clear();
sets=0;
selection=4;
}
}
else if(selection==4){
lcd.setCursor(0,0);
lcd.print("COLD IDLE");
lcd.setCursor(0,1);
lcd.print(cIdle[sets]);
button=analogRead(A0);
if(sets<1){
lcd.setCursor(0,1);
lcd.print(' ');
lcd.setCursor(1,1);
lcd.print(' ');
lcd.setCursor(2,1);
lcd.print(' ');
lcd.setCursor(3,1);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(cIdle[sets]);
if(val_sel[0]<=button&&button<=val_sel[1]&&millis()-timer>=debounce){
coldIdle=cIdle[sets];
selection=5;
}
}
else if(sets<2){
lcd.setCursor(0,1);
lcd.print(' ');
lcd.setCursor(1,1);
lcd.print(' ');
lcd.setCursor(2,1);
lcd.print(' ');
lcd.setCursor(3,1);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(cIdle[sets]);
if(val_sel[0]<=button&&button<=val_sel[1]&&millis()-timer>=debounce){
coldIdle=cIdle[sets];
selection=5;
}
}
else if(sets<3){
lcd.setCursor(0,1);
lcd.print(' ');
lcd.setCursor(1,1);
lcd.print(' ');
lcd.setCursor(2,1);
lcd.print(' ');
lcd.setCursor(3,1);
lcd.print(' ');
lcd.setCursor(0,1);
lcd.print(cIdle[sets]);
if(val_sel[0]<=button&&button<=val_sel[1]&&millis()-timer>=debounce){
coldIdle=cIdle[sets];
selection=5;
}
}
if(sets>=3||sets<=0){
sets=0;
}
}
else if(selection=5){
for(int x=0;x<1;x++){
lcd.clear();
sets=0;
}
}
if(val_left[0]<=button&&button<=val_left[1]){
sets=0;
selection=0;
x=0;
}
}
I problemi che riscontro con il codice così sono:
-premendo select a display non viene scritto più nulla
-premendo up a qualsiasi valore della variabile "sets", viene visualizzato 0.000, mentre down funziona