De delay functie bij Arduino is wel gemakkelijk maar heeft een groot nadeel. Als je bij voorbeeld een motor 30 seconden laat draaien met de delay functie dan doet het programma verder ook niets anders, het staat a.h.w. helemaal stil bij de delay, zolang als die duurt. Al die tijd worden er bij voorbeeld geen sensoren uitgelezen. Als je dus een robot wil laten rijden die obstakels moet ontwijken of zelfs al twee ledjes onafhankelijk van elkaar laten knipperen moet je een andere oplossing gebruiken.
Een principe staat beschreven op de pagina: https://sites.google.com/site/hwcontwerpen/sensoren/drukknop-als-schakelaar
Een andere eenvoudige manier is gebruik maken van een bibliotheek. We hebben hier gebruik gemaakt van de Timer bibliotheek van Simon Monk.
Je kan die hier downloaden: --> https://playground.arduino.cc/Code/Timer/
Hieronder staat de code om twee ledjes onafhankelijk van elkaar te laten knipperen. Daaronder staat de code om een ledje te laten knipperen als de waarde van een lichtsensor onder een bepaald getal komt. Dit zou je bij voorbeeld kunnen gebruiken bij een robot lijnvolger. Het ledje kan je natuurlijk ook vervangen voor een buzzer. De code 'Timer met LDR' is de de meest 'kale', het werkt maar je kan niets aflezen op de seriële monitor. De code helemaal beneden is dezelfde code maar dan met seriële monitor, dit is in veel gevallen een stuk handiger.
Hieronder het aansluitschema voor de ldr en led.
Hieronder de code zonder delay waarmee twee ledjes onafhankelijk van elkaar kunnen knipperen.
//Flash two LEDs at different rates using Simon Monk's Timer library
//http://www.doctormonk.com/2012/01/arduino-timer-library.html
//Jack Christensen 30Sep2013
#include "Timer.h" //http://github.com/JChristensen/Timer
const int LED1 = 8; //connect one LED to this pin (with appropriate current-limiting resistor of course)
const int LED2 = 9; //connect another LED to this pin (don't forget the resistor)
const unsigned long PERIOD1 = 1000; //one second
const unsigned long PERIOD2 = 10000; //ten seconds
Timer t; //instantiate the timer object
void setup(void)
{
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
t.oscillate(LED1, PERIOD1, HIGH);
t.oscillate(LED2, PERIOD2, HIGH);
}
void loop(void)
{
t.update();
}
Hieronder de code voor timer met knipperlicht (of buzzer) met timer.
//ldr met knipperled met timer bibliotheek
//http://www.doctormonk.com/2012/01/arduino-timer-library.html
#include "Timer.h"
const int LED = 13;
const unsigned long PERIOD = 500; // knippertijd 0,5 seconde
Timer t;
void setup(void) {
pinMode(LED, OUTPUT);
t.oscillate(LED, PERIOD, HIGH);
}
void loop(void) {
if (analogRead(0) < 500) {
t.update();
}
else {
digitalWrite(LED, LOW);
}
}
Hieronder de code voor de ldr met knipperlicht met afleesmogelijkheid op de seriële monitor.
// LDR met timer en seriële monitor
// http://www.doctormonk.com/2012/01/arduino-timer-library.html
int ldrPin = 0; // de LDR is verbonden met analoge pin 0
int ldrWaarde; // De uitgeleZen waarde op de analoge pin 0
#include "Timer.h"
const int LED = 13;
const unsigned long PERIOD = 500; // knippertijd 0,5 seconde
Timer t;
void setup(void) {
Serial.begin(9600); // Start de serial mmonitor
pinMode(LED, OUTPUT);
t.oscillate(LED, PERIOD, HIGH);
}
void loop(void) {
ldrWaarde = analogRead(ldrPin);
Serial.print("Analog reading = ");
Serial.println(ldrWaarde); // print de ruwe analoge waarde op de monitor
if (analogRead(ldrPin) < 500) {
t.update();
}
else {
digitalWrite(LED, LOW);
}
}