.. note::

    Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

    **Perché Unirsi?**

    - **Supporto Tecnico Esperto**: Risolvi i problemi post-vendita e affronta le sfide tecniche con l'aiuto della nostra comunità e del nostro team.
    - **Impara e Condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
    - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.
    - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni festive.

    👉 Sei pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso!

.. _4.1.1_py_pi5:

4.1.1 Fotocamera
====================

Introduzione
---------------

Qui realizzeremo una fotocamera con un otturatore; quando premi il pulsante, la fotocamera scatterà una foto mentre il LED lampeggia.

Componenti Necessari
----------------------

In questo progetto, abbiamo bisogno dei seguenti componenti.

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

È decisamente conveniente acquistare un kit completo, ecco il link: 

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

    *   - Nome	
        - COMPONENTI NEL KIT
        - LINK
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

Puoi anche acquistarli separatamente dai link sottostanti.

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

    *   - INTRODUZIONE AI COMPONENTI
        - LINK PER L'ACQUISTO

    *   - :ref:`cpn_gpio_extension_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|

Diagramma Schematica
-------------------------

============ ======== ======== ===
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

Procedure Sperimentali
--------------------------

**Passo 1:** Costruisci il circuito.

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

**Passo 2:** Accedi al desktop di Raspberry Pi. Potresti aver bisogno di uno schermo per un'esperienza migliore, fai riferimento a: `Collega il tuo Raspberry Pi <https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/3>`_. Oppure accedi al desktop di Raspberry Pi da remoto, per un tutorial dettagliato consulta :ref:`remote_desktop`.

**Passo 3:** Apri un Terminale e vai nella cartella del codice.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python-pi5

**Passo 4:** Esegui.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 4.1.1_Camera_zero.py

Dopo l'esecuzione del codice, premi il pulsante: il Raspberry Pi farà lampeggiare il LED e scatterà una foto. La foto verrà chiamata ``my_photo.jpg`` e salvata nella directory ``~``.

.. note::

    Puoi anche aprire ``4.1.1_Camera_zero.py`` nel percorso ``~/raphael-kit/python/`` con un IDE Python, cliccare sul pulsante Esegui per avviare e utilizzare il pulsante Stop per interrompere il codice.

Se desideri scaricare la foto sul tuo PC, fai riferimento a :ref:`filezilla`.


.. warning::

    Se viene visualizzato l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, fare riferimento a :ref:`faq_soc`. 

**Code**

.. note::
    Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice sottostante. Ma prima di ciò, devi andare nel percorso del codice sorgente come ``raphael-kit/python``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto.

.. raw:: html

    <run></run>

.. code-block:: python

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

   # Ottieni il nome dell'utente attualmente connesso e la sua directory home
   user = os.getlogin()
   user_home = os.path.expanduser(f'~{user}')

   # Inizializza la fotocamera
   camera = Picamera2()
   camera.start()

   # Inizializza una variabile per tracciare lo stato della fotocamera
   global status
   status = False

   # Imposta il LED e il pulsante con i rispettivi numeri di pin GPIO
   led = LED(17)
   button = Button(18)

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

   try:
       # Assegna la funzione da chiamare quando si preme il pulsante
       button.when_pressed = takePhotos
       
       # Ciclo principale
       while True:
           # Controlla se il pulsante è stato premuto
           if status:
               # Fai lampeggiare il LED cinque volte
               for i in range(5):
                   led.on()
                   time.sleep(0.1)
                   led.off()
                   time.sleep(0.1)
               # Cattura e salva una foto
               camera.capture_file(f'{user_home}/my_photo.jpg')
               print('Take a photo!')          
               # Reimposta lo stato
               status = False
           else:
               # Spegni il LED se non stai scattando foto
               led.off()
           
           # Aspetta un breve periodo prima di controllare nuovamente lo stato del pulsante
           time.sleep(1)

   except KeyboardInterrupt:
       # Interrompi l'anteprima della fotocamera e spegni il LED se si verifica un'interruzione da tastiera
       camera.stop_preview()
       led.off()
       pass


**Spiegazione del Codice**

#. Importa le librerie necessarie per la gestione del tempo, il controllo della fotocamera e dei componenti GPIO.

   .. code-block:: python

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

#. Recupera il nome dell'utente attualmente connesso e la sua directory home per salvare le foto.

   .. code-block:: python

       # Ottieni il nome dell'utente attualmente connesso e la sua directory home
       user = os.getlogin()
       user_home = os.path.expanduser(f'~{user}')

#. Inizializza la fotocamera e la avvia.

   .. code-block:: python

       # Inizializza la fotocamera
       camera = Picamera2()
       camera.start()

#. Dichiara ``status`` come variabile globale e la imposta inizialmente su ``False``.

   .. code-block:: python

       # Inizializza una variabile per tracciare lo stato della fotocamera
       global status
       status = False

#. Inizializza un LED collegato al pin GPIO 17 e un pulsante collegato al pin GPIO 18.

   .. code-block:: python

       # Imposta il LED e il pulsante con i rispettivi numeri di pin GPIO
       led = LED(17)
       button = Button(18)

#. Definisce una funzione ``takePhotos`` che imposta la variabile globale ``status`` su ``True`` quando si preme il pulsante.

   .. code-block:: python

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

#. Assegna la funzione ``takePhotos`` per essere chiamata quando si preme il pulsante.

   .. code-block:: python

       try:
           # Assegna la funzione da chiamare quando si preme il pulsante
           button.when_pressed = takePhotos
           
           ...

#. Controlla continuamente se ``status`` è ``True``. In tal caso, fa lampeggiare il LED cinque volte, cattura una foto e reimposta ``status``. In caso contrario, il LED rimane spento. C'è un ritardo di 1 secondo tra ogni iterazione del ciclo.

   .. code-block:: python

       try:        
           ...
           
           # Ciclo principale
           while True:
               # Controlla se il pulsante è stato premuto
               if status:
                   # Fai lampeggiare il LED cinque volte
                   for i in range(5):
                       led.on()
                       time.sleep(0.1)
                       led.off()
                       time.sleep(0.1)
                   # Cattura e salva una foto
                   camera.capture_file(f'{user_home}/my_photo.jpg')
                   print('Take a photo!')           
                   # Reimposta lo stato
                   status = False
               else:
                   # Spegni il LED se non stai scattando foto
                   led.off()
               
               # Aspetta un breve periodo prima di controllare nuovamente lo stato del pulsante
               time.sleep(1)

#. Cattura un'interruzione da tastiera (come Ctrl+C) e interrompe l'anteprima della fotocamera, spegnendo il LED prima di uscire.

   .. code-block:: python

       except KeyboardInterrupt:
           # Interrompi l'anteprima della fotocamera e spegni il LED se si verifica un'interruzione da tastiera
           camera.stop_preview()
           led.off()
           pass
