Arduino Nano - LED - Knipperen Zonder Delay

Laten we ons voorstellen dat de Arduino Nano twee taken tegelijk moet uitvoeren: een LED laten knipperen en tegelijkertijd de status van een knop monitoren die op elk moment ingedrukt kan worden. Als we de delay() functie gebruiken (zoals besproken in een eerdere tutorial), kan het zijn dat de Arduino Nano sommige knopdrukken mist. Met andere woorden, de Arduino Nano kan de tweede taak niet volledig uitvoeren.

In deze handleiding leert u hoe u de Arduino Nano een LED kunt laten knipperen en tegelijkertijd de status van een knop kunt detecteren zonder dat er drukmomenten worden gemist.

We behandelen drie voorbeelden en vergelijken de verschillen tussen hen:

Deze methode is niet beperkt tot alleen LED knipperen en het controleren van een knop. In het algemeen maakt het het mogelijk voor Arduino Nano om meerdere taken gelijktijdig uit te voeren zonder dat ze elkaar blokkeren.

Over LED en Knop

Als u niet vertrouwd bent met LED en knop (inclusief pinout, functionaliteit en programmering), kunnen de volgende tutorials u helpen:

Bedradingsschema

Arduino Nano LED bedradingsschema

This image is created using Fritzing. Click to enlarge image

Arduino Nano Code - Met Delay

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-led-blink-without-delay */ const int LED_PIN = 5; // The number of the LED pin const int BUTTON_PIN = 2; // The number of the button pin const long BLINK_INTERVAL = 1000; // interval at which to blink LED (milliseconds) int led_state = LOW; // led_state used to set the LED int prev_button_state = LOW; // will store last time button was updated void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT); } void loop() { // if the LED is off turn it on and vice-versa: led_state = (led_state == LOW) ? HIGH : LOW; // set the LED with the led_state of the variable: digitalWrite(LED_PIN, led_state); delay(BLINK_INTERVAL); // If button is pressed during this time, Arduino CANNOT detect int button_state = digitalRead(BUTTON_PIN); if(button_state != prev_button_state) { // print out the state of the button: Serial.println(button_state); // save the last state of button prev_button_state = button_state; } // DO OTHER WORKS HERE }

Snelle Stappen

  • Verbind uw Arduino Nano met uw computer via een USB-kabel.
  • Start de Arduino IDE, selecteer het juiste board en de juiste poort.
  • Kopieer de code en open deze in de Arduino IDE.
  • Klik op de Upload knop in de Arduino IDE om de code te compileren en te uploaden naar de Arduino Nano.
Hoe code uploaden naar Arduino Nano
  • Open de Seriële Monitor.
  • Druk vier keer op de knop.
  • Bekijk de LED; deze zal elke seconde aan en uit gaan.
  • Controleer de output in de Seriële Monitor.
COM6
Send
1 0
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • In de Seriële Monitor ziet u dat sommige drukmomenten niet werden geregistreerd. Dit komt doordat tijdens de delay-tijd de Arduino Nano geen acties kan uitvoeren. Daardoor kan hij het indrukken van de knop niet detecteren.

Arduino Nano Code - Zonder Delay

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-led-blink-without-delay */ const int LED_PIN = 5; // The number of the LED pin const int BUTTON_PIN = 2; // The number of the button pin const long BLINK_INTERVAL = 1000; // interval at which to blink LED (milliseconds) int led_state = LOW; // led_state used to set the LED int prev_button_state = LOW; // will store last time button was updated unsigned long prev_time_ms = 0; // will store last time LED was updated void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT); } void loop() { // check to see if it's time to blink the LED; that is, if the difference // between the current time and last time you blinked the LED is bigger than // The interval at which you want to blink the LED. unsigned long time_ms = millis(); if (time_ms - prev_time_ms >= BLINK_INTERVAL) { // if the LED is off turn it on and vice-versa: led_state = (led_state == LOW) ? HIGH : LOW; // set the LED with the led_state of the variable: digitalWrite(LED_PIN, led_state); // save the last time you blinked the LED prev_time_ms = time_ms; } // check button state's change int button_state = digitalRead(BUTTON_PIN); if(button_state != prev_button_state) { // print out the state of the button: Serial.println(button_state); // save the last state of button prev_button_state = button_state; } // DO OTHER WORKS HERE }

Snelle Stappen

  • Voer de code uit en druk vier keer op de knop.
  • Bekijk de LED; deze zal iedere seconde aan en uit schakelen.
  • Controleer de output in de Seriële Monitor.
COM6
Send
1 0 1 0 1 0 1 0
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Alle knopdrukken zijn correct gedetecteerd.

Code Uitleg

Bekijk de regel-voor-regel uitleg in de commentaarregels van de broncode!

Meer Taken Toevoegen

De onderstaande Arduino Nano code doet het volgende:

  • Laat twee LEDs knipperen met verschillende intervallen.
  • Controleert de status van de knop.
/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino-nano/arduino-nano-led-blink-without-delay */ const int LED_PIN_1 = 5; // The number of the LED 1 pin const int LED_PIN_2 = LED_BUILTIN; // The number of the LED 2 pin const int BUTTON_PIN = 2; // The number of the button pin const long BLINK_INTERVAL_1 = 1000; // interval at which to blink LED 1 (milliseconds) const long BLINK_INTERVAL_2 = 500; // interval at which to blink LED 2 (milliseconds) int led_state_1 = LOW; // led_state used to set the LED 1 int led_state_2 = LOW; // led_state used to set the LED 2 int prev_button_state = LOW; // will store last time button was updated unsigned long prev_time_ms_1 = 0; // will store last time LED 1 was updated unsigned long prev_time_ms_2 = 0; // will store last time LED 2 was updated void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN_1, OUTPUT); pinMode(LED_PIN_2, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT); } void loop() { unsigned long time_ms = millis(); // check to see if it's time to blink the LED 1 if (time_ms - prev_time_ms_1 >= BLINK_INTERVAL_1) { // if the LED is off turn it on and vice-versa: led_state_1 = (led_state_1 == LOW) ? HIGH : LOW; // set the LED with the led_state of the variable: digitalWrite(LED_PIN_1, led_state_1); // save the last time you blinked the LED prev_time_ms_1 = time_ms; } // check to see if it's time to blink the LED 2 if (time_ms - prev_time_ms_2 >= BLINK_INTERVAL_2) { // if the LED is off turn it on and vice-versa: led_state_2 = (led_state_2 == LOW) ? HIGH : LOW; // set the LED with the led_state of the variable: digitalWrite(LED_PIN_2, led_state_2); // save the last time you blinked the LED prev_time_ms_2 = time_ms; } // check button state's change int button_state = digitalRead(BUTTON_PIN); if(button_state != prev_button_state) { // print out the state of the button: Serial.println(button_state); // save the last state of button prev_button_state = button_state; } // DO OTHER WORKS HERE }

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Uitbreidbaarheid

Deze methode maakt het mogelijk dat de Arduino Nano meerdere taken gelijktijdig uitvoert zonder dat de ene taak de voortgang van de andere blokkeert. Bijvoorbeeld, het versturen van een verzoek naar het internet en wachten op een antwoord, terwijl tegelijkertijd LED-indicatoren knipperen en een annuleerknop wordt gemonitord.

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!