Pretraži kod

Lekcija 14/31-3: Arduino kodiranje millis() primjer 3 sa push dugmetom

Lekcija 14/31-3: Arduino kodiranje millis() primjer 3 sa push dugmetom

Da li vam je ikada trebalo da vaš Arduino zapamti kada se nešto dogodilo—poput pritiska na dugme—a zatim preduzme akciju tačno određeno vrijeme kasnije, sve dok ostatak vašeg programa radi nesmetano? Ovo je klasičan izazov u Arduino programiranju, a rješenje je millis() funkcija. Ovaj tutorijal, dio Robojax Arduino kursa, demonstrira praktičan primjer: detekciju da li je tipka pritisnuta drugi put nakon što je prošlo 5 sekundi od prvog pritiska. Ova tehnika je temeljna za kreiranje responzivnih, ne-blokirajućih projekata gdje je vrijeme kritično.

Sastavljeni Sunfounder automobil

Ovaj obrazac korištenja millis() za praćenje vremena bez zaustavljanja programa je neophodan za širok spektar stvarnih aplikacija. Evo nekoliko ideja za inspiraciju vaših vlastitih projekata:

  • Interfejsi dugmadi sa debouncingom: Implementirajte sistem gdje dugme mora biti držano određeno vrijeme (npr. 3 sekunde) da bi se uređaj uključio, sprječavajući slučajne pritiske.
  • Sekvencijalne akcije: Kreirajte sistem gdje jedan događaj, poput okidača senzora pokreta, aktivira sekundarnu akciju koja se dešava samo ako se drugi događaj desi unutar određenog vremenskog okvira.
  • Tajmeri za korisničku interakciju: Napravite projekat koji zahtijeva "potvrdu" unosa (poput drugog pritiska na dugme) unutar zadanog vremena za izvršenje kritične funkcije, kao što je slanje komande ili pokretanje motora.
  • Selektivno propuštanje senzora: Koristite prvi signal sa senzora za pokretanje vremenskog okvira, tokom kojeg se očitavanje drugog, različitog senzora smatra važećim ili se ignoriše.

Potreban hardver

Ovaj projekat koristi komponente iz SunFounder 3-u-1 Arduino kita, koji je odličan resurs za učenje. Trebat će vam:

  • Arduino ploča (Uno, Nano, itd.)
  • Trenutno pritisno dugme
  • Konektorski kablovi

Vodič za povezivanje

Povezivanje za ovaj primjer je vrlo jednostavno, zahvaljujući unutrašnjim pull-up otpornicima Arduina, što eliminiše potrebu za vanjskim otpornikom. (U videu na 08:29)

  • Spojite jednu nogicu tipke na GND pin na Arduinu.
  • Spojite drugu nogicu tipke na digitalni pin 2 na Arduinu.

Korištenjem INPUT_PULLUP, pin je interno povezan na 5V, tako da normalno očitava HIGH. Kada je dugme pritisnuto, povezuje pin na GND, uzrokujući očitavanje LOW. Ovo je logika koju ćemo koristiti u kodu.

Objašnjenje koda

Srž ovog projekta je logika koja prati prvi pritisak na dugme, a zatim provjerava drugi pritisak nakon specifičnog vremenskog intervala. Kod je dizajniran da bude ne-blokirajući, što znači da neće pauzirati izvršavanje drugih zadataka u vašoj loop() funkciji.

Na vrhu skice pronaći ćete ključne korisnički podesive varijable koje kontrolišu vremensko ponašanje:

unsigned long event = 5000;// 5 sekundi
unsigned long buttonPushed =0;
  • event: Ovo je ključna vremenska varijabla. Postavlja trajanje kašnjenja u milisekundama. U ovom primjeru, postavljena je na 5000, što iznosi 5 sekundi. Možete promijeniti ovu vrijednost na bilo koje drugo trajanje prema potrebama vašeg projekta.
  • buttonPushed: Ova varijabla se koristi kao oznaka i vremenska oznaka. Počinje na 0 i ažurira se na vrijednost millis() prvi put kada je dugme pritisnuto. Ovo pohranjeno vrijeme se zatim koristi za izračunavanje razlike za provjeru drugog pritiska.

Logika u loop() funkciji radi u dvije faze. Prvo, očitava stanje dugmeta i, ako je pritisnuto prvi put (pb == LOW && buttonPushed == 0), bilježi trenutno vrijeme putem millis() u varijablu buttonPushed. Druga faza provjerava da li je dugme još uvijek pritisnuto i da li je zabilježen prvi pritisak. Ako jeste, izračunava vremensku razliku između trenutnog vremena i vremena prvog pritiska. Ako je ova razlika veća ili jednaka vašem event vremenu, izvršava akciju—u ovom slučaju, ispisuje poruku na Serial Monitor.

Demonstracija uživo projekta

U videu, kod se prenosi na Arduino, a Serial Monitor se otvara kako bi se posmatralo ponašanje. (U videu na 16:03) Vidjet ćete kako se vrijednost millis() kontinuirano ispisuje, pokazujući vrijeme od pokretanja programa. Kada pritisnete dugme prvi put, ispisuje se poruka poput Prvi pritisak na:5019. Ako ponovo pritisnete dugme i držite ga više od 5 sekundi od prvog pritiska, ispisuje se poruka Akcija nakon 5 sekundi od prvog pritiska. Ovo demonstrira da se akcija pokreće samo kada se drugi pritisak desi nakon što je specificirano kašnjenje proteklo.

Snaga ovog pristupa je u tome što linija Serial.println(millis()) na vrhu petlje nastavlja da radi bez prekida, dokazujući da vremenska logika ne blokira izvršavanje drugog koda. Ovo je fundamentalna prednost korištenja millis() u odnosu na delay() funkciju.

Srodni projekti iz ovog videa

Poglavlja

  • [00:00] Uvod u millis() i kurs
  • [01:19] Šta je millis() i zašto ga koristiti?
  • [03:06] Prvi praktični primjer: ispis millis()
  • [05:46] Korištenje millis() za pokretanje događaja nakon 5 sekundi
  • [08:29] Primjer 2: Akcija dugmeta s odgodom od 5 sekundi
  • [12:14] Primjer 3: Detekcija drugog pritiska dugmeta nakon odgode
  • [17:20] Uvod u map() funkciju
  • [19:47] Praktični primjer mapiranja postotaka svjetline LED-a

Slike

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
Jezik: 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");
      }
  }
  
}

Resursi i reference

Datoteke📁

Korisnički priručnik