//--------------------
// DEFINES
//--------------------
#define REDPIN 7
#define GREENPIN 8
// De millis() worden in dit project gebruikt. Dit is een functie die
// aangeroepen kan worden en die het aantal milliseconden teruggeeft die
// zijn verlopen sinds de Arduino werd opgestart, of sinds de laatste reset.
// Dit is een variabele van type "unsigned long" 4 byte = 2^32 = 4294967295.
// Daarom is het belangrijk te weten dat de millis() na ongeveer 49dagen opnieuw
// gereset worden, want
// +------------+----------+---------+------+--------+
// | millis() | seconden | minuten | uren | dagen |
// | 4294967295 | 4294967 | 71583 | 1193 | 49.7 |
// +------------+----------+---------+------+--------+
// Daarom worden in dit project de variabelen "redMillis" en "greenMillis" ook
// met dit type geïnitialiseerd in de loop.
void setup() {
pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
digitalWrite(REDPIN, LOW);
digitalWrite(GREENPIN, LOW);
}
void loop() {
// static, gebruikt IN een functie, zorgt ervoor dat het mogelijk is
// om een variabele éénmalig te initialiseren. Het wordt dan zogezegd
// een "locale - globale" waarde voor deze functie. Of het lijkt alsof
// de declaratie verhuist naar buiten de functie na de eerste aanroeping.
static unsigned long redMillis = millis(); // Dit gebeurt dus maar één keer
static unsigned long greenMillis = millis();
// het volgende statement is een voorbeeld van een functie-aanroep met parameters,
// en deze functie retourneert ook een waarde.
// We ontmantelen dit statement:
// Eerst en voor al is er een toewijzing van een waarde aan "redMillis". Dus aangezien
// we weten dat de loop() zeer snel en vaak wordt doorlopen wordt deze toewijzing
// dan ook zeer vaak gedaan. redMillis krijgt elke keer een update van haar waarde.
// De waarde die toegekend wordt aan redmillis wordt bepaald door het uitvoeren
// van de functie blinkLed(x,y,z). Waarbij x = het pinnummer van de aangesloten led.
// y = het knipperinterval (tijd aan en uit) en z = de huidige waarde van de redMillis
// zelf. In de meeste gevallen gaat de functie blinkLed terug de originele waarde van
// redMillis als uitkomst geven. Dus redMillis zal in de meeste gevallen gelijkgesteld
// worden aan haar eerdere waarde, dus een update met dezelfde waarde.
redMillis = blinkLed(REDPIN, 100, redMillis);
greenMillis = blinkLed(GREENPIN, 1000, greenMillis);
}
// Onderstaande functie begint met "unsigned long" en niet met "void". Dit geeft aan
// dat deze functie een waarde zal teruggeven aan de "aanroeper". deze waarde zal van
// het type "unsigned long" zijn (net zoals de millis()). Deze functie is flexibel opgebouwd.
// Ze maakt gebruik van doorgegeven parameters. De parameter "led" van het type "int", geeft aan
// welke pin gelezen moet worden en naar welke pin geschreven kan worden. De "aanroeper"
// bepaald de waarde, niet de functie.
// De parameters in de code van de functie worden telkens vevangen door de doorgegeven waardes
// die de "aanroeper" er aan gegeven heeft:
// voorbeeld:
// de aanroeper = "redMillis = blinkLed(REDPIN, 100, redMillis);"
// en stel REDPIN = 7 en redMillis = 2000 dan
// wordt de functiecode concreet door de paramters in te vullen:
// if (millis() - 2000 > 100) {
// digitalWrite(7, !digitalRead(7));
// redMillis = millis();
// }
// return 2000 of millis();
unsigned long blinkLed(int led, int interval, unsigned long ledMillis) {
if (millis() - ledMillis > interval) {
digitalWrite(led, !digitalRead(led));
ledMillis = millis();
}
return ledMillis;
}