Nota
Ciao, benvenuto nella Community su Facebook di appassionati di SunFounder Raspberry Pi, Arduino e ESP32! Approfondisci l’esplorazione di Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.
Perché unirsi a noi?
Supporto esperto: risolvi i problemi post-vendita e le sfide tecniche grazie all’aiuto della nostra community e del nostro team.
Impara e Condividi: scambia consigli e tutorial per migliorare le tue competenze.
Anteprime esclusive: accedi in anteprima agli annunci di nuovi prodotti e curiosità.
Sconti speciali: approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni festive e omaggi: partecipa a promozioni e giveaway per le festività.
👉 Pronto a esplorare e creare insieme a noi? Clicca su [Qui] e unisciti oggi stesso!
3.1.4 Ventilatore Intelligente
Introduzione
In questo corso, utilizzeremo motori, pulsanti e termistori per creare un ventilatore intelligente manuale + automatico, con velocità del vento regolabile.
Componenti

Schema Elettrico
T-Board Name |
physical |
wiringPi |
BCM |
GPIO17 |
Pin 11 |
0 |
17 |
GPIO18 |
Pin 12 |
1 |
18 |
GPIO27 |
Pin 13 |
2 |
27 |
GPIO22 |
Pin 15 |
3 |
22 |
GPIO5 |
Pin 29 |
21 |
5 |
GPIO6 |
Pin 31 |
22 |
6 |
GPIO13 |
Pin 33 |
23 |
13 |

Procedura Sperimentale
Step 1: Costruisci il circuito.

Nota
Il modulo di alimentazione può utilizzare una batteria da 9V con l’apposito connettore incluso nel kit. Inserisci il ponticello del modulo di alimentazione nella striscia di bus da 5V della breadboard.

