Salve a tutti, sto realizzando un progetto per la "termoregolazione" di una piccola serra suddivisa in tre settori. Nello specifico sono presenti tre aperture sul soffitto comandate da motori complete di finecorsa, un anemometro e un termostato. Nel primo progetto avevo pensato di usare una sola board per far funzionare tutte e tre le finestre, però mi sono accorto che a meno che non avrei sviluppato un super codice, sarebbe stato complicato far muovere le finestre indipendentemente, quindi ho optato per l'utilizzo di tre board magari tipo arduino mini.
Il principio di funzionamento è abbastanza banale:
quando la temperatura scende sotto la soglia impostata il termostato chiude il contatto collegato in ingresso all'arduino e quindi si avvia la chiusura della finestra che deve essere eseguita a step by step (es. 2 secondi di chiusura e 10 di pausa) fino a che il termostato apre il contatto e si innesca lo stesso ciclo ma per l'apertura. Ho ovviato a prevedere una condizione di equilibrio in quanto per l'isteresi che si crea nell'ambiente credo che sarebbe molto difficile che si verificasse.
L'anemometro ha già una sua interfaccia programmabile e quindi viene usato sempre un'ingresso digitale sull'arduino, l'unica cosa da effettuare è la discretizzazione del tempo, cioè deve essere possibile impostare un tempo di intervento con cui far chiudere tutte le finestre (si chiude il contatto arduino rileva, aspetta il tempo impostato e se il vento è ancora presente chiude completamente tutte le finestre.)
Veniamo al dunque, ho già scritto un codice che a grandi linee funziona, dovrei solo riuscire a far funzionare meglio il tutto e a scrivere il pezzo di codice per l'anemometro.
#include <core_build_options.h>
#include <secTimer.h>
byte termo = 0; // Ingresso termostato;
byte fc_open = 1; // Ingresso finecorsa di apertura;
byte fc_close = 2; // Ingresso finecorsa di chiusura;
byte w_open = 3; // Relè di apertura;
byte w_close = 4; // Relè di chiusura;
byte wind = 10; // Ingresso anemometro;
int work_time = 1; // Tempo di movimento in secondi;
int pause_time = 3; // Tempo di pausa in secondi;
int wind_delay = 5; // Tempo attivazione presenza vento.
unsigned long prev_time_loop = 0;
unsigned long current_time_loop;
secTimer myTimer;
void setup()
{
pinMode(termo, INPUT);
pinMode(fc_open, INPUT);
pinMode(fc_close, INPUT);
pinMode(w_open, OUTPUT);
pinMode(w_close, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(wind, INPUT);
myTimer.startTimer();
}
void loop()
{
current_time_loop = myTimer.readTimer();
if(current_time_loop - prev_time_loop >= pause_time){
prev_time_loop = current_time_loop;
if(digitalRead(termo) == HIGH && digitalRead(wind) == LOW)
{
if(digitalRead(fc_open) == HIGH)
{
digitalWrite(w_open, HIGH);
delay(work_time * 1000);
digitalWrite(w_open, LOW);
}
else
{
digitalWrite(w_open, LOW);
}
}
if(digitalRead(termo) == LOW && digitalRead(wind) == LOW)
{
if(digitalRead(fc_close) == HIGH)
{
digitalWrite(w_close, HIGH);
delay(work_time * 1000);
digitalWrite(w_close, LOW);
}
else
{
digitalWrite(w_close, LOW);
}
}
}
}
Sicuramente ho evitato di usare la funzione delay per evitare di mettere in pausa il codice e quindi inibire qualche intervento dei finecorsa o dell'anemometro, e ho usato la libreria secTimer in modo da risolvere il problema dei 49 giorni di millis().
Le mie domande sono:
-
Ovviamente se sto useguendo un ciclo di chiusura/apertura e nello stesso tempo interviene il finecorsa l'uscita rimante alta fino allo scadere del tempo (non sarebbe un grosso problema perchè comunque i finecorsa intervengo anche a livello meccanico) però vorrei capire come sarebbe possibile eliminare questo difetto;
-
Un coniglio per gestire l'anemometro (ho pensato all'uso dell'interrupt);
-
Evitare l'uso del delay anche per il "work_time".
Grazie anticipatamente a chi vorrà aiutarmi.