come gestire velocità ventola in base alla temperatura

ciao a tutti sono nuovo e mi sto da poco dilettando in un progetto, cioe controllare una ventola tramite arduino uno.
finora sono riuscito ha accenderla ad una temperatura che imposto io, solo che adesso vorrei poter gestire la velocita della ventola in base alla temperatura, ma non riesco a capire come posso fare.
il codice che o scritto fino ad ora e questo

int motorPin = 3;
int led = 13;
int temp;
 int senPin = A0;


void setup()
{
  pinMode(motorPin,OUTPUT);
  pinMode(led,OUTPUT);
  pinMode(senPin,INPUT);
}
void loop()
 {  
 temp = analogRead(senPin);         //leggi la temperatura del sensore
 float degC = (5.0 * temp * 100.0)/1024.0;     //converti il segnale in temperatura 
 Serial.println((byte)degC);          //schrivilo sullo scherm
 
 if (degC>27) {                  //se la temperatura e superiore ha 27 gradi fai qualcosa
 digitalWrite(led, HIGH);           // accendi il led 
 digitalWrite(motorPin,HIGH);      // accendi il motore
 Serial.println(degC);
 
 } else {                        // in caso contrario fai qualcosa  
 digitalWrite(led, LOW);             // spegni led
 digitalWrite(motorPin,LOW);  // spegni motore
 Serial.println(degC);
   } 
 }

edit by mod: per favore includi il codice usango gli appositi tag CODE

Suppongo che tramite il motorPin polarizzi un transistor per far partire la ventola.... usa un pin PWM (il 3 va bene) e controllala in pwm!

Sì ho usato un transistor BD139. E che non riesco a capire come faccio a convertire il valore del sensore di temperatura( lm35) in un valore pwm

ciao.

belle92:
Sì ho usato un transistor DVD. E che non riesco a capire come faccio a convertire il valore del sensore di temperatura( lm35) in un valore pwm

Potresti usare il MAP :

int pwm = map((degC*10), 100, 800, 0, 255); 
pwm = constrain (pwm, 0, 255);

Ho moltiplicato degC per 10 perche MAP lavora con gli interi e ti darebbe una risposta a "scalini".
Così pwm vale 0 (ventola ferma) con degC = 10 e vale 255 (ventola al massimo) con degC = 80 e naturalmente varia proporzionalmente al variare di degC.

il valore minimo (10°) e il massimo (80°) naturalmente li ho messi A CASO, vedi tu quali ti vanno bene.

constrain serve per evitare valori fuori range del pwm.

Ciao
pippo72

http://www.apcc.tk/diy-projects/pwm-arduino

http://forum.arduino.cc/index.php/topic,96170.0.html

http://swingleydev.org/blog/p/1948/
http://arduinotemperaturecontrolledfan.blogspot.it/
...
...
dovreste impare a usare google prima di arduino :slight_smile: :slight_smile:

ciao

pablos:
dovreste impare a usare google prima di arduino :slight_smile: :slight_smile:

Quoto in pieno…

pippo72:
Potresti usare il MAP :

int pwm = map((degC*10), 100, 800, 0, 255); 

pwm = constrain (pwm, 0, 255);



Ho moltiplicato degC per 10 perche MAP lavora con gli interi e ti darebbe una risposta a "scalini".
Così pwm vale 0 (ventola ferma) con degC = 10 e vale 255 (ventola al massimo) con degC = 80 e naturalmente varia proporzionalmente al variare di degC.

il valore minimo (10°) e il massimo (80°) naturalmente li ho messi A CASO, vedi tu quali ti vanno bene.

[constrain](http://arduino.cc/en/Reference/Constrain) serve per evitare valori fuori range del pwm.

Ciao
pippo72

ti ringrazio tantissimo per l’aiuto e scusa se rispondo solo adesso ma e stata una settimana impegnativa.

ho provato come mi hai detto e mi sembra che funzioni tutto tranne che la ventola fa un ronzio e non capisco come eliminarlo.
il codice e questo

int motorPin = 3;
int led = 13;
int pwm;
int degC;
int temp;
 int senPin = A0;


void setup()
{
  pinMode(motorPin,OUTPUT);
  pinMode(led,OUTPUT);
  pinMode(senPin,INPUT);
  Serial.begin(9600);
 
}
void loop()
 {  
 temp = analogRead(senPin);         
 float degC = (5.0 * temp * 100.0)/1024.0;    
 Serial.println((byte)degC); 
delay(1000);
 
 
  
 if (degC<27) {                  
 digitalWrite(led, LOW);           
 digitalWrite(motorPin,LOW);      
 Serial.println(degC);
 
 } else {                        
 digitalWrite(led, HIGH);             
 int pwm = degC;
  pwm = map((degC*10), 200, 350, 50, 255);
  pwm = constrain (pwm, 0, 255);

  analogWrite(3, pwm);
 
   } 
 }

il prossimo passo voglio provare a usare il terzo cavo della ventola per la lettura della velocita.

pablos:
http://www.electroschematics.com/9540/arduino-fan-speed-controlled-temperature/
http://www.apcc.tk/diy-projects/pwm-arduino
http://forum.arduino.cc/index.php?topic=204505.0
http://makezine.com/2007/09/25/arduino-temperature-contr/
http://forum.arduino.cc/index.php/topic,96170.0.html
http://www.barnesian.com/arduino-powered-smart-fan-controller/
http://electronics.stackexchange.com/questions/62324/arduino-controlled-pwm-pc-fan
http://swingleydev.org/blog/p/1948/
http://arduinotemperaturecontrolledfan.blogspot.it/


dovreste impare a usare google prima di arduino :slight_smile: :slight_smile:

ciao

i link li avevo gia visti ma non riuscivo a venirne a capo :cold_sweat:

ciao

...tranne che la ventola fa un ronzio e non capisco come eliminarlo.

Temo non si possa fare niente per il ronzio, lavorando con un PWM non vai a variare la tensione di alimentazione della ventola ma vai a accenderla e spegnerla molto velocemente. Il ronzio sparisce solo quando il PWM è a 255 (sempre accesa).
Non so se con qualche sistema hardware (condensatore o altro) si possa risolvere ma è meglio se ti risponde uno che ci capisce di eletronica (non io :blush: )

ciao
pippo72

per il ronzio e' necessario aumentare la frequenza del PWM
http://playground.arduino.cc/Code/PwmFrequency

Ciao,
anch'io uso delle ventole per raffreddare e usando questo:

riesci facilmente a settare una frequenza abbastanza alta, diciamo 22Khz, da non sentirla più

ZioWally:
Ciao,
anch'io uso delle ventole per raffreddare e usando questo:
PWM frequency library - Libraries - Arduino Forum

Simpatica, non la conoscevo :wink:

Guglielmo

Altra soluzione è un banalissimo filtro RC messo a valle del pin e prima del transistor (o altro) con cui piloti la ventola in modo da trasformare il segnale ad onda quadra del PWM in un segnale pseudo analogico.

Puoi aiutarti con questo tool online:
http://sim.okawa-denshi.jp/en/CRlowkeisan.htm

(anche se, normalmente, una R da 10K ed un C da 100 nF sono più che sufficienti per far sparire il disturbo)