ciao, io ho scritto un menù che va bene per gli lcd abbinato ad una pulstatiera a 5 pin:
la funzione doso l'avevo scritta per far partire una dosometrica e fermare la pompa di mandata sump per un tempo variabile. Dovrebbe essere adatta al tuo scopo. Anche se nel video che ho caricato viene usato un lcd più piccolo il programma è stato scritto per un 20x4
codice:
// DR.JEKYLL ENRICOVELA@GMAIL.COM
#include <LiquidCrystal.h>
int meno=53;
int piu=52;
int dx=51;
int enter=50;
int sx=49;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//VARIAIBLI bool
//VARIBILI tempo
short int s=35;
short int m=03;
short int h=23;
short int ktime=1;
short int day=3;
//VARIABILI neon
short int neon_cond=0; //!!!!!!!!!!!!!!!!!! NON MODIFICARE!!!!!!!!!!!!!!!!!
short int m_on=0;
short int h_on=0;
short int m_off=0;
short int h_off=0;
//VARIABILI doso
short int doso_cond=0; //!!!!!!!!!!!!!!!!!! NON MODIFICARE!!!!!!!!!!!!!!!!!
short int tempo_doso=0;
short int m_stop=0;
short int h_stop=0;
short int m_period=0;
short int h_period=0;
float ml=0;
//VARIABILI controller
boolean pinsx;
boolean pindx;
boolean pinp;
boolean pinm;
boolean pinenter;
short int cas=0;
short int cas1=0;
short int cas2=0;
void menucontroll(boolean,boolean,boolean,boolean,boolean,int,int){
pinp=digitalRead(piu);
pinm=digitalRead(meno);
pindx=digitalRead(dx);
pinenter=digitalRead(enter);
pinsx=digitalRead(sx);
if (pindx==HIGH){cas1=cas1+1;bounc(); lcd.begin(20,4); if (cas1==5){cas1=1;}}
if (pinsx==HIGH){cas1=cas1-1; lcd.begin(20,4); if (cas1==0){cas1=4;}bounc();}
if (pinenter==HIGH){cas2=1; bounc(); lcd.begin(20,4);}
if(pinp==HIGH){bounc();cas1=0; lcd.begin(20,4);}
if (pinm==HIGH){bounc();cas1=0; lcd.begin(20,4);}
}
void allread(boolean,boolean,boolean,boolean,boolean){
pinp=digitalRead(piu);
pinm=digitalRead(meno);
pindx=digitalRead(dx);
pinenter=digitalRead(enter);
pinsx=digitalRead(sx);
}
// STAMPA ORARIO variabili: ore, minuti, secondi
void printime(int,int,int){
if(day==0){lcd.setCursor(0, 0);lcd.print("Lun");}
if(day==1){lcd.setCursor(0, 0);lcd.print("Mar");}
if(day==2){lcd.setCursor(0, 0);lcd.print("Mer");}
if(day==3){lcd.setCursor(0, 0);lcd.print("Gio");}
if(day==4){lcd.setCursor(0, 0);lcd.print("Ven");}
if(day==5){lcd.setCursor(0, 0);lcd.print("Sab");}
if(day==6){lcd.setCursor(0, 0);lcd.print("Dom");}
lcd.setCursor(4, 0); lcd.print(h);
lcd.setCursor(6, 0);lcd.print(":");
lcd.setCursor(7, 0);lcd.print(m);
lcd.setCursor(9, 0);lcd.print(":");
lcd.setCursor(10, 0);lcd.print(s);
lcd.setCursor(14, 0);lcd.print("T:");
lcd.setCursor(16, 0);lcd.print(temperatura);
lcd.setCursor(0, 4);
lcd.print("mod");
lcd.setCursor(4, 4);
lcd.print("mod");
lcd.setCursor(8, 4);
lcd.print("set");
}
// SET NEON h_on, s, m_on, h_off, m_off
void setneonprint_M_ON(int,int,int,int,int){
lcd.setCursor(0, 0);lcd.print("Inzio Fotoperio ") ;
lcd.setCursor(1, 1);lcd.print(h_on) ;
lcd.setCursor(2, 1); lcd.print(":");
if((s%2)==0){ lcd.setCursor(4, 1);lcd.print(m_on);}
if((s%2)!=0){ lcd.setCursor(4, 1);lcd.print(" ");}
lcd.setCursor(0, 2);lcd.print("Fine Fotoperiodo ") ;
lcd.setCursor(0, 3);lcd.print(h_off) ;
lcd.setCursor(2, 3); lcd.print(":");
lcd.setCursor(3, 3);lcd.print(m_off);
}
void setneonprint_H_ON(int,int,int,int,int){
lcd.setCursor(0, 0);lcd.print("Inzio Fotoperiodo ") ;
if((s%2)==0){ lcd.setCursor(10, 0);lcd.print(h_on);}
if((s%2)!=0){ lcd.setCursor(10, 0);lcd.print(" ");}
lcd.setCursor(12, 0); lcd.print(":");
lcd.setCursor(13, 0);lcd.print(m_on);
lcd.setCursor(15, 0);lcd.print("<");
lcd.setCursor(0, 1);lcd.print("Fine ") ;
lcd.setCursor(10, 1);lcd.print(h_off) ;
lcd.setCursor(12, 1); lcd.print(":");
lcd.setCursor(13, 1);lcd.print(m_off);
}
void setneonprint_M_OFF(int,int,int,int,int){
lcd.setCursor(0, 0);lcd.print("Inzio Fotoperido ") ;
lcd.setCursor(10, 0);lcd.print(h_on) ;
lcd.setCursor(12, 0); lcd.print(":");
lcd.setCursor(13, 0);lcd.print(m_on);
lcd.setCursor(15, 1);lcd.print("<");
lcd.setCursor(0, 1);lcd.print("Fine ") ;
lcd.setCursor(10, 1);lcd.print(h_off) ;
lcd.setCursor(12, 1); lcd.print(":");
if((s%2)==0){ lcd.setCursor(13, 1);lcd.print(m_off);}
if((s%2)!=0){ lcd.setCursor(13, 1);lcd.print(" ");}
}
void setneonprint_H_OFF(int,int,int,int,int){
lcd.setCursor(0, 0);lcd.print("Inzio Fotoperio ") ;
lcd.setCursor(10, 0);lcd.print(h_on) ;
lcd.setCursor(12, 0); lcd.print(":");
lcd.setCursor(13, 0);lcd.print(m_on);
lcd.setCursor(15, 1);lcd.print("<");
lcd.setCursor(0, 1);lcd.print("Fine ") ;
if((s%2)==0){ lcd.setCursor(10, 1);lcd.print(h_off);}
if((s%2)!=0){ lcd.setCursor(10, 1);lcd.print(" ");}
lcd.setCursor(12, 1); lcd.print(":");
lcd.setCursor(13, 1);lcd.print(m_off);
}
// STAMPA SET M ORARIO variabili: ore, minuti, secondi
void setprintime_M(int, int, int){
lcd.setCursor(13, 0);lcd.print("SetTime") ;
if(day==0){lcd.setCursor(0, 1);lcd.print("Lun");}
if(day==1){lcd.setCursor(0, 1);lcd.print("Mar");}
if(day==2){lcd.setCursor(0, 1);lcd.print("Mer");}
if(day==3){lcd.setCursor(0, 1);lcd.print("Gio");}
if(day==4){lcd.setCursor(0, 1);lcd.print("Ven");}
if(day==5){lcd.setCursor(0, 1);lcd.print("Sab");}
if(day==6){lcd.setCursor(0, 1);lcd.print("Dom");}
lcd.setCursor(4, 1); lcd.print(h);
lcd.setCursor(6, 1);lcd.print(":");
if((s%2)==0){ lcd.setCursor(7, 1);lcd.print(m);}
if((s%2)!=0){ lcd.setCursor(7, 1);lcd.print(" ");}
lcd.setCursor(0, 4);
lcd.print("<=");
lcd.setCursor(4, 4);
lcd.print("OK");
lcd.setCursor(8, 4);
lcd.print("=>");
lcd.setCursor(15, 4);
lcd.print("- +");
}
// STAMPA SET H ORARIO variabili: ore, minuti, secondi
void setprintime_H(int, int, int){
lcd.setCursor(13, 0);lcd.print("SetTime") ;
if(day==0){lcd.setCursor(0, 1);lcd.print("Lun");}
if(day==1){lcd.setCursor(0, 1);lcd.print("Mar");}
if(day==2){lcd.setCursor(0, 1);lcd.print("Mer");}
if(day==3){lcd.setCursor(0, 1);lcd.print("Gio");}
if(day==4){lcd.setCursor(0, 1);lcd.print("Ven");}
if(day==5){lcd.setCursor(0, 1);lcd.print("Sab");}
if(day==6){lcd.setCursor(0, 1);lcd.print("Dom");}
lcd.setCursor(7, 1); lcd.print(m);
lcd.setCursor(6, 1);lcd.print(":");
if((s%2)==0){ lcd.setCursor(4, 1);lcd.print(h);}
if((s%2)!=0){ lcd.setCursor(4, 1);lcd.print(" ");}
lcd.setCursor(0, 4);
lcd.print("<=");
lcd.setCursor(4, 4);
lcd.print("OK");
lcd.setCursor(8, 4);
lcd.print("=>");
lcd.setCursor(15, 4);
lcd.print("- +");
}
// STAMPA SET DOSO START STOP H s, h_start, m_start
void setprintdoso_stop_H(int, int, int){
lcd.setCursor(0, 0);lcd.print("Set time stop ");
if((s%2)==0){ lcd.setCursor(0, 1);lcd.print(h_stop);}
if((s%2)!=0){ lcd.setCursor(0, 1);lcd.print(" ");}
lcd.setCursor(2,1); lcd.print(":");
lcd.setCursor(3,1);lcd.print(m_stop);
}
// STAMPA SET DOSO START M h_start, s, m_start,
void setprintdoso_stop_M(int, int, int){
lcd.setCursor(0, 0);lcd.print("Set time stop ");
lcd.setCursor(0,1);lcd.print(h_stop);
lcd.setCursor(2,1); lcd.print(":");
if((s%2)==0){ lcd.setCursor(3, 1);lcd.print(m_stop);}
if((s%2)!=0){ lcd.setCursor(3, 1);lcd.print(" ");}
}
// SET DOSO PERIODO H s, h_period, m_period
void setprintdoso_period_H(int, int, int){
lcd.setCursor(0, 0);lcd.print("Set period ");
if((s%2)==0){ lcd.setCursor(0, 1);lcd.print(h_period);}
if((s%2)!=0){ lcd.setCursor(0, 1);lcd.print(" ");}
lcd.setCursor(2,1); lcd.print(":");
lcd.setCursor(3,1);lcd.print(m_period);
}
// SET DOSO PERIODO M h_period, s, m_period
void setprintdoso_period_M(int, int, int){
lcd.setCursor(0, 0);lcd.print("Set period");
lcd.setCursor(0,1);lcd.print(h_period);
lcd.setCursor(2,1); lcd.print(":");
if((s%2)==0){ lcd.setCursor(3, 1);lcd.print(m_period);}
if((s%2)!=0){ lcd.setCursor(3, 1);lcd.print(" ");}
}
// SET DOSO ML
void setprintdoso_ML(int, float){
lcd.setCursor(0, 0);lcd.print("Set ml per day ");
if((s%2)==0){ lcd.setCursor(0, 1);lcd.print(ml);}
if((s%2)!=0){ lcd.setCursor(0, 1);lcd.print(" ");}
}
// OROLOGIO vaiabili: millis, ktime, secondi, muniti, ore
void clock(int, int, int, int){
long ctime=millis()/1000;
if (ctime-(ktime*1)==0){ s++; ktime++;}
if(s==60){ lcd.begin(20, 4); m++; s=00;}
if(m==60){ lcd.begin(20, 4); h++; m=0;}
if(m==-1){ lcd.begin(20, 4); m=59;}
if(h==24){lcd.begin(20, 4); day=day+1; h=0;}
if(day==7){day=0; }
if(h==-1){lcd.begin(20, 4); h=23;}
}
//SET VARIABILI TEMPO
void h24(int, int){
if (m_on==-1)
{m_on=59;}
if (h_on==-1)
{h_on=23;}
}
//ELIMINA IN RIMBALZO DEI TASTI
void bounc(){
for (int bounc=0; bounc==0; bounc++){ delay(150);};
}
//NEON
void neon(){
if(h_on==h && m_on==m ){analogWrite(A5, 128);}
if(h_off==h && m_off==m ){analogWrite(A5, 0);}
}
//DOSO
void doso(){
if(m==m_stop && h==h_stop){
analogWrite(A4, 0);}
if(h==h_stop && m==(m_stop+1)){
if(s==0){
analogWrite(A3,128);
if (s==tempo_doso){
analogWrite(A3,0);
}
}
}
if(m==(m_stop+m_period) && h==(h_stop+h_period)){
analogWrite(A4,128);
}
}
void setup() {
// controller
pinMode(52, INPUT); // +
pinMode(53, INPUT); // -
pinMode(51, INPUT); // destra
pinMode(50, INPUT); // sinistra
lcd.begin(20,4);
//relè
}
void loop() {
lcd.setCursor(0, 0);
printime(h, m, s);
clock(ktime, s, m, h);
pindx=digitalRead(enter);
if(pindx==HIGH){cas1=1; bounc(); lcd.begin(20,4);}
neon();
doso();
/*SET TIME*/ while (cas1==1){
lcd.setCursor(4, 0);
lcd.print("Set time(1/4)");
lcd.setCursor(0, 4);
lcd.print("<=");
lcd.setCursor(4, 4);
lcd.print("En");
lcd.setCursor(8, 4);
lcd.print("=>");
lcd.setCursor(15, 4);
lcd.print("exit");
clock(ktime, s, m, h);
neon();
menucontroll(pinp,pinm,pindx,pinenter,pinsx,cas1,cas2);
while(cas2==1){
clock(ktime, s, m, h);
neon();
setprintime_M(h, m, s);
allread(pinp,pinm,pindx,pinenter,pinsx);
if(pinsx==HIGH){bounc();cas2=cas2-1; lcd.begin(20,4);}
if(pinenter==HIGH){bounc();cas2=0; lcd.begin(20,4);}
if (pindx==HIGH){bounc();cas2=cas2+1; lcd.begin(20,4);}
if(pinp==HIGH){bounc();m=m+1; lcd.begin(20,4);}
if (pinm==HIGH){bounc();m=m-1; lcd.begin(20,4);}
while(cas2==2){
clock(ktime, s, m, h);
neon();
setprintime_H(h, m, s);
allread(pinp,pinm,pindx,pinenter,pinsx);
if(pinsx==HIGH){bounc();cas2=cas2-1; lcd.begin(20,4);}
if (pindx==HIGH){bounc();cas2=cas2+1; lcd.begin(20,4);}
if (pinsx==HIGH){cas2=cas2-1; lcd.begin(20,4);}
if(pinp==HIGH){h=h+1;bounc();}
if(pinm==HIGH){h=h-1;bounc();}
if (pindx==HIGH){bounc();cas2=cas2+1; lcd.begin(20,4);}
if(h-h_on>=0 && h-h_off<=0){
neon_cond++;
}
}
}
}
/*SET NEON*/ while (cas1==2){
clock(ktime, s, m, h);
neon();
lcd.setCursor(4, 0);
lcd.print("Set neon(2/4)");
lcd.setCursor(0, 4);
lcd.print("<=");
lcd.setCursor(4, 4);
lcd.print("En");
lcd.setCursor(8, 4);
lcd.print("=>");
lcd.setCursor(15, 4);
lcd.print("exit");
menucontroll(pinp,pinm,pindx,pinenter,pinsx,cas1,cas2);
/*m on */ while(cas2==1){
clock(ktime,s,m,h);
neon();
setneonprint_M_ON(h_on,s,m_on,h_off,m_off);
if (pinsx==HIGH){cas1=0; lcd.begin(20,4);}
if(pinp==HIGH){m_on=m_on+1;bounc();}
if(pinm==HIGH){m_on=m_on-1;bounc();}
if (m_on==-1){m_on=59;}
if (m_on==60){m_on=0;}
if (pindx==HIGH){bounc();cas2=2; lcd.begin(20,4);}
/*h on*/ while(cas2==2){
clock(ktime, s, m, h);
neon();
setneonprint_H_ON(s,h_on,m_on,h_off,m_off);
if (pinsx==HIGH){cas2=0; lcd.begin(20,4);}
if(pinp==HIGH){h_on=h_on+1;bounc();}
if(pinm==HIGH){h_on=h_on-1;bounc();}
if (h_on==-1){h_on=23;}
if (h_on==24){h_on=00;}
if (pindx==HIGH){bounc();cas1=3; lcd.begin(20,4);}
/*m off*/ while(cas2==3){
clock(ktime,s,m,h);
neon();
setneonprint_M_OFF(h_on,m_on,h_off,s,m_off);
if (pinsx==HIGH){cas1=0; lcd.begin(16,2);}
if(pinp==HIGH){m_off=m_off+1;bounc();}
if(pinm==HIGH){m_off=m_off-1;bounc();}
if (m_off==-1){m_off=59;}
if (m_off==60){m_off=0;}
if (pindx==HIGH){bounc();cas2=4; lcd.begin(20,4);}
/*h off*/ while(cas2==4){
clock(ktime,s,m,h);
neon();
setneonprint_H_OFF(h_on,m_on,s,h_off,m_off);
if (pinsx==HIGH){cas1=0; lcd.begin(20,4);}
if(pinp==HIGH){h_off=h_off+1;bounc();}
if(pinm==HIGH){h_off=h_off-1;bounc();}
if (h_off==-1){h_off=23;}
if (h_off==24){h_off=00;}
if (pindx==HIGH){bounc();cas2=1; lcd.begin(16,2);}
}
}
}
}
}
/*SET DOSO*/ while (cas1==3){
clock(ktime, s, m, h);
neon();
lcd.setCursor(4, 0);
lcd.print("Set doso(3/4)");
lcd.setCursor(0, 4);
lcd.print("<=");
lcd.setCursor(4, 4);
lcd.print("En");
lcd.setCursor(8, 4);
lcd.print("=>");
lcd.setCursor(15, 4);
lcd.print("exit");
menucontroll(pinp,pinm,pindx,pinenter,pinsx,cas1,cas2);
/*m stop */ while(cas1==1){
clock(ktime,s,m,h);
neon();
setprintdoso_stop_M(h_stop, s, m_stop);
if (pinsx==HIGH){cas1=0; lcd.begin(20,4);}
if(pinp==HIGH){m_stop=m_stop+1;bounc();}
if(pinm==HIGH){m_stop=m_stop-1;bounc();}
if (m_on==-2){m_stop=59;}
if (pindx==HIGH){bounc();cas1=2; lcd.begin(20,4);}
/*h sto*/ while(cas2==2){
clock(ktime, s, m, h);
neon();
setprintdoso_stop_H(s,h_stop, m_stop);
if (pinsx==HIGH){cas1=0; lcd.begin(20,4);}
if(pinp==HIGH){h_stop=h_stop+1;bounc();}
if(pinm==HIGH){h_stop=h_stop-1;bounc();}
if (h_stop==-1){h_stop=23;}
if (pindx==HIGH){bounc();cas2=3; lcd.begin(20,4);}
/*period m*/
while(cas2==3){
clock(ktime,s,m,h);
neon();
setprintdoso_period_M(h_period,s,m_period);
if (pinsx==HIGH){cas2=0; lcd.begin(20,4);}
if(pinp==HIGH){m_period=m_period+1;bounc();}
if(pinm==HIGH){m_period=m_period-1;bounc();}
if (m_period==-1){m_period=59;}
if (pindx==HIGH){bounc();cas2=4; lcd.begin(20,4);}
/*period h*/
while(cas2==4){
clock(ktime,s,m,h);
neon();
setprintdoso_period_H(s, h_period, m_period);
if (pinsx==HIGH){cas2=0; lcd.begin(20,4);}
if(pinp==HIGH){h_period=h_period+1;bounc();}
if(pinm==HIGH){h_period=h_period-1;bounc();}
if (h_period==-1){h_period=23;}
if (pindx==HIGH){bounc();cas1=5; lcd.begin(20,4);}
while(cas2==5){
clock(ktime,s,m,h);
neon();
setprintdoso_ML(s, ml);
if (pinsx==HIGH){cas2=0; lcd.begin(20,4);}
if(pinp==HIGH){ml=ml+0.25;bounc();}
if(pinm==HIGH){ml=ml-0.25;bounc();}
/* REGOLA ML MAX */ if (ml==-2){ml=10;}
if (pindx==HIGH){bounc();cas2=1; lcd.begin(20,4);
tempo_doso=(ml*10); //calcolare tempi dosometrica
}
}
}
}
}
}
/*SET TEMPERATURA*/ while (cas1==4){
clock(ktime, s, m, h);
neon();
lcd.setCursor(4, 0);
lcd.print("Set temp(4/4)");
lcd.setCursor(0, 4);
lcd.print("<=");
lcd.setCursor(4, 4);
lcd.print("En");
lcd.setCursor(8, 4);
lcd.print("=>");
lcd.setCursor(15, 4);
lcd.print("exit");
menucontroll(pinp,pinm,pindx,pinenter,pinsx,cas1,cas2);
}
}
}