Ovvero, come ti comando un forno per scaldare qualcosa alle temperature e per i tempi previsti
mi riallaccio ad una dicussione che ho visto qui da poco, una persona che aveva da riscaldare delle cose rispettando dei tempi
come mio solito ho pensato a un (paio di) Array per conservare tempi e temperature
una cosa così, insomma
// di Nelson "StandardOil"
// Idea da sviluppare:
// termostato a passi
// senza strutture, facile da capire
// non bloccante, si possono fare altre cose
#define PASSI 3 // il numero di passi da eseguire
int soglia[PASSI] = {15, 20, 10}; // le temperature da raggiungere passo a passo
int tempo[PASSI] = {5, 10, 20}; // il tempo (in minuti) di mantenimento della temperatura prima del prossimo passo
#define AVVIO 2 // il pin del led di macchina in ciclo
#define FERMO 3 // il pin del led di ciclo terminato
#define CALDO 4 // il pin del riscaldatore, ma anche del led di riscaldatore acceso
int temperatura; // il valore attuale della temperatura (letto da una funzione a parte)
byte passo; // il gradino attuale
bool mantiene; // indica se abbiamo già raggiunto la soglia oppure no, se si siamo in mantenimento
int timer; // per il timer
void setup(void)
{
pinMode(AVVIO, OUTPUT);
pinMode(FERMO, OUTPUT);
pinMode(CALDO, OUTPUT);
// accendo il led di macchina in ciclo
digitalWrite(AVVIO, 1);
}
void loop(void)
{
if (!(millis() / 1000)) // dovrebbe essere 60000 per i minuti
{
// passato un minuto, vado ad aggiornare i termostati
mantienitemperatura();
}
}
void mantienitemperatura(void)
{
// siccome il tutto non è bloccante Arduino potrebbe fare altro
// se lo facesse (non bloccante pure lui) dobbiamo prevedere il caso che
// il forno avesse terminato, ma le altre operazioni no
if (passo < PASSI)
{
// mantiene la temperatura imposta dall'array di temperature
// richiamta una volta al minuto
// gestisce anche i timer
// acquisisco la temperatura (dipende dal tipo di sonda)
temperatura = leggitemperatura();
if (mantiene)
{
// siamo in mantenimento
// per prima cosa controllo la temperatura e accendo/spengo il riscaldatore
digitalWrite(CALDO, temperatura < soglia[passo]);
// devo gestire il timer
// ma uso uno sporco trucco
// conto che un giro di loop valga un minuto
timer--; // e tolgo uno dal conto dei minuti
// se il tempo è scaduto
if (timer <= 0)
{
// primo: tolgo il flag di mantenimento
mantiene = 0;
//secondo: avanti un passo
passo++;
// terzo, se avessi superato i passi programmati, fermo il programma
if (passo >= PASSI)
{
// spengo il riscaldatore
digitalWrite(CALDO, 0);
// spengo il led di macchina in ciclo
digitalWrite(AVVIO, 0);
// accendo il ledi di ciclo terminato
digitalWrite(FERMO, 1);
}
}
}
else
{
// siamo in salita
if (temperatura >= soglia[passo])
{
// appena raggiunta
// spengo il riscaldatore
digitalWrite(CALDO, LOW);
// passo in mantenimento
mantiene = 1;
// memorizzo il tempo
timer = tempo[passo];
}
else
{
// non ancora raggiunta
// mi assicuro che il riscaldatore sia acceso
digitalWrite(CALDO, HIGH);
}
}
}
}
int leggitemperatura(void)
{
// funzione fittizia, che fa finta di leggere la temperatura, in realtà fà una stima un po' farlocca
static int interna = 0;
if (digitalRead(CALDO))
{
interna = interna + 2;
}
else
{
interna = interna - 1;
}
return interna;
}
prende un (paio di) array di tempi e temperature,
poi ogni minuto (non è bloccante) vede se siamo già arrivati alla temperatura, se si, mantenendo la temperatura, aspetta il tempo previsto, e passa al passo succcessivo