Lezione 14/31-3: Esempio 3 di programmazione Arduino con millis() e pulsante
Hai mai avuto bisogno che il tuo Arduino ricordi quando è successo qualcosa—come la pressione di un pulsante—e poi agisca una quantità precisa di tempo dopo, il tutto mantenendo il resto del programma in esecuzione senza intoppi? Questa è una sfida classica nella programmazione Arduino, e la soluzione è la funzione millis(). Questo tutorial, parte del corso Arduino di Robojax, dimostra un esempio pratico: rilevare se un pulsante viene premuto una seconda volta dopo che è trascorso un ritardo di 5 secondi dalla prima pressione. Questa tecnica è fondamentale per creare progetti reattivi e non bloccanti dove il tempismo è critico.
Questo schema di utilizzo di millis() per tracciare il tempo senza fermare il programma è essenziale per un'ampia gamma di applicazioni reali. Ecco alcune idee per ispirare i tuoi progetti:
- Interfacce pulsanti con debounce: Implementa un sistema in cui un pulsante deve essere tenuto premuto per una durata specifica (es. 3 secondi) per accendere un dispositivo, prevenendo pressioni accidentali.
- Azioni sequenziali: Crea un sistema in cui un evento, come l'attivazione di un sensore di movimento, arma un'azione secondaria che si verifica solo se un altro evento accade entro una finestra di tempo.
- Timer per interazioni utente: Costruisci un progetto che richiede un input di "conferma" (come una seconda pressione del pulsante) entro un tempo prestabilito per eseguire una funzione critica, come inviare un comando o avviare un motore.
- Gating dei sensori: Usa un primo segnale da un sensore per avviare una finestra temporale, durante la quale la lettura di un secondo sensore diverso è considerata valida o viene ignorata.
Hardware Richiesto
Questo progetto utilizza componenti del kit Arduino 3-in-1 SunFounder, che è una grande risorsa per imparare. Avrai bisogno di:
- Scheda Arduino (Uno, Nano, ecc.)
- Un pulsante momentaneo
- Cavi jumper
Guida al Cablaggio
Il cablaggio per questo esempio è molto semplice, grazie ai resistori pull-up interni dell'Arduino, che eliminano la necessità di un resistore esterno. (Nel video a 08:29)
- Collega una gamba del pulsante al pin GND sull'Arduino.
- Collega l'altra gamba del pulsante al pin digitale 2 sull'Arduino.
Usando INPUT_PULLUP, il pin è internamente collegato a 5V, quindi legge HIGH normalmente. Quando il pulsante viene premuto, collega il pin a GND, facendolo leggere LOW. Questa è la logica che useremo nel codice.
Spiegazione del Codice
Il cuore di questo progetto è la logica che traccia la prima pressione del pulsante e poi controlla una seconda pressione dopo un intervallo di tempo specifico. Il codice è progettato per essere non bloccante, il che significa che non fermerà l'esecuzione di altre attività nel tuo loop().
In cima allo sketch, troverai le variabili chiave configurabili dall'utente che controllano il comportamento temporale:
unsigned long event = 5000;// 5 secondi
unsigned long buttonPushed =0;
event: Questa è la variabile temporale cruciale. Imposta la durata del ritardo in millisecondi. In questo esempio, è impostata a5000, che equivale a 5 secondi. Puoi cambiare questo valore a qualsiasi altra durata per adattarlo alle esigenze del tuo progetto.buttonPushed: Questa variabile è usata come flag e timestamp. Inizia a0e viene aggiornata al valore dimillis()la prima volta che il pulsante viene premuto. Questo tempo memorizzato viene poi usato per calcolare la differenza per il controllo della seconda pressione.
La logica nella funzione loop() funziona in due fasi. Prima, legge lo stato del pulsante e, se viene premuto per la prima volta (pb == LOW && buttonPushed == 0), registra il tempo corrente tramite millis() nella variabile buttonPushed. La seconda fase controlla se il pulsante è ancora premuto e se è stata registrata una prima pressione. Se sì, calcola la differenza di tempo tra il tempo corrente e il tempo della prima pressione. Se questa differenza è maggiore o uguale al tuo tempo event, esegue l'azione—in questo caso, stampando un messaggio sul Monitor Seriale.
Dimostrazione del Progetto dal Vivo
Nel video, il codice viene caricato sull'Arduino e il Monitor Seriale viene aperto per osservare il comportamento. (Nel video a 16:03) Vedrai il valore di millis() stampato continuamente, mostrando il tempo trascorso dall'avvio del programma. Quando premi il pulsante per la prima volta, viene stampato un messaggio come Prima pressione a:5019. Se premi di nuovo il pulsante e lo tieni premuto per più di 5 secondi dalla prima pressione, viene stampato il messaggio Azione dopo 5 secondi dalla prima pressione. Questo dimostra che l'azione viene attivata solo quando la seconda pressione avviene dopo che il ritardo specificato è trascorso.
La potenza di questo approccio è che la riga Serial.println(millis()) all'inizio del loop continua a essere eseguita senza interruzioni, dimostrando che la logica temporale non blocca l'esecuzione di altro codice. Questo è il vantaggio fondamentale dell'uso di millis() rispetto alla funzione delay().
Progetti correlati da questo video
- Lezione 14/31-1: Funzioni Arduino Millis (senza delay) e map | SunFounder Robojax
- Lezione 14/31-2: Esempio 2 di codifica Arduino millis() con evento
- Lezione 14/31-4: Esempio 1 di codifica Arduino map()
- Lezione 14/31-5: Esempio 2 di codifica Arduino map()
Capitoli
- [00:00] Introduzione a millis() e al corso
- [01:19] Cos'è millis() e perché usarlo?
- [03:06] Primo esempio pratico: stampa di millis()
- [05:46] Uso di millis() per attivare un evento dopo 5 secondi
- [08:29] Esempio 2: Azione con pulsante con ritardo di 5 secondi
- [12:14] Esempio 3: Rilevamento di una seconda pressione del pulsante dopo un ritardo
- [17:20] Introduzione alla funzione map()
- [19:47] Esempio pratico di mappatura delle percentuali di luminosità dei LED
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
unsigned long event = 5000;// 5 seconds
unsigned long buttonPushed =0;
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
pinMode(2,INPUT_PULLUP);
}
void loop() {
// ilmoFan.com example-2 millis()
Serial.println(millis());
int pb = digitalRead(2);// read pin 2
if(pb ==LOW && buttonPushed ==0)
{
buttonPushed =millis();
Serial.print("First push at:");
Serial.println(buttonPushed);
}
if( pb ==LOW && buttonPushed >0 )
{
unsigned long difference = millis()- buttonPushed;
if( difference >= event)
{
Serial.println("Action after 5 seconds of first push");
}
}
}
Cose di cui potresti avere bisogno
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Risorse e riferimenti
-
DocumentazioneDocumentazione per il kit di apprendimento SunFounder 3 in 1 IoT/Smart Car.docs.sunfounder.com
-
Esterno
File📁
Manuale dell'utente
-
Manuale di assemblaggio SunFounder 3-in-1 Arduino Smart CarQuesto documento mostra l'assemblaggio passo dopo passo della SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB