Ciao a tutti ragazzi ho bisogno di un aiutino da parte vostra
Sto provando a realizzare un piccolo programma che nel loop mi mostra su lcd diverse schermate ed ogni 5 secondi il display cambia visualizzazione ciclicamente, schermata 1-->schermata 2-->schermata n-->e ricomincia dalla 1.
Durante l'esecuzione di queste finestre vorrei poter intervenire in qualsiasi momento premendo un tasto ed entrare nella funzione Main.
Fin'ora ho usato la funzione delay per far cambiare le schermate, ma come noto mi blocca fin quando non finisce il suo ciclo.
Esiste un altro modo per fare la stessa cosa, ma che non mi blocchi e che in qualsiasi momento premo il pulsante entro nel Main?
Allego il codice che ho scritto fino ad ora che lavora con le delay
Ringrazio anticipatamente coloro che vorranno aiutarmi.
#include <LiquidCrystal.h>
#define btnRIGHT 0 //costante pulsante RIGHT
#define btnUP 1 //costante pulsante UP
#define btnDOWN 2 //costante pulsante DOWN
#define btnLEFT 3 //costante pulsante LEFT
#define btnSELECT 4 //costante pulsante SELECT
#define btnNONE 5 //costante pulsante NONE
////////////////////////////////////////////////////////////////////////
////////////// Menu ///////////////////////////////
////////////////////////////////////////////////////////////////////////
char Menu[5][17] = {"Voce 1 ",
"Voce 2 ",
"Voce 3 ",
"Voce 4 ",
" "};
int offset = 0;
////////////////////////////////////////////////////////////////////////
////////////// LCD ///////////////////////////////
////////////////////////////////////////////////////////////////////////
LiquidCrystal lcd(8,9,4,5,6,7); //pin Display Arduino Mega
////////////////////////////////////////////////////////////////////////
////////////// Keypad ///////////////////////////////
////////////////////////////////////////////////////////////////////////
int NUM_KEYS = 5;
int adc_key_in ;
int key = -1;
int oldkey = -1;
int adc_key_val[5] = {50 ,195 ,380 ,555 ,790 };
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{
return k;
}
}
if (k >= NUM_KEYS)
k = -1;
return k;
}
void setup(){
Serial.begin(9600);
lcd.begin(16,2);
}
void loop(){
prima_schermata();
delay(5000);
seconda_schermata();
delay(5000);
terza_schermata();
delay(5000);
adc_key_in = analogRead(0);
delay(50);
key = get_key(adc_key_in);
if (key != oldkey){
adc_key_in = analogRead(0);
delay(50);
key = get_key(adc_key_in);
if (key != oldkey){
switch(key){
case 1:
lcd.clear();
Main();
break;
}
}
}
}
void PrintMenu( char item[20]){
lcd.setCursor(0,0);
lcd.print(item);
}
void Main(){
for(;;){
PrintMenu(Menu[offset]);
adc_key_in = analogRead(0);
delay(50);
key = get_key(adc_key_in);
if (key != oldkey)
{
adc_key_in = analogRead(0);
delay(50);
key = get_key(adc_key_in);
if (key != oldkey)
{
switch(key){
case 3:
if (offset > 0) offset--;
break;
case 0:
if (offset < 3) offset++;
break;
case 4:
switch(offset){
case 0:
break;
case 1:
break;
case 2:
case 3:
break;
}
}
oldkey = key;
}
}
}
}
void prima_schermata(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Schermata 1");
}
void seconda_schermata(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Schermata 2");
}
void terza_schermata(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Schermata 3");
}