.. note::

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

    **Perché unirti a noi?**

    - **Supporto esperto**: Risolvi i problemi post-vendita e 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 speciali.
    - **Sconti esclusivi**: Approfitta di sconti riservati sui nostri prodotti più recenti.
    - **Promozioni festive e concorsi**: Partecipa a concorsi e promozioni durante le festività.

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

.. _2.2.4_py:

2.2.4 Modulo Interruttore Reed
====================================

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

In questo progetto, impareremo a conoscere l'interruttore reed, che è un interruttore elettrico che funziona grazie a un campo magnetico applicato.

.. image:: ../img/2.2.4reed_switch.png
    :width: 300
    :align: center

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

In questo progetto, abbiamo bisogno dei seguenti componenti.

.. image:: ../img/2.2.4component.png
    :width: 700
    :align: center

È sicuramente comodo acquistare un kit completo, ecco il link:

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

    *   - Nome	
        - ARTICOLI IN QUESTO KIT
        - LINK
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

Puoi anche acquistarli separatamente dai link qui sotto.

.. 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_reed_switch`
        - |link_reed_switch_buy|

Schema Elettrico
-------------------

============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17       Pin 11   0        17
GPIO27       Pin 13   2        27
GPIO22       Pin 15   3        22
============ ======== ======== ===

.. image:: ../img/reed_schematic.png
    :width: 400
    :align: center

.. image:: ../img/reed_schematic2.png
    :width: 400
    :align: center

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

**Passo 1:** Costruisci il circuito.

.. image:: ../img/2.2.4fritzing.png
    :width: 700
    :align: center

**Passo 2:** Cambia directory.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python/

**Passo 3:** Esegui.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 2.2.4_ReedSwitch.py

Quando il codice è in esecuzione, il LED verde si accenderà. Se un magnete viene avvicinato al modulo reed, il LED rosso si accenderà; allontanando il magnete, si accenderà di nuovo il LED verde.

**Codice**

.. note::

    Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Ma prima devi accedere al percorso del codice 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
    import RPi.GPIO as GPIO
    import time

    ReedPin = 17
    Gpin    = 27
    Rpin    = 22

    def setup():
        GPIO.setmode(GPIO.BCM)       
        GPIO.setup(Gpin, GPIO.OUT)     # Imposta il pin LED verde in modalità output
        GPIO.setup(Rpin, GPIO.OUT)     # Imposta il pin LED rosso in modalità output
        GPIO.setup(ReedPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # Imposta ReedPin in modalità input e lo tira su al livello alto (3,3V)
        GPIO.add_event_detect(ReedPin, GPIO.BOTH, callback=detect, bouncetime=200)

    def Led(x):
        if x == 0:
            GPIO.output(Rpin, 1)
            GPIO.output(Gpin, 0)
        if x == 1:
            GPIO.output(Rpin, 0)
            GPIO.output(Gpin, 1)

    def detect(self):
        Led(GPIO.input(ReedPin))

    def loop():
        while True:
            pass

    def destroy():
        GPIO.output(Gpin, GPIO.HIGH)       # Accende il LED verde
        GPIO.output(Rpin, GPIO.LOW)       # Spegne il LED rosso
        GPIO.cleanup()                     # Libera le risorse

    if __name__ == '__main__':     # Il programma parte da qui
        setup()
        detect()
        try:
            loop()
        except KeyboardInterrupt:  # Quando viene premuto 'Ctrl+C', il programma distrugge() sarà eseguito.
            destroy()

**Spiegazione del Codice**

.. code-block:: python

    ReedPin = 17
    Gpin    = 27
    Rpin    = 22

    def setup():
        GPIO.setmode(GPIO.BCM)       
        GPIO.setup(Gpin, GPIO.OUT)     # Imposta il pin LED verde in modalità output
        GPIO.setup(Rpin, GPIO.OUT)     # Imposta il pin LED rosso in modalità output
        GPIO.setup(ReedPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # Imposta ReedPin in modalità input e lo tira su al livello alto (3,3V)
        GPIO.add_event_detect(ReedPin, GPIO.BOTH, callback=detect, bouncetime=200)

Imposta la numerazione dei GPIO in modalità BCM. ``ReedPin``, ``Gpin`` e ``Rpin`` sono collegati rispettivamente ai GPIO17, GPIO27 e GPIO22.

``GPIO.add_event_detect()`` viene utilizzato per aggiungere un evento che viene attivato da una variazione del valore (livello) di ``ReedPin``, a quel punto viene chiamata la funzione di callback ``detect()``.

.. code-block:: python

    def Led(x):
        if x == 0:
            GPIO.output(Rpin, 1)
            GPIO.output(Gpin, 0)
        if x == 1:
            GPIO.output(Rpin, 0)
            GPIO.output(Gpin, 1)

Definisci una funzione ``Led()`` per accendere o spegnere i due LED. Se ``x=0``, si accende il LED rosso; altrimenti, si accenderà il LED verde.

.. code-block:: python

    def detect(self):
    Led(GPIO.input(ReedPin))

In questa funzione di callback, il valore dell'interruttore reed viene utilizzato per controllare i 2 LED.

 
Immagine del Fenomeno
--------------------------------

.. image:: ../img/2.2.4reed_switch.JPG
    :width: 500
    :align: center
