.. note:: 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 [|link_sf_facebook|] und treten Sie heute bei! .. _4.1.8_py: 4.1.8 Willkommen ===================================== Einführung ------------- In diesem Projekt verwenden wir einen PIR, um die Bewegung von Fußgängern zu erfassen. Mit Servos, LED und einem Summer simulieren wir die Funktion einer Sensortür eines Convenience-Stores. Wenn sich ein Fußgänger im Erfassungsbereich des PIR befindet, leuchtet die Kontrollleuchte auf, die Tür öffnet sich und der Summer spielt das Öffnungsglockensignal. Benötigte Komponenten ------------------------------ Für dieses Projekt benötigen wir folgende Komponenten. .. image:: ../img/list_Welcome.png :align: center Es ist definitiv praktisch, ein ganzes Kit zu kaufen, hier ist der Link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Name - ARTIKEL IN DIESEM KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| Sie können diese auch einzeln über die untenstehenden Links kaufen. .. list-table:: :widths: 30 20 :header-rows: 1 * - KOMPONENTENBESCHREIBUNG - KAUF-LINK * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_led` - |link_led_buy| * - :ref:`cpn_pir` - \- * - :ref:`cpn_servo` - |link_servo_buy| * - :ref:`cpn_Buzzer` - |link_passive_buzzer_buy| * - :ref:`cpn_transistor` - |link_transistor_buy| Schaltplan ------------------- ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO18 Pin 12 1 18 GPIO17 Pin 11 0 17 GPIO27 Pin 13 2 27 GPIO22 Pin 15 3 22 ============ ======== ======== === .. image:: ../img/Schematic_three_one2.png :align: center Experimentelle Verfahren ------------------------- **Schritt 1:** Schaltung aufbauen. .. image:: ../img/image239.png :align: center **Schritt 2:** Verzeichnis wechseln. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Schritt 3:** Ausführen. .. raw:: html .. code-block:: sudo python3 4.1.8_Welcome.py Nachdem der Code ausgeführt wurde und der PIR-Sensor jemanden erkennt, der vorbeigeht, wird die Tür automatisch geöffnet (simuliert durch das Servo), die Anzeige eingeschaltet und die Türklingelmusik abgespielt. Nachdem die Türklingelmusik gespielt hat, wird das System die Tür automatisch schließen und die Anzeige ausschalten, in Erwartung des nächsten Vorbeigehenden. Auf dem PIR-Modul befinden sich zwei Potentiometer: eines zur Einstellung der Empfindlichkeit und eines zur Einstellung der Erfassungsentfernung. Um das PIR-Modul optimal zu nutzen, sollten Sie beide im Uhrzeigersinn bis zum Anschlag drehen. .. image:: ../img/PIR_TTE.png :width: 400 :align: center **Code** .. note:: Sie können den untenstehenden Code **Modifizieren/Zurücksetzen/Kopieren/Ausführen/Stoppen**. Bevor Sie dies tun, müssen Sie jedoch zum Quellcode-Pfad wie ``raphael-kit/python`` wechseln. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, um das Ergebnis zu sehen. .. raw:: html .. code-block:: python #!/usr/bin/env python3 import RPi.GPIO as GPIO import time SERVO_MIN_PULSE = 500 SERVO_MAX_PULSE = 2500 ledPin = 18 # define the ledPin pirPin = 17 # define the sensorPin servoPin = 22 # define the servoPin buzPin = 27 # define the buzzerpin CL = [0, 131, 147, 165, 175, 196, 211, 248] # Frequency of Low C notes CM = [0, 262, 294, 330, 350, 393, 441, 495] # Frequency of Middle C notes CH = [0, 525, 589, 661, 700, 786, 882, 990] # Frequency of High C notes song = [ CH[5],CH[2],CM[6],CH[2],CH[3],CH[6],CH[3],CH[5],CH[3],CM[6],CH[2] ] beat = [ 1,1,1,1,1,2,1,1,1,1,1,] def setup(): global p global Buzz # Assign a global variable to replace GPIO.PWM GPIO.setmode(GPIO.BCM) # Numbers GPIOs by physical location GPIO.setup(ledPin, GPIO.OUT) # Set ledPin's mode is output GPIO.setup(pirPin, GPIO.IN) # Set sensorPin's mode is input GPIO.setup(servoPin, GPIO.OUT) # Set servoPin's mode is output GPIO.output(servoPin, GPIO.LOW) # Set servoPin to low GPIO.setup(buzPin, GPIO.OUT) # Set pins' mode is output Buzz = GPIO.PWM(buzPin, 440) # 440 is initial frequency. Buzz.start(50) # Start Buzzer pin with 50% duty ration p = GPIO.PWM(servoPin, 50) # set Frequece to 50Hz p.start(0) # Duty Cycle = 0 def map(value, inMin, inMax, outMin, outMax): return (outMax - outMin) * (value - inMin) / (inMax - inMin) + outMin def setAngle(angle): # make the servo rotate to specific angle (0-180 degrees) angle = max(0, min(180, angle)) pulse_width = map(angle, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE) pwm = map(pulse_width, 0, 20000, 0, 100) p.ChangeDutyCycle(pwm)#map the angle to duty cycle and output it def doorbell(): for i in range(1, len(song)): # Play song 1 Buzz.ChangeFrequency(song[i]) # Change the frequency along the song note time.sleep(beat[i] * 0.25) # delay a note for beat * 0.25s time.sleep(1) # Wait a second for next song. def closedoor(): GPIO.output(ledPin, GPIO.LOW) for i in range(180, -1, -1): #make servo rotate from 180 to 0 deg setAngle(i) time.sleep(0.001) time.sleep(1) def opendoor(): GPIO.output(ledPin, GPIO.HIGH) for i in range(0, 181, 1): #make servo rotate from 0 to 180 deg setAngle(i) # Write to servo time.sleep(0.001) time.sleep(1) doorbell() closedoor() def loop(): while True: if GPIO.input(pirPin)==GPIO.HIGH: opendoor() def destroy(): GPIO.cleanup() # Release resource p.stop() Buzz.stop() if __name__ == '__main__': # Program start from here setup() try: loop() except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the program destroy() will be executed. destroy() **Code-Erklärung** .. code-block:: python def setup(): global p global Buzz # Assign a global variable to replace GPIO.PWM GPIO.setmode(GPIO.BCM) # Numbers GPIOs by physical location GPIO.setup(ledPin, GPIO.OUT) # Set ledPin's mode is output GPIO.setup(pirPin, GPIO.IN) # Set sensorPin's mode is input GPIO.setup(buzPin, GPIO.OUT) # Set pins' mode is output Buzz = GPIO.PWM(buzPin, 440) # 440 is initial frequency. Buzz.start(50) # Start Buzzer pin with 50% duty ration GPIO.setup(servoPin, GPIO.OUT) # Set servoPin's mode is output GPIO.output(servoPin, GPIO.LOW) # Set servoPin to low p = GPIO.PWM(servoPin, 50) # set Frequece to 50Hz p.start(0) # Duty Cycle = 0 Diese Anweisungen werden verwendet, um die Pins jedes Bauteils zu initialisieren. .. code-block:: python def setAngle(angle): # make the servo rotate to specific angle (0-180 degrees) angle = max(0, min(180, angle)) pulse_width = map(angle, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE) pwm = map(pulse_width, 0, 20000, 0, 100) p.ChangeDutyCycle(pwm)#map the angle to duty cycle and output it Erstellen Sie eine Funktion namens servowrite, um den Winkel im Servo zwischen 0-180 Grad zu schreiben. .. code-block:: python def doorbell(): for i in range(1,len(song)): # Play song1 Buzz.ChangeFrequency(song[i]) # Change the frequency along the song note time.sleep(beat[i] * 0.25) # delay a note for beat * 0.25s Erstellen Sie eine Funktion namens doorbell, um dem Summer zu ermöglichen, Musik zu spielen. .. code-block:: python def closedoor(): GPIO.output(ledPin, GPIO.LOW) Buzz.ChangeFrequency(1) for i in range(180, -1, -1): #make servo rotate from 180 to 0 deg setAngle(i) time.sleep(0.001) Schließen Sie die Tür und schalten Sie das Anzeigelicht aus. .. code-block:: python def opendoor(): GPIO.output(ledPin, GPIO.HIGH) for i in range(0, 181, 1): #make servo rotate from 0 to 180 deg setAngle(i) # Write to servo time.sleep(0.001) doorbell() closedoor() Die Funktion ``opendoor()`` besteht aus mehreren Teilen: Einschalten des Anzeigelichts, Drehen des Servos (um das Öffnen der Tür zu simulieren), Abspielen der Türklingelmusik des Convenience-Stores und Aufrufen der Funktion ``closedoor()`` nach dem Abspielen der Musik. .. code-block:: python def loop(): while True: if GPIO.input(pirPin)==GPIO.HIGH: opendoor() Wenn der PIR erkennt, dass jemand vorbeigeht, ruft er die Funktion ``opendoor()`` auf. Phänomen-Bild -------------------- .. image:: ../img/image240.jpeg :align: center