Vai al contenuto

Arduino controllo ventola 12v


samf92

Messaggi raccomandati

Ciao a tutti.

Premesso che sono le mie prime prove con arduino quindi abbiate pazienza😅😅 

Dovrei creare la ventilazione per la cabina DIY della mia stampante. 

La velocita della ventola viene modificata da arduino in base alla temperatura.
 

Ho questo sketch:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
float temp; // set temp as a whole number
int tempPin = A0; //arduino pin used for temperature sensor
int tempMin = 23;  // the temperature to start the buzzer
int tempMax = 25;   // temperature full speed
int fan = 3;       // the pin where fan is connected
int fanSpeed = 0; // fan speed variable


void setup() {
 
 pinMode(fan, OUTPUT); // declaring fan pin 6 as output
 pinMode(tempPin, INPUT); // declaring tempPin A0 as input
 lcd.begin(16, 2); // LCD intialize  
 lcd.clear(); // clears lcd
 lcd.print("Fan Speed:"); // prints "Fan Speed" 75-255 PWM
 lcd.setCursor(0,1); // Sets cursor for next line
 lcd.print("Temp:"); // Prints "Temperature" below "Fan Speed"
 Serial.begin(9600); // begins the serial monitor
}


void loop() {
  temp = analogRead(tempPin);
  float voltage = float(5000.0d/1024.0d)*(float)temp;
  float temp = voltage/10.0d; // formula for degrees celcius 
  Serial.println(temp); // prints temp in serial monitor
  lcd.setCursor(12,1); // 12 character to the right on the first column
  lcd.print(temp); // prints the number on the 12 character
  delay(1000);        // delay in between reads for stability
  if(temp < tempMin) {   // if temp is lower than minimum temp
  fanSpeed = 0;      // fan is not spinning
  digitalWrite(fan, LOW); // pin 6 output is low 
   } 
    
     if((temp >= tempMin) && (temp <= tempMax))  //if temperature is higher than the minimmum range
   { 
    fanSpeed = map(temp, tempMin, tempMax, 75, 255); // the actual speed of fan
    analogWrite(fan, fanSpeed);  // spin the fan at the fanSpeed speed  
    Serial.println(fanSpeed); // prints fan speed in serial monitor
    lcd.setCursor(12,0); // sets cursor
    lcd.print(fanSpeed); // prints 
    lcd.print("  "); // fixes an error of random number display
   } 
   }

tutto funziona come dovrebbe tranne che quando si raggiunge la temperatura MAX la ventola non parte mai a piena velocità resta a valore 168 su 255 e sono erogati 8v invece di 12v.

Qualcuno saprebbe darmi qualche suggerimento su perchè questo accade??

Ho provato con un altro sketch a specificare velocità 255 e funziona, alla ventola arrivano 12v.

Link al commento
Condividi su altri siti

  • Risposte 8
  • Creato
  • Ultima Risposta

Miglior contributo in questa discussione

Giorni Popolari

Miglior contributo in questa discussione

Giorni Popolari

Immagini Pubblicate

Ciao Whitedavil.

 

Veramente come ho scritto all'inizio sono le prime prove con arduino e il codice non l'ho scritto io, ho cercato di fare un pò di collage con sketch che ho trovato leggendo nei vari forum solo che non capisco perchè non raggiunga la velocità MAX.

 

Speravo solo che qualcuno più esperto di me potesse aiutarmi a capire cosa c'è che non va.

Link al commento
Condividi su altri siti

premetto che sto seguendo dei corsi tutorial su arduino da 2 mesi percio inizio ora anche io pero vorrei un chiarimento per capire

 

la ventola dovrebbe partire quando il sensore sente 23gradi e andare alla massima velocità quando sente piu di 25gradi?

 

come dovrebbe funzionare cosi capisco anche io lo sketch? 🙂 dovrebbe salire gradualmente?

 

float temp = voltage/10.0d; // formula for degrees celcius 

di sicuro dirò una castroneria ma non dovrebbe essere 12 questa regola perche se si ferma a 10V cosrrisponde hai tuoi 168 su 255 sempre se cio capito qualcosa ahhahaha

spiegatemi che voglio cpaire pure io 😉 

