isteresi con arduino

salve dovrei realizzare un controllo di temperatura con arduino:
la logica che vorrei seguire è la seguente:
-la temperatura deve essere mantenuta tra i 20 e i 24 °C

  • se la temperatura suera i 24° interviene una ventola che rimane attiva fino a quando la temperatura raggiunge il valor medio 22°C
  • se la temperatura scende sotto i 20 interviene una piastra scaldante che rimane attiva fino a quando la temperatura raggiunge i 22°C..
    a monte ho realizzato un circuito di condizionamento del segnale in modo da adattare la dinamica dello stesso alla scheda arduino.
    ho trovato la seguente corrispondenza fra le temperature e i valori numerici in uscita dall' adc di arduino:
    20°C corrispondono a 409
    22°C corrispondono a 450
    24°C corrispondono a 491
    io avevo impostato qualcosa del genere:
# define piastra 7
# define ventola 8
void setup() {
  pinMode(piastra,OUTPUT);
   pinMode(ventola,OUTPUT);
   digitalWrite(ventola,LOW);
   digitalWrite(piastra,LOW);
}

void loop() {
  int temperatura;
temperatura =analogRead(0);
      if (temperatura>450)
    {
           if (temperatura<491)
           {
            digitalWrite(ventola,HIGH);
            digitalWrite(piastra,LOW);
           }
           else
           {
            
            digitalWrite(piastra,LOW);
           }
    }
    else
     
    {
           if (temperatura<409)
           {
            digitalWrite(piastra,HIGH);
            digitalWrite(ventola,LOW);
           }
           else
           {
            
            digitalWrite(ventola,LOW);
           }
    }
}

Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post ...

... poi, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ...

... infine, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Il tuo post è stato spostato nell'opportuna sezione del forum dove puoi proseguire.

E magari spiega anche qual è il problema...

preferisco gli switch...

Incominciamo a separare i problemi. Fatti una funzione/trova una libreria che tu restituisca la temperatura in °C (491 non vuol dire molto, 20 é più chiaro).

Fatto questo mi pare molto facile:
Se la temperatura letta <20 accendi piastra e spegni ventola (si sa mai)
Se la temperatura letta >24 accendi ventola e spegni piastra (si sa mai)
Se la temperatura letta ==22 spegni tutto.

Può essere soluzione? Per dire di si basta premere add

Bella l'idea della funzione di conversione
Meno bella la soglia unica
Scaldare supera la soglia in salita
Raffreddare supera in discesa

Silente:
Incominciamo a separare i problemi. Fatti una funzione/trova una libreria che tu restituisca la temperatura in °C (491 non vuol dire molto, 20 é più chiaro).

Fatto questo mi pare molto facile:
Se la temperatura letta <20 accendi piastra e spegni ventola (si sa mai)
Se la temperatura letta >24 accendi ventola e spegni piastra (si sa mai)
Se la temperatura letta ==22 spegni tutto.

Può essere soluzione? Per dire di si basta premere add

si è chiaro che come dici tu dovrei realizzare una funzione che dato il valore analogico in uscita dall adc di arduino mi restituisca il valore in temperatura, ed infatti sarebbe la cosa più giusta nel caso si volesse visualizzare òla temperatura su display lcd.
qui onestamente mi interessava solo la logica dell' isteresi.
dai calcoli (veloci) che avevo fatto carta e penna i valori 409-450 e 491 corrispondevano a 20-22-24.
avevo pensato ad un circuito di condizionamento per il sensore LM35 che facessa corrispondere all' intervallo 0-50 la tensione 0-5 V.

e perchè?
hai l'occasione di farlo con una funzione sulla lettura già eseguita, perchè vuoi farlo con un operazionale su una grandezza ancora da leggere?

Bene, se non devi visualizzare temperature allora puoi anche evitare la parte di modifica valori. Se anche (per sfizio) la volessi fare credo che le scelte siano due:
Se esiste una formula che lega i due valori la trovi e la usi
Se non esiste allora array di 50 interi, immagina come popolarlo e come ottenere i gradi.

Silente:
Se non esiste allora array di 50 interi, immagina come popolarlo e come ottenere i gradi.

:o Eh??? :o

Standardoil:
Meno bella la soglia unica
Scaldare supera la soglia in salita
Raffreddare supera in discesa

Questo lo quoto, i confronti con == in presenza di valori "aleatori" possono portare a problemi di mancato riconoscimento.

Mi sembra che il minimo sindacale siano quattro condizioni che tengano conto anche dello stato attuale delle uscite:

pic002.png

(NOTA: è sottointeso un else vuoto implicito se nessuna delle condizioni risulta vera)

nicoct46:
dai calcoli (veloci) che avevo fatto carta e penna i valori 409-450 e 491 corrispondevano a 20-22-24.

Ok, ma almeno per chiarezza meglio usare dei nomi di comodo, che servono appunto per eliminare i "magic number" all'interno del codice (vale per i pin usati, e per qualsiasi alto valore costante):

#define HIGH_TEMP  491
#define MID_TEMP   450
#define LOW_TEMP   409

Guarda, a me mi piacciono le istruzioni concise.
Posto T , I , S e R rispettivamente temperatura (float o intero scegli tu) , isteresi (float o intero) , soglia di intervento, pin di attivazione della piastra riscaldante
Te la cavi con

digitalWrite(R, T < (S + I * digitalRead(R)));

metti tu i giusti nomi di variabile

Standardoil:
Guarda, a me mi piacciono le istruzioni concise ...

digitalWrite(R, T < (S + I * digitalRead(R)));

Che fai, leggi la temperatura dallo stesso pin della piastra riscaldante ? ? ? :o :o :o

Guglielmo

Una nuova tecnica, leggo la resistenza della piastra durante il passaggio per lo zero della semionda....
No, leggi meglio...

Standardoil:
No, leggi meglio...

Azz ... m'era sfuggito :-* ... ma non potevi includere nella stessa riga pure la lettura della temperatura ? Così era ancora più compatto :smiley:

Guglielmo

gpb01:
Azz ... m'era sfuggito :-* ... ma non potevi includere nella stessa riga pure la lettura della temperatura ? Così era ancora più compatto :smiley:

Guglielmo

non potevo mica fare tutto io
Qualcosa anche per lo OP
seriamente la lettura e conversione della temperatura serve due volte, per piastra e ventola. Conviene passare per una variabile

Per quanto.....
Sostituire solo sulla prima DigitalWrite la T con " T = analogRead(....... "
Ma sarebbe da sadici, non da compattisti....

Claudio_FF:
Ok, ma almeno per chiarezza meglio usare dei nomi di comodo, che servono appunto per eliminare i "magic number" all'interno del codice (vale per i pin usati, e per qualsiasi alto valore costante):

#define HIGH_TEMP  491

#define MID_TEMP  450
#define LOW_TEMP  409

ok sono d'accordo...è quello che avrei fatto nella riscrittura finale del programma....