Per utenti del linguaggio C
Step 2: Accedi alla cartella del codice.
cd ~/davinci-kit-for-raspberry-pi/c/3.1.4/
Step 3: Compila.
gcc 3.1.4_SmartFan.c -lwiringPi -lm
Step 4: Esegui il file compilato.
sudo ./a.out
All’avvio del codice, premi il pulsante per accendere il ventilatore. Ogni volta che premi, la velocità aumenta o diminuisce di una tacca. Sono disponibili 5 livelli di velocità: 0~4. Quando è impostato sulla 4a velocità e premi il pulsante, il ventilatore si ferma con velocità del vento 0.
Nota
Se il programma non funziona dopo l’esecuzione o appare il messaggio di errore: «wiringPi.h: No such file or directory», fai riferimento a Il codice C non funziona?.
Quando la temperatura aumenta o diminuisce di oltre 2°C, la velocità aumenta o diminuisce automaticamente di 1 livello.
Spiegazione del Codice
int temperture(){
unsigned char analogVal;
double Vr, Rt, temp, cel, Fah;
analogVal = get_ADC_Result(0);
Vr = 5 * (double)(analogVal) / 255;
Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
cel = temp - 273.15;
Fah = cel * 1.8 +32;
int t=cel;
return t;
}
La funzione temperature() converte i valori del termistore letti da ADC0834 in valori di temperatura. Per ulteriori dettagli consulta 2.2.2 Termistore.
int motor(int level){
if(level==0){
digitalWrite(MotorEnable,LOW);
return 0;
}
if (level>=4){
level =4;
}
digitalWrite(MotorEnable,HIGH);
softPwmWrite(MotorPin1, level*25);
return level;
}
Questa funzione controlla la velocità di rotazione del motore. Livello: 0-4 (il livello 0 ferma il motore). Ogni livello rappresenta un cambiamento del 25% nella velocità del vento.
int main(void)
{
setup();
int currentState,lastState=0;
int level = 0;
int currentTemp,markTemp=0;
while(1){
currentState=digitalRead(BtnPin);
currentTemp=temperture();
if (currentTemp<=0){continue;}
if (currentState==1&&lastState==0){
level=(level+1)%5;
markTemp=currentTemp;
delay(500);
}
lastState=currentState;
if (level!=0){
if (currentTemp-markTemp<=-2){
level=level-1;
markTemp=currentTemp;
}
if (currentTemp-markTemp>=2){
level=level+1;
markTemp=currentTemp;
}
}
level=motor(level);
}
return 0;
}
La funzione main() racchiude l’intero processo del programma come segue:
Legge costantemente lo stato del pulsante e la temperatura attuale.
2) Ogni pressione incrementa di +1 il livello e aggiorna la temperatura. I livelli vanno da 1 a 4.
3) Mentre il ventilatore è in funzione (livello diverso da 0), la temperatura viene monitorata. Una variazione di 2°C comporta l’aumento o la diminuzione del livello.
Il motore modifica la velocità di rotazione in base al livello.
Per Utenti Python
Step 2: Entra nella cartella del codice.
cd ~/davinci-kit-for-raspberry-pi/python
Step 3: Esegui.
sudo python3 3.1.4_SmartFan.py
Quando il codice è in esecuzione, accendi il ventilatore premendo il pulsante. Ogni volta che premi, la velocità viene aumentata o diminuita di un livello. Sono disponibili 5 livelli di velocità: 0~4. Quando è impostato al 4° livello e premi il pulsante, il ventilatore si ferma con una velocità 0.
Quando la temperatura sale o scende di più di 2°C, la velocità aumenta o diminuisce automaticamente di un livello.
Codice
Nota
Puoi Modificare/Ripristinare/Copiare/Eseguire/Interrompere il codice
qui sotto. Prima di farlo, devi accedere alla directory del codice come
davinci-kit-for-raspberry-pi/python
.
import RPi.GPIO as GPIO
import time
import ADC0834
import math
# Configurazione dei pin
MotorPin1 = 5
MotorPin2 = 6
MotorEnable = 13
BtnPin = 22
def setup():
global p_M1,p_M2
ADC0834.setup()
GPIO.setmode(GPIO.BCM)
GPIO.setup(MotorPin1, GPIO.OUT)
GPIO.setup(MotorPin2, GPIO.OUT)
p_M1=GPIO.PWM(MotorPin1,2000)
p_M2=GPIO.PWM(MotorPin2,2000)
p_M1.start(0)
p_M2.start(0)
GPIO.setup(MotorEnable, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(BtnPin, GPIO.IN)
def temperature():
analogVal = ADC0834.getResult()
Vr = 5 * float(analogVal) / 255
Rt = 10000 * Vr / (5 - Vr)
temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))
Cel = temp - 273.15
Fah = Cel * 1.8 + 32
return Cel
def motor(level):
if level == 0:
GPIO.output(MotorEnable, GPIO.LOW)
return 0
if level>=4:
level = 4
GPIO.output(MotorEnable, GPIO.HIGH)
p_M1.ChangeDutyCycle(level*25)
return level
def main():
lastState=0
level=0
markTemp = temperature()
while True:
currentState =GPIO.input(BtnPin)
currentTemp=temperature()
if currentState == 1 and lastState == 0:
level=(level+1)%5
markTemp = currentTemp
time.sleep(0.5)
lastState=currentState
if level!=0:
if currentTemp-markTemp <= -2:
level = level -1
markTemp=currentTemp
if currentTemp-markTemp >= 2:
level = level +1
markTemp=currentTemp
level = motor(level)
def destroy():
GPIO.output(MotorEnable, GPIO.LOW)
p_M1.stop()
p_M2.stop()
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
main()
except KeyboardInterrupt:
destroy()
Spiegazione del Codice
def temperature():
analogVal = ADC0834.getResult()
Vr = 5 * float(analogVal) / 255
Rt = 10000 * Vr / (5 - Vr)
temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))
Cel = temp - 273.15
Fah = Cel * 1.8 + 32
return Cel
La funzione temperature() converte i valori del termistore letti da ADC0834 in valori di temperatura. Per maggiori dettagli consulta 2.2.2 Termistore.
def motor(level):
if level == 0:
GPIO.output(MotorEnable, GPIO.LOW)
return 0
if level>=4:
level = 4
GPIO.output(MotorEnable, GPIO.HIGH)
p_M1.ChangeDutyCycle(level*25)
return level
Questa funzione controlla la velocità di rotazione del motore. Il range di Livello va da 0 a 4 (livello 0 ferma il motore). Ogni livello rappresenta un cambiamento del 25% nella velocità del vento.
def main():
lastState=0
level=0
markTemp = temperature()
while True:
currentState =GPIO.input(BtnPin)
currentTemp=temperature()
if currentState == 1 and lastState == 0:
level=(level+1)%5
markTemp = currentTemp
time.sleep(0.5)
lastState=currentState
if level!=0:
if currentTemp-markTemp <= -2:
level = level -1
markTemp=currentTemp
if currentTemp-markTemp >= 2:
level = level +1
markTemp=currentTemp
level = motor(level)
La funzione main() racchiude l’intero processo del programma:
Legge costantemente lo stato del pulsante e la temperatura corrente.
Ogni pressione incrementa il livello di +1 e allo stesso tempo aggiorna la temperatura. Il Livello varia da 1 a 4.
Mentre il ventilatore è attivo (livello diverso da 0), la temperatura viene monitorata. Una variazione di ±2°C comporta un aumento o una diminuzione del livello.
Il motore modifica la velocità di rotazione in base al livello.
Immagine del Fenomeno
