Cerca codice

Lezione 14/31-2: Esempio 2 di codifica Arduino millis() con evento

Lezione 14/31-2: Esempio 2 di codifica Arduino millis() con evento

In questo tutorial imparerai come usare la funzione millis() di Arduino per attivare un'azione solo dopo che è trascorso un periodo di tempo specificato, senza bloccare il resto del programma. Questa è una tecnica fondamentale per creare progetti Arduino reattivi in cui più attività devono essere eseguite contemporaneamente, come far lampeggiare LED mentre si leggono sensori o si monitorano pressioni di pulsanti. Questo esempio specifico si concentra sull'attivazione di un evento dopo cinque secondi, ma la logica può essere applicata a innumerevoli scenari del mondo reale.

Auto Sunfounder assemblata

Ecco alcuni esempi pratici di come potresti usare questo schema nei tuoi progetti:

  • Attivazione ritardata: Accendi una ventola o una pompa solo dopo che un sistema è rimasto in funzione per un tempo prestabilito.
  • Blocchi di sicurezza: Richiedi che un pulsante venga premuto e tenuto premuto per una certa durata prima di eseguire un'azione pericolosa, come avviare un motore.
  • Avvisi basati sul tempo: Attiva un allarme o una notifica se una lettura del sensore non è cambiata entro un certo intervallo.
  • Timer non bloccanti: Crea un timer "watchdog" che ripristina un dispositivo se diventa non reattivo.

Il problema principale che questo risolve è la limitazione della funzione delay(). Quando usi delay(5000), Arduino smette di eseguire qualsiasi altro codice per quei cinque secondi. Questo va bene per sketch semplici, ma diventa un problema importante in progetti più complessi dove devi leggere sensori, aggiornare display o ascoltare pressioni di pulsanti mentre aspetti. La funzione millis(), che conta i millisecondi da quando la scheda è stata accesa, ti permette di controllare il tempo senza mettere in pausa il programma.

Hardware Richiesto

  • Scheda Arduino (Uno, Nano, Mega, ecc.)
  • Un pulsante
  • Cavi jumper

Guida al Cablaggio

Il cablaggio per questo esempio è molto semplice. Usa un resistore di pull-up interno, quindi non è necessario alcun resistore esterno per il pulsante.

  • Collega un piedino del pulsante al pin GND su Arduino.
  • Collega l'altro piedino del pulsante al pin digitale 2 su Arduino.

Poiché usiamo INPUT_PULLUP nel codice, il pin leggerà HIGH quando il pulsante non è premuto e LOW quando è premuto, collegando il pin a terra. (nel video a 08:29)

Capire il Codice

Questo codice dimostra un semplice timer basato su eventi. Il programma stampa continuamente il valore corrente di millis() sul Monitor Seriale. Quando il pulsante viene premuto e tenuto premuto, e Arduino è rimasto in funzione per almeno 5 secondi, stamperà "Take action" sul Monitor Seriale. Il punto chiave è che il controllo di millis() non interrompe la stampa continua del tempo.

Analizziamo le parti configurabili dall'utente del codice:

unsigned long event = 5000;// 5 secondi

Questa è la variabile più importante da configurare. Definisce la durata del tuo "evento" in millisecondi. In questo esempio, è impostata su 5000, che equivale a 5 secondi. Per cambiare il ritardo, modifica semplicemente questo numero. Ad esempio, impostarlo su 10000 farebbe scattare l'azione dopo 10 secondi. È fondamentale usare il tipo di dato unsigned long, poiché il valore di millis() può diventare molto grande e supererà eventualmente il valore massimo di una variabile int standard, causando errori nel confronto. (nel video a 05:46)

pinMode(2,INPUT_PULLUP);

Questa riga configura il pin digitale 2 come ingresso e attiva il suo resistore di pull-up interno. Questo è un passaggio di configurazione chiave che ti permette di collegare un pulsante senza resistore esterno. Il pin leggerà HIGH per impostazione predefinita e andrà a LOW quando il pulsante viene premuto, collegandolo a terra. Se desideri usare un pin diverso, cambia il numero 2 qui e nella riga digitalRead(2) all'interno del loop. (nel video a 08:46)

La logica all'interno del loop() è semplice. Legge lo stato del pulsante. Se il pulsante è premuto (pb == LOW), controlla quindi se il tempo corrente (millis()) è maggiore o uguale al tuo tempo event definito. Se entrambe le condizioni sono vere, stampa il messaggio di azione. Il resto del loop, che stampa il tempo, continua a essere eseguito senza interruzioni, dimostrando la potenza di millis() rispetto a delay().

Questo esempio controlla il tempo dal momento in cui Arduino si avvia. Il terzo esempio nella serie video si basa su questo registrando il tempo della prima pressione del pulsante e attivando un'azione solo se una seconda pressione avviene almeno 5 secondi dopo. Questa logica è trattata in Lezione 14/31-3: Esempio 3 di codifica Arduino millis() con pulsante.

Dimostrazione del Progetto dal Vivo

Una volta caricato il codice e aperto il Monitor Seriale (a 9600 baud), vedrai un flusso continuo di numeri, che rappresentano i millisecondi da quando la scheda è stata accesa. Se premi e tieni premuto il pulsante prima che siano trascorsi 5 secondi, non succederà nulla. Tuttavia, se premi e tieni premuto il pulsante dopo il segno dei 5 secondi, vedrai il messaggio "Take action" stampato nel Monitor Seriale. L'azione continuerà a essere stampata finché il pulsante è tenuto premuto. Questo dimostra un timer non bloccante che permette ad altro codice (la stampa) di essere eseguito senza problemi. (nel video a 10:52)

Progetti correlati da questo video

Questo video fa parte di una serie multi-lezione sulle funzioni di temporizzazione e mappatura di Arduino. Esplora gli altri tutorial creati da questa stessa fonte:

Capitoli

  • [00:00] Introduzione a millis() e al kit SunFounder
  • [01:19] Cos'è millis() e perché usarlo al posto di delay()?
  • [03:06] Dimostrazione pratica: stampa del valore di millis()
  • [05:46] Creazione di un evento con millis() e unsigned long
  • [08:29] Cablaggio e codifica di un pulsante con INPUT_PULLUP
  • [10:52] Esecuzione dell'esempio di evento con un pulsante
  • [12:14] Anteprima dell'esempio 3: rilevamento di una seconda pressione del pulsante
  • [17:20] Introduzione alla funzione map()
  • [19:47] Codifica e dimostrazione della funzione map() con un LED

Immagini

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
Lingua: C++
/*
Lesson 14/31: Arduino coding millis() example 2 with event
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
void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // Robojax.com millis() example 1
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW)
  {
      if(millis() >= event)
      {
        Serial.println("Take action");
      }// if end
  }// if end
  
}// loop end

File📁

Manuale dell'utente