Soek Kode

Les 14/31-3: Arduino-kode millis() voorbeeld 3 met drukknoppie

Les 14/31-3: Arduino-kode millis() voorbeeld 3 met drukknoppie

Het het jy al ooit nodig gehad dat jou Arduino moet onthou wanneer iets gebeur het—soos 'n knoppie-druk—en dan 'n presiese hoeveelheid tyd later aksie neem, terwyl die res van jou program glad aanhou loop? Dit is 'n klassieke uitdaging in Arduino-programmering, en die oplossing is die millis()-funksie. Hierdie tutoriaal, deel van die Robojax Arduino-kursus, demonstreer 'n praktiese voorbeeld: die opsporing of 'n drukknoppie 'n tweede keer gedruk word nadat 'n 5-sekonde vertraging verloop het sedert die eerste druk. Hierdie tegniek is fundamenteel vir die skep van responsiewe, nie-blokkerende projekte waar tydsberekening krities is.

Sunfounder-motor gemonteer

Hierdie patroon van die gebruik van millis() om tyd op te spoor sonder om die program te stop, is noodsaaklik vir 'n wye reeks werklike toepassings. Hier is 'n paar idees om jou eie projekte te inspireer:

  • Gedebonseerde knoppie-koppelvlakke: Implementeer 'n stelsel waar 'n knoppie vir 'n spesifieke duur (bv. 3 sekondes) gehou moet word om 'n toestel aan te skakel, wat toevallige drukke voorkom.
  • Opeenvolgende aksies: Skep 'n stelsel waar een gebeurtenis, soos 'n bewegingsensor-trigger, 'n sekondêre aksie aktiveer wat slegs plaasvind as 'n ander gebeurtenis binne 'n sekere tydsvenster plaasvind.
  • Gebruikerinteraksie-tydtellers: Bou 'n projek wat 'n "bevestigings"-inset (soos 'n tweede knoppie-druk) binne 'n vasgestelde tyd vereis om 'n kritieke funksie uit te voer, soos die stuur van 'n opdrag of die begin van 'n motor.
  • Sensorpoortbeheer: Gebruik 'n eerste sein van 'n sensor om 'n tydsvenster te begin, waartydens 'n tweede, verskillende sensor se lesing as geldig beskou of geïgnoreer word.

Hardeware benodig

Hierdie projek gebruik komponente uit die SunFounder 3-in-1 Arduino-stel, wat 'n goeie hulpbron vir leer is. Jy sal nodig hê:

  • Arduino-bord (Uno, Nano, ens.)
  • 'n Momentêre drukknoppie
  • Springdrade

Bedradingsgids

Die bedrading vir hierdie voorbeeld is baie eenvoudig, danksy die Arduino se interne optrekweerstande, wat die behoefte aan 'n eksterne weerstand uitskakel. (In video by 08:29)

  • Verbind een been van die drukknoppie aan die GND-pen op die Arduino.
  • Verbind die ander been van die drukknoppie aan digitale pen 2 op die Arduino.

Deur INPUT_PULLUP te gebruik, word die pen intern aan 5V verbind, sodat dit normaalweg HIGH lees. Wanneer die knoppie gedruk word, verbind dit die pen aan GND, wat veroorsaak dat dit LOW lees. Dit is die logika wat ons in die kode sal gebruik.

Kode-uitleg

Die kern van hierdie projek is die logika wat die eerste knoppie-druk opspoor en dan vir 'n tweede druk na 'n spesifieke tydsinterval kontroleer. Die kode is ontwerp om nie-blokkerend te wees, wat beteken dit sal nie die uitvoering van ander take in jou loop() stop nie.

Boonop in die skets sal jy die belangrikste gebruikerskonfigureerbare veranderlikes vind wat die tydsgedrag beheer:

unsigned long event = 5000;// 5 sekondes
unsigned long buttonPushed =0;
  • event: Dit is die deurslaggewende tydsveranderlike. Dit stel die vertragingsduur in millisekondes. In hierdie voorbeeld is dit gestel op 5000, wat gelyk is aan 5 sekondes. Jy kan hierdie waarde na enige ander duur verander om by jou projek se behoeftes te pas.
  • buttonPushed: Hierdie veranderlike word as 'n vlag en 'n tydstempel gebruik. Dit begin by 0 en word opgedateer na die waarde van millis() die eerste keer dat die knoppie gedruk word. Hierdie gestoorde tyd word dan gebruik om die verskil vir die tweede druk-kontrole te bereken.

Die logika in die loop()-funksie werk in twee fases. Eerstens lees dit die knoppie se toestand en, as dit vir die eerste keer gedruk word (pb == LOW && buttonPushed == 0), teken dit die huidige tyd via millis() in die buttonPushed-veranderlike aan. Die tweede fase kontroleer of die knoppie steeds gedruk is en of 'n eerste druk aangeteken is. Indien wel, bereken dit die tydsverskil tussen die huidige tyd en die eerste druk-tyd. As hierdie verskil groter as of gelyk aan jou event-tyd is, voer dit die aksie uit—in hierdie geval, die druk van 'n boodskap na die Serial Monitor.

Lewende projekdemonstrasie

In die video word die kode na die Arduino opgelaai, en die Serial Monitor word geopen om die gedrag waar te neem. (In video by 16:03) Jy sal sien dat die millis()-waarde deurlopend druk, wat die tyd sedert die program begin het, toon. Wanneer jy die knoppie vir die eerste keer druk, word 'n boodskap soos Eerste druk by:5019 gedruk. As jy die knoppie weer druk en dit vir meer as 5 sekondes vanaf die eerste druk hou, word die boodskap Aksie na 5 sekondes van eerste druk gedruk. Dit demonstreer dat die aksie slegs geaktiveer word wanneer die tweede druk plaasvind nadat die gespesifiseerde vertraging verloop het.

Die krag van hierdie benadering is dat die Serial.println(millis())-lyn bo-aan die lus sonder onderbreking aanhou loop, wat bewys dat die tydslogika nie ander kode se uitvoering blokkeer nie. Dit is die fundamentele voordeel van die gebruik van millis() bo die delay()-funksie.

Verwante projekte uit hierdie video

Hoofstukke

  • [00:00] Inleiding tot millis() en die kursus
  • [01:19] Wat is millis() en hoekom dit gebruik?
  • [03:06] Eerste praktiese voorbeeld: druk millis() af
  • [05:46] Gebruik millis() om 'n gebeurtenis na 5 sekondes te aktiveer
  • [08:29] Voorbeeld 2: Druk-knoppie-aksie met 'n 5-sekonde vertraging
  • [12:14] Voorbeeld 3: Opspoor van 'n tweede knoppie-druk na 'n vertraging
  • [17:20] Inleiding tot die map()-funksie
  • [19:47] Praktiese voorbeeld van die kartering van LED-helderheidspersentasies

Beelde

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

Hulpbronne en verwysings

Lêers📁

Gebruikershandleiding