.. note::
Ciao, benvenuto nella Community di SunFounder per appassionati di Raspberry Pi, Arduino ed ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
**Perché unirti?**
- **Supporto Esperto**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
- **Apprendimento e Condivisione**: Scambia consigli e tutorial per migliorare le tue competenze.
- **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.
- **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni Festive e Giveaway**: Partecipa a concorsi e promozioni speciali durante le festività.
👉 Pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso!
.. _2.1.1_button:
2.1.1 Pulsante
===============
Introduzione
--------------
In questa lezione impareremo come accendere o spegnere un LED utilizzando
un pulsante.
Componenti
-----------
.. image:: img/list_2.1.1_Button.png
Principio
----------
**Pulsante**
Il pulsante è un componente comune per il controllo di dispositivi elettronici,
usato principalmente come interruttore per collegare o interrompere circuiti.
I pulsanti possono avere dimensioni e forme varie; in questo caso utilizziamo
un mini-pulsante da 6mm, come mostrato nelle immagini seguenti.
I due pin a sinistra sono collegati tra loro, così come quelli a destra, come
illustrato di seguito:
.. image:: img/image148.png
:width: 400
:align: center
Il simbolo mostrato qui sotto rappresenta comunemente un pulsante nei circuiti.
.. image:: img/image301.png
:width: 400
:align: center
Quando il pulsante viene premuto, i 4 pin vengono connessi, chiudendo il circuito.
Schema Elettrico
------------------
Utilizza un pulsante normalmente aperto come ingresso per Raspberry Pi; la
connessione è mostrata nel diagramma elettrico sottostante. Quando il pulsante
viene premuto, il GPIO18 passa a livello basso (0V). Possiamo rilevare lo stato
di GPIO18 tramite programmazione: se GPIO18 passa a livello basso, significa che
il pulsante è stato premuto. A questo punto il LED si accenderà.
.. note::
Il pin più lungo del LED è l'anodo, mentre quello più corto è il catodo.
.. image:: img/image302.png
:width: 600
:align: center
.. image:: img/image303.png
:width: 400
:align: center
Procedure Sperimentali
------------------------
**Passo 1**: Costruisci il circuito.
.. image:: img/image152.png
:width: 800
Per Utenti C
^^^^^^^^^^^^^^^
**Passo 2**: Apri il file del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/2.1.1/
.. note::
Cambia directory al percorso del codice di questo esperimento tramite **cd**.
**Passo 3**: Compila il codice.
.. raw:: html
.. code-block::
gcc 2.1.1_Button.c -lwiringPi
**Passo 4**: Esegui il file compilato.
.. raw:: html
.. code-block::
sudo ./a.out
Dopo l'esecuzione del codice, premi il pulsante: il LED si accenderà;
altrimenti, resterà spento.
.. note::
Se il programma non funziona o compare il messaggio di errore: \"wiringPi.h: No such file or directory", fai riferimento a :ref:`faq_c_nowork`.
**Codice**
.. code-block:: c
#include
#include
#define LedPin 0
#define ButtonPin 1
int main(void){
// Se l’inizializzazione di wiringPi fallisce, stampa un messaggio a schermo
if(wiringPiSetup() == -1){
printf("setup wiringPi failed !");
return 1;
}
pinMode(LedPin, OUTPUT);
pinMode(ButtonPin, INPUT);
digitalWrite(LedPin, HIGH);
while(1){
// Indica che il pulsante è stato premuto
if(digitalRead(ButtonPin) == 0){
// Accendi LED
digitalWrite(LedPin, LOW);
// printf("...LED acceso\n");
}
else{
// Spegni LED
digitalWrite(LedPin, HIGH);
// printf("LED spento...\n");
}
}
return 0;
}
**Spiegazione del Codice**
.. code-block::
#define LedPin 0
Il pin GPIO17 sulla T_Extension Board corrisponde al GPIO0 in wiringPi.
.. code-block::
#define ButtonPin 1
ButtonPin è collegato al GPIO1.
.. code-block::
pinMode(LedPin, OUTPUT);
Imposta LedPin come uscita per poter assegnare un valore.
.. code-block::
pinMode(ButtonPin, INPUT);
Imposta ButtonPin come ingresso per leggere il valore di ButtonPin.
.. code-block:: C
while(1){
// Indica che il pulsante è stato premuto
if(digitalRead(ButtonPin) == 0){
// Accendi LED
digitalWrite(LedPin, LOW);
// printf("...LED acceso\n");
}
else{
// Spegni LED
digitalWrite(LedPin, HIGH);
// printf("LED spento...\n");
}
}
if (digitalRead (ButtonPin) == 0): verifica se il pulsante è stato
premuto. Esegui digitalWrite(LedPin, LOW) quando il pulsante è premuto
per accendere il LED.
Per Utenti Python
^^^^^^^^^^^^^^^^^^^^^^^^^
**Passo 2**: Apri il file di codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python
**Passo 3**: Esegui il codice.
.. raw:: html
.. code-block::
sudo python3 2.1.1_Button.py
Ora, premi il pulsante, e il LED si accenderà; premi nuovamente il pulsante,
e il LED si spegnerà. Allo stesso tempo, lo stato del LED verrà stampato sullo
schermo.
**Codice**
.. note::
Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice sottostante. Ma prima di farlo, devi andare nel percorso del codice sorgente come ``davinci-kit-for-raspberry-pi/python``.
.. raw:: html
.. code-block:: python
import RPi.GPIO as GPIO
import time
LedPin = 17 # Imposta GPIO17 come pin del LED
BtnPin = 18 # Imposta GPIO18 come pin del pulsante
Led_status = True # Imposta lo stato del LED su True (SPENTO)
# Definisci una funzione di setup per alcune configurazioni iniziali
def setup():
# Imposta la modalità GPIO su numerazione BCM
GPIO.setmode(GPIO.BCM)
GPIO.setup(LedPin, GPIO.OUT, initial=GPIO.HIGH) # Imposta il LedPin come uscita e il livello iniziale su alto (3.3V)
GPIO.setup(BtnPin, GPIO.IN) # Imposta BtnPin come ingresso.
# Definisci una funzione di callback per il pulsante
def swLed(ev=None):
global Led_status
# Cambia lo stato del LED (acceso-->spento; spento-->acceso)
Led_status = not Led_status
GPIO.output(LedPin, Led_status)
if Led_status:
print ('LED OFF...')
else:
print ('...LED ON')
# Definisci una funzione principale per il processo principale
def main():
# Imposta una rilevazione di caduta su BtnPin,
# e collega la funzione di callback a swLed
GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=swLed)
while True:
# Non fare nulla
time.sleep(1)
# Definisci una funzione destroy per pulire tutto al termine
# dello script
def destroy():
# Spegni il LED
GPIO.output(LedPin, GPIO.HIGH)
# Rilascia le risorse
GPIO.cleanup()
# Se esegui questo script direttamente, fai:
if __name__ == '__main__':
setup()
try:
main()
# Quando viene premuto 'Ctrl+C', il programma
# eseguirà destroy().
except KeyboardInterrupt:
destroy()
**Spiegazione del Codice**
.. code-block:: python
LedPin = 17
Imposta GPIO17 come pin del LED
.. code-block:: python
BtnPin = 18
Imposta GPIO18 come pin del pulsante
.. code-block:: python
GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=swLed)
Imposta una rilevazione di caduta su BtnPin, e quando il valore di BtnPin
cambia da livello alto a livello basso, significa che il pulsante è stato premuto.
Il passo successivo è chiamare la funzione swLed.
.. code-block:: python
def swLed(ev=None):
global Led_status
# Cambia lo stato del LED (acceso-->spento; spento-->acceso)
Led_status = not Led_status
GPIO.output(LedPin, Led_status)
Definisce una funzione di callback come callback del pulsante. Quando il
pulsante viene premuto la prima volta, e la condizione `not Led_status` è falsa,
viene chiamata la funzione GPIO.output() per accendere il LED. Alla pressione
successiva del pulsante, lo stato del LED viene convertito da falso a vero,
spegnendo così il LED.
Immagine del Fenomeno
------------------------
.. image:: img/image153.jpeg