Skip to Content

Come Controllare una Ventola con Arduino

Come Controllare una Ventola con Arduino

In questo articolo imparerai come controllare una ventola con un Arduino Uno. Esamineremo i diversi tipi di ventole e i metodi per controllarle. Alla fine di questo post avrai una solida comprensione di come controllare una ventola e sarai pronto a creare il tuo sistema di controllo della ventola.

Allora, iniziamo!

Overview

Componenti necessari

Di seguito trovi i componenti necessari per questo progetto. Presumo tu abbia già una ventola da controllare, ma nella sezione successiva troverai anche link a diversi tipi di ventole.

Useremo un MOSFET 2N7000 per alcuni dei circuiti in questo blog. Ho fornito un link a un kit con vari transistor e MOSFET, molto utile da avere. Puoi anche acquistare il 2N7000 MOSFET singolo, ma solitamente vengono venduti in confezioni da 100 pezzi, probabilmente più di quanto ti serva.

Se vuoi controllare ventole o dispositivi che assorbono più di 200mA, piccoli MOSFET come il 2N7000 non saranno sufficienti. Avrai bisogno di MOSFET di potenza MOSFETs, che possono arrivare fino a 100A!

Arduino

Arduino Uno

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

Cavo USB per Arduino UNO

Variable Resistor 6mm Potentiometer Trimmer Kit

Kit di trimmer

Kit di resistori e LED

Relay Module

Modulo relè

Transistor MOSFET kit

Kit di transistor

PIR motion sensor AM312

Sensore di movimento

Sensore di temperatura

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Tipi di ventole

In questa sezione diamo una rapida occhiata ai diversi tipi di ventole che solitamente si vogliono controllare con un Arduino.

Ventole AC vs DC

Quando si tratta di controllare una ventola con Arduino, una delle considerazioni chiave è se la ventola funziona in AC (corrente alternata) o DC (corrente continua). Capire la differenza è fondamentale per scegliere la ventola giusta e garantire la compatibilità con il tuo setup Arduino.

Ventole AC

Le ventole AC sono progettate per funzionare con la normale alimentazione domestica di 110V o 220V, ad esempio. Le trovi spesso come ventilatori a soffitto o in elettrodomestici come i condizionatori. Ma esistono anche piccole ventole da scrivania AC. Le ventole AC solitamente funzionano a velocità fissa. Qui sotto puoi vedere una foto di una ventola AC tipica:

AC Fan 115-230V
Ventola AC 115-230V (Amazon)

Nota che di solito non puoi capire a vista se una ventola è AC o DC o quale tensione richiede. Devi controllare l’etichetta (vedi sopra) che fornisce queste informazioni.

Per controllare una ventola AC con Arduino, solitamente si usa un Relay o un Thyristor. Relè o tiristori agiscono come interruttori controllabili che possono gestire l’alta tensione e corrente di una ventola AC. Attenzione, quando si lavora con alte tensioni sii molto prudente!

Ventole DC

Le ventole DC, a differenza delle AC, funzionano con corrente continua. Sono comunemente usate in dispositivi elettronici come computer, laptop e altri piccoli sistemi di raffreddamento. Solitamente funzionano a 6V o 12V e possono essere facilmente controllate con Arduino.

Le ventole DC si trovano in diverse configurazioni, come varianti a 2, 3 e 4 fili. Vediamo più da vicino queste varianti nelle prossime sezioni.

Ventola DC a 2 fili

Le ventole DC a 2 fili sono il tipo più semplice. Hanno due fili: uno rosso per l’alimentazione (VCC) e uno nero per la massa (GND). Queste ventole funzionano nativamente a velocità fissa, ma la velocità può essere modificata tramite modulazione di larghezza di impulso (PWM). Ti mostrerò diversi esempi di come farlo. Qui sotto una foto di una ventola DC 12V tipica. Nota i due fili per alimentazione e massa.

12V DC Fan, with two wires
Ventola DC 12V, con due fili (Find at Amazon)

Ventola DC a 3 fili

Le ventole DC a 3 fili hanno i due fili usuali per alimentazione e massa (rosso e nero) e un filo aggiuntivo (tipicamente giallo) chiamato filo tachimetro (TACH). Questo filo fornisce un segnale a impulsi che indica la velocità di rotazione della ventola. Leggendo questo segnale puoi monitorare la velocità della ventola nel tuo progetto Arduino.

