E' lungo, ma non tanto da non poter essere pubblicato qui!
// librerie per display LCD ompatibili con R1 v4
#include <Wire.h>
#include <PCF8574_HD44780_I2C.h>
// Definizione dei pin per l'encoder
#define Clk 3
#define Dt 2
#define pin_pul 4
// Definizione variabili per i menù
int posizione = 0; // Indica la posizione della freccia nel display
int scelta = 0; // Indica quale opzione del menù si sceglie premendo il pulsante
bool tasto =0; // 0 = pulsante non premuto, 1 = pulsante premuto
int direzione = 0; // Indica il verso di rotazione dell'encoder, -1 o +1
int prevClk;
int prevDt;
int visualizza_menu =0;
bool esci=0;
// Definizione caratteristiche display
PCF8574_HD44780_I2C lcd(0x27,20,4);
// Definizione dei sottomenu
String menu_principale[5] = {"Scelta 1", "Scelta 2", "Scelta 3", "Scelta 4", "Esci"};
String sottomenu1[5] = {"Scelta 1_1", "Scelta 2_1", "Scelta 3_1", "Scelta 4_1", "Esci"};
String sottomenu2[9] = {"Scelta 1_2", "Scelta 2_2", "Scelta 3_2", "Scelta 4_2", "Scelta 5_2", "Scelta 6_2", "Scelta 7_2", "Scelta 8_2", "Esci"};
String sottomenu3[12] = {"Scelta 1_3", "Scelta 2_3", "Scelta 3_3", "Scelta 4_3", "Scelta 5_3", "Scelta 6_3", "Scelta 7_3", "Scelta 8_3", "Scelta 9_3", "Scelta 10_3", "Scelta 11_3", "Esci"};
String sottomenu4[5] = {"Scelta 1_4", "Esci"};
void setup() {
// Inizializzazione dell'encoder
pinMode(Clk, INPUT);
pinMode(Dt, INPUT);
pinMode(pin_pul, INPUT_PULLUP);
// Inizializzazione del display
lcd.init();
lcd.backlight();
Serial.begin(9600);
prevClk = digitalRead(Clk);
prevDt = digitalRead(Dt);
}
void loop() {
// Visualizzazione del menù principale se si preme il pulsante dell'encoder
if (digitalRead(pin_pul) == 0) Menu_principale();
//Serial.println("Loop principale");
}
void Menu_principale() {
while(digitalRead(pin_pul) !=1 ){} // Gira finchè non viene rilasciato il pulsante
lcd.clear();
scelta =0;
posizione = 0;
tasto = 1;
esci =0;
visualizza_menu =1;
// Stampa il menù principale
stampa_menu(0,4,menu_principale);
//stampa_freccia();
while (esci==0) { // Esce dal menù quando viene scelta l'opzione desiderata
stampa_freccia();
leggi_Encoder();
if (posizione > 3) {
visualizza_menu=2;
posizione = 0;
} else if (posizione ==1 && visualizza_menu ==2){
visualizza_menu =1;
posizione = 0;
scelta = 0;
}
if (posizione < 0 ){
if (visualizza_menu ==1) {
visualizza_menu =2;
posizione = 0;
scelta = 4;
} else if (visualizza_menu ==2){
visualizza_menu =1;
posizione = 3;
scelta = 3;
}
}
switch(visualizza_menu){
case 1:
stampa_menu(0,4,menu_principale);
break;
case 2:
stampa_menu(4,5,menu_principale);
break;
}
if (tasto==0) {
switch(scelta){
case 0:
prima_scelta();
break;
case 1:
seconda_scelta();
break;
case 2:
terza_scelta();
break;
case 3:
quarta_scelta();
break;
case 4:
esci=1;
break;
} // Fine switch
} // fine IF
} // Fine while
while(digitalRead(pin_pul) !=1 ){} // Si ferma finchè non viene rilasciato il tasto
lcd.clear();
} // Fine menù principale
void prima_scelta() {
while(digitalRead(pin_pul) !=1 ){} // Gira finchè non viene rilasciato il pulsante
lcd.clear();
scelta=0;
posizione = 0;
tasto = 1;
esci=0;
// Stampa il menù principale
stampa_menu(0,4,sottomenu1);
//stampa_freccia();
while (esci==0) { // Esce dal menù quando viene scelta l'opzione desiderata
stampa_freccia();
leggi_Encoder();
if (posizione > 3) {
visualizza_menu=2;
posizione = 0;
} else if (posizione ==1 && visualizza_menu ==2){
visualizza_menu =1;
posizione = 0;
scelta = 0;
}
if (posizione < 0 ){
if (visualizza_menu ==1) {
visualizza_menu =2;
posizione = 0;
scelta = 4;
} else if (visualizza_menu ==2){
visualizza_menu =1;
posizione = 3;
scelta = 3;
}
}
switch(visualizza_menu){
case 1:
stampa_menu(0,4,sottomenu1);
break;
case 2:
stampa_menu(4,5,sottomenu1);
break;
}
if (tasto==0) {
switch(scelta){
case 0:
prima_scelta();
break;
case 1:
//seconda_scelta();
break;
case 2:
//terza_scelta();
break;
case 3:
//quarta_scelta();
break;
case 4:
esci=1;
break;
} // Fine switch
} // fine IF
} // Fine while
while(digitalRead(pin_pul) !=1 ){} // Si ferma finchè non viene rilasciato il tasto
lcd.clear();
Menu_principale();
} // Fine prima_scelta
void seconda_scelta() {
while(digitalRead(pin_pul) !=1 ){} // Gira finchè non viene rilasciato il pulsante
lcd.clear();
scelta=0;
posizione = 0;
tasto = 1;
esci=0;
visualizza_menu =1;
// Stampa il menù principale
stampa_menu(0,4,sottomenu2);
//stampa_freccia();
while (esci==0) { // Esce dal menù quando viene scelta l'opzione desiderata
stampa_freccia();
leggi_Encoder();
if (posizione > 3) {
if (visualizza_menu==1) {
visualizza_menu=2;
posizione = 0;
} else if (visualizza_menu==2){
visualizza_menu =3;
posizione = 0;
}
}
if (posizione ==1 && visualizza_menu==3){
visualizza_menu =1;
posizione = 0;
scelta =0;
}
if (posizione < 0){
if (visualizza_menu==1) {
visualizza_menu =3;
posizione = 0;
scelta = 8;
} else if (visualizza_menu ==2){
visualizza_menu =1;
posizione = 3;
scelta = 3;
} else if (visualizza_menu ==3){
visualizza_menu =2;
posizione = 3;
scelta = 7;
}
}
switch(visualizza_menu){
case 1:
stampa_menu(0,4,sottomenu2);
break;
case 2:
stampa_menu(4,8,sottomenu2);
break;
case 3:
stampa_menu(8,9,sottomenu2);
break;
}
if (tasto==0) {
switch(scelta){
case 0:
prima_scelta();
break;
case 1:
//seconda_scelta();
break;
case 2:
//terza_scelta();
break;
case 3:
//quarta_scelta();
break;
case 4:
//quinta_scelta();
break;
case 5:
//sesta_scelta();
break;
case 6:
//settima_scelta();
break;
case 7:
//ottava_scelta();
break;
case 8:
esci=1;
break;
} // Fine switch
} // fine IF
} // Fine while
while(digitalRead(pin_pul) !=1 ){} // Si ferma finchè non viene rilasciato il tasto
lcd.clear();
Menu_principale();
} // Fine seconda_scelta
void terza_scelta() {
while(digitalRead(pin_pul) !=1 ){} // Gira finchè non viene rilasciato il pulsante
lcd.clear();
scelta=0;
posizione = 0;
tasto = 1;
esci=0;
visualizza_menu =1;
// Stampa il menù principale
stampa_menu(0,4,sottomenu3);
//stampa_freccia();
while (esci==0) { // Esce dal menù quando viene scelta l'opzione desiderata
stampa_freccia();
leggi_Encoder();
if (posizione > 3) {
if (visualizza_menu==1) {
visualizza_menu=2;
posizione =0;
} else if (visualizza_menu==2){
visualizza_menu =3;
posizione =0;
}
}
if (posizione ==3 && visualizza_menu==3){
visualizza_menu =1;
posizione = 0;
scelta =0;
}
if (posizione < 0){
posizione = 3;
if (visualizza_menu==1) {
visualizza_menu =3;
scelta = 11;
} else if (visualizza_menu ==2){
visualizza_menu =1;
scelta = 3;
} else if (visualizza_menu ==3){
visualizza_menu =2;
scelta = 7;
}
}
switch(visualizza_menu){
case 1:
stampa_menu(0,4,sottomenu3);
break;
case 2:
stampa_menu(4,8,sottomenu3);
break;
case 3:
stampa_menu(8,12,sottomenu3);
break;
}
if (tasto==0) {
switch(scelta){
case 0:
prima_scelta();
break;
case 1:
//seconda_scelta();
break;
case 2:
//terza_scelta();
break;
case 3:
//quarta_scelta();
break;
case 4:
//quinta_scelta();
break;
case 5:
//sesta_scelta();
break;
case 6:
//settima_scelta();
break;
case 7:
//ottava_scelta();
break;
case 11:
esci=1;
break;
} // Fine switch
} // fine IF
} // Fine while
while(digitalRead(pin_pul) !=1 ){} // Si ferma finchè non viene rilasciato il tasto
lcd.clear();
Menu_principale();
} // Fine terza_scelta
void quarta_scelta() {
while(digitalRead(pin_pul) !=1 ){} // Gira finchè non viene rilasciato il pulsante
lcd.clear();
scelta=0;
posizione = 0;
tasto = 1;
esci=0;
// Stampa il menù principale
stampa_menu(0,2,sottomenu4);
//stampa_freccia();
while (esci==0) { // Esce dal menù quando viene scelta l'opzione desiderata
stampa_freccia();
leggi_Encoder();
if (posizione > 1) {
posizione = 0;
scelta =0;
} else if (posizione < 0 ){
posizione = 1;
scelta = 1;
}
if (tasto==0) {
switch(scelta){
case 0:
prima_scelta();
break;
case 1:
esci=1;
break;
} // Fine switch
} // fine IF
} // Fine while
while(digitalRead(pin_pul) !=1 ){} // Si ferma finchè non viene rilasciato il tasto
lcd.clear();
Menu_principale();
} // Fine quarta_scelta
void stampa_menu(int min_menu,int max_menu, String sottomenu[]){ // Visualizza il menù su LCD. min_menu e max_menu dicono quale intervallo dell'array visualizzare
lcd.clear();
for (int i=min_menu; i<max_menu; i++) {
lcd.setCursor(1, i-min_menu);
lcd.print(sottomenu[i]);
}
}
void stampa_freccia(){
for (int i=0;i<4;i++){
lcd.setCursor(0,i);
lcd.print(" ");
}
lcd.setCursor(0,posizione);
lcd.print(">"); // Stampa la freccia sul LCD
}
void leggi_Encoder(){
while(digitalRead(pin_pul) !=1 ){} // Gira finchè non viene rilasciato il pulsante
direzione = 0;
tasto = 1;
while(direzione==0 && tasto==1){
tasto = digitalRead(pin_pul);
int currClk = digitalRead(Clk);
int currDt = digitalRead(Dt);
if (currClk != prevClk) {
if (0 == currClk) {
direzione = 1 - ((currDt == currClk) << 1);
}
prevClk = currClk;
prevDt = currDt;
}
} // Fine while
if (direzione > 0) {
scelta++;
posizione++;
} else if (direzione < 0) {
scelta--;
posizione--;
}
while(digitalRead(pin_pul) !=1 ){} // Gira finchè non viene rilasciato il pulsante
}