Lecția 14/31-3: Exemplu 3 de cod Arduino cu millis() și buton
Ați avut vreodată nevoie ca Arduino-ul dumneavoastră să-și amintească când s-a întâmplat ceva—cum ar fi apăsarea unui buton—și apoi să acționeze la o perioadă precisă de timp mai târziu, toate în timp ce restul programului rulează fără probleme? Aceasta este o provocare clasică în programarea Arduino, iar soluția este funcția millis(). Acest tutorial, parte a cursului Robojax Arduino, demonstrează un exemplu practic: detectarea dacă un buton este apăsat a doua oară după ce a trecut o întârziere de 5 secunde de la prima apăsare. Această tehnică este fundamentală pentru crearea de proiecte receptive, non-blocante, unde sincronizarea este critică.
Acest model de utilizare a millis() pentru a urmări timpul fără a opri programul este esențial pentru o gamă largă de aplicații din lumea reală. Iată câteva idei pentru a vă inspira propriile proiecte:
- Interfețe cu butoane debounce: Implementați un sistem în care un buton trebuie ținut apăsat pentru o durată specifică (de exemplu, 3 secunde) pentru a porni un dispozitiv, prevenind apăsările accidentale.
- Acțiuni secvențiale: Creați un sistem în care un eveniment, cum ar fi declanșarea unui senzor de mișcare, armează o acțiune secundară care are loc doar dacă un alt eveniment se întâmplă într-o anumită fereastră de timp.
- Temporizatoare pentru interacțiunea utilizatorului: Construiți un proiect care necesită o intrare de "confirmare" (cum ar fi o a doua apăsare de buton) într-un timp stabilit pentru a executa o funcție critică, cum ar fi trimiterea unei comenzi sau pornirea unui motor.
- Filtrarea senzorilor: Folosiți un prim semnal de la un senzor pentru a începe o fereastră de timp, în timpul căreia citirea unui al doilea senzor diferit este considerată validă sau este ignorată.
Hardware necesar
Acest proiect folosește componente din kit-ul Arduino SunFounder 3-în-1, care este o resursă excelentă pentru învățare. Veți avea nevoie de:
- Placă Arduino (Uno, Nano, etc.)
- Un buton momentan
- Fire de legătură
Ghid de cablare
Cablarea pentru acest exemplu este foarte simplă, datorită rezistențelor interne de pull-up ale Arduino, ceea ce elimină necesitatea unei rezistențe externe. (În videoclip la 08:29)
- Conectați un picior al butonului la pinul GND de pe Arduino.
- Conectați celălalt picior al butonului la pinul digital 2 de pe Arduino.
Folosind INPUT_PULLUP, pinul este conectat intern la 5V, deci citește HIGH în mod normal. Când butonul este apăsat, acesta conectează pinul la GND, determinând citirea LOW. Aceasta este logica pe care o vom folosi în cod.
Explicația codului
Miezul acestui proiect este logica care urmărește prima apăsare a butonului și apoi verifică o a doua apăsare după un interval de timp specific. Codul este conceput pentru a fi non-blocant, ceea ce înseamnă că nu va întrerupe execuția altor sarcini din loop().
La începutul schiței, veți găsi variabilele cheie configurabile de utilizator care controlează comportamentul de sincronizare:
unsigned long event = 5000;// 5 secunde
unsigned long buttonPushed =0;
event: Aceasta este variabila crucială de sincronizare. Setează durata întârzierii în milisecunde. În acest exemplu, este setată la5000, ceea ce înseamnă 5 secunde. Puteți schimba această valoare la orice altă durată pentru a se potrivi nevoilor proiectului dumneavoastră.buttonPushed: Această variabilă este folosită ca un indicator și o marcă de timp. Începe la0și este actualizată la valoareamillis()la prima apăsare a butonului. Acest timp stocat este apoi folosit pentru a calcula diferența pentru verificarea celei de-a doua apăsări.
Logica din funcția loop() funcționează în două etape. În primul rând, citește starea butonului și, dacă este apăsat pentru prima dată (pb == LOW && buttonPushed == 0), înregistrează timpul curent prin millis() în variabila buttonPushed. A doua etapă verifică dacă butonul este încă apăsat și dacă a fost înregistrată o primă apăsare. Dacă da, calculează diferența de timp între timpul curent și timpul primei apăsări. Dacă această diferență este mai mare sau egală cu timpul event, execută acțiunea—în acest caz, tipărirea unui mesaj în Monitorul Serial.
Demonstrație live a proiectului
În videoclip, codul este încărcat pe Arduino, iar Monitorul Serial este deschis pentru a observa comportamentul. (În videoclip la 16:03) Veți vedea valoarea millis() tipărindu-se continuu, arătând timpul de la pornirea programului. Când apăsați butonul pentru prima dată, un mesaj precum Prima apăsare la:5019 este tipărit. Dacă apăsați butonul din nou și îl țineți apăsat mai mult de 5 secunde de la prima apăsare, mesajul Acțiune după 5 secunde de la prima apăsare este tipărit. Aceasta demonstrează că acțiunea este declanșată doar când a doua apăsare are loc după ce întârzierea specificată a trecut.
Puterea acestei abordări este că linia Serial.println(millis()) de la începutul buclei continuă să ruleze fără întrerupere, demonstrând că logica de sincronizare nu blochează execuția altor coduri. Acesta este avantajul fundamental al utilizării millis() în locul funcției delay().
Proiecte conexe din acest videoclip
- Lecția 14/31-1: Funcțiile Arduino Millis (fără delay) și map | SunFounder Robojax
- Lecția 14/31-2: Exemplu 2 de codare Arduino millis() cu eveniment
- Lecția 14/31-4: Exemplu 1 de codare Arduino map()
- Lecția 14/31-5: Exemplu 2 de codare Arduino map()
Capitole
- [00:00] Introducere în millis() și curs
- [01:19] Ce este millis() și de ce să o folosim?
- [03:06] Primul exemplu practic: afișarea millis()
- [05:46] Folosirea millis() pentru a declanșa un eveniment după 5 secunde
- [08:29] Exemplul 2: Acțiune cu buton și o întârziere de 5 secunde
- [12:14] Exemplul 3: Detectarea unei a doua apăsări de buton după o întârziere
- [17:20] Introducere în funcția map()
- [19:47] Exemplu practic de mapare a procentelor de luminozitate 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");
}
}
}
Lucruri de care ai putea avea nevoie
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Resurse și referințe
-
DocumentațieDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
ExternPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Fișiere📁
Manualul utilizatorului
-
Manual de asamblare pentru SunFounder 3-in-1 Arduino Smart CarAcest document prezintă asamblarea pas cu pas a SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB