Ciao a tutti.
Sto testando una centralina alba tramonto dotata di rtc, lcd, tre tasti per il settaggio dell'ora e sensore lm35 tutto collegato all'arduino uno.
Da LCD visualizzo potenza dei led caldi e freddi e temperatura dell'acqua il tutto collegato ad una ventola per il raffreddamento dell'acqua d'estate.
Ho da poco aggiunto i tasti per la selezione dell'ora con un menu per il settaggio dato che inizialmente settavo l'ora da PC.
Il problema si presenta quando inserisco nello sketch il menu di selezione per il settaggio dell'ora che nonostante mi faccia visualizzare il menù e settare l'ora, fa bloccare lo schermo senza visualizzare potenza dei led e temperature, ma solo l'ora inoltre si blocca anche la dissolvenza dei led che a quel punto rimangono accesi fissi senza mai spegnersi.
Vi posto lo scketch.
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
// inizializza la libreria con i Pin LCD
LiquidCrystal lcd(13, 12, 5, 4, 3, 2);
RTC_DS1307 RTC;
const int LedFreddo =10;
const int LedCaldo = 11;
// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
const int ProgFreddo[24]={ 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 30, 60, 70, 75, 75, 75, 75, 75, 75, 75, 70, 60, 30, 5 };
const int ProgCaldo[24]= { 1, 1, 0, 0, 0, 0, 0, 0, 5, 20, 40, 70, 90, 90, 90, 90, 90, 90, 90, 90, 90, 70, 40, 20};
int OutFreddo, OutCaldo, OutVentola;
int Ventola = 9;
int P1=6;
int P2=7;
int P3=8;
int oraagg;
int minagg;
int annoagg;
int meseagg;
int dayagg;
int menu =0;
void setup()
{
// Quante colonne e righe ha il display:
lcd.begin(16, 2);
lcd.clear();
// Inizializzazione dei pulsanti
pinMode(P1,INPUT);
pinMode(P2,INPUT);
pinMode(P3,INPUT);
pinMode(LedFreddo, OUTPUT);
pinMode(LedCaldo, OUTPUT);
pinMode(Ventola, OUTPUT);
//inizializzo la libreria
Serial.begin(9600);
Wire.begin();
RTC.begin();
//RTC.sqw(1);
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// settiamo la data e l'ora al momento della compilazione
RTC.adjust(DateTime(__DATE__, __TIME__));
}
// di default il display visualizzerà data e ora
int menu=0;
}
void loop()
{
// verifichiamo se viene premuto il pulsante SET e incrementiamo l'indice del menu
if(digitalRead(P1))
{
menu=menu+1;
}
// a quale subroutine dobbiamo andare?
if (menu==0)
{
DisplayDateTime();
delay (1000);
}
if (menu==1)
{
DisplaySetHour();
}
if (menu==2)
{
DisplaySetMinute();
}
if (menu==3)
{
DisplaySetYear();
}
if (menu==4)
{
DisplaySetMonth();
}
if (menu==5)
{
DisplaySetDay();
}
if (menu==6)
{
StoreAgg();
delay(500);
menu=0;
}
delay(100);
}
void DisplayDateTime ()
{
// mostriamo la data e l'ora correnti
DateTime now = RTC.now();
lcd.clear();
lcd.setCursor(0, 1);
if (now.hour()<=9)
{
lcd.print("0");
}
lcd.print(now.hour(), DEC);
oraagg=now.hour();
lcd.print(":");
if (now.minute()<=9)
{
lcd.print("0");
}
lcd.print(now.minute(), DEC);
minagg=now.minute();
lcd.print(":");
if (now.second()<=9)
{
lcd.print("0");
}
lcd.print(now.second(), DEC);
}
void DisplaySetHour()
{
// Impostazione dell'ora
lcd.clear();
DateTime now = RTC.now();
if(digitalRead(P2)==HIGH)
{
if(oraagg==23)
{
oraagg=0;
}
else
{
oraagg=oraagg+1;
}
}
if(digitalRead(P3)==HIGH)
{
if(oraagg==0)
{
oraagg=23;
}
else
{
oraagg=oraagg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Imposta Ora:");
lcd.setCursor(0,1);
lcd.print(oraagg,DEC);
delay(200);
}
void DisplaySetMinute()
{
// Impostazione dei minuti
lcd.clear();
if(digitalRead(P2)==HIGH)
{
if (minagg==59)
{
minagg=0;
}
else
{
minagg=minagg+1;
}
}
if(digitalRead(P3)==HIGH)
{
if (minagg==0)
{
minagg=59;
}
else
{
minagg=minagg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Imposta Minuti:");
lcd.setCursor(0,1);
lcd.print(minagg,DEC);
delay(200);
}
void DisplaySetYear()
{
// Impostazione dell'anno
lcd.clear();
if(digitalRead(P2)==HIGH)
{
annoagg=annoagg+1;
}
if(digitalRead(P3)==HIGH)
{
annoagg=annoagg-1;
}
lcd.setCursor(0,0);
lcd.print("Imposta Anno:");
lcd.setCursor(0,1);
lcd.print(annoagg,DEC);
delay(200);
}
void DisplaySetMonth()
{
// Impostazione del mese
lcd.clear();
if(digitalRead(P2)==HIGH)
{
if (meseagg==12)
{
meseagg=1;
}
else
{
meseagg=meseagg+1;
}
}
if(digitalRead(P3)==HIGH)
{
if (meseagg==12)
{
meseagg=12;
}
else
{
meseagg=meseagg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Imposta Mese:");
lcd.setCursor(0,1);
lcd.print(meseagg,DEC);
delay(200);
}
void DisplaySetDay()
{
// Impostazione del giorno
lcd.clear();
if(digitalRead(P2)==HIGH)
{
if (dayagg==31)
{
dayagg=1;
}
else
{
dayagg=dayagg+1;
}
}
if(digitalRead(P3)==HIGH)
{
if (dayagg==1)
{
dayagg=31;
}
else
{
dayagg=dayagg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Imposta Giorno:");
lcd.setCursor(0,1);
lcd.print(dayagg,DEC);
delay(200);
}
void StoreAgg()
{
// Salvataggio delle variabili
lcd.clear();
lcd.setCursor(0,0);
lcd.print("SALVATAGGIO IN");
lcd.setCursor(0,1);
lcd.print("CORSO");
RTC.adjust(DateTime(annoagg,meseagg,dayagg,oraagg,minagg,0));
delay(200);
CalcolaLed();
DisplayDateTime ();
lcd.clear();
}
void CalcolaLed() {
DateTime now = RTC.now();
int OraAttuale, OraFutura, Minuto, Differenza;
float Incremento, Attuale, T1;
OraFutura = (now.hour()%24+1)%24;
//---------------------------------------------------------------------------
Differenza=ProgFreddo[OraFutura]-ProgFreddo[now.hour()%24];
Incremento=Differenza/60.0;
Attuale=Incremento*now.minute()+ProgFreddo[now.hour()%24];
OutFreddo= Attuale * 255 / 100 ;
lcd.setCursor(0,0);
lcd.print("F");
lcd.print((int)Attuale);
//---------------------------------------------------------------------------
Differenza=ProgCaldo[OraFutura]-ProgCaldo[now.hour()%24];
Incremento=Differenza/60.0;
Attuale=Incremento*now.minute()+ProgCaldo[now.hour()%24];
OutCaldo= Attuale * 255 / 100 ;
lcd.setCursor(5,0);
lcd.print("C");
lcd.print((int)Attuale);
analogWrite(LedFreddo, OutFreddo);
analogWrite(LedCaldo, OutCaldo);
T1=analogRead(A0)*0.51;
lcd.setCursor(9,0);
lcd.print("T:");
lcd.print((int)T1);
lcd.print(" C ");
analogRead(A0);
if(T1 <29)
analogWrite(Ventola,HIGH);
else
analogWrite(Ventola,LOW);
}
Ho fatto diverse ricerche su internet e quì nel forum, ma sto provando a capire come mai non va anche se effettivamente i led si accendono quando setto l'ora ad esempio si nota che se setto da pulsanti le 12 i led risultano molto più luminosi rispetto a quando setto le 23.
Sarà mica qualche delay di troppo?