Dissipazione e calore

vorrei aiutare un dissipatore per led con una ventolina. :blush:

Avendo a disposizione la temperatura come è meglio modulare la velocità della ventola?

dividendo la temperatura il gradoni Con una serie di if ?
Oppure in modo proporzionale alla temperatura acquisita?

Grazie

ma questo è perché vuoi divertirti? la regolazione di una ventola non è così lineare come la lettura della temperatura, e poi non devi mica mantenere una temperatura costante, quindi semplicemente fissa un limite oltre il quale la ventola interviene e riporta tutto al di sotto del limite, è la cosa più semplice e fai lavorare la ventola il meno possibile.

Grazie,
No non voglio divertirmi vorrei semplicemente capire quale algoritmo è meglio usare.
Come giustamente mi consigli il punto principale è intervenire il meno possibile da parte della ventola,
ma come lo correlaziono con la velocità?
Nel senso è meglio 1 minuto alla max velocità o 2 minuti ad una velocità intermedia?

Il controllo del tempo non devi deciderlo tu, tu (se vuoi) puoi decidere la velocità, ma quando la ventola si deve fermare deve dipendere dalla lettura della temperatura, altrimenti dov'è il nesso tra le due cose, solo all'attacco?

Ok grazie! :slight_smile:

Secondo te potrebbe avere un senso aumentare la velocità in base alla differenza di temperatura dalla soglia stabilita?
un vantaggio sul controllo della velocità produrrebbe la diminuzione del rumore generato.

Considera che tu imposti una soglia al cui superamento la ventola parte, poi in ballo non hai centinaia di gradi, ma solo qualche grado, puoi impostare la massima velocità in modo che rientri subito nel range consentito, oppure dimezzi la velocità, diminuisci il rumore, ma ci metti anche più tempo a raffreddare l'ambiente; fai qualche tentativo e vedi cosa ti viene meglio...

Ciao,
Per ora mi sono orientato verso questo:

void loop() {
   float tmp;
 
  lcd.setCursor(0, 1);
  // stampa temperatura
  tmp = temperatura();
  lcd.print(tmp);
  if(tmp<25) {
    
    lcd.setCursor(0, 2);
    lcd.print("Ventola Spenta");
    lcd.setCursor(10, 3);
    lcd.print(tmp);
}
 
  else
  {
    lcd.setCursor(0, 2);
    lcd.print("Ventola ACCESA!");
    lcd.setCursor(10, 3);
    lcd.print((tmp-20)*5);
   analogWrite(ventola, (tmp-20)*5);

  }
}

attualmente il termometro indica stabilmente 29 gradi

anche se vorrei capire cosa fa il pwm con un numero + grande di 255 ma non dovrebbe capitare.

llluca:
anche se vorrei capire cosa fa il pwm con un numero + grande di 255 ma non dovrebbe capitare.

La funzione analogWrite accetta come valore di PWM un tipo di dati "int", quindi 16 bit, ma il registro del timer è configurato ad 8 bit per cui il compilatore effettuerà il casting automatico da int a byte, perciò va visto come un valore di 16 bit viene convertito: potrebbe ad esempio prendere solo il byte più basso.

Per non sbagliare tu fai un controllo prima, per cui se il valore è maggiore di 255 lo imposti manualmente a 255. Oppure usi la funzione map() per riportarlo nel range 0-255 se sei sicuro che possa uscire da questi 2 limiti.

Potresti utilizzare un controllo di tipo "curva climatica" dei termoregolatori:
crei una retta tra i punti:
temperatura MIN velocità MIN e
temperatura MAX velocità MAX

dove hai la T sull'asse delle ordinate e la velocità sull'asse delle ascisse. così moduli la velocità del ventilatore in base alla temperatura letta,man mano che sale la temperatura aumenti la velocità della ventola.
Implementa un piccolo ritardo e una variazione proporzionale ed avrai un controllo costante e puntuale sulla temperatura desiderata!

tapirinho:
Potresti utilizzare un controllo di tipo "curva climatica" dei termoregolatori:
...
avrai un controllo costante e puntuale sulla temperatura desiderata!

Ciao ,
E' esattamente quello che avevo i mente :slight_smile:
Mi daresti un esempio per capire se quanto ho già scritto è circa / quasi quanto tu dici? :fearful:

Ti faccio un semplice esempio:

Immagino che ci sia una velocità/tensione al disotto della quale la ventola non gira, e la userei come MINVEL (altrimenti lasciala a 0)

T rilevata < Soglia MIN => Ventilatore off
T rilevata = Soglia MIN => Ventilatore MINVEL
T rilevata > Soglia MAX => Ventilatore 100%

Poi fai un proporzionale, VELSET= MINVEL+ ((100%-MINVEL)/ (Soglia MIN-Soglia MAX) * (T rilevata - Soglia MIN))

Adesso dipende molto dalla risposta del tuo sistema, bisogna evitare che vada in pendolazione (variazioni troppo veloci) ma che ci sia un buon riscontro. Io farei una integrazione della correzione, cioè:

VELATTUALE=VELATTUALE+((VELATTUALE-VELSET)/COSTANTE)

così porti una correzione graduale alla tua velocità, senza troppi sbalzi. Questo controllo lo farai ogni tot secondi, inserisci un controllo tramite la funzione millis() altrimenti con i delay azzoppi il tuo programma (ci sono un sacco di esempi a proposito di come usare millis).

Se ad esempio rilevi 40° ed aumenti troppo la velocità, poi la T rilevata calerà bruscamente e di conseguenza anche la velocità desiderata. Una volta che cala la velocità risale la temperatura e siamo daccapo. Verifica che valore usare con COSTANTE (magari inizia con 2) ed il tempo di intervallo per inserire la correzione.