1 of 34

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é!”

2 of 34

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

3 of 34

Indice

3

© FB - 09.2023

4 of 34

Obiettivi didattici

4

5 of 34

Obiettivi didattici

  • Gestione dei Pulsanti con Arduino

5

© FB - 02.2024

6 of 34

Introduzione teorica

6

7 of 34

Pulsanti

8 of 34

Pulsanti e microcontrollori

Utilizzo di pulsanti, interruttori e deviatori con i microcontrollori

8

© FB - 12.2020

9 of 34

Collegare un pulsante al microcontrollore

Simboli usati negli schemi elettrici

9

© FB - 11.2021

10 of 34

Pull-up/Pull-down

10

© FB - 10.2021

11 of 34

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:

  • Vogliamo che la caduta di tensione sulla resistenza sia piccola
  • Vogliamo che la corrente assorbita quando l'interruttore è chiuso sia piccola
  • Per il calcolo preciso dobbiamo conoscere la resistenza su pin di ingresso del microcontrollore. Se questa è circa 1Mohm, allora R di pull-up può andare bene da 5-100Kohm

[Approfondimenti: Resistenza di pull-up / pull-down; Come calcolare le resistenze di pull-up e pull-down - Video 238]

11

© FB - 02.2021

12 of 34

Collegamento tipico pull-up

12

© FB - 12.2020

13 of 34

Collegamento tipico con pulsante pull-down

13

© FB - 12.2020

14 of 34

Collegamento tipico con pulsante pull-down

14

© FB - 12.2020

15 of 34

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

16 of 34

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

17 of 34

Rimbalzi e Debounce

17

© FB - 10.2021

18 of 34

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

19 of 34

Codice di esempio

19

© FB - 12.2021

20 of 34

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:

  • Click
  • LongPress (pressione > 1-2 sec)
  • LongLongPress (pressione > 5-10 sec)
  • LongClick
  • DoubleClick
  • TripleClick

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

21 of 34

Esercitazione

21

22 of 34

Esercizio a

Pressione Pulsante (con durata minima)

22

© FB - 01.2024

23 of 34

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

24 of 34

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

25 of 34

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

26 of 34

Esercizio b

Puls_LongPress

26

© FB - 01.2024

27 of 34

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

28 of 34

Esercizio c

Puls_Click

28

© FB - 01.2024

29 of 34

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

30 of 34

Valutazione

30

31 of 34

Griglia di valutazione

Si ricorda l’importanza di svolgere e consegnare i progetti assegnati.

31

© FB - 09.2023

32 of 34

Grazie per l’attenzione

32

33 of 34

Link/Riferimenti

33

© FB - 09.2023

34 of 34

Revisioni

v1.0 25/01/24 - versione iniziale �

34