Note
Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Approfondissez vos connaissances sur Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.
Pourquoi rejoindre ?
Assistance experte : 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 tutoriels pour améliorer vos compétences.
Aperçus exclusifs : Accédez en avant-première aux annonces de nouveaux produits et aperçus exclusifs.
Réductions spéciales : Profitez de réductions exclusives sur nos derniers produits.
Promotions festives et cadeaux : Participez à des tirages au sort et promotions spéciales pour les fêtes.
👉 Prêt à explorer et créer avec nous ? Cliquez sur [Ici] et rejoignez-nous dès aujourd’hui !
3.1.5 Indicateur de batterie (MCP3008)
Note
Selon la version de votre kit, veuillez identifier si vous disposez de l’ADC0834 ou du MCP3008 et suivez la section correspondante.
Introduction
Dans ce projet, nous allons réaliser un dispositif indicateur de batterie qui peut afficher visuellement le niveau de charge sur un afficheur à bargraph LED.
Avertissement
N’utilisez pas de composants de batterie dépassant 3,3V afin d’éviter toute surcharge qui pourrait endommager la puce ou le Raspberry Pi.
Composants nécessaires
Pour ce projet, nous avons besoin des composants suivants.
Schéma de câblage
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 |
GPIO25 |
Pin 22 |
6 |
25 |
GPIO12 |
Pin 32 |
26 |
12 |
GPIO16 |
Pin 36 |
27 |
16 |
GPIO20 |
Pin 38 |
28 |
20 |
GPIO21 |
Pin 40 |
29 |
21 |
GPIO5 |
Pin 29 |
21 |
5 |
GPIO6 |
Pin 31 |
22 |
6 |
GPIO13 |
Pin 33 |
23 |
13 |
GPIO19 |
Pin 35 |
24 |
19 |
GPIO26 |
Pin 37 |
25 |
26 |
Procédures expérimentales
Étape 1 : Montez le circuit.
Étape 2 : Configurez l’interface SPI et installez la bibliothèque spidev (voir Configuration SPI pour les instructions détaillées). Si vous avez déjà effectué ces étapes, vous pouvez les ignorer.
Étape 3 : Allez dans le dossier du code.
cd ~/davinci-kit-for-raspberry-pi/python-pi5
Étape 4 : Exécutez le fichier.
sudo python3 3.1.5-2_Battery_indicator_zero.py
Après le lancement du programme, connectez séparément le 3ᵉ pin du MCP3008 et la masse (GND) aux deux pôles d’une batterie. Vous verrez alors la LED correspondante sur le bargraph LED s’allumer pour afficher le niveau de charge (plage de mesure : 0–5V).
Avertissement
Si un message d’erreur RuntimeError: Cannot determine SOC peripheral base address apparaît, veuillez consulter Si gpiozero ne fonctionne pas.
Code
Note
Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci-dessous. Mais avant cela, vous devez vous placer dans le chemin source comme davinci-kit-for-raspberry-pi/python-pi5. Après modification, vous pouvez l’exécuter directement pour voir le résultat.
#!/usr/bin/env python3
import LCD1602
from gpiozero import LED, Buzzer, Button
import spidev
import time
import math
# Initialiser le bouton du joystick, le buzzer et la LED
Joy_BtnPin = Button(22) # GPIO22, Pin15
buzzPin = Buzzer(23) # GPIO23, Pin16
ledPin = LED(24) # GPIO24, Pin18
# Seuil initial de température supérieure
upperTem = 40
# Initialiser SPI pour MCP3008 (Bus 0, CE0 -> GPIO8 / Pin24)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000 # 1 MHz
# Initialiser l'écran LCD (adresse I2C 0x27, rétroéclairage activé)
LCD1602.init(0x27, 1)
def read_adc(channel):
"""
Lire la valeur analogique depuis le MCP3008
"""
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 get_joystick_value():
"""
Lit les valeurs du joystick et renvoie un changement selon la position.
"""
x_val = read_adc(1)
y_val = read_adc(2)
if x_val > 800:
return 1
elif x_val < 200:
return -1
elif y_val > 800:
return -10
elif y_val < 200:
return 10
else:
return 0
def upper_tem_setting():
"""
Ajuste et affiche le seuil de température supérieure sur le LCD.
"""
global upperTem
LCD1602.write(0, 0, 'Upper Adjust: ')
change = int(get_joystick_value())
upperTem += change
strUpperTem = str(upperTem)
LCD1602.write(0, 1, strUpperTem)
LCD1602.write(len(strUpperTem), 1, ' ')
time.sleep(0.1)
def temperature():
"""
Lit la température actuelle depuis le capteur et la renvoie en °C.
"""
analogVal = read_adc(0)
Vr = 3.3 * analogVal / 1023.0
if Vr == 0:
return 0
Rt = 10000.0 * (3.3 - Vr) / Vr
temp = 1 / (((math.log(Rt / 10000.0)) / 3950.0) + (1 / (273.15 + 25.0)))
Cel = temp - 273.15
return round(Cel, 2)
def monitoring_temp():
"""
Surveille et affiche la température actuelle et le seuil.
Active le buzzer et la LED si la température dépasse la limite.
"""
global upperTem
Cel = temperature()
LCD1602.write(0, 0, 'Temp: ')
LCD1602.write(0, 1, 'Upper: ')
LCD1602.write(6, 0, str(Cel))
LCD1602.write(7, 1, str(upperTem))
time.sleep(0.1)
if Cel >= upperTem:
buzzPin.on()
ledPin.on()
else:
buzzPin.off()
ledPin.off()
# Boucle principale
try:
lastState = 1
stage = 0
while True:
currentState = Joy_BtnPin.value
if currentState == 1 and lastState == 0:
stage = (stage + 1) % 2
time.sleep(0.1)
LCD1602.clear()
lastState = currentState
if stage == 1:
upper_tem_setting()
else:
monitoring_temp()
except KeyboardInterrupt:
LCD1602.clear()
spi.close()
Explication du code
Ce programme Python s’exécute sur un Raspberry Pi. Il utilise un convertisseur analogique-numérique MCP3008 pour lire les données de température depuis un capteur analogique. Un joystick est utilisé pour ajuster le seuil de température, et un écran LCD1602 affiche la température actuelle ainsi que le seuil. Un buzzer et une LED sont activés lorsque la température dépasse ce seuil.
Importer les bibliothèques nécessaires
#!/usr/bin/env python3 import RPi.GPIO as GPIO import spidev import time import math import LCD1602
RPi.GPIOest utilisé pour contrôler les broches GPIO.spidevpermet de communiquer avec le MCP3008 via SPI.mathest utilisé pour les calculs de conversion de température.LCD1602sert à contrôler l’écran LCD.
Configuration des GPIO
JOY_BTN_PIN = 22 BUZZER_PIN = 23 LED_PIN = 24 GPIO.setmode(GPIO.BCM) GPIO.setup(JOY_BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(BUZZER_PIN, GPIO.OUT) GPIO.setup(LED_PIN, GPIO.OUT)
Attribue les broches pour le bouton du joystick, le buzzer et la LED (numérotation BCM).
Configure le bouton du joystick avec résistance pull-up et initialise les sorties à LOW.
Initialisation du SPI et de l’écran LCD
upperTem = 40 # Seuil de température par défaut spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000 # 1 MHz LCD1602.init(0x27, 1)
Initialise la communication SPI pour le MCP3008.
Configure l’écran LCD1602 via I²C à l’adresse
0x27.
Lecture d’un canal ADC
def read_adc(channel): 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
Envoie les commandes SPI au MCP3008 pour lire la tension analogique du canal (0–7).
Retourne une valeur 10 bits comprise entre 0 et 1023.
Lecture de la direction du joystick
def get_joystick_value(): x_val = read_adc(1) y_val = read_adc(2) if x_val > 800: return 1 elif x_val < 200: return -1 elif y_val > 800: return -10 elif y_val < 200: return 10 else: return 0
Lit les mouvements horizontaux (X) et verticaux (Y) du joystick et les traduit en variation du seuil : * Haut / Bas : variation de 10 * Gauche / Droite : variation de 1
Ajustement du seuil de température
def upper_tem_setting(): global upperTem LCD1602.write(0, 0, 'Upper Adjust: ') change = int(get_joystick_value()) upperTem += change strUpperTem = str(upperTem) LCD1602.write(0, 1, strUpperTem) LCD1602.write(len(strUpperTem), 1, ' ') time.sleep(0.1)
Permet à l’utilisateur de modifier le seuil
upperTemvia le joystick.Met à jour l’écran LCD avec la nouvelle valeur.
Calcul de la température depuis le capteur analogique
def temperature(): analogVal = read_adc(0) Vr = 3.3 * analogVal / 1023.0 if Vr == 0: return 0 Rt = 10000.0 * (3.3 - Vr) / Vr tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0))) Cel = tempK - 273.15 return round(Cel, 2)
Convertit la tension lue en résistance, puis applique l’équation de Steinhart-Hart pour obtenir la température en °C.
Mode surveillance
def monitoring_temp(): global upperTem Cel = temperature() LCD1602.write(0, 0, 'Temp: ') LCD1602.write(0, 1, 'Upper: ') LCD1602.write(6, 0, str(Cel)) LCD1602.write(7, 1, str(upperTem)) time.sleep(0.1) if Cel >= upperTem: GPIO.output(BUZZER_PIN, GPIO.HIGH) GPIO.output(LED_PIN, GPIO.HIGH) else: GPIO.output(BUZZER_PIN, GPIO.LOW) GPIO.output(LED_PIN, GPIO.LOW)
Affiche la température actuelle et le seuil sur le LCD.
Active le buzzer et la LED si la température dépasse le seuil.
Boucle principale
try: lastState = GPIO.input(JOY_BTN_PIN) stage = 0 while True: currentState = GPIO.input(JOY_BTN_PIN) if currentState == GPIO.HIGH and lastState == GPIO.LOW: stage = (stage + 1) % 2 time.sleep(0.1) LCD1602.clear() lastState = currentState if stage == 1: upper_tem_setting() else: monitoring_temp()
Utilise le bouton du joystick pour basculer entre :
stage 0: mode surveillance de la températurestage 1: mode réglage du seuil
Nettoyage à la sortie
except KeyboardInterrupt: pass finally: LCD1602.clear() GPIO.cleanup() spi.close()
Assure la réinitialisation des GPIO et de l’écran LCD à la fin du programme (par exemple, après un
Ctrl+C).