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.

../_images/4.1.7_counting_device_list_1.png ../_images/4.1.7_counting_device_list_2.png

Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Raphael Kit

337

Raphael Kit

Sie können diese auch separat über die untenstehenden Links kaufen.

KOMPONENTENVORSTELLUNG

KAUF-LINK

GPIO-Erweiterungsplatine

BUY

Steckbrett

BUY

Jumper-Kabel

BUY

Widerstand

BUY

4-stellige 7-Segment-Anzeige

-

74HC595

BUY

PIR Bewegungssensormodul

-

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

../_images/4.1.7_counting_device_schematic.png

Experimentelle Verfahren

Schritt 1: Bauen Sie den Schaltkreis.

../_images/4.1.7_counting_device_circuit.png

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.

../_images/4.1.7_PIR_TTE.png

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

  1. Diese Zeile importiert die Klassen OutputDevice und MotionSensor aus der Bibliothek gpiozero. OutputDevice kann eine LED, ein Motor oder jedes Gerät sein, das Sie als Ausgang steuern möchten. Der MotionSensor ist in der Regel ein PIR (Passiver Infrarotsensor), der zur Bewegungserkennung verwendet wird.

    #!/usr/bin/env python3
    from gpiozero import OutputDevice, MotionSensor
    
  2. Initialisiert den PIR-Bewegungssensor, der mit dem GPIO-Pin 26 verbunden ist.

    # Initialize PIR motion sensor on GPIO 26
    pir = MotionSensor(26)
    
  3. 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
    
  4. 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)
    
  5. 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()
    
  6. 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()
    
  7. 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()
    
  8. 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])
    
  9. 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
    
  10. 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