Buongiorno a tutti,
premetto che come vedrete nel programma ho utilizzato un display senza modulo IC2 visto che non ne disponevo uno.
vi pongo il mio problema, vorrei realizzare un menù "interattivo". Questo menù avrà come input 2 pulsanti, uno di selezione e uno di cambio modalità.
nel momento in cui viene premuto il tasto "p_mode" lui cambia la modalità passando dalla verde alla gialla e infine alla rossa, per ogni cambio è necessario premere il pulsante ogni volta.
quando si è fermi su una modalità premendo "p_select" accenderà un led e cambierà schermata, poi comincierà a farlo lampeggiare all'infinito (processo che verrà poi sostituito).
tutto questo attualmente funziona, ora la mia domanda è una volta entrato in questo loop infinito necessito di uscirne soltanto premendo il pulsante "p_mode", e tornare nel void principale. siccome il processo all'interno del loop sarà più complesso in futuro di un led che lampeggia, non posso uscirne normalmente terminando le istruzioni nel void secondario (in questo caso void green/yellow/red), quindi ho pensato di utilizzare un interrupt che funziona soltanto nel void secondario e che quando il pulsante "p_mode" viene premuto (dando "0") entri nel void reset che spenga i led, e che tramite un goto mi riporti nel void principale facendolo tornare alla pagina delle modalità.
soltanto che a quanto ho capito il goto funziona soltanto nel void in cui è chiamato.
ora sperando di avervi fornito una spiegazione comprensibile, cosa ne pensate? cosa potrei fare?
grazie in anticipo,
buon pomeriggio
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#define p_mode 8
#define p_select 9
int mode=0;
int lv=12;
int lg=11;
int lr=10;
void setup(){
Serial.begin(9600);
pinMode(p_mode,INPUT);
pinMode(p_select,INPUT);
pinMode(lv,OUTPUT);
pinMode(lg,OUTPUT);
pinMode(lr,OUTPUT);
attachInterrupt(0,reset,FALLING);
lcd.begin(20, 4);
lcd.setCursor(8,0);
lcd.print("Menu");
lcd.setCursor(0,3);
lcd.print("Select Mode");
}
void loop(){
noInterrupts();
header:
Serial.println(mode);
if(digitalRead(p_mode)==LOW){
mode=mode+1;
while(digitalRead(p_mode)==LOW){
delayMicroseconds(1);
}
lcd.clear();
}
if(mode==1){
verde();
}
else if(mode==2){
giallo();
}
else if(mode==3){
rosso();
}
else if(mode>=4){
mode=1;
}
}
void verde(){
interrupts();
lcd.setCursor(8,0);
lcd.print("Menu");
lcd.setCursor(0,1);
lcd.print("Green Mode");
if(digitalRead(p_select)==LOW){
digitalWrite(lv,HIGH);
digitalWrite(lg,LOW);
digitalWrite(lr,LOW);
lcd.clear();
lcd.setCursor(5,4);
lcd.print("GREEN MODE");
lcd.setCursor(16,3);
lcd.print("Home");
int led1=0;
while(led1==0){
digitalWrite(lv,LOW);
digitalWrite(lv,HIGH);
}
}
noInterrupts();
}
void giallo(){
interrupts();
lcd.setCursor(8,0);
lcd.print("Menu");
lcd.setCursor(4,4);
lcd.print("Yellow Mode");
if(digitalRead(p_select)==LOW){
digitalWrite(lv,LOW);
digitalWrite(lg,HIGH);
digitalWrite(lr,LOW);
lcd.clear();
lcd.setCursor(4,1);
lcd.print("YELLOW MODE");
lcd.setCursor(16,3);
lcd.print("Home");
int led2=0;
while(led2==0){
digitalWrite(lg,LOW);
digitalWrite(lg,HIGH);
}
}
noInterrupts();
}
void rosso(){
interrupts();
lcd.setCursor(8,0);
lcd.print("Menu");
lcd.setCursor(6,4);
lcd.print("Red Mode");
if(digitalRead(p_select)==LOW){
digitalWrite(lv,LOW);
digitalWrite(lg,LOW);
digitalWrite(lr,HIGH);
lcd.clear();
lcd.setCursor(6,4);
lcd.print("RED MODE");
lcd.setCursor(16,3);
lcd.print("Home");
int led3=0;
while(led3==0){
digitalWrite(lr,LOW);
digitalWrite(lr,HIGH);
}
}
noInterrupts();
}
void reset(){
digitalWrite(lv,LOW);
digitalWrite(lg,LOW);
digitalWrite(lr,LOW);
lcd.clear();
lcd.setCursor(8,0);
lcd.print("Menu");
lcd.setCursor(0,3);
lcd.print("Select Mode");
goto header;
}