Bemerkung
Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauche tiefer in Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten ein.
Warum beitreten?
Expertenunterstützung: Löse Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.
Lernen & Teilen: Tausche Tipps und Tutorials aus, um deine Fähigkeiten zu verbessern.
Exklusive Vorschauen: Erhalte frühzeitigen Zugang zu neuen Produktankündigungen und Vorschauen.
Sonderrabatte: Genieße exklusive Rabatte auf unsere neuesten Produkte.
Festliche Aktionen und Gewinnspiele: Nimm an Gewinnspielen und Feiertagsaktionen teil.
👉 Bereit, mit uns zu erkunden und zu kreieren? Klicke [hier] und tritt noch heute bei!
4.1.11 Batterieanzeige (MCP3008)
Bemerkung
Abhängig von deiner Kit-Version überprüfe bitte, ob du ADC0834 oder MCP3008 hast und fahre mit dem entsprechenden Abschnitt fort.
Einführung
In diesem Projekt erstellen wir ein Batterieanzeigegerät, das den Batteriestand visuell auf einer LED-Balkenanzeige darstellt.
Warnung
Verwende keine Batteriekomponenten, die 3,3 V überschreiten, um eine Überlastung zu vermeiden, die den Chip oder den Raspberry Pi beschädigen könnte.
Benötigte Komponenten
Für dieses Projekt benötigen wir die folgenden Komponenten:
Es ist auf jeden Fall praktisch, ein komplettes Kit zu kaufen. Hier ist der Link:
Name |
ENTHALTENE ARTIKEL |
LINK |
|---|---|---|
Raphael Kit |
337 |
Du kannst sie auch separat über die folgenden Links kaufen:
KOMPONENTENBESCHREIBUNG |
KAUFLINK |
|---|---|
- |
|
- |
Schaltplan
T-Board Name |
physical |
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 |
Experimentelle Schritte
Schritt 1: Baue die Schaltung auf.
Schritt 2: Richte die SPI-Schnittstelle ein und installiere die Bibliothek spidev (siehe SPI-Konfiguration für detaillierte Anweisungen). Wenn du diese Schritte bereits abgeschlossen hast, kannst du diesen Schritt überspringen.
Schritt 3: Wechsle in den Code-Ordner.
cd ~/raphael-kit/python
Schritt 4: Führe die ausführbare Datei aus.
sudo python3 4.1.11-2_BatteryIndicator.py
Nachdem das Programm läuft, verbinde den 3. Pin des MCP3008 und GND mit den beiden Polen einer Batterie. Du wirst sehen, dass die entsprechende LED auf der LED-Balkenanzeige aufleuchtet, um den Ladezustand anzuzeigen (Messbereich: 0–5 V).
Warnung
Wenn die Fehlermeldung RuntimeError: Cannot determine SOC peripheral base address angezeigt wird, siehe If gpiozero doesn’t work..
Code
Bemerkung
Du kannst den untenstehenden Code Bearbeiten/Zurücksetzen/Kopieren/Ausführen/Stoppen.
Gehe vorher in das Quellcodeverzeichnis wie raphael-kit/python.
Nach Änderungen kannst du den Code direkt ausführen, um den Effekt zu sehen.
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import spidev
import time
# GPIO-Pins für 10 LEDs (von links nach rechts)
led_pins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26] # BCM-Nummerierung
# GPIO einrichten
GPIO.setmode(GPIO.BCM)
for pin in led_pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
# SPI initialisieren
spi = spidev.SpiDev()
spi.open(0, 0) # Bus 0, CE0
spi.max_speed_hz = 1000000 # 1 MHz
# Wert von MCP3008-Kanal lesen
def read_adc(channel):
if channel < 0 or channel > 7:
return -1
r = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((r[1] & 0x03) << 8) | r[2]
return value
# LEDs entsprechend dem Wert steuern
def led_bar_graph(level):
for i, pin in enumerate(led_pins):
if i < level:
GPIO.output(pin, GPIO.HIGH)
else:
GPIO.output(pin, GPIO.LOW)
# Hauptschleife
try:
while True:
analog_val = read_adc(0) # Kanal 0 lesen
level = int(analog_val * 10 / 1023)
led_bar_graph(level)
print(f"ADC: {analog_val}, Level: {level}")
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
for pin in led_pins:
GPIO.output(pin, GPIO.LOW)
GPIO.cleanup()
spi.close()
Code-Erklärung
Dieses Programm liest die analoge Spannung von einem MCP3008-ADC und zeigt das Ergebnis auf einer 10-LED-Balkenanzeige unter Verwendung des Raspberry Pi (BCM-Pinlayout) an.
Module importieren
RPi.GPIOzur Steuerung der GPIO-Pins des Raspberry Pi.spidevzur Kommunikation mit dem MCP3008 über SPI.timefür Verzögerungen.
import RPi.GPIO as GPIO import spidev import time
GPIO-LED-Setup
Eine Liste mit 10 GPIO-Pins wird für die LED-Steuerung definiert. Diese Pins werden als Ausgang konfiguriert und auf LOW (aus) gesetzt.
led_pins = [25, 12, 16, 20, 21, 5, 6, 13, 19, 26] GPIO.setmode(GPIO.BCM) for pin in led_pins: GPIO.setup(pin, GPIO.OUT) GPIO.output(pin, GPIO.LOW)
SPI-Initialisierung
Initialisiert SPI-Bus 0 und Chip Enable 0 (CE0) zur Kommunikation mit dem MCP3008. Die Geschwindigkeit wird auf 1 MHz eingestellt.
spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000
ADC-Lesefunktion
Liest einen analogen Wert von einem angegebenen MCP3008-Kanal (0–7). Es wird ein 3-Byte-SPI-Befehl gesendet und das 10-Bit-Ergebnis decodiert.
def read_adc(channel): if channel < 0 or channel > 7: return -1 r = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((r[1] & 0x03) << 8) | r[2] return value
LED-Balkenanzeige
Schaltet die LEDs je nach Pegel ein. Wenn der Pegel 7 beträgt, leuchten die ersten 7 LEDs, die restlichen sind aus.
def led_bar_graph(level): for i, pin in enumerate(led_pins): if i < level: GPIO.output(pin, GPIO.HIGH) else: GPIO.output(pin, GPIO.LOW)
Hauptschleife
Liest kontinuierlich den analogen Eingang von Kanal 0, skaliert das Ergebnis auf einen Wert von 0 bis 10 und aktualisiert die LED-Anzeige entsprechend. Außerdem werden ADC- und Pegelwerte zur Überwachung ausgegeben.
while True: analog_val = read_adc(0) level = int(analog_val * 10 / 1023) led_bar_graph(level) print(f"ADC: {analog_val}, Level: {level}") time.sleep(0.2)
Aufräumen beim Beenden
Bei
Ctrl+Cwerden alle LEDs ausgeschaltet, die GPIO-Pins zurückgesetzt und die SPI-Schnittstelle geschlossen.except KeyboardInterrupt: pass finally: for pin in led_pins: GPIO.output(pin, GPIO.LOW) GPIO.cleanup() spi.close()