.. 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.1_py: 4.1.1 Kamera =========================== Einführung ----------------- Hier werden wir eine Kamera mit einem Verschluss bauen. Wenn Sie den Knopf drücken, macht die Kamera ein Foto, während die LED blitzt. Benötigte Komponenten ------------------------------ Für dieses Projekt benötigen wir die folgenden Komponenten. .. image:: ../img/3.1.15camera_list.png :width: 800 :align: center Es ist definitiv praktisch, ein komplettes Set 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 sie 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_button` - |link_button_buy| * - :ref:`cpn_camera_module` - |link_camera_buy| Schaltplan ----------------------- ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO17 Pin 11 0 17 GPIO18 Pin 12 1 18 ============ ======== ======== === .. image:: ../img/camera_schematic.png :width: 500 :align: center Versuchsverfahren ------------------------------ **Schritt 1:** Bauen Sie den Schaltkreis. .. image:: ../img/4.1.1_camera_circuit.png :width: 800 :align: center **Schritt 2:** Um das Kameramodul anzuschließen und die Konfiguration abzuschließen, beachten Sie bitte: :ref:`cpn_camera_module`. **Schritt 3:** Gehen Sie zum Raspberry Pi Desktop. Für eine bessere Erfahrung benötigen Sie vielleicht einen Bildschirm. Siehe: `Verbinden Sie Ihren Raspberry Pi `_. Oder greifen Sie remote auf den Raspberry Pi Desktop zu. Für ein detailliertes Tutorial siehe :ref:`remote_desktop`. **Schritt 4:** Öffnen Sie ein Terminal und navigieren Sie zum Ordner des Codes. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Schritt 5:** Ausführen. .. raw:: html .. code-block:: sudo python3 4.1.1_Camera.py Nachdem der Code ausgeführt wurde, drücken Sie den Knopf. Der Raspberry Pi wird die LED blinken lassen und ein Foto machen. Das Foto wird als ``my_photo.jpg`` benannt und im Verzeichnis ``~`` gespeichert. .. note:: Sie können auch ``4.1.1_Camera.py`` im Pfad ``~/raphael-kit/python/`` mit einer Python-IDE öffnen, den Run-Button klicken, um es auszuführen, und den Code mit dem Stop-Button stoppen. Wenn Sie das Foto auf Ihren PC herunterladen möchten, beachten Sie bitte :ref:`filezilla`. **Code** .. note:: Sie können den untenstehenden Code **Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen**. Aber zuerst müssen Sie zum Quellcode-Pfad wie ``raphael-kit/python`` gehen. Nachdem Sie den Code geändert haben, können Sie ihn direkt ausführen, um den Effekt zu sehen. .. raw:: html .. code-block:: python #!/usr/bin/env python3 import time import os import RPi.GPIO as GPIO from picamera2 import Picamera2, Preview # ---------------------------- # GPIO SETUP # ---------------------------- BUTTON_PIN = 18 # The push button is connected to GPIO18 LED_PIN = 17 # The LED is connected to GPIO17 GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbering # The button uses a 10K pull-up resistor externally. # When released → HIGH, when pressed → LOW. GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # LED is an output (HIGH → ON, LOW → OFF) GPIO.setup(LED_PIN, GPIO.OUT) GPIO.output(LED_PIN, GPIO.LOW) # Ensure LED is OFF at startup # ---------------------------- # USER DIRECTORY SETUP # ---------------------------- # Get the current logged-in username user = os.getlogin() # Build the path to the user's home directory (ex: /home/pi) user_home = os.path.expanduser(f"~{user}") # ---------------------------- # CAMERA SETUP # ---------------------------- # Create a Picamera2 object camera = Picamera2() # Create a preview configuration: # main → the main camera stream # size → resolution 800x600 # format → display format used by the preview window preview_config = camera.create_preview_configuration( main={"size": (800, 600), "format": "XRGB8888"} ) # Apply the configuration to the camera camera.configure(preview_config) # Start the preview window using QTGL (GPU-accelerated) camera.start_preview(Preview.QTGL) # Start the camera hardware camera.start() print("Ready! Press the button to take a photo...") # ---------------------------- # MAIN LOOP # ---------------------------- try: while True: # Check if button is pressed (LOW means pressed) if GPIO.input(BUTTON_PIN) == GPIO.LOW: print("Button pressed! Taking photo...") # Flash LED 3 times to warn before taking the photo for _ in range(3): GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.1) GPIO.output(LED_PIN, GPIO.LOW) time.sleep(0.1) # Build a unique filename using current date and time # Example: /home/pi/my_photo_20251201_143522.jpg timestamp = time.strftime("%Y%m%d_%H%M%S") filename = os.path.join(user_home, f"my_photo_{timestamp}.jpg") # Capture the image camera.capture_file(filename) print(f"Photo saved to: {filename}") # Turn LED ON briefly to confirm capture GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.5) GPIO.output(LED_PIN, GPIO.LOW) # Debounce delay to prevent repeated triggers time.sleep(0.3) # Small delay to reduce CPU usage time.sleep(0.01) # ---------------------------- # CLEAN EXIT WHEN CTRL+C IS PRESSED # ---------------------------- except KeyboardInterrupt: print("\nCtrl+C received, exiting...") # ---------------------------- # CLEANUP SECTION # ---------------------------- finally: # Safely try to stop the camera preview try: camera.stop_preview() except: pass # Ignore errors if preview wasn't running # Safely close the camera device try: camera.close() except: pass # Reset GPIO pins to a safe state GPIO.cleanup() print("Program exited cleanly.") **Code-Erklärung** #. Prüft, ob der mit ``BUTTON_PIN`` verbundene Taster gedrückt wurde. .. code-block:: python if GPIO.input(BUTTON_PIN) == GPIO.LOW: Da der Taster einen Pull-up-Widerstand verwendet, ist sein Standardzustand ``HIGH``. Wenn der Taster gedrückt wird, wechselt das Signal auf ``LOW`` und löst den Fotoaufnahmeprozess aus. #. Lässt die LED dreimal aufblinken, um eine visuelle Rückmeldung vor der Fotoaufnahme zu geben. .. code-block:: python for _ in range(3): GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.1) GPIO.output(LED_PIN, GPIO.LOW) time.sleep(0.1) Dies zeigt an, dass der Raspberry Pi sich auf die Bildaufnahme vorbereitet. #. Erzeugt einen eindeutigen Dateinamen mithilfe eines Zeitstempels und nimmt ein Foto auf. .. code-block:: python timestamp = time.strftime("%Y%m%d_%H%M%S") filename = os.path.join(user_home, f"my_photo_{timestamp}.jpg") camera.capture_file(filename) Der Zeitstempel stellt sicher, dass jedes aufgenommene Foto einen einzigartigen Dateinamen erhält. Das Bild wird anschließend im Home-Verzeichnis des Benutzers gespeichert. #. Schaltet die LED für 0,5 Sekunden ein, um zu bestätigen, dass ein Foto aufgenommen wurde. .. code-block:: python GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(0.5) GPIO.output(LED_PIN, GPIO.LOW) Diese kurze Beleuchtung signalisiert, dass die Aufnahme erfolgreich war. #. Fügt eine kurze Verzögerung hinzu, um mehrere Auslösungen durch einen einzigen Tastendruck zu verhindern. .. code-block:: python time.sleep(0.3) Diese Entprellverzögerung sorgt für eine zuverlässige Tastererkennung. Phänomen-Bild ------------------------ .. image:: ../img/4.1.1camera.JPG :align: center