Lekcija 14/31-2: Arduino kodiranje millis() primjer 2 sa događajem
U ovom tutorijalu naučit ćete kako koristiti Arduino millis() funkciju za pokretanje akcije tek nakon što prođe određeno vremensko razdoblje, sve bez blokiranja ostatka vašeg programa. Ovo je temeljna tehnika za stvaranje responzivnih Arduino projekata gdje više zadataka treba raditi istovremeno, poput treptanja LED dioda dok čitate senzore ili pratite pritiske tipki. Ovaj konkretni primjer fokusira se na pokretanje događaja nakon pet sekundi, ali logika se može primijeniti na bezbroj stvarnih scenarija.
Evo nekoliko praktičnih primjera kako biste mogli koristiti ovaj obrazac u svojim projektima:
- Odgođena aktivacija: Uključite ventilator ili pumpu tek nakon što sustav radi određeno vrijeme.
- Sigurnosne blokade: Zahtijevajte da se tipka pritisne i drži određeno vrijeme prije izvođenja opasne radnje, poput pokretanja motora.
- Upozorenja temeljena na vremenu: Pokrenite alarm ili obavijest ako se očitanje senzora nije promijenilo unutar određenog vremenskog okvira.
- Neblokirajući mjerači vremena: Napravite "watchdog" mjerač vremena koji resetira uređaj ako postane neodzivan.
Osnovni problem koji ovo rješava je ograničenje delay() funkcije. Kada koristite delay(5000), Arduino prestaje izvršavati bilo koji drugi kod tijekom tih pet sekundi. To je u redu za jednostavne skice, ali postaje veliki problem u složenijim projektima gdje trebate čitati senzore, ažurirati zaslone ili slušati pritiske tipki dok čekate. millis() funkcija, koja broji milisekunde od trenutka kada je ploča uključena, omogućuje vam provjeru vremena bez pauziranja programa.
Potreban hardver
- Arduino ploča (Uno, Nano, Mega, itd.)
- Tipkalo (push button)
- Žice za spajanje (jumper wires)
Vodič za spajanje
Spajanje za ovaj primjer je vrlo jednostavno. Koristi se unutarnji pull-up otpornik, tako da nije potreban vanjski otpornik za tipkalo.
- Spojite jednu nogicu tipkala na GND pin na Arduinu.
- Spojite drugu nogicu tipkala na digitalni pin 2 na Arduinu.
Budući da koristimo INPUT_PULLUP u kodu, pin će čitati HIGH kada tipkalo nije pritisnuto i LOW kada je pritisnuto, povezujući pin s masom. (u videu na 08:29)
Razumijevanje koda
Ovaj kod demonstrira jednostavan mjerač vremena temeljen na događajima. Program kontinuirano ispisuje trenutnu vrijednost millis() na Serial Monitor. Kada je tipkalo pritisnuto i držano, a Arduino radi najmanje 5 sekundi, ispisat će "Take action" na Serial Monitor. Ključno je da provjera millis() ne zaustavlja kontinuirano ispisivanje vremena.
Razdvojimo korisnički konfigurabilne dijelove koda:
unsigned long event = 5000;// 5 sekundi
Ovo je najvažnija varijabla za konfiguriranje. Ona definira trajanje vašeg "događaja" u milisekundama. U ovom primjeru postavljena je na 5000, što iznosi 5 sekundi. Da biste promijenili kašnjenje, jednostavno modificirajte ovaj broj. Na primjer, postavljanje na 10000 učinilo bi da se akcija pokrene nakon 10 sekundi. Ključno je koristiti tip podataka unsigned long, jer vrijednost millis() može postati vrlo velika i na kraju će premašiti maksimalnu vrijednost standardne int varijable, uzrokujući pogreške u usporedbi. (u videu na 05:46)
pinMode(2,INPUT_PULLUP);
Ova linija konfigurira digitalni pin 2 kao ulaz i aktivira njegov unutarnji pull-up otpornik. Ovo je ključni korak konfiguracije koji vam omogućuje spajanje tipkala bez vanjskog otpornika. Pin će čitati HIGH prema zadanim postavkama i prijeći će na LOW kada je tipkalo pritisnuto, povezujući ga s masom. Ako želite koristiti drugi pin, promijenite broj 2 ovdje i u liniji digitalRead(2) unutar petlje. (u videu na 08:46)
Logika unutar loop() je jednostavna. Čita stanje tipkala. Ako je tipkalo pritisnuto (pb == LOW), tada provjerava je li trenutno vrijeme (millis()) veće ili jednako vašem definiranom event vremenu. Ako su oba uvjeta istinita, ispisuje poruku o akciji. Ostatak petlje, koji ispisuje vrijeme, nastavlja se izvršavati bez prekida, demonstrirajući snagu millis() u odnosu na delay().
Ovaj primjer provjerava vrijeme od trenutka pokretanja Arduina. Treći primjer u seriji videozapisa nadograđuje ovo bilježenjem vremena prvog pritiska tipkala i pokretanjem akcije samo ako se drugi pritisak dogodi najmanje 5 sekundi kasnije. Ta logika obrađena je u Lekciji 14/31-3: Arduino kodiranje millis() primjer 3 s tipkalom.
Demonstracija uživo projekta
Nakon što prenesete kod i otvorite Serial Monitor (na 9600 bauda), vidjet ćete kontinuirani niz brojeva koji predstavljaju milisekunde od trenutka uključivanja ploče. Ako pritisnete i držite tipkalo prije nego što prođe 5 sekundi, ništa se neće dogoditi. Međutim, ako pritisnete i držite tipkalo nakon oznake od 5 sekundi, vidjet ćete poruku "Take action" ispisanu u Serial Monitoru. Akcija će se nastaviti ispisivati sve dok je tipkalo držano. Ovo demonstrira neblokirajući mjerač vremena koji omogućuje drugom kodu (ispisivanju) da se izvršava neprimjetno. (u videu na 10:52)
Povezani projekti iz ovog videa
Ovaj video je dio serije o Arduino tajming i map funkcijama. Istražite ostale tutorijale kreirane iz istog izvornog materijala:
- Lekcija 14/31-1: Arduino Millis (bez delay) i map funkcije | SunFounder Robojax
- Lekcija 14/31-3: Arduino kodiranje millis() primjer 3 sa push dugmetom
- Lekcija 14/31-4: Arduino kodiranje map() primjer 1
- Lekcija 14/31-5: Arduino kodiranje map() primjer 2
Poglavlja
- [00:00] Uvod u millis() i SunFounder komplet
- [01:19] Šta je millis() i zašto ga koristiti umjesto delay()?
- [03:06] Praktična demonstracija: ispis millis() vrijednosti
- [05:46] Kreiranje događaja sa millis() i unsigned long
- [08:29] Povezivanje i kodiranje push dugmeta sa INPUT_PULLUP
- [10:52] Pokretanje primjera događaja sa push dugmetom
- [12:14] Pregled primjera 3: detekcija drugog pritiska dugmeta
- [17:20] Uvod u map() funkciju
- [19:47] Kodiranje i demonstracija map() funkcije sa LED diodom
/*
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
Stvari koje bi vam mogle zatrebati
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
-
Ostalo
Resursi i reference
-
EksternoPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Datoteke📁
Korisnički priručnik
-
SunFounder 3-u-1 Arduino Smart Car priručnik za sastavljanjeOvaj dokument prikazuje korak po korak sastavljanje SunFounder 3-u-1 Arduino Smart Car-a
SunFounder_car_assembly_manual.pdf1.20 MB