Stap 4: Knipperende leds (non-blocking)
Ik wilde de LEDS flash met wisselende intervallen/snelheden om aan te geven van de dingen. Het is onpraktisch om het gebruik van de "delay()"-functie (zoals de "blink" Arduino voorbeeld), omdat de micro-controller niet kan uitvoeren iets anders terwijl het is wachten op de volgende flitser. De juiste aanpak is kennis te nemen van wanneer een LED was uitgeschakeld op /, en klik vervolgens op elke iteratie door de hoofdlus, bepalen of het is tijd om het uit/op te zetten.
Neem een kijkje op de Arduino "BlinkWithoutDelay" voorbeeld om een idee van hoe het daadwerkelijk wordt uitgevoerd. Mij zwellen lichtjes op dit concept dat twee extra functies.
- De LED's kunnen hebben asymmetrische op/af tijden de rode LED kan een bepaald aantal keer knipperde en blijf af
- De amber LED is niet opgenomen, omdat het is een eenvoudige aan/uit, geen knipperen.
Eerst instellen wij sommige variabelen
//red can be blinked n times instead of continuously //this variable stores how many flashes are left int blinksRed = 0; //is the led on or off int ledStateRed = LOW; int ledStateGreen = LOW; //when was the LED state last toggled unsigned long previousMillisRed = 0; unsigned long previousMillisGreen = 0; //how long should the LED stay on long intervalOnRed = 600; long intervalOnGreen = 0; //how long should the LED stay off long intervalOffRed = 500; long intervalOffGreen = 1000;
De volgende functie werkt de LEDS, zodat het kan worden geroepen op elke iteratie van de lus main(). Lees de inline-opmerkingen voor meer informatie.
void updateLeds() { unsigned long currentMillis = millis(); //get the current time if ((ledStateRed == HIGH) && (currentMillis - previousMillisRed >= intervalOnRed)) { //if the red led is on and ontime has expired, turn it off blinksRed = max(0,blinksRed - 1); previousMillisRed = currentMillis; ledStateRed = LOW; } else if ((blinksRed > 0) && (ledStateRed == LOW) && (currentMillis - previousMillisRed >= intervalOffRed)) { //if the red led is off and offtime has expired and there are more blinks left, turn it on previousMillisRed = currentMillis; ledStateRed = HIGH ; } //green is exactly the same, but without a number of blinks limitation if ((ledStateGreen == HIGH) && (currentMillis - previousMillisGreen >= intervalOnGreen)) { previousMillisGreen = currentMillis; ledStateGreen = LOW; } else if ((ledStateGreen == LOW) && (currentMillis - previousMillisGreen >= intervalOffGreen)) { previousMillisGreen = currentMillis; ledStateGreen = HIGH ; } digitalWrite(pinRed,ledStateRed); digitalWrite(pinGreen,ledStateGreen); }