Lecția 14/31-2: Exemplu 2 de codare Arduino cu millis() și eveniment
În acest tutorial, vei învăța cum să folosești funcția millis() de la Arduino pentru a declanșa o acțiune doar după ce a trecut o anumită perioadă de timp, totul fără a bloca restul programului. Aceasta este o tehnică fundamentală pentru crearea de proiecte Arduino receptive, în care mai multe sarcini trebuie să ruleze simultan, cum ar fi clipirea LED-urilor în timp ce citești senzori sau monitorizezi apăsările de butoane. Acest exemplu specific se concentrează pe declanșarea unui eveniment după cinci secunde, dar logica poate fi aplicată în nenumărate scenarii din lumea reală.
Iată câteva exemple practice despre cum ai putea folosi acest model în propriile proiecte:
- Activare întârziată: Pornește un ventilator sau o pompă doar după ce sistemul a funcționat pentru un timp stabilit.
- Blocaje de siguranță: Necesită ca un buton să fie apăsat și ținut apăsat pentru o durată înainte de a efectua o acțiune periculoasă, cum ar fi pornirea unui motor.
- Alerte bazate pe timp: Declanșează o alarmă sau o notificare dacă o citire a senzorului nu s-a schimbat într-un anumit interval.
- Temporizatoare neblocante: Creează un temporizator „watchdog” care resetează un dispozitiv dacă acesta devine neresponsiv.
Problema principală pe care o rezolvă aceasta este limitarea funcției delay(). Când folosești delay(5000), Arduino oprește executarea oricărui alt cod timp de cinci secunde. Acest lucru este acceptabil pentru schițe simple, dar devine o problemă majoră în proiecte mai complexe, unde trebuie să citești senzori, să actualizezi afișaje sau să asculți apăsările de butoane în timp ce aștepți. Funcția millis(), care numără milisecundele de la pornirea plăcii, îți permite să verifici timpul fără a întrerupe programul.
Hardware Necesar
- Placă Arduino (Uno, Nano, Mega, etc.)
- Un buton apăsător
- Fire de legătură
Ghid de Cablare
Cablarea pentru acest exemplu este foarte simplă. Folosește un rezistor intern de pull-up, deci nu este necesar niciun rezistor extern pentru buton.
- Conectează un picior al butonului apăsător la pinul GND de pe Arduino.
- Conectează celălalt picior al butonului apăsător la pinul digital 2 de pe Arduino.
Deoarece folosim INPUT_PULLUP în cod, pinul va citi HIGH când butonul nu este apăsat și LOW când este apăsat, conectând pinul la masă. (în video la 08:29)
Înțelegerea Codului
Acest cod demonstrează un temporizator simplu bazat pe evenimente. Programul afișează continuu valoarea curentă a millis() în Monitorul Serial. Când butonul apăsător este apăsat și ținut, iar Arduino a funcționat timp de cel puțin 5 secunde, va afișa „Take action” în Monitorul Serial. Cheia este că verificarea millis() nu oprește afișarea continuă a timpului.
Să descompunem părțile configurabile ale codului:
unsigned long event = 5000;// 5 secunde
Aceasta este cea mai importantă variabilă de configurat. Definește durata „evenimentului” tău în milisecunde. În acest exemplu, este setată la 5000, ceea ce înseamnă 5 secunde. Pentru a schimba întârzierea, modifică pur și simplu acest număr. De exemplu, setarea la 10000 ar face ca acțiunea să se declanșeze după 10 secunde. Este crucial să folosești tipul de date unsigned long, deoarece valoarea lui millis() poate crește foarte mult și va depăși în cele din urmă valoarea maximă a unei variabile standard int, cauzând erori în comparație. (în video la 05:46)
pinMode(2,INPUT_PULLUP);
Această linie configurează pinul digital 2 ca intrare și activează rezistorul intern de pull-up. Acesta este un pas cheie de configurare care îți permite să conectezi un buton fără rezistor extern. Pinul va citi HIGH în mod implicit și va trece la LOW când butonul este apăsat, conectându-l la masă. Dacă dorești să folosești un alt pin, schimbă numărul 2 aici și în linia digitalRead(2) din buclă. (în video la 08:46)
Logica din interiorul loop() este simplă. Citește starea butonului. Dacă butonul este apăsat (pb == LOW), verifică apoi dacă timpul curent (millis()) este mai mare sau egal cu timpul tău definit event. Dacă ambele condiții sunt adevărate, afișează mesajul de acțiune. Restul buclei, care afișează timpul, continuă să ruleze neîntrerupt, demonstrând puterea lui millis() față de delay().
Acest exemplu verifică timpul de la momentul pornirii Arduino. Al treilea exemplu din seria video se bazează pe acesta, înregistrând timpul primei apăsări a butonului și declanșând o acțiune doar dacă o a doua apăsare are loc la cel puțin 5 secunde mai târziu. Acea logică este acoperită în Lecția 14/31-3: Arduino coding millis() exemplul 3 cu buton apăsător.
Demonstrație Live a Proiectului
După ce încarci codul și deschizi Monitorul Serial (la 9600 baud), vei vedea un flux continuu de numere, reprezentând milisecundele de la pornirea plăcii. Dacă apeși și ții butonul apăsător înainte de trecerea a 5 secunde, nu se va întâmpla nimic. Totuși, dacă apeși și ții butonul după marcajul de 5 secunde, vei vedea mesajul „Take action” afișat în Monitorul Serial. Acțiunea va continua să se afișeze cât timp butonul este ținut. Aceasta demonstrează un temporizator neblocant care permite altui cod (afișarea) să ruleze fără probleme. (în video la 10:52)
Proiecte conexe din acest videoclip
Acest videoclip face parte dintr-o serie multi-partită despre funcțiile de temporizare și mapare pe Arduino. Explorează celelalte tutoriale create din aceeași sursă de material:
- Lecția 14/31-1: Funcțiile Arduino Millis (fără delay) și map | SunFounder Robojax
- Lecția 14/31-3: Codare Arduino millis() exemplul 3 cu buton apăsător
- Lecția 14/31-4: Codare Arduino map() exemplul 1
- Lecția 14/31-5: Codare Arduino map() exemplul 2
Capitole
- [00:00] Introducere în millis() și kit-ul SunFounder
- [01:19] Ce este millis() și de ce să-l folosim în loc de delay()?
- [03:06] Demonstrație practică: afișarea valorii millis()
- [05:46] Crearea unui eveniment cu millis() și unsigned long
- [08:29] Cablarea și codarea unui buton apăsător cu INPUT_PULLUP
- [10:52] Rularea exemplului de eveniment cu un buton apăsător
- [12:14] Previzualizarea exemplului 3: detectarea unei a doua apăsări de buton
- [17:20] Introducere în funcția map()
- [19:47] Codarea și demonstrarea funcției map() cu un LED
/*
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
Lucruri de care ai putea avea nevoie
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
-
Altul
Resurse și referințe
-
ExternPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Fișiere📁
Manualul utilizatorului
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB