Caută cod

Lecția 14/31-2: Exemplu 2 de codare Arduino cu millis() și eveniment

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ă.

Mașină Sunfounder asamblată

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:

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

Imagini

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
Limba: 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

Resurse și referințe

Fișiere📁

Manualul utilizatorului