Schematics of a 3-wire DC fan with a Hall Sensor
Schema di una ventola DC a 3 fili con sensore Hall (source)

Il segnale tachimetro è generato da un sensore ad effetto Hall o da un sensore ottico che rileva il passaggio di marcature o caratteristiche specifiche sul rotore o motore della ventola. L’uscita è un impulso, e la frequenza degli impulsi corrisponde alla velocità della ventola. Un RPM più alto genera una frequenza maggiore, mentre un RPM più basso una frequenza minore.

Molte ventole di raffreddamento per computer sono a 3 fili, ma sono usate anche in molti altri dispositivi. Qui sotto una foto di una piccola ventola DC 12V a 3 fili per una stampante 3D:

Ventola DC 12V con 3 fili (Find at Amazon)

Ventola DC a 4 fili

Una ventola DC a 4 fili è un altro tipo di ventola tipicamente usata come ventola di raffreddamento nei computer. È un’estensione della ventola a 3 fili e ha un quarto filo per controllare la velocità della ventola. Come per le ventole a 2 e 3 fili, il filo di alimentazione positivo è solitamente rosso e il filo di massa nero. Il filo del segnale tachimetro è giallo. Il filo aggiuntivo per il controllo della velocità è tipicamente blu.

La velocità della ventola è regolata inviando un segnale PWM (Pulse Width Modulation) sul filo di controllo della velocità, che è collegato a un MOSFET che controlla il motore. Per maggiori dettagli guarda lo schema del circuito seguente.

Schematics of a 4-wire DC fan with a Hall Sensor and PWM control wire
Schema di una ventola DC a 4 fili con sensore Hall e filo di controllo PWM (source)

Qui sotto una foto di una ventola DC 12V a 4 fili tipica usata come ventola di raffreddamento per computer:

Ventola DC 12V con 4 fili (Find at Amazon)

In sintesi, le ventole a 2 e 3 fili solitamente funzionano a velocità costante. Le ventole a 3 fili forniscono un segnale tachimetro per monitorare la velocità. Le ventole a 4 fili funzionano tipicamente a velocità variabile, controllata tramite un segnale PWM sul quarto filo, ma permettono anche di monitorare la velocità tramite il terzo filo.

Nota che sia il filo tachimetro che quello di controllo velocità usano impulsi come segnali. Ma il segnale tachimetro è un’uscita, mentre il controllo velocità è un ingresso. Inoltre la velocità è controllata tramite modulazione di larghezza di impulso con ciclo di lavoro variabile, mentre il segnale tachimetro ha un ciclo di lavoro costante al 50% ma la frequenza cambia in relazione alla velocità.

Nelle sezioni seguenti vedremo vari metodi per controllare una ventola.

Esempio 1: Accendere la ventola con un relè

Iniziamo con il modo più semplice per controllare una ventola. Colleghiamo uno dei moduli relè comuni a un Arduino e lo usiamo per accendere o spegnere una ventola.

Nota che di solito non puoi collegare una ventola direttamente a uno dei pin di uscita di un Arduino. La corrente in uscita dai pin GPIO di un Arduino è limitata a 20mA (40mA a breve termine). A parte ventole molto piccole, quasi tutte le ventole consumano più corrente e richiedono tensioni più alte dei 5V forniti dai pin GPIO.

Collegamenti su breadboard

Collegare una ventola tramite un relè a un Arduino è molto semplice. Guarda lo schema di collegamento qui sotto.

Fan controlled via Arduino and Relay
Ventola controllata tramite Arduino e relè

Collegare il relè all’Arduino

Per prima cosa collega il GND dell’Arduino al pin contrassegnato (-) o GND del relè (filo blu). Poi collega l’uscita 5V dell’Arduino al pin di alimentazione positivo (+) del relè (filo rosso). Infine, colleghiamo il filo di segnale (giallo) dal pin 3 al pin contrassegnato (S) sul modulo relè. Questo filo controlla il relè, che a sua volta accende o spegne la ventola.

Collegare l’alimentazione

Poi colleghiamo la ventola all’alimentazione. Ti serve un alimentatore o una batteria che corrisponda ai requisiti di potenza della ventola. Quindi, se hai una ventola da 12V, 180mA, ti serve un alimentatore o batteria da 12V che possa fornire almeno 180mA. In breve, la tensione della batteria non deve essere superiore a quella della ventola, ma la corrente della batteria dovrebbe essere maggiore.

