Note
Bonjour et bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 sur Facebook ! Plongez plus profondément dans l’univers Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.
Pourquoi rejoindre ?
Support d’experts : Résolvez les problèmes après‑vente et les défis techniques avec l’aide de notre communauté et de notre équipe.
Apprendre et partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.
Aperçus exclusifs : Obtenez un accès anticipé aux annonces de nouveaux produits et aux avant‑premières.
Réductions spéciales : Profitez de remises exclusives sur nos derniers produits.
Promotions et concours festifs : Participez à des concours et promotions de vacances.
👉 Prêt à explorer et créer avec nous ? Cliquez sur [Ici] et rejoignez‑nous dès aujourd’hui !
4.1.7 Ventilateur intelligent (MCP3008)
Note
Selon la version de votre kit, veuillez identifier si vous avez ADC0834 ou MCP3008 et suivre la section correspondante.
Introduction
Dans ce projet, nous utiliserons un moteur, un bouton et une thermistance pour créer un ventilateur intelligent, manuel + automatique, dont la vitesse est réglable.
Composants requis
Dans ce projet, nous avons besoin des composants suivants :
Il est évidemment plus pratique d’acheter un kit complet, voici le lien :
Nom |
ÉLÉMENTS DANS CE KIT |
LIEN |
|---|---|---|
Kit Raphael |
337 |
Vous pouvez également les acheter séparément via les liens ci‑dessous :
INTRODUCTION DU COMPOSANT |
LIEN D’ACHAT |
|---|---|
- |
|
- |
|
- |
|
Schéma
Nom T-Board |
physique |
wiringPi |
BCM |
SPICE0 |
Pin 24 |
10 |
8 |
SPIMOSI |
Pin 19 |
12 |
10 |
SPIMISO |
Pin 21 |
13 |
9 |
SPISCLK |
Pin 23 |
14 |
11 |
GPIO22 |
Pin 15 |
3 |
22 |
GPIO5 |
Pin 29 |
21 |
5 |
GPIO6 |
Pin 31 |
22 |
6 |
GPIO13 |
Pin 33 |
23 |
13 |
Procédure expérimentale
Étape 1 : Construire le circuit.
Note
Le module d’alimentation peut utiliser une pile 9 V avec l’attache 9 V fournie dans le kit.
Étape 2 : Configurer l’interface SPI et installer la bibliothèque spidev (voir Configuration SPI pour des instructions détaillées).
Si vous avez déjà effectué ces étapes, vous pouvez les ignorer.
Étape 3 : Accéder au dossier du code.
cd ~/raphael-kit/python-pi5
Étape 4 : Exécuter.
sudo python3 4.1.10-2_SmartFan_zero.py
Une fois le code exécuté, démarrez le ventilateur en appuyant sur le bouton. Chaque pression modifie la vitesse d’un niveau. Il existe 5 vitesses : 0 ~ 4. Si la vitesse est à 4 et que vous appuyez de nouveau sur le bouton, le ventilateur s’arrête (0).
Dès que la température varie de plus de 2 ℃, la vitesse augmente ou diminue automatiquement d’un niveau.
Code
Note
Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci‑dessous.
Mais avant cela, vous devez aller dans le chemin du code source comme raphael-kit/python-pi5.
Après modification, vous pouvez exécuter directement le code pour voir l’effet.
#!/usr/bin/env python3
from gpiozero import Motor, Button
from time import sleep
import spidev
import math
# Initialisation SPI pour MCP3008
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CE0 (GPIO8 / pin physique 24)
spi.max_speed_hz = 1000000 # 1 MHz
# Initialisation du bouton et du moteur
BtnPin = Button(22) # GPIO22 (pin physique 15)
motor = Motor(forward=5, backward=6, enable=13) # GPIO5, GPIO6, GPIO13
# Variables globales
level = 0
currentTemp = 0
markTemp = 0
def read_adc(channel):
"""
Lit la valeur analogique du canal MCP3008 (0–7).
"""
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
def temperature():
"""
Lit et calcule la température en °C depuis le capteur.
"""
analogVal = read_adc(0) # Thermistance connectée à CH0
Vr = 3.3 * analogVal / 1023.0
Rt = 10000.0 * Vr / (3.3 - Vr)
temp = 1 / (((math.log(Rt / 10000.0)) / 3950.0) + (1 / (273.15 + 25.0)))
Cel = temp - 273.15
return Cel
def motor_run(level):
"""
Ajuste la vitesse du moteur selon le niveau.
"""
if level == 0:
motor.stop()
return 0
if level >= 4:
level = 4
motor.forward(speed=float(level / 4))
return level
def changeLevel():
"""
Change la vitesse du moteur lors d’un appui sur le bouton
et met à jour la température de référence.
"""
global level, currentTemp, markTemp
print("Bouton appuyé")
level = (level + 1) % 5
markTemp = currentTemp
# Associer l’événement du bouton à la fonction
BtnPin.when_pressed = changeLevel
def main():
"""
Fonction principale : surveille la température et ajuste la vitesse.
"""
global level, currentTemp, markTemp
markTemp = temperature()
while True:
currentTemp = temperature()
if level != 0:
if currentTemp - markTemp <= -2:
level -= 1
markTemp = currentTemp
elif currentTemp - markTemp >= 2:
if level < 4:
level += 1
markTemp = currentTemp
level = motor_run(level)
sleep(0.2)
try:
main()
except KeyboardInterrupt:
motor.stop()
spi.close()
Explication du code
Importation des bibliothèques :
gpiozeropour contrôler le moteur et le bouton,spidevpour la communication SPI avec MCP3008 etmathpour les calculs de température.#!/usr/bin/env python3 from gpiozero import Motor, Button from time import sleep import spidev import math
Initialisation SPI : bus 0, périphérique 0 (CE0), vitesse de 1 MHz.
# Initialize SPI for MCP3008 spi = spidev.SpiDev() spi.open(0, 0) # Bus 0, CE0 (GPIO8 / physical pin 24) spi.max_speed_hz = 1000000 # 1 MHz
Configuration des E/S : GPIO22 comme entrée bouton, moteur configuré avec GPIO5 (avant), GPIO6 (arrière) et GPIO13 (PWM).
# Initialize GPIO pins for the button and motor control BtnPin = Button(22) # GPIO22 (physical pin 15) motor = Motor(forward=5, backward=6, enable=13) # GPIO5, GPIO6, GPIO13 # Initialize variables to track the motor speed level and temperatures level = 0 currentTemp = 0 markTemp = 0
Lecture ADC : fonction
read_adc()pour obtenir la valeur analogique (0–1023).def read_adc(channel): """ Reads analog value from MCP3008 channel (0–7). """ if channel < 0 or channel > 7: return -1 adc = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((adc[1] & 0x03) << 8) | adc[2] return value
Température : fonction
temperature()qui calcule la température en Celsius via l’équation de Steinhart–Hart.def temperature(): """ Reads and calculates the current temperature from the sensor. Returns: float: The current temperature in Celsius. """ analogVal = read_adc(0) # Assuming thermistor connected to CH0 Vr = 3.3 * analogVal / 1023.0 # For 3.3V system Rt = 10000.0 * Vr / (3.3 - Vr) temp = 1 / (((math.log(Rt / 10000.0)) / 3950.0) + (1 / (273.15 + 25.0))) Cel = temp - 273.15 return Cel
Contrôle du moteur : fonction
motor_run()qui ajuste la vitesse selon le niveau (0–4).def motor_run(level): """ Adjusts the motor speed based on the specified level. Args: level (int): Desired motor speed level. Returns: int: Adjusted motor speed level. """ if level == 0: motor.stop() return 0 if level >= 4: level = 4 motor.forward(speed=float(level / 4)) return level
Gestion du bouton : fonction
changeLevel()pour changer le niveau et actualiser la température de référence.def changeLevel(): """ Changes the motor speed level when the button is pressed and updates the reference temperature. """ global level, currentTemp, markTemp print("Button pressed") level = (level + 1) % 5 markTemp = currentTemp # Bind the button press event to changeLevel function BtnPin.when_pressed = changeLevel
Boucle principale : ajuste automatiquement la vitesse si la température varie de ±2 °C.
def main(): """ Main function to continuously monitor and respond to temperature changes. """ global level, currentTemp, markTemp markTemp = temperature() while True: currentTemp = temperature() if level != 0: if currentTemp - markTemp <= -2: level -= 1 markTemp = currentTemp elif currentTemp - markTemp >= 2: if level < 4: level += 1 markTemp = currentTemp level = motor_run(level) sleep(0.2)
Gestion des interruptions : arrête le moteur et ferme la connexion SPI lors de Ctrl+C.
# Run the main function and handle KeyboardInterrupt try: main() except KeyboardInterrupt: motor.stop() spi.close()