Automazione di un forno

Buon giorno a tutti,
vorrei simulare il funzionamento di un forno con Arduino, un sensore LM35, due trimmer ed un led.
Il trimmer 1 sere ad accedere il forno ed impostare il timer, il secondo trimmer per regolare la temperatura, il led serve a simulare l'accensione e lo spegnimento del forno. Mi domandavo se nei forni elettrici domestici la resistenza ha stato on/off o tensione variabile in base alla temperatura raggiunta (in questo caso utilizzerei l'uscita analogica di Arduino)

disne:
... Mi domandavo se nei forni elettrici domestici la resistenza ha stato on/off o tensione variabile in base alla temperatura raggiunta ...

Semplicemente ON/OFF ... :slight_smile:

Guglielmo

P.S.: ... mi raccomando, che il progetti RESTI come lo hai descritto, un semplice prototipo dimostrativo con un LED e NON venga MAI utilizzato per comandare veramente un forno !

Credo che ci sia un range di temperatura... mi spiego meglio: impostando 150°C immagino che la resistenza si spenga prima di raggiungere i 150°C, magari a 140/145°C... o no? Magari si accende e spegne proprio alla temperatura impostata

disne:
Credo che ci sia un range di temperatura... mi spiego meglio: impostando 150°C immagino che la resistenza si spenga prima di raggiungere i 150°C, magari a 140/145°C... o no? Magari si accende e spegne proprio alla temperatura impostata

Dipende ...
... i più semplici usano un volgare interruttore "bimetallico", quelli più evoluti un circuito con una gestione "PID".

Puoi semplificare la cosa gestendo un minimo di "isteresi" ... fissato 150° stacchi a 155° e riattacchi a 145°. Del resto, in un semplice forno, la temperatura è ... a dir poco alquanto imprecisa :smiley:

Guglielmo

Grazie per la risposta, me lo sono chiesto proprio per capire se concepire il sistema come un trasduttore e quindi ottimizzare al meglio la gestione dell'attuatore

Sto ragionando sul timer regolato attraverso il trimmer (per adesso ho escluso la funziona map)... il conto alla rovescia deve partire dal valore istantaneo letto sull'uscita del trimmer, purtroppo come l'ho scritto il valore del trimmer è letto all'avvio dello sketch e quindi non varia durante il ciclo

int Timer=A0;
int i;
int t;

void setup() {
Serial.begin(9600);
}

void loop() {
t=analogRead(Timer);
for(i=t;i>0;i--)
  { 
   Serial.println(i);
   delay(1000);
  }
}

Perdona, ma quello è un modo "barbaro" ...
... impara invece ad usare la funzione millis().

Per chiarire il conectto, leggi QUESTO post ... poi, per studiare come applicarla correttamente leggi prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina.

Guglielmo

1 Like

Mi è chiara la funzione mills() ma non mi è chiaro come creare il conto alla rovescia partendo da un valore (es. 1minuto) usando mills()

Non dei fare un conto alla rovescia ... devi verificare se E' PASSATO il tempo che a te interessa, ovvero se, dal momento in cui dai il via alla cosa, è passato il tempo che tu hai previsto.

Devo cuocere la torta, la metto in forno alle 15:00 e deve cuocere per 45 minuti ...
... non è che starò li in continuazione a fare 44, 43, 42, 41 ... ma verificherò che siano o no le 15:45 ... ora a cui è cotta :wink:

Guglielmo

... in ogni caso è banale anche fare un conto alla rovescia ... con millis() ricavi un intervallo di tempo a tua scelta (es. 1 secondo) ed ad ogni scadenza dell'intervallo decrementi di 1un contatore (nel esempio, contatore di secondi) senza mai usare la funzione delay() che non ti permette di fare altro.

Guglielmo

Mi sono veramente confuso le idee

disne:
Mi sono veramente confuso le idee

In che senso ? ? ? :o ... cosa non ti è chiaro ?

Guglielmo

Ho impostato il tempo attraverso il valore del trimmer rimappato ma sbaglio qualcosa nel codice:

long tempoAttuale;
int forno = 10;
int trimmerForno = A1;