Nell’esempio sopra uso una batteria da 9V con 1000mAh per alimentare una ventola da 12V, 180mA. Funziona ed è adatto per test, ma la ventola non girerà a piena velocità. Per un’applicazione reale userei una batteria o alimentatore da 12V.

Collegare la ventola

Collegare la ventola è facile. Colleghiamo il filo blu/nero della ventola al polo meno (-) della batteria. Il filo rosso va ai terminali dell’interruttore del relè. Uno sarà contrassegnato GND (massa), uno NO (normalmente aperto), uno NC (normalmente chiuso). Normalmente aperto significa che l’interruttore è aperto e la ventola non gira finché il relè non è attivato. Collega i fili rossi di batteria e ventola a GND e NO. L’ordine non conta.

Nota però che molte ventole (in particolare quelle per computer) usano motori brushless e hanno elettronica interna che richiede la polarità corretta. Mentre puoi invertire il senso di rotazione di un motore DC semplice scambiando positivo e negativo, questo generalmente non funziona con i motori brushless. Questi girano solo in una direzione con la polarità corretta. I vantaggi dei motori brushless sono che sono silenziosi, possono funzionare a lungo e non necessitano di un snubber diode.

Puoi usare il circuito sopra anche per accendere ventole AC, ma fai attenzione! Usa sicuramente un modulo relè invece di un semplice relè, poiché i moduli relè di solito hanno optoisolatori per fornire isolamento elettrico.

Codice per controllare la ventola con relè

Accendere o spegnere la ventola usando un Arduino è ora molto semplice. Puoi vedere il codice qui sotto, che accende e spegne la ventola periodicamente ogni 5 secondi.

// Control a relay to switch on/off a fan

const int relayPin = 3;

void setup() {
  pinMode(relayPin, OUTPUT);
}

void loop() {
  digitalWrite(relayPin, HIGH);
  delay(5000);
  digitalWrite(relayPin, LOW);
  delay(5000); 
}

Passiamo in rassegna il codice per capire come funziona.

Costanti e variabili

Iniziamo definendo la costante relayPin che specifica il pin a cui è collegato il relè. In questo caso è il pin 3.

const int relayPin = 2;

Funzione setup

Nella funzione setup() impostiamo la modalità di relayPin a OUTPUT. Questo è necessario perché scriveremo su questo pin per controllare il relè.

void setup() {
  pinMode(relayPin, OUTPUT);
}

Funzione loop

La funzione loop() contiene la logica principale del codice. Qui impostiamo prima il relayPin a HIGH usando la funzione digitalWrite(). Questo accende il relè e quindi la ventola. Poi aspettiamo 5000 millisecondi (5 secondi) con la funzione delay().

