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 ...
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
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
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
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
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"
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
..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????