Les 14/31-3: Arduino-codering millis() voorbeeld 3 met drukknop
Heb je ooit je Arduino nodig gehad om te onthouden wanneer er iets gebeurde—zoals een knopdruk—en dan een exacte tijd later actie te ondernemen, terwijl de rest van je programma soepel blijft draaien? Dit is een klassieke uitdaging in Arduino-programmering, en de oplossing is de millis()-functie. Deze tutorial, onderdeel van de Robojax Arduino-cursus, demonstreert een praktisch voorbeeld: detecteren of een drukknop een tweede keer wordt ingedrukt nadat een vertraging van 5 seconden is verstreken sinds de eerste druk. Deze techniek is fundamenteel voor het creëren van responsieve, niet-blokkerende projecten waar timing cruciaal is.
Dit patroon van het gebruik van millis() om tijd bij te houden zonder het programma te stoppen, is essentieel voor een breed scala aan praktische toepassingen. Hier zijn een paar ideeën om je eigen projecten te inspireren:
- Debounced-knopinterfaces: Implementeer een systeem waarbij een knop een specifieke duur moet worden ingedrukt (bijv. 3 seconden) om een apparaat in te schakelen, waardoor onbedoelde drukken worden voorkomen.
- Sequentiële acties: Creëer een systeem waarbij één gebeurtenis, zoals een bewegingssensortrigger, een secundaire actie activeert die alleen plaatsvindt als een andere gebeurtenis binnen een bepaald tijdsvenster gebeurt.
- Gebruikersinteractietimers: Bouw een project dat een "bevestigings"-invoer vereist (zoals een tweede knopdruk) binnen een ingestelde tijd om een kritieke functie uit te voeren, zoals het verzenden van een opdracht of het starten van een motor.
- Sensorpoorten: Gebruik een eerste signaal van een sensor om een tijdsvenster te starten, waarin de meting van een tweede, andere sensor als geldig wordt beschouwd of wordt genegeerd.
Benodigde hardware
Dit project gebruikt componenten uit de SunFounder 3-in-1 Arduino-kit, die een geweldige bron is om te leren. Je hebt nodig:
- Arduino-bord (Uno, Nano, enz.)
- Een drukknop (momentaan)
- Jumperdraden
Bedradingsgids
De bedrading voor dit voorbeeld is heel eenvoudig, dankzij de interne pull-up-weerstanden van de Arduino, waardoor een externe weerstand niet nodig is. (In video op 08:29)
- Verbind één poot van de drukknop met de GND-pin op de Arduino.
- Verbind de andere poot van de drukknop met digitale pin 2 op de Arduino.
Door INPUT_PULLUP te gebruiken, wordt de pin intern verbonden met 5V, zodat deze normaal HIGH leest. Wanneer de knop wordt ingedrukt, verbindt deze de pin met GND, waardoor deze LOW leest. Dit is de logica die we in de code zullen gebruiken.
Code-uitleg
De kern van dit project is de logica die de eerste knopdruk bijhoudt en vervolgens controleert op een tweede druk na een specifiek tijdsinterval. De code is ontworpen om niet-blokkerend te zijn, wat betekent dat het de uitvoering van andere taken in je loop() niet pauzeert.
Bovenaan de sketch vind je de belangrijkste door de gebruiker configureerbare variabelen die het timinggedrag bepalen:
unsigned long event = 5000;// 5 seconden
unsigned long buttonPushed =0;
event: Dit is de cruciale timingvariabele. Het stelt de vertragingsduur in milliseconden in. In dit voorbeeld is het ingesteld op5000, wat gelijk is aan 5 seconden. Je kunt deze waarde wijzigen naar elke andere duur die past bij de behoeften van je project.buttonPushed: Deze variabele wordt gebruikt als een vlag en een tijdstempel. Het begint op0en wordt bijgewerkt naar de waarde vanmillis()de eerste keer dat de knop wordt ingedrukt. Deze opgeslagen tijd wordt vervolgens gebruikt om het verschil te berekenen voor de tweede drukcontrole.
De logica in de loop()-functie werkt in twee fasen. Eerst leest het de status van de knop en als deze voor de eerste keer wordt ingedrukt (pb == LOW && buttonPushed == 0), registreert het de huidige tijd via millis() in de variabele buttonPushed. De tweede fase controleert of de knop nog steeds is ingedrukt en of een eerste druk is geregistreerd. Zo ja, berekent het het tijdsverschil tussen de huidige tijd en de tijd van de eerste druk. Als dit verschil groter is dan of gelijk is aan je event-tijd, voert het de actie uit—in dit geval het afdrukken van een bericht naar de Seriële Monitor.
Live projectdemonstratie
In de video wordt de code geüpload naar de Arduino en wordt de Seriële Monitor geopend om het gedrag te observeren. (In video op 16:03) Je zult de millis()-waarde continu zien afdrukken, die de tijd sinds het starten van het programma weergeeft. Wanneer je de knop voor de eerste keer indrukt, wordt een bericht zoals Eerste druk op:5019 afgedrukt. Als je de knop opnieuw indrukt en langer dan 5 seconden vanaf de eerste druk vasthoudt, wordt het bericht Actie na 5 seconden van eerste druk afgedrukt. Dit demonstreert dat de actie alleen wordt geactiveerd wanneer de tweede druk plaatsvindt nadat de gespecificeerde vertraging is verstreken.
De kracht van deze aanpak is dat de regel Serial.println(millis()) bovenaan de loop zonder onderbreking blijft draaien, wat bewijst dat de timinglogica andere code niet blokkeert. Dit is het fundamentele voordeel van het gebruik van millis() boven de delay()-functie.
Gerelateerde projecten uit deze video
- Les 14/31-1: Arduino Millis (zonder delay) en map-functies | SunFounder Robojax
- Les 14/31-2: Arduino millis() coderen voorbeeld 2 met gebeurtenis
- Les 14/31-4: Arduino map() coderen voorbeeld 1
- Les 14/31-5: Arduino map() coderen voorbeeld 2
Hoofdstukken
- [00:00] Inleiding tot millis() en de cursus
- [01:19] Wat is millis() en waarom gebruiken?
- [03:06] Eerste praktisch voorbeeld: millis() afdrukken
- [05:46] millis() gebruiken om een gebeurtenis na 5 seconden te activeren
- [08:29] Voorbeeld 2: Druk op knop-actie met een vertraging van 5 seconden
- [12:14] Voorbeeld 3: Detecteren van een tweede knopdruk na een vertraging
- [17:20] Inleiding tot de map()-functie
- [19:47] Praktisch voorbeeld van het mappen van LED-helderheidspercentages
/*
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");
}
}
}
Dingen die je misschien nodig hebt
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Hulpmiddelen en referenties
-
DocumentatieDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
ExternPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Bestanden📁
Gebruikershandleiding
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB