Bemerkung
Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.
Warum beitreten?
Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.
👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [hier] und treten Sie heute bei!
4.1.4 Zählgerät¶
Einführung¶
Hier erstellen wir ein Zählsystem mit Anzeige, bestehend aus einem PIR-Sensor und einer 4-stelligen Segmentanzeige. Wenn der PIR erkennt, dass jemand vorbeigeht, wird die Zahl auf der 4-stelligen Segmentanzeige um 1 erhöht. Sie können diesen Zähler verwenden, um die Anzahl der Personen zu zählen, die durch einen Durchgang gehen.
Benötigte Komponenten¶
Für dieses Projekt benötigen wir folgende Komponenten.
Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link:
Name |
ARTIKEL IN DIESEM KIT |
LINK |
---|---|---|
Raphael Kit |
337 |
Sie können diese auch separat über die untenstehenden Links kaufen.
KOMPONENTENVORSTELLUNG |
KAUF-LINK |
---|---|
- |
|
- |
Schaltplan¶
T-Board Name |
physical |
wiringPi |
BCM |
GPIO17 |
Pin 11 |
0 |
17 |
GPIO27 |
Pin 13 |
2 |
27 |
GPIO22 |
Pin 15 |
3 |
22 |
SPIMOSI |
Pin 19 |
12 |
10 |
GPIO18 |
Pin 12 |
1 |
18 |
GPIO23 |
Pin 16 |
4 |
23 |
GPIO24 |
Pin 18 |
5 |
24 |
GPIO26 |
Pin 37 |
25 |
26 |
Experimentelle Verfahren¶
Schritt 1: Bauen Sie den Schaltkreis.
Schritt 2: Wechseln Sie in den Ordner des Codes.
cd ~/raphael-kit/python-pi5
Schritt 3: Führen Sie die ausführbare Datei aus.
sudo python3 4.1.7_CountingDevice_zero.py
Nachdem der Code ausgeführt wurde, wird die Zahl auf der 4-stelligen Segmentanzeige um 1 erhöht, wenn der PIR erkennt, dass jemand vorbeigeht.
Es gibt zwei Potentiometer am PIR-Modul: eines zur Einstellung der Empfindlichkeit und das andere zur Einstellung der Erkennungsdistanz. Um das PIR-Modul besser zu nutzen, sollten Sie beide gegen den Uhrzeigersinn bis zum Anschlag drehen.
Code
Bemerkung
Sie können den untenstehenden Code modifizieren/zurücksetzen/kopieren/ausführen/stoppen. Bevor Sie dies tun, müssen Sie zum Quellcodepfad wie raphael-kit/python-pi5
gehen. Nach der Änderung des Codes können Sie ihn direkt ausführen, um die Auswirkung zu sehen.
#!/usr/bin/env python3
from gpiozero import OutputDevice, MotionSensor
# Initialize PIR motion sensor on GPIO 26
pir = MotionSensor(26)
# Initialize shift register pins
SDI = OutputDevice(24) # Serial Data Input
RCLK = OutputDevice(23) # Register Clock Input
SRCLK = OutputDevice(18) # Shift Register Clock Input
# Initialize 7-segment display pins
placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)]
# Define digit codes for 7-segment display
number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
# Counter for the displayed number
counter = 0
def clearDisplay():
# Clears the display by setting all segments off
for _ in range(8):
SDI.on()
SRCLK.on()
SRCLK.off()
RCLK.on()
RCLK.off()
def hc595_shift(data):
# Shifts data into the 74HC595 shift register
for i in range(8):
SDI.value = 0x80 & (data << i)
SRCLK.on()
SRCLK.off()
RCLK.on()
RCLK.off()
def pickDigit(digit):
# Activates a specific digit of the 7-segment display
for pin in placePin:
pin.off()
placePin[digit].on()
def display():
# Updates the display with the current counter value
global counter
clearDisplay()
pickDigit(0)
hc595_shift(number[counter % 10])
clearDisplay()
pickDigit(1)
hc595_shift(number[counter % 100//10])
clearDisplay()
pickDigit(2)
hc595_shift(number[counter % 1000//100])
clearDisplay()
pickDigit(3)
hc595_shift(number[counter % 10000//1000])
def loop():
# Main loop to update display and check for motion
global counter
currentState = 0
lastState = 0
while True:
display()
currentState = 1 if pir.motion_detected else 0
if currentState == 1 and lastState == 0:
counter += 1
lastState = currentState
try:
loop()
except KeyboardInterrupt:
# Turn off all pins when the script is interrupted
SDI.off()
SRCLK.off()
RCLK.off()
pass
Code-Erklärung
Diese Zeile importiert die Klassen
OutputDevice
undMotionSensor
aus der Bibliothekgpiozero
.OutputDevice
kann eine LED, ein Motor oder jedes Gerät sein, das Sie als Ausgang steuern möchten. DerMotionSensor
ist in der Regel ein PIR (Passiver Infrarotsensor), der zur Bewegungserkennung verwendet wird.#!/usr/bin/env python3 from gpiozero import OutputDevice, MotionSensor
Initialisiert den PIR-Bewegungssensor, der mit dem GPIO-Pin 26 verbunden ist.
# Initialize PIR motion sensor on GPIO 26 pir = MotionSensor(26)
Initialisiert GPIO-Pins, die mit dem Serial Data Input (SDI), Register Clock Input (RCLK) und Shift Register Clock Input (SRCLK) des Schieberegisters verbunden sind.
# Initialize shift register pins SDI = OutputDevice(24) # Serial Data Input RCLK = OutputDevice(23) # Register Clock Input SRCLK = OutputDevice(18) # Shift Register Clock Input
Initialisiert die Pins für jede Ziffer der 7-Segment-Anzeige und definiert die Binärcodes für die Anzeige der Zahlen 0-9.
# Initialize 7-segment display pins placePin = [OutputDevice(pin) for pin in (10, 22, 27, 17)] # Define digit codes for 7-segment display number = (0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90)
Löscht die 7-Segment-Anzeige, indem alle Segmente ausgeschaltet werden, bevor die nächste Ziffer angezeigt wird.
def clearDisplay(): # Clears the display by setting all segments off for _ in range(8): SDI.on() SRCLK.on() SRCLK.off() RCLK.on() RCLK.off()
Verschiebt ein Byte Daten in das 74HC595-Schieberegister, um die Anzeigesegmente zu steuern.
def hc595_shift(data): # Shifts data into the 74HC595 shift register for i in range(8): SDI.value = 0x80 & (data << i) SRCLK.on() SRCLK.off() RCLK.on() RCLK.off()
Wählt aus, welche Ziffer der 7-Segment-Anzeige aktiviert werden soll. Jede Ziffer wird durch einen separaten GPIO-Pin gesteuert.
def pickDigit(digit): # Activates a specific digit of the 7-segment display for pin in placePin: pin.off() placePin[digit].on()
Startet die Anzeige zunächst für die Einerziffer, gefolgt von der Aktivierung der Anzeige für die Zehnerziffer. Anschließend werden die Anzeigen für die Hunderter- und Tausenderziffern in der Reihenfolge aktiviert. Diese schnelle Abfolge von Aktivierungen erzeugt die Illusion einer kontinuierlichen vierstelligen Anzeige.
def display(): # Updates the display with the current counter value global counter clearDisplay() pickDigit(0) hc595_shift(number[counter % 10]) clearDisplay() pickDigit(1) hc595_shift(number[counter % 100//10]) clearDisplay() pickDigit(2) hc595_shift(number[counter % 1000//100]) clearDisplay() pickDigit(3) hc595_shift(number[counter % 10000//1000])
Definiert die Hauptschleife, in der die Anzeige kontinuierlich aktualisiert und der Zustand des PIR-Sensors überprüft wird. Wenn eine Bewegung erkannt wird, wird der Zähler erhöht.
def loop(): # Main loop to update display and check for motion global counter currentState = 0 lastState = 0 while True: display() currentState = 1 if pir.motion_detected else 0 if currentState == 1 and lastState == 0: counter += 1 lastState = currentState
Führt die Hauptschleife aus und stellt sicher, dass das Skript mit einem Tastaturbefehl (Ctrl+C) unterbrochen werden kann, wobei alle Pins für einen sauberen Ausstieg ausgeschaltet werden.
try: loop() except KeyboardInterrupt: # Turn off all pins when the script is interrupted SDI.off() SRCLK.off() RCLK.off() pass