#include <LiquidCrystal.h>
#define menuLength 4
#define pinBtnUp 2
#define pinBtnDwn 3
LiquidCrystal lcd(9,8,7,6,5,4);
bool menuChange = 0;
unsigned menuVal = 0;
unsigned char RxdataCnt = 0;
unsigned long time = 0;
unsigned int counter = 0;
float analogVal; // letura analogico-digitale potenziometro su A0
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode (pinBtnUp, INPUT_PULLUP); // alla push
pinMode (pinBtnDwn, INPUT_PULLUP); // alla push
attachInterrupt(digitalPinToInterrupt(pinBtnUp), myISRup, FALLING);
attachInterrupt(digitalPinToInterrupt(pinBtnDwn), myISRdwn, FALLING);
lcd.begin(16,2);
menuChange = 1;
}
void loop() {
// put your main code here, to run repeatedly:
if (menuChange == 1) {
changeMenuText();
}
updateVal();
//Serial.print(" INIT LCD ");
}
void myISRup(void) { // interrupt service routine
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
// Per gestire il bounce del pulsante non accetto azioni per 150ms,
// non funziona con i semplici delay all'interno degli interrupt
if (interrupt_time - last_interrupt_time > 150) {
if (++menuVal >= menuLength) {
menuVal = 0;
}
menuChange =1;
counter++;
}
last_interrupt_time = interrupt_time;
}
void myISRdwn(void) { // interrupt service routine
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
// Per gestire il bounce del pulsante non accetto azioni per 150ms,
// non funziona con i semplici delay all'interno degli interrupt
if (interrupt_time - last_interrupt_time > 150) {
if (--menuVal > menuLength) {
menuVal = menuLength-1;
}
menuChange =1;
counter++;
}
last_interrupt_time = interrupt_time;
}
void changeMenuText(void) { //parte fissa del display alla i-esima posizione
lcd.clear();
switch(menuVal) {
case 0:
lcd.setCursor(3,0);
lcd.print("Voltometro");
lcd.setCursor(15,0);
lcd.print(menuVal);
lcd.setCursor(0,1);
lcd.print("Tensione: ");
lcd.setCursor(14,1);
lcd.print("V");
Serial.print(menuVal, DEC);
break;
case 1:
lcd.setCursor(3,0);
lcd.print("Cronometro");
lcd.setCursor(15,0);
lcd.print(menuVal);
lcd.setCursor(0,1);
lcd.print("Up-Time: ");
Serial.print(menuVal, DEC);
break;
case 2:
lcd.setCursor(1,0);
lcd.print("Dati Seriale");
lcd.setCursor(15,0);
lcd.print(menuVal);
Serial.print(menuVal, DEC);
break;
case 3:
lcd.setCursor(2,0);
lcd.print("Contatore");
lcd.setCursor(15,0);
lcd.print(menuVal);
Serial.print(menuVal, DEC);
break;
}
menuChange = 0;
delay(400);
}
void updateVal(void) { //senza variare il contenuto della schermata, aggiorno i valori variabili rilevati/forniti
switch(menuVal) {
case 0:
lcd.setCursor(10,1);
analogVal = ((float)analogRead(A0)/1024)*5;
lcd.print(analogVal);
break;
case 1:
time = millis() / 1000;
lcd.setCursor(9,1);
lcd.print(time);
lcd.print("sec.");
break;
case 2:
char incomingByte;
if (Serial.available() > 0) {
incomingByte = Serial.read();
lcd.setCursor(RxdataCnt++,1);
lcd.print(incomingByte);
delay(300);
if (RxdataCnt >= 16) {
RxdataCnt = 0;
}
lcd.print(" ");
}
break;
case 3:
lcd.setCursor(0,1);
lcd.print(counter);
break;
}
}