passata la rabbia? tra l'altro la scheda non si chiama nemmeno arduino mega, ma DFRduino mega.
Comunque, se qualcuno fosse interessato a darmi una mano, ho fatto progressi, ma ho ancora dei problemi, forse anche hardware (così chi me l'ha tirata almeno sarà soddisfatto :D)
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
float sonda_refrigerata =15; // pin a cui e' collegata la sonda serbatoio refrigerata
float sonda_birra = 14; // pin a cui e' collegata la sonda serbatoio birra
float sonda_tec = 13; // pin a cui e' collegata la sonda TEC
int alza_refr = 22; // pin per il bottone aumento setpoint refrigerata
int abbassa_refr = 23; // pin per il bottone diminuzione setpoint refrigerata
int alza_birra = 24; // pin per il bottone aumento setpoint birra
int abbassa_birra = 25; // pin per il bottone diminuzione setpoint birra
int tec = 53; // pin per il comando relais accensione TEC
int vent_tec = 52; // pin per il comando relais ventilatore TEC (eventualmente libero il pin e collego il ventilatore al relais TEC)
int pompa_ref = 51; // pin per il comando relais pompa circuito refrigerata (eventualmente libero il pin e collego la pompa al relais TEC)
int pompa_birra = 50; // pin per il comando relais pompa circuito birra
int escludi_ref = 49; // pin per l'interruttore esclusione circuito refrigerata (non essenziale, si puo' anche eliminare)
int escludi_birra = 48; // pin per l'interruttore esclusione circuito birra
int setpoint_ref = 60; // inizializza il setpoint dell'acqua refrigerata a 5 C
int setpoint_birra = 60;// inizializza il setpoint della birra a 22 C
int incr_refr; // inzializza la variabile associata ai bottoni di regolazione setpoint refrigerata
int incr_birra; // inizializza una variabile associata ai bottoni di regolazione setpoint birra
int decr_refr; // inzializza la variabile associata ai bottoni di regolazione setpoint refrigerata
int decr_birra; // inizializza una variabile associata ai bottoni di regolazione setpoint birra
int lettura_birra; // inizializza una variabile contenente la lettura della birra
int lettura_refrigerata; // inizializza una variabile contenente la lettura della refrigerata
int lettura_tec; // inizializza una variabile contenente la lettura della TEC
int temp_tec; // inizializza una variabile contenente la temperatura della TEC
int temp_birra; // inizializza una variabile contenente la temperatura della birra
int temp_ref; // inizializza una variabile contenente la temperatura della refrigera
void setup() { //dichiarazione degli ingressi come imput o output
pinMode(sonda_refrigerata, INPUT);
pinMode(sonda_birra, INPUT);
pinMode(sonda_tec, INPUT);
pinMode(alza_refr, INPUT);
pinMode(abbassa_refr, INPUT);
pinMode(alza_birra, INPUT);
pinMode(abbassa_birra, INPUT);
pinMode(tec, OUTPUT);
pinMode(vent_tec, OUTPUT);
pinMode(pompa_ref, OUTPUT);
pinMode(pompa_birra, OUTPUT);
pinMode(escludi_ref, INPUT);
pinMode(escludi_birra, INPUT);
lcd.begin(16,2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Birra");
lcd.setCursor(0, 1);
lcd.print("Refr.");
lcd.setCursor(9, 0);
lcd.print("Set");
lcd.setCursor(9, 1);
lcd.print("Set");
}
void loop() {
lettura_birra = analogRead(sonda_birra); // legge la sonda birra in valore sonda
lettura_refrigerata = analogRead (sonda_refrigerata); // legge la sonda refrigerata in valore sonda
lettura_tec = analogRead (sonda_tec); // legge la sonda TEC in valore sonda
temp_tec = (5.0 * lettura_tec * 100.0)/1024.0; // interpreta la lettura della sonda TEC in gradi centigradi
temp_birra = (5.0 * lettura_birra * 100.0)/1024.0; // interpreta la lettura della sonda birra in gradi centigradi
temp_ref = (5.0 * lettura_refrigerata * 100.0)/1024.0; // interpreta la lettura della sonda refrigerata in gradi centigradi
incr_birra = digitalRead (alza_birra); // legge il bottone per alzare il setpoint birra
delay(20); // il delay serve per evitare che ciclando il programma la lettura venga effettuata piu' volte per una sola pressione
decr_birra = digitalRead (abbassa_birra); // legge il bottone per abbassare il setpoint birra
delay(20);
incr_refr = digitalRead (alza_refr); // legge il bottone per alzare il setpoint refrigerata
delay(20);
decr_refr = digitalRead (abbassa_refr); // legge il bottone per abbassare il setpoint refrigerata
delay(20);
if (incr_birra = HIGH){ // se ha rilevato pressione del bottone + birra incrementa
setpoint_birra++;
}
if (decr_birra = HIGH){ // se ha rilevato pressione del bottone - birra decrementa
setpoint_birra--;
}
if (incr_refr = HIGH){ // se ha rilevato pressione del bottone + refrigerata incrementa
setpoint_ref++;
}
if (decr_refr = HIGH){ // se ha rilevato pressione del mottone - refrigerata decrementa
setpoint_ref--;
}
if (escludi_ref != HIGH && temp_tec < 80){ // controlla se non e' escluso il circuito refrigerata e se la temperatura della TEC e' sotto soglia
if (temp_ref > setpoint_ref){ // se il passaggio precedente e' validato, controlla se l'accumulo non e' in temperatura
digitalWrite(pompa_ref, HIGH); // se non e' in temperatura accende la pompa del circuito refrigerata
delay(50); // attende un secondo
digitalWrite(vent_tec, HIGH); // accende il ventilatore della TEC
delay(50); // attende un secondo
digitalWrite(tec, HIGH); // accende la TEC
}
else // se l'accumulo e' in temperatura
{
digitalWrite(tec, LOW); // spegne la TEC
delay(50); // attende 5 secondi
digitalWrite(vent_tec, LOW); // spegne il ventilatore della TEC
digitalWrite(pompa_ref, LOW); // e la TEC
}
}
else // se il circuito refrigerata e' escluso o se la TEC e' surriscaldata
{
digitalWrite(tec, LOW); // spegne la TEC
delay(50); // attende 5 secondi
digitalWrite(vent_tec, LOW); // spegne il ventilatore della TEC
digitalWrite(pompa_ref, LOW); // e la TEC
}
if (escludi_birra != HIGH && temp_birra > setpoint_birra){ // controlla se non e' escluso il circuito birra e che la temperatura della birra sia sopra soglia
digitalWrite(pompa_birra, HIGH); // accende la pompa del circuito birra
}
else
{
digitalWrite(pompa_ref, LOW); // altrimenti spegne la pompa del circuito birra
}
lcd.setCursor(6, 0);
lcd.print(temp_birra);
lcd.setCursor(6, 1);
lcd.print(temp_ref);
lcd.setCursor(13, 1);
lcd.print(setpoint_birra);
lcd.setCursor(13, 0);
lcd.print(setpoint_ref);
}
In questo modo il display funziona, visualizza correttamente i testi, mentre le due letture delle sonde sono numeri a tre cifre in continuo cambiamento anche senza sonde collegate. Indicativamente cambia repentinamente da 0 a 400 frullando.
I setpoint che ho inizializzato a 60 rimangono tali. Per ora non ho configurato i bottoni analogici dell'lcd per non complicare troppo, quindi ho mantenuto i bottoni analogici.
Se non ho capito male, per far risultare HIGH un digitale, devo collegare un bottone ai 5V e al suo pin. Cliccando chiude il circuito e rileva HIGH.
Il problema è che alcuni pin risultano HIGH ance senza nulla connesso, altri risultano HIGH anche infilandoci un connettore volante, un filo staccato. Per fare la prova, ho usato l'esempio Button che fa accendere un led quando il bottone viene rilevato HIGH.
Questo è un sintomo di un problema hardware?
Lasciamo per un attimo perdere questa cosa, che potrebbe essere eventualmente risolta con una sostituzione del prodotto.
Il problema principale è che ho difficoltà ad ottenere la lettura delle sonde in un formato corretto, cioè gradi centigradi. Senza sonde connesse, in teoria, dovrei leggere un valore corrispondente a 0V, che una volta tarata sarà credo tipo -20°C, tra l'altro stabile.
Penso che la ragione sia il formato della variabile in cui ho convertito il valore dalla lettura alla temperatura.
Qualcuno mi sa dare qualche info a riguardo? Tra l'altro mi è stato consigliato di cambiare la libreria che usavo prima (lcd4bit_mod) con questa perchè dovrebbe avere delle funzioni che servono all'uopo, ma non ne ho trovate.