Link al commento
Condividi su altri siti

Si, la ventola parte a una temperatura di 23 e in teoria dovrebbe andare al MAX raggiunti i 25 cosa che al momento non accade. Ho usato questi parametri per fare qualche test in casa altrimenti non partirebbe mai, ovviamente poi antra calibrata sulla temperatura ambine della cabina di stampa.

 

float temp = voltage/10.0d; // formula for degrees celcius 

 

Questa formula l'ho trovata in questo video:  Misurare la temperatura con LM35 e Arduino - #67

 

Serve per trasformare la lettura del sensore termico LM35 in gradi celsius, non centra con la corrente che arriva alla ventola che invece è regolata da arduino tramite un transistor.

ff1e7356-2a35-46d4-b0b5-76e943bda801.thumb.jpg.5e4316ca9f2be8e95d4620ded188c1c0.jpg

Link al commento
Condividi su altri siti

Non programmo arduino, ma la funzione MAP dovrebbe servire a creare una scala tra tempmin e tempmax in funzione del valore attuale e dovrebbe restituire un ipotetico valore in byte da 75 a 255.

Probabilmente quella funzione, che non vedo dichiarata da nessuna parte, è sbagliata. 

 

Per la cronaca:

float temp = voltage/10.0d; // formula for degrees celcius

 

Questa è corretta perché il sensore lm35 in uscita ti fornisce 10mV a grado centrigrado. A 25 gradi hai in uscita 250mV,dividi per 10 e leggi diretto... Che poi il convertitore A/D è 10bit approssima di 0.4 gradi, è un'altro discorso... 😅

Link al commento
Condividi su altri siti

5 ore fa, samf92 dice:

 

    
     if((temp >= tempMin) && (temp <= tempMax))  //if temperature is higher than the minimmum range
   { 
    fanSpeed = map(temp, tempMin, tempMax, 75, 255); // the actual speed of fan
    analogWrite(fan, fanSpeed);  // spin the fan at the fanSpeed speed  
    Serial.println(fanSpeed); // prints fan speed in serial monitor
    lcd.setCursor(12,0); // sets cursor
    lcd.print(fanSpeed); // prints 
    lcd.print("  "); // fixes an error of random number display
   } 
   }

tutto funziona come dovrebbe tranne che quando si raggiunge la temperatura MAX la ventola non parte mai a piena velocità resta a valore 168 su 255 e sono erogati 8v invece di 12v.

Qualcuno saprebbe darmi qualche suggerimento su perchè questo accade??

Ho provato con un altro sketch a specificare velocità 255 e funziona, alla ventola arrivano 12v.

eccola, l'ho evidenziata, ci imposta la fanspeed con  la funzione map()

1 ora fa, Whitedavil dice:

Non programmo arduino, ma la funzione MAP dovrebbe servire a creare una scala tra tempmin e tempmax in funzione del valore attuale e dovrebbe restituire un ipotetico valore in byte da 75 a 255.

Probabilmente quella funzione, che non vedo dichiarata da nessuna parte, è sbagliata. 

 

Per la cronaca:

float temp = voltage/10.0d; // formula for degrees celcius

 

Questa è corretta perché il sensore lm35 in uscita ti fornisce 10mV a grado centrigrado. A 25 gradi hai in uscita 250mV,dividi per 10 e leggi diretto... Che poi il convertitore A/D è 10bit approssima di 0.4 gradi, è un'altro discorso... 😅

qui la funzione:

https://www.arduino.cc/reference/en/language/functions/math/map/

Link al commento
Condividi su altri siti

Partecipa alla conversazione

Puoi pubblicare ora e registrarti più tardi. Se hai un account, accedi ora per pubblicarlo con il tuo account.

Ospite
Rispondi a questa discussione...

×   Hai incollato il contenuto con la formattazione.   Rimuovere la formattazione

  Sono consentiti solo 75 emoticon max.

×   Il tuo collegamento è stato incorporato automaticamente.   Mostra come un collegamento

×   Il tuo contenuto precedente è stato ripristinato.   Pulisci editor

×   Non puoi incollare le immagini direttamente. Carica o inserisci immagini dall'URL.

×
×
  • Crea Nuovo...