.. 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_pi5:

4.1.1 Kamera
======================

Einführung
-----------------

Hier werden wir eine Kamera mit einem Auslöser bauen, bei deren Betätigung die Kamera ein Foto macht, während die LED blinkt.

Benötigte Komponenten
------------------------------

Für dieses Projekt benötigen wir folgende Komponenten.

.. image:: ../python_pi5/img/4.1.1_camera_list.png
  :width: 800
  :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 separat über die untenstehenden Links kaufen.

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - KOMPONENTENVORSTELLUNG
        - 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:: ../python_pi5/img/4.1.1_camera_schematic.png
   :align: center

Experimentelle Verfahren
------------------------------


**Schritt 1:** Bauen Sie den Schaltkreis.

.. image:: ../python_pi5/img/4.1.1_camera_circuit.png
  :width: 800
  :align: center

**Schritt 2:** Gehen Sie zum Raspberry Pi Desktop. Für ein besseres Erlebnis benötigen Sie möglicherweise einen Bildschirm, siehe: `Verbinden Sie Ihren Raspberry Pi <https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/3>`_. Oder greifen Sie remote auf den Raspberry Pi Desktop zu, für eine detaillierte Anleitung siehe :ref:`remote_desktop`.

**Schritt 3:** Öffnen Sie ein Terminal und wechseln Sie in den Ordner des Codes.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python-pi5

**Schritt 4:** Ausführen.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 4.1.1_Camera_zero.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 ``my_photo.jpg`` genannt und im Verzeichnis ``~`` gespeichert.

.. note::

    Sie können auch ``4.1.1_Camera_zero.py`` im Pfad ``~/raphael-kit/python/`` mit einer Python-IDE öffnen, den Ausführen-Button klicken, um es zu starten, und den Code mit dem Stop-Button beenden.

Wenn Sie das Foto auf Ihren PC herunterladen möchten, siehe :ref:`filezilla`.

.. warning::

    Wenn die Fehlermeldung ``RuntimeError: Cannot determine SOC peripheral base address`` angezeigt wird, lesen Sie bitte :ref:`faq_soc`

**Code**

.. note::
    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`` gehen. Nach der Änderung des Codes können Sie ihn direkt ausführen, um die Auswirkung zu sehen.

.. raw:: html

    <run></run>

.. code-block:: python

   #!/usr/bin/env python3
   von picamera2 import Picamera2, Preview
   von gpiozero import LED, Button
   import time
   import os

   # Den Login-Namen und das Home-Verzeichnis des aktuellen Benutzers abrufen
   user = os.getlogin()
   user_home = os.path.expanduser(f'~{user}')

   # Die Kamera initialisieren
   camera = Picamera2()
   camera.start()

   # Eine Variable initialisieren, um den Status der Kamera zu verfolgen
   global status
   status = False

   # LED und Knopf mit ihren GPIO-Pinnummern einrichten
   led = LED(17)
   button = Button(18)

   def takePhotos(pin):
       """Funktion, um den Kamerastatus auf True zu setzen, wenn der Knopf gedrückt wird."""
       global status
       status = True

   try:
       # Die Funktion zuweisen, die aufgerufen werden soll, wenn der Knopf gedrückt wird
       button.when_pressed = takePhotos
       
       # Hauptschleife
       while True:
           # Überprüfen, ob der Knopf gedrückt wurde
           if status:
               # Die LED fünfmal blinken lassen
               for i in range(5):
                   led.on()
                   time.sleep(0.1)
                   led.off()
                   time.sleep(0.1)
               # Ein Foto aufnehmen und speichern
               camera.capture_file(f'{user_home}/my_photo.jpg')
               print('Foto aufgenommen!')          
               # Den Status zurücksetzen
               status = False
           else:
               # Die LED ausschalten, wenn nicht aufgenommen wird
               led.off()
           
           # Kurz warten, bevor der Knopfstatus erneut überprüft wird
           time.sleep(1)

   except KeyboardInterrupt:
       # Die Kamera stoppen und die LED ausschalten, wenn ein KeyboardInterrupt auftritt
       camera.stop_preview()
       led.off()
       pass

**Code-Erklärung**

#. Importiert die notwendigen Bibliotheken für Zeitsteuerung, Kamerasteuerung und GPIO-Komponentensteuerung.

   .. code-block:: python

       #!/usr/bin/env python3
       von picamera2 import Picamera2, Preview
       von gpiozero import LED, Button
       import time
       import os

#. Ruft den Login-Namen und das Home-Verzeichnis des aktuellen Benutzers ab, um Fotos zu speichern.

   .. code-block:: python

       # Get the current user's login name and home directory
       user = os.getlogin()
       user_home = os.path.expanduser(f'~{user}')

#. Initialisiert die Kamera und startet sie.

   .. code-block:: python

       # Initialize the camera
       camera = Picamera2()
       camera.start()

#. Deklariert ``status`` als globale Variable und initialisiert sie mit ``False``.

   .. code-block:: python

       # Initialize a variable to track the camera's status
       global status
       status = False

#. Initialisiert eine LED, die mit dem GPIO-Pin 17 verbunden ist, und einen Knopf, der mit dem GPIO-Pin 18 verbunden ist.

   .. code-block:: python

       # Set up LED and button with their GPIO pin numbers
       led = LED(17)
       button = Button(18)

#. Definiert eine Funktion ``takePhotos``, die die globale Variable ``status`` auf ``True`` setzt, wenn der Knopf gedrückt wird.

   .. code-block:: python

       def takePhotos(pin):
           """Function to set the camera's status to True when the button is pressed."""
           global status
           status = True

#. Weist die Funktion ``takePhotos`` zu, die aufgerufen werden soll, wenn der Knopf gedrückt wird.

   .. code-block:: python

       try:
           # Assign the function to be called when the button is pressed
           button.when_pressed = takePhotos
           
           ...

#. Überprüft kontinuierlich, ob der ``status`` ``True`` ist. Wenn ja, lässt es die LED fünfmal blinken, macht ein Foto und setzt ``status`` zurück. Wenn nicht, bleibt die LED aus. Es gibt eine 1-Sekunden-Verzögerung zwischen den Iterationen der Schleife.

   .. code-block:: python

       try:        
           ...
           
           # Main loop
           while True:
               # Check if the button has been pressed
               if status:
                   # Blink the LED five times
                   for i in range(5):
                       led.on()
                       time.sleep(0.1)
                       led.off()
                       time.sleep(0.1)
                   # Capture and save a photo
                   camera.capture_file(f'{user_home}/my_photo.jpg')
                   print('Take a photo!')          
                   # Reset the status
                   status = False
               else:
                   # Turn off the LED if not capturing
                   led.off()
               
               # Wait for a short period before checking the button status again
               time.sleep(1)

#. Fängt ein KeyboardInterrupt (wie Ctrl+C) ab und stoppt die Kameravorschau und schaltet die LED aus, bevor das Programm beendet wird.

   .. code-block:: python

       except KeyboardInterrupt:
           # Stop the camera and turn off the LED if a KeyboardInterrupt occurs
           camera.stop_preview()
           led.off()
           pass



