Hľadať kód

Lekcia 14/31-2: Arduino programovanie príklad millis() 2 s udalosťou

Lekcia 14/31-2: Arduino programovanie príklad millis() 2 s udalosťou

V tomto návode sa naučíte, ako použiť funkciu Arduino millis() na spustenie akcie až po uplynutí určeného časového obdobia, a to bez blokovania zvyšku vášho programu. Toto je základná technika na vytváranie responzívnych projektov Arduino, kde musí súčasne bežať viacero úloh, napríklad blikanie LED diód počas čítania senzorov alebo sledovania stlačení tlačidiel. Tento konkrétny príklad sa zameriava na spustenie udalosti po piatich sekundách, ale logiku možno aplikovať na nespočetné scenáre z reálneho sveta.

Zostavené auto Sunfounder

Tu je niekoľko praktických príkladov, ako by ste mohli tento vzor použiť vo svojich vlastných projektoch:

  • Oneskorená aktivácia: Zapnite ventilátor alebo čerpadlo až po tom, čo systém beží stanovený čas.
  • Bezpečnostné blokovania: Vyžadujte, aby bolo tlačidlo stlačené a podržané po určitú dobu pred vykonaním nebezpečnej akcie, ako je spustenie motora.
  • Časové upozornenia: Spustite alarm alebo upozornenie, ak sa hodnota senzora nezmenila v určitom časovom okne.
  • Neblokujúce časovače: Vytvorte „strážny“ časovač, ktorý resetuje zariadenie, ak prestane reagovať.

Hlavný problém, ktorý to rieši, je obmedzenie funkcie delay(). Keď použijete delay(5000), Arduino na tých päť sekúnd prestane vykonávať akýkoľvek iný kód. To je v poriadku pre jednoduché náčrty, ale stáva sa to veľkým problémom v zložitejších projektoch, kde potrebujete čítať senzory, aktualizovať displeje alebo počúvať stlačenia tlačidiel počas čakania. Funkcia millis(), ktorá počíta milisekundy od zapnutia dosky, vám umožňuje skontrolovať čas bez pozastavenia programu.

Potrebný hardvér

  • Doska Arduino (Uno, Nano, Mega atď.)
  • Stlačovacie tlačidlo
  • Prepojovacie vodiče

Schéma zapojenia

Zapojenie pre tento príklad je veľmi jednoduché. Používa interný pull-up rezistor, takže pre tlačidlo nie je potrebný žiadny externý rezistor.

  • Pripojte jednu nožičku stlačovacieho tlačidla na pin GND na Arduino.
  • Pripojte druhú nožičku stlačovacieho tlačidla na digitálny pin 2 na Arduino.

Pretože v kóde používame INPUT_PULLUP, pin bude čítať HIGH, keď tlačidlo nie je stlačené, a LOW, keď je stlačené, čím sa pin pripojí na zem. (vo videu o 08:29)

Pochopenie kódu

Tento kód demonštruje jednoduchý časovač založený na udalostiach. Program nepretržite vypisuje aktuálnu hodnotu millis() do sériového monitora. Keď je stlačovacie tlačidlo stlačené a podržané a Arduino beží aspoň 5 sekúnd, vypíše „Take action“ do sériového monitora. Kľúčové je, že kontrola millis() nezastaví nepretržité vypisovanie času.

Poďme si rozobrať používateľsky konfigurovateľné časti kódu:

unsigned long event = 5000;// 5 sekúnd

Toto je najdôležitejšia premenná na konfiguráciu. Definuje trvanie vašej „udalosti“ v milisekundách. V tomto príklade je nastavená na 5000, čo sa rovná 5 sekundám. Ak chcete zmeniť oneskorenie, jednoducho upravte toto číslo. Napríklad nastavenie na 10000 by spôsobilo spustenie akcie po 10 sekundách. Je kľúčové použiť dátový typ unsigned long, pretože hodnota millis() môže narásť veľmi vysoko a nakoniec prekročí maximálnu hodnotu štandardnej premennej int, čo spôsobí chyby v porovnávaní. (vo videu o 05:46)

pinMode(2,INPUT_PULLUP);

Tento riadok nakonfiguruje digitálny pin 2 ako vstup a aktivuje jeho interný pull-up rezistor. Toto je kľúčový konfiguračný krok, ktorý vám umožní pripojiť tlačidlo bez externého rezistora. Pin bude štandardne čítať HIGH a prejde na LOW, keď je tlačidlo stlačené, čím sa pripojí na zem. Ak chcete použiť iný pin, zmeňte číslo 2 tu a v riadku digitalRead(2) v rámci slučky. (vo videu o 08:46)

Logika vo vnútri loop() je priamočiara. Číta stav tlačidla. Ak je tlačidlo stlačené (pb == LOW), potom skontroluje, či je aktuálny čas (millis()) väčší alebo rovný vášmu definovanému času event. Ak sú obe podmienky pravdivé, vypíše správu o akcii. Zvyšok slučky, ktorý vypisuje čas, pokračuje v behu bez prerušenia, čo demonštruje silu millis() oproti delay().

Tento príklad kontroluje čas od okamihu spustenia Arduina. Tretí príklad vo video sérii na to nadväzuje zaznamenaním času prvého stlačenia tlačidla a spustením akcie iba vtedy, ak dôjde k druhému stlačeniu aspoň o 5 sekúnd neskôr. Táto logika je pokrytá v Lekcii 14/31-3: Arduino coding millis() príklad 3 so stlačovacím tlačidlom.

Živá ukážka projektu

Po nahratí kódu a otvorení sériového monitora (pri 9600 baudoch) uvidíte nepretržitý prúd čísel, ktoré predstavujú milisekundy od zapnutia dosky. Ak stlačíte a podržíte stlačovacie tlačidlo pred uplynutím 5 sekúnd, nič sa nestane. Ak však stlačíte a podržíte tlačidlo po uplynutí 5-sekundovej hranice, uvidíte v sériovom monitore správu „Take action“. Akcia sa bude naďalej vypisovať, pokiaľ je tlačidlo podržané. Toto demonštruje neblokujúci časovač, ktorý umožňuje plynulé spustenie iného kódu (vypisovanie). (vo videu o 10:52)

Súvisiace projekty z tohto videa

Toto video je súčasťou série o časovaní a mapovacích funkciách Arduina. Preskúmajte ďalšie návody vytvorené z tohto istého zdrojového materiálu:

Kapitoly

  • [00:00] Úvod do millis() a SunFounder súpravy
  • [01:19] Čo je millis() a prečo ho použiť namiesto delay()?
  • [03:06] Praktická ukážka: tlač hodnoty millis()
  • [05:46] Vytvorenie udalosti s millis() a unsigned long
  • [08:29] Zapojenie a kódovanie tlačidla s INPUT_PULLUP
  • [10:52] Spustenie príkladu udalosti s tlačidlom
  • [12:14] Ukážka príkladu 3: detekcia druhého stlačenia tlačidla
  • [17:20] Úvod do funkcie map()
  • [19:47] Kódovanie a ukážka funkcie map() s LED

Obrázky

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

Zdroje a referencie

Súbory📁

Používateľská príručka