void setup() {
  Serial.begin(9600);
  pinMode(forno, OUTPUT);
  tempoAttuale = millis();
}

void loop() {
  int  tempoForno = map(analogRead(A1), 0, 1024, 0, 5000) ;
  if (millis() - tempoAttuale >= tempoForno)
  {
    digitalWrite(forno, HIGH);
    tempoAttuale = millis();
    Serial.print(tempoForno);
    Serial.print("  ");
    Serial.println(millis());
  }
  else
    digitalWrite(forno, LOW);
}

Quando usi millis ti conviene impostare le variabili interessate come unsigned long

millis esprime millisecondi, quindi se imposti 5000 potrai avere il forno acceso per i primi 5 secondi :slight_smile:

P.S.
Ma se usi un LED, come fa ad aumentare la temperatura? E' un LED ad alta potenza?

Il led rappresenta solo forno acceso / forno spento, per rilevare la temperatura uso un sensore di temperatura LM35 da scaldare con le mani o accendino... è giusto la simulazione dell'automazione

Qualcuno ha suggerimenti sull'ultimo codice postato?

Con questo sketch riesco ad impostare il timer tramite trimmer ma quando il led (il forno) si spegne, ruotando nuovamente il trimmer per variare il timer, il led (forno) non si attiva più. In un forno di casa, ruotando la manopola timer si varia il valore del timer in ogni istante.... vorrei simulare lo stesso. Dove sbaglio?

unsigned long tempoAttuale;
int forno = 10;
//int trimmerForno = A0;

void setup() {
  Serial.begin(9600);
  pinMode(forno, OUTPUT);
  tempoAttuale = millis();
}

void loop() {
  unsigned long  tempoForno = map(analogRead(A1), 0, 1024, 0, 5000) ;
  //unsigned long  tempoForno = 5000 ;
  if (millis() <= tempoAttuale - tempoForno) //se attuale conteggio del tempo è maggiore
    //del tempo preedentemente preso
  {
    digitalWrite(forno, HIGH);
    tempoAttuale = millis();
  }
  else {
    digitalWrite(forno, LOW);
  }
  Serial.print(millis());
  Serial.print("  ");
  Serial.print(tempoAttuale);
  Serial.print("  ");
  Serial.println(tempoForno);
}

Devi leggere in continuazione il valore del trimmer del tempo e confrontarlo con il valore precedente +/- una certa tolleranza e, se noti una variazione (oltre la tolleranza), calcoli il nuovo tempo ed aggiusti ... "la cottura" :smiley:

Guglielmo

non vorrei sbagliare ma secondo me l'errore è qui:

if (millis() <= tempoAttuale - tempoForno)

disne:
Ho impostato il tempo attraverso il valore del trimmer rimappato ma sbaglio qualcosa nel codice:

long tempoAttuale;

int forno = 10;
int trimmerForno = A1;

void setup() {
 Serial.begin(9600);
 pinMode(forno, OUTPUT);
 tempoAttuale = millis();
}

void loop() {
 int  tempoForno = map(analogRead(A1), 0, 1024, 0, 5000) ;
 if (millis() - tempoAttuale >= tempoForno)
 {
   digitalWrite(forno, HIGH);
   tempoAttuale = millis();
   Serial.print(tempoForno);
   Serial.print("  ");
   Serial.println(millis());
 }
 else
   digitalWrite(forno, LOW);
}

...scusa se te lo dico ma sbagli praticamente il 90% del tuo codice a partire dalle variabili,poi all'utilizzo di millis(),poi alla cosa ne vuoi fare dopo che il CRONOMETRO....(usare "un tempo da confrontare" con millis() è come usare un CRONOMETRO ne più ne meno),poi se in aggiunta ci metti pure che il tuo tempo scade in base a ciò che viene letto da un trimmer :cold_sweat: :cold_sweat: :cold_sweat:

..perche per complicarti ulteriormente lo schetc,non aggiungi pure che il trimmer lo regoli tramite il telefono che attiva un motore passopasso con un perno che gira il trimmer al posto tuo???? :smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp: