Code zoeken

Les 14/31-2: Arduino-codering millis() voorbeeld 2 met evenement

Les 14/31-2: Arduino-codering millis() voorbeeld 2 met evenement

In deze tutorial leer je hoe je de Arduino millis()-functie gebruikt om een actie pas te laten plaatsvinden nadat een bepaalde tijd is verstreken, zonder de rest van je programma te blokkeren. Dit is een fundamentele techniek voor het maken van responsieve Arduino-projecten waarbij meerdere taken tegelijkertijd moeten draaien, zoals het laten knipperen van LED's terwijl je sensoren uitleest of knopdrukken bewaakt. Dit specifieke voorbeeld richt zich op het activeren van een gebeurtenis na vijf seconden, maar de logica kan worden toegepast op talloze praktijkscenario's.

Sunfounder-auto gemonteerd

Hier zijn een paar praktische voorbeelden van hoe je dit patroon in je eigen projecten kunt gebruiken:

  • Vertraagde activering: Schakel een ventilator of pomp pas in nadat een systeem een bepaalde tijd heeft gedraaid.
  • Veiligheidsvergrendelingen: Vereis dat een knop gedurende een bepaalde tijd wordt ingedrukt en vastgehouden voordat een gevaarlijke actie wordt uitgevoerd, zoals het starten van een motor.
  • Tijdgebaseerde waarschuwingen: Activeer een alarm of melding als een sensorwaarde binnen een bepaald tijdsbestek niet is veranderd.
  • Niet-blokkerende timers: Maak een "watchdog"-timer die een apparaat reset als het niet meer reageert.

Het kernprobleem dat dit oplost, is de beperking van de delay()-functie. Wanneer je delay(5000) gebruikt, stopt de Arduino gedurende die vijf seconden met het uitvoeren van alle andere code. Dit is prima voor eenvoudige schetsen, maar het wordt een groot probleem in complexere projecten waarbij je sensoren moet uitlezen, displays moet bijwerken of moet luisteren naar knopdrukken terwijl je wacht. De millis()-functie, die de milliseconden telt sinds het bord is ingeschakeld, stelt je in staat om de tijd te controleren zonder het programma te pauzeren.

Benodigde hardware

  • Arduino-bord (Uno, Nano, Mega, enz.)
  • Een drukknop
  • Jumperdraden

Bedradingsgids

De bedrading voor dit voorbeeld is heel eenvoudig. Er wordt een interne pull-upweerstand gebruikt, dus er is geen externe weerstand nodig voor de knop.

  • 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.

Omdat we INPUT_PULLUP in de code gebruiken, leest de pin HOOG wanneer de knop niet is ingedrukt en LAAG wanneer deze is ingedrukt, waardoor de pin met aarde wordt verbonden. (in video op 08:29)

De code begrijpen

Deze code demonstreert een eenvoudige op gebeurtenissen gebaseerde timer. Het programma print continu de huidige millis()-waarde naar de seriële monitor. Wanneer de drukknop wordt ingedrukt en vastgehouden, en de Arduino minstens 5 seconden heeft gedraaid, wordt "Take action" naar de seriële monitor geprint. De sleutel is dat de millis()-controle het continu printen van de tijd niet stopt.

Laten we de door de gebruiker configureerbare delen van de code opsplitsen:

unsigned long event = 5000;// 5 seconden

Dit is de belangrijkste variabele om te configureren. Het definieert de duur van je "gebeurtenis" in milliseconden. In dit voorbeeld is het ingesteld op 5000, wat gelijk is aan 5 seconden. Om de vertraging te wijzigen, wijzig je eenvoudig dit getal. Als je het bijvoorbeeld op 10000 instelt, wordt de actie na 10 seconden geactiveerd. Het is cruciaal om het gegevenstype unsigned long te gebruiken, omdat de waarde van millis() erg groot kan worden en uiteindelijk de maximale waarde van een standaard int-variabele zal overschrijden, wat fouten in de vergelijking veroorzaakt. (in video op 05:46)

pinMode(2,INPUT_PULLUP);

Deze regel configureert digitale pin 2 als invoer en activeert de interne pull-upweerstand. Dit is een belangrijke configuratiestap waarmee je een knop kunt aansluiten zonder externe weerstand. De pin leest standaard HOOG en gaat naar LAAG wanneer de knop wordt ingedrukt, waardoor deze met aarde wordt verbonden. Als je een andere pin wilt gebruiken, wijzig dan het getal 2 hier en in de digitalRead(2)-regel in de loop. (in video op 08:46)

De logica in de loop() is eenvoudig. Het leest de status van de knop. Als de knop is ingedrukt (pb == LAAG), controleert het vervolgens of de huidige tijd (millis()) groter is dan of gelijk is aan jouw gedefinieerde event-tijd. Als beide voorwaarden waar zijn, print het de actieboodschap. De rest van de loop, die de tijd print, blijft ononderbroken draaien, wat de kracht van millis() ten opzichte van delay() demonstreert.

Dit voorbeeld controleert de tijd vanaf het moment dat de Arduino start. Het derde voorbeeld in de videoserie bouwt hierop voort door het tijdstip van de eerste knopdruk te registreren en een actie alleen te activeren als een tweede druk minstens 5 seconden later plaatsvindt. Die logica wordt behandeld in Les 14/31-3: Arduino-codering millis() voorbeeld 3 met drukknop.

Live projectdemonstratie

Zodra je de code uploadt en de seriële monitor opent (op 9600 baud), zie je een continue stroom getallen, die de milliseconden sinds het inschakelen van het bord weergeven. Als je de drukknop indrukt en vasthoudt voordat er 5 seconden zijn verstreken, gebeurt er niets. Als je de knop echter indrukt en vasthoudt na het 5-secondenpunt, zie je het bericht "Take action" in de seriële monitor verschijnen. De actie blijft printen zolang de knop wordt vastgehouden. Dit demonstreert een niet-blokkerende timer die andere code (het printen) naadloos laat draaien. (in video op 10:52)

Gerelateerde projecten uit deze video

Deze video maakt deel uit van een serie over Arduino-timing- en mappingfuncties. Verken de andere tutorials die uit hetzelfde bronmateriaal zijn gemaakt:

Hoofdstukken

  • [00:00] Inleiding tot millis() en de SunFounder-kit
  • [01:19] Wat is millis() en waarom gebruiken in plaats van delay()?
  • [03:06] Praktische demonstratie: de millis()-waarde afdrukken
  • [05:46] Een gebeurtenis maken met millis() en unsigned long
  • [08:29] Bedrading en codering van een drukknop met INPUT_PULLUP
  • [10:52] Het gebeurtenisvoorbeeld uitvoeren met een drukknop
  • [12:14] Voorbeeld van voorbeeld 3: een tweede knopdruk detecteren
  • [17:20] Inleiding tot de map()-functie
  • [19:47] Codering en demonstratie van de map()-functie met een LED

Afbeeldingen

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
Taal: C++
/*
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

Hulpmiddelen en referenties

Bestanden📁

Gebruikershandleiding