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
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
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.
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.
...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 )
Ciao,
anch'io uso delle ventole per raffreddare e usando questo: http://forum.arduino.cc/index.php?topic=117425
riesci facilmente a settare una frequenza abbastanza alta, diciamo 22Khz, da non sentirla più
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.