GSM närhet Alert med GPS läge och tid (4 / 5 steg)
Steg 4: Blinkande lysdioder (icke-blockerande)
Jag ville ha Lysdioderna flash med varierande intervall/hastigheter att ange saker. Det är opraktiskt att använda funktionen "delay()" (som i "blink" Arduino exempel), eftersom den mikro-controller inte kan köra något annat medan du väntar på nästa blixten. Rätt inställning är att notera när en LED vändes på/av, och sedan vid varje iteration genom huvudsakliga öglan kan bestämma om det är dags att stänga av/på.
Ta en titt på Arduino "BlinkWithoutDelay" exempel för att få en uppfattning om hur det verkligen genomförs. Jag utökade något på detta begrepp så att två extra funktioner.
- Lysdioderna kan ha asymmetriska på/off tider den röda lysdioden kan vara blinkade ett antal gånger och sedan stanna utanför
- Amber LED inte är inkluderade, eftersom det är en enkel på/av, ingen blinkar.
Först satt vi upp vissa variabler
Red kan vara blinkade n gånger i stället för kontinuerligt
Denna variabel lagrar hur många blixtar är kvar
int blinksRed = 0;
är led på eller av
int ledStateRed = låg;
int ledStateGreen = låg;
När var LED staten senast växlas
osignerade långa previousMillisRed = 0;
osignerade långa previousMillisGreen = 0;
Hur länge ska LED bo
lång intervalOnRed = 600;
lång intervalOnGreen = 0;
Hur länge ska LED stanna av
lång intervalOffRed = 500.
lång intervalOffGreen = 1000;
Följande funktion uppdateras Lysdioderna, så det kan kallas vid varje iteration av loopen main (). Läs de infogade kommentarerna för mer detaljer.
void updateLeds() {
osignerade långa currentMillis = millis(); få aktuell tid
om ((ledStateRed == HIGH) & & (currentMillis - previousMillisRed > = intervalOnRed)) {
om den röda led är på och ontime har löpt ut, stänga av
blinksRed = max (0, blinksRed - 1);
previousMillisRed = currentMillis;
ledStateRed = låg;
}
annars om ((blinksRed > 0) & & (ledStateRed == låg) & & (currentMillis - previousMillisRed > = intervalOffRed)) {
om den röda ledde är avstängd och offtime har löpt ut och det finns fler blinkar vänster, slå på den
previousMillisRed = currentMillis;
ledStateRed = hög;
}
grönt är exakt samma, men utan ett antal blinkar begränsning
om ((ledStateGreen == HIGH) & & (currentMillis - previousMillisGreen > = intervalOnGreen)) {
previousMillisGreen = currentMillis;
ledStateGreen = låg;
}
annars om ((ledStateGreen == LOW) & & (currentMillis - previousMillisGreen > = intervalOffGreen)) {
previousMillisGreen = currentMillis;
ledStateGreen = hög;
}
digitalWrite(pinRed,ledStateRed);
digitalWrite(pinGreen,ledStateGreen);
}