void loop() {
  digitalWrite(relayPin, HIGH);
  delay(5000);

Dopo la pausa, impostiamo il relayPin a LOW usando la funzione digitalWrite(). Questo spegne il relè e quindi la ventola. Aspettiamo di nuovo 5000 millisecondi (5 secondi) con la funzione delay().

  digitalWrite(relayPin, LOW);
  delay(5000);

Questo ciclo di accensione e spegnimento della ventola si ripete indefinitamente, creando un ciclo continuo di 5 secondi accesa e 5 secondi spenta.

Con il codice e il circuito sopra puoi accendere o spegnere una ventola per durate specifiche. Potresti ora usare l’orologio interno di Arduino per accendere la ventola a un’ora specifica e farla funzionare per un tempo fisso, per esempio.

Nella sezione successiva ti mostrerò come usare un modulo PIR per accendere una ventola quando viene rilevato un movimento.

Esempio 2: Accendere la ventola con sensore di movimento

Spesso si vuole far funzionare una ventola solo quando viene rilevato un movimento. Per esempio, l’immagine qui sotto mostra una ventola attivata da movimento che ho costruito per rimuovere i fumi di saldatura. Puoi vedere il sensore di movimento (sensore PIR) alla base della ventola.

Motion activated Fan to remove Soldering Fumes
Ventola attivata da movimento per rimuovere fumi di saldatura

Circuito per ventola attivata da movimento

Il circuito seguente mostra come costruire qualcosa di simile. Usa un sensore a infrarossi passivo (PIR) per rilevare il movimento che attiva un relè, che a sua volta accende la ventola.

Switching Fan with Relay and Motion Detector
Accensione ventola con relè e sensore di movimento

Il circuito è essenzialmente identico a quello della ventola controllata da relè visto prima. Basta aggiungere il sensore di movimento. Quindi, collega batteria, relè, ventola e Arduino allo stesso modo. Poi collega il positivo e il negativo del sensore PIR alle linee di alimentazione positiva e negativa della breadboard (fili blu e rossi). Infine, collega l’uscita segnale del sensore PIR al pin 2 di Arduino (filo verde).

Codice per ventola attivata da movimento

Qui sotto trovi il codice per la ventola attivata da movimento. Legge (=polling) il sensore di movimento ogni 100ms e se viene rilevato movimento accende la ventola per 10 secondi. Dai un’occhiata veloce e poi ne discutiamo i dettagli.

// Switch on fan for 10 seconds via relay
// if PIR sensor detects motion

const int motionPin = 3;
const int relayPin = 2;

void setup() {
  pinMode(motionPin, INPUT);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  int motionState = digitalRead(motionPin);

  if (motionState == HIGH) {
    digitalWrite(relayPin, HIGH);
    delay(10000);  // 10 seconds
    digitalWrite(relayPin, LOW);
  }
  delay(100);
}

Costanti e variabili

Iniziamo definendo le costanti motionPin e relayPin che specificano i pin a cui sono collegati rispettivamente il sensore PIR e il relè.

const int motionPin = 3;
const int relayPin = 2;

Funzione setup

Nella funzione setup() impostiamo la modalità di motionPin a INPUT e di relayPin a OUTPUT poiché leggiamo dal sensore PIR e scriviamo sul relè.

void setup() {
  pinMode(motionPin, INPUT);
  pinMode(relayPin, OUTPUT);
}

Funzione loop

Nella funzione loop() leggiamo prima lo stato del sensore PIR usando digitalRead(motionPin) e lo memorizziamo nella variabile motionState.

void loop() {
  int motionState = digitalRead(motionPin);

Se il motionState è HIGH, indicando che è stato rilevato movimento, accendiamo la ventola impostando il relayPin a HIGH usando digitalWrite(relayPin, HIGH). Poi aspettiamo 10 secondi con delay(10000) per mantenere la ventola accesa. Dopo spegniamo la ventola impostando il relayPin a LOW usando digitalWrite(relayPin, LOW).

  if (motionState == HIGH) {
    digitalWrite(relayPin, HIGH);
    delay(10000);  // 10 seconds
    digitalWrite(relayPin, LOW);
  }

Infine aggiungiamo un piccolo ritardo di 100ms con delay(100) per evitare di leggere il sensore PIR troppo frequentemente e per permettere ad Arduino di eseguire altre operazioni.

  delay(100);

Ecco fatto. Ora hai una ventola attivata da movimento!

Esempio 3: Controllare la velocità della ventola con PWM

Negli esempi precedenti abbiamo acceso o spento una ventola. Ma se vogliamo controllarne la velocità? In questo esempio impareremo come fare.

Comunemente usiamo la modulazione di larghezza di impulso (PWM) per controllare la potenza fornita a un dispositivo. Il PWM è una tecnica in cui il valore medio di un segnale è regolato variando il ciclo di lavoro di un’onda quadra. Cambiando il ciclo di lavoro possiamo controllare la velocità della ventola. Vedi il nostro tutorial su How use Arduino to control an LED with a Potentiometer per maggiori dettagli sul PWM.

Tuttavia, non puoi collegare direttamente una ventola a un Arduino e controllarla così, perché una ventola assorbe troppa potenza. Negli esempi precedenti usiamo un relè per aggirare questo problema. Ma i relè sono troppo lenti per il PWM e non durerebbero a lungo a causa dello stress meccanico causato da un segnale PWM.

MOSFET

Useremo quindi un MOSFET. Un MOSFET, o transistor a effetto campo metallo-ossido-semiconduttore, è un tipo di transistor molto usato nei circuiti elettronici. Ha tre terminali (Drain, Gate, Source) e può amplificare e commutare segnali elettronici. Il MOSFET funziona controllando il flusso di corrente tra Source e Drain tramite un campo elettrico generato da una tensione applicata al Gate. È noto per la sua alta velocità di commutazione, basso consumo e capacità di gestire alte correnti e tensioni.

In questo esempio userò un MOSFET 2N7000. Vedi il simbolo del circuito e il pinout del 2N7000 qui sotto.

MOSFET 2N7000
MOSFET 2N7000 (datasheet)

Per maggiori dettagli, dai un’occhiata al datasheet del 2N7000:

Il 2N7000 può commutare fino a 60V e 200mA in modo continuo. È sufficiente per la mia piccola ventola. Di solito puoi scoprire i requisiti di tensione e corrente guardando l’etichetta. L’immagine qui sotto mostra l’etichetta della mia ventola che funziona a 12V e assorbe 0,18A = 180mA. Il MOSFET 2N7000 è quindi adatto a controllare la mia ventola.

Etichetta della ventola

Se hai una ventola più grande che assorbe più corrente, ti servirà un MOSFET più potente. Esistono molti tipi diversi e alcuni possono commutare 100A o più! Cerca uno con una tensione (V DSS ) e corrente (I D ) nominali superiori a quelle richieste dalla tua ventola. Il kit transistor proposto tra i componenti necessari ha una buona selezione.

Come regola generale, scegli un MOSFET con valori circa 2 volte superiori per stare sul sicuro ed evitare la necessità di dissipatori. Per ventole più piccole, come quella che uso qui, non serve un margine così ampio.

Circuito per controllare la velocità della ventola

In questa sezione ti mostro e spiego il circuito necessario per controllare una ventola con un MOSFET. È molto semplice. Guarda:

Circuit to control fan with MOSFET
Circuito per controllare la ventola con MOSFET

Colleghiamo una delle uscite PWM di Arduino, qui il GPIO 3, al pin Gate (G) del MOSFET 2N7000. La resistenza da 100Ω (R2) è solo una resistenza di limitazione corrente per sicurezza. Potresti anche ometterla. La seconda resistenza (R1) da 100KΩ è una resistenza di pulldown che assicura che il MOSFET si spenga quando il gate non è collegato.

La ventola è collegata a +12V e al Drain (D) del MOSFET, mentre il Source (S) è collegato a massa (GND). Se il Gate del MOSFET riceve un impulso PWM si apre e la corrente può fluire da Drain a Source, permettendo alla ventola di ricevere alimentazione. Ricorda che le ventole brushless hanno polarità. Se la ventola non gira, controlla la polarità corretta e anche l’orientamento del MOSFET.

Se usi un motore DC standard o una ventola non brushless, dovresti aggiungere un Flyback Diode in parallelo al motore per sopprimere i picchi di tensione causati da un carico induttivo come un motore o un solenoide. Qui sotto una foto del circuito con il diodo flyback aggiuntivo:

Circuito con diodo flyback

Codice per controllare la velocità della ventola

Ecco il codice di esempio per controllare la ventola. Spegnerà la ventola per 3 secondi, poi la farà girare per 3 secondi a velocità media, e infine per altri 3 secondi a piena velocità.

// Code to control Fan speed via PWM

int fanPin = 3;         

void setup() {
  pinMode(fanPin, OUTPUT);
}

void loop() {
  // Fan off  
  analogWrite(fanPin, 0);
  delay(3000);

  // Medium speed
  analogWrite(fanPin, 150);
  delay(3000);

  // Max speed
  analogWrite(fanPin, 255);
  delay(3000);
}

Analizziamo il codice per capire come funziona.

Costanti e variabili

In questo codice abbiamo una sola variabile chiamata fanPin. Questa variabile memorizza il numero del pin a cui è collegata la ventola. In questo caso la ventola è collegata al pin 3. Nota che devi usare un pin PWM! I pin PWM su Arduino Uno sono identificati con il simbolo “~”, come ~3, ~5, ~6, ~9, ~10 e ~11.

int fanPin = 3;

Funzione setup

Nella funzione setup() impostiamo la modalità del fanPin a OUTPUT. Questo è necessario perché scriveremo su questo pin per controllare la velocità della ventola.

void setup() {
  pinMode(fanPin, OUTPUT);
}

Funzione loop

Nella funzione loop() controlliamo la velocità della ventola usando il PWM. Abbiamo tre livelli di velocità: spento, medio e massimo.

Prima spegniamo la ventola impostando il valore PWM a 0 con analogWrite(fanPin, 0). Poi aspettiamo 3 secondi con delay(3000).

// Fan off  
analogWrite(fanPin, 0);
delay(3000);

Poi impostiamo la velocità della ventola a un livello medio impostando il valore PWM a 150 con analogWrite(fanPin, 150). Di nuovo aspettiamo 3 secondi.

// Medium speed
analogWrite(fanPin, 150);
delay(3000);

Infine impostiamo la velocità della ventola al massimo impostando il valore PWM a 255 con analogWrite(fanPin, 255). Aspettiamo altri 3 secondi prima di ripetere il ciclo.

// Max speed
analogWrite(fanPin, 255);
delay(3000);

Questo ciclo continua indefinitamente, alternando i diversi livelli di velocità della ventola.

Con questo codice e circuito puoi controllare la velocità praticamente di qualsiasi ventola. Funziona per ventole brushless e con spazzole, a 2 e 3 fili. Se hai una ventola a 4 fili, che ha già un circuito interno di controllo della velocità, non ti serve il circuito MOSFET mostrato sopra, ma puoi fornire direttamente il segnale PWM.

Esempio 3: Ventola controllata dalla temperatura

Un caso d’uso molto comune è regolare la velocità della ventola in base alla temperatura ambiente. Ti mostro come farlo in questo esempio.

Prima ci serve un sensore per misurare la temperatura. Esistono molti tipi di sensori di temperatura e non importa troppo quale. Qui userò il sensore di temperatura e umidità DHT11. Puoi trovarli come moduli o come sensore semplice. Entrambi vanno bene e funzionano allo stesso modo.

Sensore DHT11
DHT11 sensor mounted on an easy-to-use PCB
Modulo sensore DHT11

Se ti servono più dettagli sul DHT11 e sul suo “cugino” DHT22, dai un’occhiata al nostro tutorial: DHT11/DHT22 Sensor with Arduino Tutorial. Invece del DHT11 potresti anche usare il TMP36, il LM35 o il DS18B20. Sono altri sensori di temperatura adatti, ma dovrai adattare un po’ circuito e codice se li usi.

Circuito per ventola controllata dalla temperatura

Il circuito per controllare la velocità della ventola con un DHT11 è mostrato qui sotto. Puoi sostituire il DHT11 con un DHT21 o DHT22 senza cambiare il circuito.

Circuit for Temperature Controlled Fan
Circuito per ventola controllata dalla temperatura

Come vedi usiamo lo stesso circuito a MOSFET per controllare la ventola via PWM dal pin 3 di Arduino. Aggiungiamo solo il DHT11 collegando il suo pin IO al pin 2 di Arduino. Per l’alimentazione, collega il pin VCC a 5V e il pin GND a massa. L’immagine seguente mostra il pinout del DHT11

Pins of the DHT11
Pin del DHT11

Nota che il pin 3 non è usato. Per questo i moduli DHT hanno solo tre pin, mentre il sensore ne ha 4.

Qui sotto una foto del circuito completo con una piccola ventola, una batteria da 9V e una breadboard.

Temperature Controlled Fan Circuit
Circuito ventola controllata dalla temperatura

Codice per ventola controllata dalla temperatura

Il codice seguente mostra come usare il PWM (modulazione di larghezza di impulso) e le letture di temperatura dal sensore DHT11 per regolare la velocità della ventola.

// Control fan speed using PWM based
// on temperature reading from DHT11 sensor

#include "Adafruit_Sensor.h"
#include "DHT.h"

const int tempPin = 2;
const int fanPin = 3;

// Sensor types: DHT11, DHT22, DHT21
DHT dht = DHT(tempPin, DHT11); 

void setup() {
  dht.begin();
  pinMode(fanPin , OUTPUT);  
}

void loop() {
  float temp = dht.readTemperature(); // Celsius
  if (isnan(temp)) return;

  int fanSpeed = map(temp, 20, 40, 0, 255);
  fanSpeed = constrain(fanSpeed, 0, 255);
  analogWrite(fanPin, fanSpeed);

  delay(5000);
}

Analizziamo il codice per capire come funziona.

Librerie

Il DHT11 usa un protocollo di comunicazione relativamente complesso (vedi Datasheet). Potresti implementarlo da solo, ma è più facile usare una libreria. Esistono diverse librerie Arduino per il sensore DHT11. Qui usiamo quella di Adafruit.

#include "Adafruit_Sensor.h"
#include "DHT.h"

Devi installare la libreria base “Adafruit_Sensor.h” e la loro libreria “DHT.h”. Dai un’occhiata al nostro tutorial: DHT11/DHT22 Sensor with Arduino Tutorial, se ti servono più dettagli.

Costanti e variabili

Iniziamo definendo due costanti: tempPin e fanPin. tempPin rappresenta il numero del pin a cui è collegato il sensore DHT11, e fanPin rappresenta il numero del pin a cui è collegata la ventola.

const int tempPin = 2;
const int fanPin = 3;

Poi creiamo un’istanza della libreria DHT e la inizializziamo con tempPin e il tipo di sensore, che in questo caso è DHT11. Se vuoi usare un DHT21 o DHT22 invece del DHT11, cambia semplicemente il nome della costante.

// Sensor types: DHT11, DHT22, DHT21
DHT dht = DHT(tempPin, DHT11);

Funzione setup

Nella funzione setup() inizializziamo il sensore DHT con la funzione dht.begin(). Impostiamo anche il fanPin come pin di uscita usando la funzione pinMode().

void setup() {
  dht.begin();
  pinMode(fanPin , OUTPUT);  
}

Funzione loop

Nella funzione loop() leggiamo prima la temperatura in gradi Celsius dal sensore DHT usando la funzione dht.readTemperature(). Se vuoi usare Fahrenheit invece di Celsius, chiama semplicemente dht.readTemperature(true).

Se il sensore non riesce a leggere la temperatura, restituisce Not-a-Number (NaN). In questo caso usciamo dalla funzione con l’istruzione return.

Altrimenti, mappiamo il valore della temperatura dall’intervallo 20-40 gradi Celsius a un intervallo da 0 a 255. Questo servirà a controllare la velocità della ventola. Significa che a 20 gradi la ventola è ferma (velocità 0), ma sopra i 20 gradi la ventola inizia a girare molto lentamente fino a raggiungere la velocità massima (255) a 40 gradi.

Per molte applicazioni potresti voler modificare questo comportamento e far partire la ventola a velocità media quando si supera una certa soglia di temperatura, perché velocità molto basse hanno quasi nessun effetto di raffreddamento e la ventola potrebbe non partire con valori PWM troppo bassi.

float temp = dht.readTemperature();
if (isnan(temp)) return;

int fanSpeed = map(temp, 20, 40, 0, 255);

Nota che la funzione map() in realtà non garantisce che fanSpeed sia nel range consentito [0..255]. Per esempio, per temperature inferiori a 20 gradi restituisce valori negativi!

Non vogliamo questo, quindi usiamo la funzione constrain() per limitare il valore di fanSpeed nell’intervallo 0-255.

fanSpeed = constrain(fanSpeed, 0, 255);

Infine usiamo la funzione analogWrite() per impostare la velocità della ventola fornendo fanPin e il valore di velocità. Come detto, per valori PWM bassi (fanSpeed < 10) la ventola potrebbe non partire. Prova con la tua ventola e trova un valore minimo adatto. Magari vuoi far partire la ventola a velocità 100 quando la temperatura supera i 20 gradi.

analogWrite(fanPin, fanSpeed);

Infine aggiungiamo un ritardo di 5 secondi con la funzione delay() prima che il ciclo si ripeta. Quindi campioniamo la temperatura ambiente ogni 5 secondi e regoliamo la velocità della ventola di conseguenza.

delay(5000);

Ecco una ventola controllata dalla temperatura!

Conclusioni

In questo post abbiamo imparato come controllare una ventola usando Arduino. Abbiamo iniziato parlando dei componenti necessari per questo progetto, inclusi una scheda Arduino, una ventola e vari componenti elettronici come relè, MOSFET e sensori di temperatura.

Poi abbiamo esplorato i diversi tipi di ventole disponibili sul mercato, come ventole AC e DC. Abbiamo discusso vantaggi e svantaggi di ciascun tipo e come possono essere usati in diversi scenari.

Successivamente abbiamo approfondito il controllo delle ventole DC, in particolare le configurazioni a 2, 3 e 4 fili. Abbiamo spiegato come ogni filo è usato per scopi diversi, come alimentazione, massa, segnale tachimetro e controllo PWM.

Per fornire esempi pratici, abbiamo mostrato vari metodi per controllare ventole con Arduino. Abbiamo dimostrato come accendere o spegnere una ventola AC o DC usando un relè.

Inoltre, abbiamo esplorato tecniche più avanzate come il controllo della velocità della ventola usando PWM con un MOSFET. Abbiamo spiegato come la modulazione di larghezza di impulso può variare la velocità della ventola, permettendo un controllo preciso in base alle esigenze di raffreddamento.

Infine, abbiamo presentato un esempio di controllo della velocità della ventola basato sulla temperatura ambiente usando un MOSFET. Questa applicazione è utile in ambienti dove la regolazione della temperatura è cruciale, come in contenitori elettronici o sale server.

Speriamo che questo post ti abbia fornito spunti utili e ispirazione per i tuoi progetti di controllo ventole. Sentiti libero di sperimentare ed esplorare ulteriori possibilità con Arduino e ventole!

Domande frequenti

Ecco alcune domande frequenti sul controllo di una ventola con Arduino:

D: Qual è la differenza tra ventole AC e DC?

R: La differenza principale è il tipo di alimentazione richiesta. Le ventole AC sono progettate per funzionare con la rete elettrica domestica, che è corrente alternata. Le ventole DC, invece, sono progettate per funzionare con una fonte di corrente continua, come una batteria o un alimentatore.

D: Come posso accendere una ventola usando un relè?

R: Per accendere una ventola con un relè, devi collegare il modulo relè ad Arduino. Arduino può quindi controllare il relè, che a sua volta accende o spegne la ventola. Devi collegare il pin di ingresso del relè a uno dei pin digitali di Arduino e i pin di uscita del relè all’alimentazione della ventola.

D: Come posso controllare la velocità di una ventola con Arduino?

R: Per controllare la velocità di una ventola con Arduino, puoi usare un modulo MOSFET. Collegando il modulo MOSFET ad Arduino, puoi variare la tensione fornita alla ventola, controllandone così la velocità. Questo si ottiene usando segnali PWM generati da Arduino.

D: Posso leggere il segnale di velocità di una ventola con Arduino?

R: Sì, puoi leggere il segnale di velocità di una ventola con Arduino. Alcune ventole hanno un’uscita tachimetro che fornisce un segnale a impulsi proporzionale alla velocità della ventola. Collegando questo segnale a uno dei pin digitali di Arduino puoi misurare la velocità. Se la ventola non ha il filo della velocità, puoi costruire un tuo monitor di velocità. Vedi il nostro tutorial Build Arduino Tachometer Using A3144 Hall Effect Sensor.

D: Posso controllare la velocità della ventola in base alla temperatura ambiente?

R: Sì, puoi controllare la velocità della ventola in base alla temperatura ambiente usando Arduino. Collegando un sensore di temperatura ad Arduino, puoi misurare la temperatura e regolare la velocità della ventola di conseguenza.

D: Posso controllare la velocità della ventola in base alla luce ambientale?

R: Sì, puoi controllare la velocità della ventola in base alla luce ambientale. Collegando un sensore di luce in un partitore di tensione ad Arduino, puoi misurare la luce e regolare la velocità della ventola di conseguenza. Qui sotto il circuito base per misurare la luce.

Partitore di tensione con sensore di luce per misurare la luminosità

Per maggiori dettagli dai un’occhiata al nostro tutorial How to detect light using an Arduino.

D: Posso usare un sensore di temperatura DS18B20 invece del DHT11?

Sì, puoi, ma dovrai cambiare il codice. Ecco un breve esempio su come leggere i dati di temperatura dal DS18B20:

// https://github.com/matmunk/DS18B20
#include "DS18B20.h"

const int tempPin = 2;
DS18B20 ds(tempPin);

void setup() {
  Serial.begin(9600);
}

void loop() {
  while (ds.selectNext()) {
    float temp = ds.getTempC();
	...
    delay(1000);
  }
}

D: Posso controllare la direzione di rotazione di una ventola con Arduino?

Dipende. Le ventole brushless e le ventole AC solitamente girano in una sola direzione. Cambiare la polarità per invertire la direzione non funziona con queste ventole. Se invece la ventola usa un motore DC con spazzole semplice, puoi controllare la direzione. Ti serve un ponte H o una scheda driver motore per farlo.

D: Posso controllare più ventole con Arduino?

Sì, puoi controllare più ventole con Arduino usando componenti elettronici appropriati come relè o MOSFET. Ogni ventola richiede il proprio circuito di controllo, ma tutte possono essere gestite da un singolo Arduino.

Queste sono solo alcune delle domande frequenti sul controllo di una ventola con Arduino. Se hai altre domande, sentiti libero di chiedere nella sezione commenti qui sotto.