Arduino Countdown tidtagare (15 / 22 steg)
Steg 15: Program
/*
Arduino nedräkningstimer
av Randy Sarafan - 2013
Använder två 7-segment visar Countdown från 99 till 0. När timern når noll, Piper displayen blinkar och en piezo.
-Om du vill starta timern knappen.
-För att pausa tiduret, tryck på knappen igen.
-Om du vill återställa innan den når 0, tryck på knappen 3 gånger snabbt i under 1 sekund. När timern når 0, tryck en gång till Återställ.
För mer information besök:
Denna kod innehåller Arduino statliga förändring upptäckt och Debouncing exempelkod av David A. Mellis, Limor Fried och Tom Igoe.
Denna kod är i Public Domain.
*/
Numrera av tryckknapp PIN-koden
CONST int buttonPin = 12;
7-segment identifierare variabler
int leftnumber;
int rightnumber;
Variabler för nuvarande och den föregående behandlingen från tryckknapp PIN-koden
int buttonState;
int lastButtonState = 0;
Ytterligare variabel att hålla reda på tidigare knapp tryck på staten.
Den här bara håller reda på statligt av knappen när det finns en
Debounce dröjsmål händelse.
int previousState;
Spår sista gången utgångsstiftet var växlas
lång lastDebounceTime = 0;
Debounce tiden; öka om knappen registreras en enkel pressa mer än en gång
lång debounceDelay = 20;
Variabel för att räkna antalet gånger på knappen har tryckts.
int buttonPushCounter;
Denna variabel får växlas antingen hög eller låg varje gång knappen trycks.
Med andra ord, ändras denna variabel stater med varje knapptryckning.
bool tryckte = sant;
int buttonpress;
void setup() {
Ställ in 7-segement utgångar
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (7, OUTPUT);
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (10, OUTPUT);
Ställ in Summer utgång
pinMode (11, OUTPUT);
Ange tryckknapp input
pinMode (buttonPin, ingång);
}
void loop() {
för (int jag = 0; jag < 10; i ++) {
Räknar ner den vänstra siffran med 10
leftnumber = 9 - i.
för (int x = 0; x < 10; x ++) {
Räknar ned den högra siffran.
Eftersom detta är inuti andra loop,
det räknar ned med 10 tio gånger
rightnumber = 9 - x;
Denna loop visar siffrorna och kontrollerar knappen
Minska detta nummer för att göra det gå snabbare
för (int y = 0; y < 50; y) {
Ta en knapp läsning
int läsa = digitalRead(buttonPin);
Kontrollera om du bara tryckt på knappen
(dvs. indata gick från låg till hög), och du har väntat
tillräckligt länge sedan den senaste pressen att ignorera något buller:
Om tillståndet i den switchen har förändrats, på grund av att
pressade eller en falsk kontakt, sedan återställa debounce timern
om (läsa! = lastButtonState) {
lastDebounceTime = millis();
}
Om den aktuella behandlingen är bortom debounce förseningen
ställa in knappen till den aktuella behandlingen
om ((millis()-lastDebounceTime) > debounceDelay) {
buttonState = behandlingen.
}
Om den nuvarande och den tidigare staten inte matchar
och det aktuella läget anger att knappen trycks.
Vänd sedan tillståndet för variabeln "pressade" (till sant eller falskt)
och öka räknaren knappen push
om (buttonState! = previousState) {
IF(buttonState == 1) {
tryckte =! pressade,
buttonPushCounter ++;
}
}
Om du trycker på knappen är sant
då displayen är pausad och slutar räknar
om (tryckte == true) {
Visar den vänstra siffran
digitalWrite (9, 1);
digitalWrite (10, 0);
lightUpDigit(leftnumber);
Delay(10);
Visar den rätt siffran
digitalWrite (9, 0);
digitalWrite (10, 1);
lightUpDigit(rightnumber);
Delay(10);
}
Annars, om staten inte är sant
displayen återupptar visar nedräkningen
annat {
digitalWrite (9, 1);
digitalWrite (10, 0);
lightUpDigit(leftnumber);
Delay(10);
digitalWrite (9, 0);
digitalWrite (10, 1);
lightUpDigit(rightnumber);
Delay(10);
y = y + 1.
}
Uppdatera previousState variabeln för nästa loopen
previousState = buttonState;
Uppdatera lastButtonState variabeln för nästa loopen
lastButtonState = behandlingen.
Om båda siffror lika med noll, stoppa räknaren, flash-00 och pip
medan (leftnumber == 0 & & rightnumber == 0) {
Anropar timesup rutin och kör tills knappen trycks och timer återställa
timesUp();
}
Om knappen är intryckt 3 gånger under en sekund
återställa programmet
om (buttonPushCounter > 2) {
buttonPushCounter = 0;
hemkomst.
}
}
Återställer knapp tryck på räkningen efter 1 sekund
buttonPushCounter = 0;
}
}
}
Den här funktionen körs över och över när tiden går ut
Bara att trycka på den röda knappen gör detta stopp
void timesUp() {
Ett pip på
analogWrite (11, 20);
Display "00" 1/2 sekund
för (int z = 0, z < 25, z ++) {
digitalWrite (9, 1);
digitalWrite (10, 0);
lightUpDigit(0);
Delay(10);
digitalWrite (9, 0);
digitalWrite (10, 1);
lightUpDigit(0);
Delay(10);
Nollställa räknaren om du trycker på knappen
och inaktivera display och ljudsignal
IF(digitalRead(buttonPin) == 1) {
tryckte = sant;
leftnumber = 9;
rightnumber = 9;
analogWrite (11, 0);
digitalWrite (9, 1);
digitalWrite (10, 1);
Delay(2000);
hemkomst.
}
}
Beep off
analogWrite (11, 0);
Visa off 1/2 sekund
för (int z = 0, z < 25, z ++) {
digitalWrite (9, 1);
digitalWrite (10, 0);
lightUpDigit(10);
Delay(10);
digitalWrite (9, 0);
digitalWrite (10, 1);
lightUpDigit(10);
Delay(10);
Nollställa räknaren om du trycker på knappen
IF(digitalRead(buttonPin) == 1) {
tryckte = sant;
leftnumber = 9;
rightnumber = 9;
Delay(2000);
hemkomst.
}
}
}
Denna funktion har ett case-uttryck
som fastställer stiften högt eller lågt,
och skärmar varje av siffrorna.
void lightUpDigit (int DisplayNumber) {
växel (DisplayNumber) {
fall 0:
digitalWrite (2, 1);
digitalWrite (3, 1);
digitalWrite (4, 1);
digitalWrite (5, 1);
digitalWrite (6, 0);
digitalWrite (7, 1);
digitalWrite (8, 1);
bryta;
fall 1:
digitalWrite (2, 1);
digitalWrite (3, 0);
digitalWrite (4, 1);
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (7, 0);
digitalWrite (8, 0);
bryta;
fall 2:
digitalWrite (2, 1);
digitalWrite (3, 1);
digitalWrite (4, 0);
digitalWrite (5, 0);
digitalWrite (6, 1);
digitalWrite (7, 1);
digitalWrite (8, 1);
bryta;
fall 3:
digitalWrite (2, 1);
digitalWrite (3, 1);
digitalWrite (4, 1);
digitalWrite (5, 0);
digitalWrite (6, 1);
digitalWrite (7, 1);
digitalWrite (8, 0);
bryta;
fall 4:
digitalWrite (2, 1);
digitalWrite (3, 0);
digitalWrite (4, 1);
digitalWrite (5, 1);
digitalWrite (6, 1);
digitalWrite (7, 0);
digitalWrite (8, 0);
bryta;
fall 5:
digitalWrite (2, 0);
digitalWrite (3, 1);
digitalWrite (4, 1);
digitalWrite (5, 1);
digitalWrite (6, 1);
digitalWrite (7, 1);
digitalWrite (8, 0);
bryta;
fall 6:
digitalWrite (2, 0);
digitalWrite (3, 1);
digitalWrite (4, 1);
digitalWrite (5, 1);
digitalWrite (6, 1);
digitalWrite (7, 1);
digitalWrite (8, 1);
bryta;
fall 7:
digitalWrite (2, 1);
digitalWrite (3, 1);
digitalWrite (4, 1);
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (7, 0);
digitalWrite (8, 0);
bryta;
mål 8:
digitalWrite (2, 1);
digitalWrite (3, 1);
digitalWrite (4, 1);
digitalWrite (5, 1);
digitalWrite (6, 1);
digitalWrite (7, 1);
digitalWrite (8, 1);
bryta;
mål 9:
digitalWrite (2, 1);
digitalWrite (3, 1);
digitalWrite (4, 1);
digitalWrite (5, 1);
digitalWrite (6, 1);
digitalWrite (7, 1);
digitalWrite (8, 0);
bryta;
mål 10:
digitalWrite (2, 0);
digitalWrite (3, 0);
digitalWrite (4, 0);
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (7, 0);
digitalWrite (8, 0);
bryta;
}
}