Code zoeken

Les 14/31-3: Arduino-codering millis() voorbeeld 3 met drukknop

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.

Sunfounder-auto gemonteerd

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 op 5000, 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 op 0 en wordt bijgewerkt naar de waarde van millis() 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

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

Afbeeldingen

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

Hulpmiddelen en referenties

Bestanden📁

Gebruikershandleiding