Les 14/31-2: Arduino-kodering millis() voorbeeld 2 met gebeurtenis
In hierdie tutoriaal sal jy leer hoe om die Arduino millis()-funksie te gebruik om 'n aksie eers te aktiveer nadat 'n bepaalde tydperk verloop het, sonder om die res van jou program te blokkeer. Dit is 'n fundamentele tegniek vir die skep van responsiewe Arduino-projekte waar verskeie take gelyktydig moet loop, soos om LED's te laat flikker terwyl sensors gelees word of drukknoppies gemonitor word. Hierdie spesifieke voorbeeld fokus op die aktivering van 'n gebeurtenis na vyf sekondes, maar die logika kan op ontelbare werklike scenario's toegepas word.
Hier is 'n paar praktiese voorbeelde van hoe jy hierdie patroon in jou eie projekte kan gebruik:
- Vertraagde aktivering: Skakel 'n waaier of pomp eers aan nadat 'n stelsel vir 'n vasgestelde tyd loop.
- Veiligheidslotstelsels: Vereis dat 'n knoppie vir 'n duur ingedruk en gehou word voordat 'n gevaarlike aksie uitgevoer word, soos om 'n motor te begin.
- Tydgebaseerde waarskuwings: Aktiveer 'n alarm of kennisgewing as 'n sensorlesing nie binne 'n sekere venster verander nie.
- Nie-blokkerende timers: Skep 'n "waghonde"-timer wat 'n toestel herstel as dit onresponsief raak.
Die kernprobleem wat dit oplos, is die beperking van die delay()-funksie. Wanneer jy delay(5000) gebruik, stop die Arduino met die uitvoering van enige ander kode vir daardie vyf sekondes. Dit is goed vir eenvoudige sketse, maar dit word 'n groot probleem in meer komplekse projekte waar jy sensors moet lees, skerms moet opdateer, of na drukknoppies moet luister terwyl jy wag. Die millis()-funksie, wat die millisekondes tel sedert die bord aangeskakel is, laat jou toe om die tyd na te gaan sonder om die program te onderbreek.
Hardeware Benodig
- Arduino-bord (Uno, Nano, Mega, ens.)
- 'n Druk-knoppie
- Springdrade
Bedradingsgids
Die bedrading vir hierdie voorbeeld is baie eenvoudig. Dit gebruik 'n interne optrekweerstand, dus is geen eksterne weerstand vir die knoppie nodig nie.
- Koppel een been van die druk-knoppie aan die GND-pen op die Arduino.
- Koppel die ander been van die druk-knoppie aan digitale pen 2 op die Arduino.
Omdat ons INPUT_PULLUP in die kode gebruik, sal die pen HOOG lees wanneer die knoppie nie gedruk is nie en LAAG wanneer dit gedruk is, wat die pen aan grond koppel. (in video by 08:29)
Verstaan die Kode
Hierdie kode demonstreer 'n eenvoudige gebeurtenisgebaseerde timer. Die program druk voortdurend die huidige millis()-waarde na die Serial Monitor. Wanneer die druk-knoppie ingedruk en gehou word, en die Arduino vir ten minste 5 sekondes loop, sal dit "Take action" na die Serial Monitor druk. Die sleutel is dat die millis()-kontrole nie die voortdurende druk van die tyd stop nie.
Kom ons breek die gebruikerskonfigureerbare dele van die kode af:
unsigned long event = 5000;// 5 sekondes
Dit is die belangrikste veranderlike om te konfigureer. Dit definieer die duur van jou "gebeurtenis" in millisekondes. In hierdie voorbeeld is dit gestel op 5000, wat gelyk is aan 5 sekondes. Om die vertraging te verander, verander eenvoudig hierdie nommer. Byvoorbeeld, om dit op 10000 te stel, sal die aksie na 10 sekondes laat aktiveer. Dit is noodsaaklik om die unsigned long-datatipe te gebruik, aangesien die waarde van millis() baie groot kan word en uiteindelik die maksimum waarde van 'n standaard int-veranderlike sal oorskry, wat foute in vergelykings veroorsaak. (in video by 05:46)
pinMode(2,INPUT_PULLUP);
Hierdie lyn konfigureer digitale pen 2 as 'n invoer en aktiveer sy interne optrekweerstand. Dit is 'n sleutelkonfigurasiestap wat jou toelaat om 'n knoppie sonder 'n eksterne weerstand te koppel. Die pen sal HOOG by verstek lees en sal LAAG word wanneer die knoppie gedruk word, wat dit aan grond koppel. As jy 'n ander pen wil gebruik, verander die nommer 2 hier en in die digitalRead(2)-lyn binne die lus. (in video by 08:46)
Die logika binne die loop() is eenvoudig. Dit lees die toestand van die knoppie. As die knoppie gedruk is (pb == LAAG), kontroleer dit dan of die huidige tyd (millis()) groter as of gelyk aan jou gedefinieerde event-tyd is. As beide voorwaardes waar is, druk dit die aksieboodskap. Die res van die lus, wat die tyd druk, gaan ononderbroke voort, wat die krag van millis() bo delay() demonstreer.
Hierdie voorbeeld kontroleer die tyd vanaf die oomblik dat die Arduino begin. Die derde voorbeeld in die videoreeks bou hierop voort deur die tyd van die eerste knoppiedruk aan te teken en 'n aksie eers te aktiveer as 'n tweede druk ten minste 5 sekondes later plaasvind. Daardie logika word gedek in Les 14/31-3: Arduino-kodering millis() voorbeeld 3 met druk-knoppie.
Lewende Projekdemonstrasie
Sodra jy die kode oplaai en die Serial Monitor (by 9600 baud) oopmaak, sal jy 'n deurlopende stroom nommers sien, wat die millisekondes sedert die bord aangeskakel is, voorstel. As jy die druk-knoppie voor 5 sekondes ingedruk en hou, sal niks gebeur nie. As jy egter die knoppie na die 5-sekonde-merk indruk en hou, sal jy die boodskap "Take action" in die Serial Monitor sien druk. Die aksie sal voortgaan om te druk solank die knoppie gehou word. Dit demonstreer 'n nie-blokkerende timer wat ander kode (die druk) naatloos laat loop. (in video by 10:52)
Verwante projekte van hierdie video
Hierdie video is deel van 'n multi-reeks oor Arduino-tydsberekening en karteringsfunksies. Verken die ander tutorials wat uit hierdie selfde bronmateriaal geskep is:
- Les 14/31-1: Arduino Millis (geen vertraging) en kaartfunksies | SunFounder Robojax
- Les 14/31-3: Arduino-kodering millis() voorbeeld 3 met druk-knoppie
- Les 14/31-4: Arduino-kodering map() voorbeeld 1
- Les 14/31-5: Arduino-kodering map() voorbeeld 2
Hoofstukke
- [00:00] Inleiding tot millis() en die SunFounder-stel
- [01:19] Wat is millis() en waarom dit gebruik in plaas van delay()?
- [03:06] Praktiese demonstrasie: druk die millis()-waarde
- [05:46] Skep 'n gebeurtenis met millis() en unsigned long
- [08:29] Bedrading en kodering van 'n druk-knoppie met INPUT_PULLUP
- [10:52] Laat die gebeurtenis-voorbeeld met 'n druk-knoppie loop
- [12:14] Voorskou van voorbeeld 3: opspoor van 'n tweede knoppie-druk
- [17:20] Inleiding tot die map()-funksie
- [19:47] Kodering en demonstrasie van die map()-funksie met 'n LED
/*
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
Goedere wat jy dalk nodig het
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
-
Ander
Hulpbronne en verwysings
-
BuitenburgPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Lêers📁
Gebruikershandleiding
-
SunFounder 3-in-1 Arduino Slimmotor-monteringshandleidingHierdie dokument wys stap-vir-stap montering van SunFounder 3-in-1 Arduino Slimmotor
SunFounder_car_assembly_manual.pdf1.20 MB