Hľadať kód

Lekcia 14/31-3: Arduino programovanie príklad millis() 3 s tlačidlom

Lekcia 14/31-3: Arduino programovanie príklad millis() 3 s tlačidlom

Už ste niekedy potrebovali, aby si váš Arduino zapamätal, kedy sa niečo stalo—napríklad stlačenie tlačidla—a potom vykonal akciu presne po určitom čase, pričom zvyšok programu bežal plynulo? Toto je klasická výzva v programovaní Arduina a riešením je funkcia millis(). Tento tutoriál, súčasť kurzu Robojax Arduino, demonštruje praktický príklad: detekciu, či je tlačidlo stlačené druhýkrát po uplynutí 5-sekundového oneskorenia od prvého stlačenia. Táto technika je základom pre vytváranie responzívnych, neblokujúcich projektov, kde je čas kritický.

Zostavené auto Sunfounder

Tento vzor používania millis() na sledovanie času bez zastavenia programu je nevyhnutný pre širokú škálu reálnych aplikácií. Tu je niekoľko nápadov, ktoré môžu inšpirovať vaše vlastné projekty:

  • Rozhrania tlačidiel s debouncingom: Implementujte systém, kde musí byť tlačidlo podržané po určitú dobu (napr. 3 sekundy), aby sa zariadenie zapol, čím sa zabráni náhodným stlačeniam.
  • Sekvenčné akcie: Vytvorte systém, kde jedna udalosť, napríklad spustenie pohybového senzora, aktivuje sekundárnu akciu, ktorá sa vykoná len vtedy, ak sa iná udalosť stane v určitom časovom okne.
  • Časovače interakcie s používateľom: Vytvorte projekt, ktorý vyžaduje „potvrdzovací" vstup (napríklad druhé stlačenie tlačidla) v stanovenom čase na vykonanie kritickej funkcie, ako je odoslanie príkazu alebo spustenie motora.
  • Bránenie senzorov: Použite prvý signál zo senzora na spustenie časového okna, počas ktorého sa údaj z druhého, odlišného senzora považuje za platný alebo sa ignoruje.

Potrebný hardvér

Tento projekt používa komponenty zo súpravy SunFounder 3-v-1 Arduino, ktorá je skvelým zdrojom na učenie. Budete potrebovať:

  • Dosku Arduino (Uno, Nano atď.)
  • Momentové tlačidlo
  • Prepojovacie vodiče

Sprievodca zapojením

Zapojenie pre tento príklad je veľmi jednoduché vďaka interným pull-up rezistorom Arduina, čo eliminuje potrebu externého rezistora. (Vo videu o 08:29)

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

Použitím INPUT_PULLUP je pin interne pripojený na 5V, takže normálne číta HIGH. Keď je tlačidlo stlačené, pripojí pin na GND, čo spôsobí, že číta LOW. Toto je logika, ktorú použijeme v kóde.

Vysvetlenie kódu

Jadrom tohto projektu je logika, ktorá sleduje prvé stlačenie tlačidla a potom kontroluje druhé stlačenie po určitom časovom intervale. Kód je navrhnutý ako neblokujúci, čo znamená, že nepozastaví vykonávanie iných úloh vo vašej funkcii loop().

Na začiatku skice nájdete kľúčové používateľom konfigurovateľné premenné, ktoré riadia časové správanie:

unsigned long event = 5000;// 5 sekúnd
unsigned long buttonPushed =0;
  • event: Toto je kľúčová časová premenná. Nastavuje trvanie oneskorenia v milisekundách. V tomto príklade je nastavená na 5000, čo sa rovná 5 sekundám. Túto hodnotu môžete zmeniť na akékoľvek iné trvanie podľa potrieb vášho projektu.
  • buttonPushed: Táto premenná sa používa ako príznak a časová pečiatka. Začína na 0 a pri prvom stlačení tlačidla sa aktualizuje na hodnotu millis(). Tento uložený čas sa potom použije na výpočet rozdielu pre kontrolu druhého stlačenia.

Logika vo funkcii loop() funguje v dvoch fázach. Najprv číta stav tlačidla a ak je stlačené prvýkrát (pb == LOW && buttonPushed == 0), zaznamená aktuálny čas pomocou millis() do premennej buttonPushed. Druhá fáza kontroluje, či je tlačidlo stále stlačené a či bolo zaznamenané prvé stlačenie. Ak áno, vypočíta časový rozdiel medzi aktuálnym časom a časom prvého stlačenia. Ak je tento rozdiel väčší alebo rovný vášmu času event, vykoná akciu—v tomto prípade vytlačí správu do sériového monitora.

Živá demonštrácia projektu

Vo videu je kód nahraný do Arduina a sériový monitor je otvorený na pozorovanie správania. (Vo videu o 16:03) Uvidíte, ako sa hodnota millis() nepretržite tlačí, čo ukazuje čas od spustenia programu. Keď stlačíte tlačidlo prvýkrát, vytlačí sa správa ako First push at:5019. Ak stlačíte tlačidlo znova a podržíte ho viac ako 5 sekúnd od prvého stlačenia, vytlačí sa správa Action after 5 seconds of first push. To demonštruje, že akcia sa spustí len vtedy, keď druhé stlačenie nastane po uplynutí stanoveného oneskorenia.

Sila tohto prístupu spočíva v tom, že riadok Serial.println(millis()) na začiatku slučky pokračuje v behu bez prerušenia, čo dokazuje, že časová logika neblokuje vykonávanie iného kódu. Toto je zásadná výhoda používania millis() oproti funkcii delay().

Súvisiace projekty z tohto videa

Kapitoly

  • [00:00] Úvod do millis() a kurzu
  • [01:19] Čo je millis() a prečo ho používať?
  • [03:06] Prvý praktický príklad: tlač millis()
  • [05:46] Použitie millis() na spustenie udalosti po 5 sekundách
  • [08:29] Príklad 2: Akcia tlačidla s 5-sekundovým oneskorením
  • [12:14] Príklad 3: Detekcia druhého stlačenia tlačidla po oneskorení
  • [17:20] Úvod do funkcie map()
  • [19:47] Praktický príklad mapovania percent jasu LED

Obrázky

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
918-Lesson 14/31-3: Arduino coding millis() example 3 with push button
Jazyk: C++
/*
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");
      }
  }
  
}

Zdroje a referencie

Súbory📁

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