E - Le funzioni
ES03 - Arduino, funzioni per gestire i Pulsanti
FB - 01.2024 - v1.0
“La teoria è quando si sa tutto e niente funziona. La pratica è quando tutto funziona e nessuno sa il perché. Noi abbiamo messo insieme la teoria e la pratica: non c'è niente che funzioni… e nessuno sa il perché!”
“La teoria è quando si sa tutto e niente funziona. La pratica è quando tutto funziona e nessuno sa il perché. Noi abbiamo messo insieme la teoria e la pratica: non c'è niente che funzioni… e nessuno sa il perché!”
Le funzioni
Sono blocchi di codice che possono essere riutilizzati all'interno di un programma. Possono essere definite dal programmatore o utilizzare funzioni già fornite dalle librerie standard di C.
�
2
© FB - 09.2023
Indice
3
© FB - 09.2023
Obiettivi didattici
4
Obiettivi didattici
5
© FB - 02.2024
Introduzione teorica
6
Pulsanti
Pulsanti e microcontrollori
Utilizzo di pulsanti, interruttori e deviatori con i microcontrollori
8
© FB - 12.2020
Collegare un pulsante al microcontrollore
Simboli usati negli schemi elettrici
9
© FB - 11.2021
Pull-up/Pull-down
10
© FB - 10.2021
Resistenze di pull-up e di pull-down
La pratica sconsiglia vivamente di lasciare liberi (floating -flottanti) ingressi di componenti MOS/CMOS perchè, nelle condizioni peggiori, sono in grado di funzionare da sensibili antenne per disturbi di ogni genere, anche di frequenze radio, e creare situazioni di malfunzionamento assai difficili da debuggare. Considerazioni per il dimensionamento:
[Approfondimenti: Resistenza di pull-up / pull-down; Come calcolare le resistenze di pull-up e pull-down - Video 238]
11
© FB - 02.2021
Collegamento tipico pull-up
12
© FB - 12.2020
Collegamento tipico con pulsante pull-down
13
© FB - 12.2020
Collegamento tipico con pulsante pull-down
14
© FB - 12.2020
Utilizzo delle resistenze interne di pull-up e pull-down
Molti microcontrollori incorporano al loro interno resistenze di pull-up e pull-down attivabili via software. �Con questo tipo di collegamento e configurazione del microcontrollore, quando il pulsante non è premuto, sul pin dove è collegato, sarà presente il livello logico alto (5V), mentre con la pressione, ci sarà un collegamento diretto a massa e quindi il livello logico basso (0V).
15
© FB - 01.2023
Utilizzo delle resistenze interne di pull-up e pull-down
#define LED_PIN 13
#define SW_PIN 2
void setup() { // Inizializzazione
pinMode(LED_PIN, OUTPUT);
pinMode(SW_PIN, INPUT_PULLUP);
}
void loop() { // Loop infinito
if(digitalRead(SW_PIN)==HIGH)
//Pulsante non premuto
digitalWrite(LED_PIN, HIGH);
else
//Pulsante premuto
digitalWrite(LED_PIN, LOW);
}
Approfondimenti:
16
© FB - 11.2021
Rimbalzi e Debounce
17
© FB - 10.2021
Rimbalzi e Debounce
Alla pressione o al rilascio del pulsante o dell’interruttore si osservano dei rimbalzi del segnale che possono durare diversi ms (2-30ms)
18
© FB - 11.2020
Codice di esempio
19
© FB - 12.2021
Routine di esempio
visto che la pressione del pulsante dura alcuni millisecondi possiamo controllare per 5-50msec che il pulsante rimanga premuto, per scartare pressioni non valide.
per rilevare un click dobbiamo aspettare che il pulsante venga rilasciato
un pulsante può anche generare gli eventi:
Se volessimo utilizzare la pressione del pulsante per impostare un orologio realizzato con microcontrollore bisognerebbe utilizzare l’evento LongPress e non Press. Provate a tenere premuto un tasto sul pc e pensate a cosa succederebbe se non ci fosse un ritardo tra due letture successive.
20
© FB - 02.2025
Esercitazione
21
Esercizio a
Pressione Pulsante (con durata minima)
22
© FB - 01.2024
Rilevamento pressione pulsante di durata minima
Montare un circuito con 2 led e due pulsanti. Nel loop del programma verificare la pressione del pulsante P1. Accendere il Led1 (verde) se P1 (verde) premuto per un tempo minimo, altrimenti spegnerlo.
23
© FB - 01.2024
Rilevamento pressione pulsante di durata minima
Utilizzare la funzione digitalRead(P1_PIN) per ottenere lo stato del pulsante. Questa funzione restituisce HIGH se il pulsante è rilasciato e LOW se è premuto.
Scrivere una funzione denominata P1_Press() in C++ per il rilevamento di un pulsante premuto per un periodo di tempo minimo. Questa funzione deve restituire 1 se il pulsante è stato premuto costantemente per almeno 50 millisecondi, altrimenti deve restituire 0.
Logica della Funzione: Se il pulsante non è premuto inizialmente (digitalRead(P1_PIN) restituisce HIGH), la funzione deve restituire 0. Se il pulsante è premuto, inizia un conteggio: Attendi 1 millisecondo in ogni iterazione del ciclo utilizzando la funzione delay(1). Verifica se il pulsante è stato rilasciato (digitalRead(P1_PIN) restituisce HIGH). Se è stato rilasciato prima che il conteggio raggiunga 50 millisecondi, la funzione deve restituire 0. Se il pulsante è stato costantemente premuto per almeno 50 millisecondi, restituisci 1.
24
© FB - 01.2024
Rilevamento pressione pulsante di durata minima
Creare delle funzioni per inizializzare i led e i pulsanti da richiamare nella funzione setup dello sketc (void led_configura(); void puls_configura();)
nel loop richiamare la funzione puls_press(). Se pulsante premuto accendere il led (led_accendi) altrimenti spegnerlo (led_spegni)
25
© FB - 01.2024
Esercizio b
Puls_LongPress
26
© FB - 01.2024
Puls_LongPress
Aggiungere al programma precedente la funzione P2_longPress() da richiamare nel main loop. La funzione restitusce 1 o 0 (vero o falso)
Testare questa funzione nel loop del programma: Se viene premuto per più di 3 secondi il pulsante cambiare lo stato del led arancione (Led2) (Toggle/Inverti)
27
© FB - 01.2024
Esercizio c
Puls_Click
28
© FB - 01.2024
Puls_Click() e doppioClick() (opzionale)
Aggiungere al programma precedente la funzione P3_click() (restituisce 1 o 0) da richiamare nel main loop. Se viene cliccato il pulsante cambiare lo stato del led blu (Led3) (Toggle/Inverti)
Provare ad implementare anche la funzione P3_doppioClick()
29
© FB - 02.2024
Valutazione
30
Griglia di valutazione
Si ricorda l’importanza di svolgere e consegnare i progetti assegnati.
31
© FB - 09.2023
Grazie per l’attenzione
32
Link/Riferimenti
33
© FB - 09.2023
Revisioni
v1.0 25/01/24 - versione iniziale �
34