/* Chronometer gemäss Aufgabe 2: * Start und Stop-Taste für Zeitmessung. Die gestoppte Zeit * wird jeweils bei Betätigung der Stop-Taste angezeigt. * Zusätzlich wird die beste seit Reset gemessene Zeit angezeigt. * Reset-Taste setzt alle Zeiten zurück. */ #include #include #include // create object of class LiquidCrytal_I22 and define parametes: LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Konstanten festlegen (für bessere Lesbarkeit des Codes): #define startPin 5 #define stopPin 4 #define resetPin 3 #define nextPin 2 #define debounce 100 // Folgende Variable speichert den Status der Zeitmessung bool timeRunning; // Folgende Variablen speichern die Zeiten in Millisekunden: unsigned long startTime; unsigned long currentTime; unsigned long stoppedTime; unsigned long bestTime; // Folgende Vraiablen dienen der Anzeige im Format MM:SS:HH: unsigned int minutes; unsigned int seconds; unsigned int hundreds; char timeString[] = "00:00:00"; void setup() { // Eingänge definieren: pinMode(startPin, INPUT_PULLUP); pinMode(stopPin, INPUT_PULLUP); pinMode(resetPin, INPUT_PULLUP); // Für Debugging: // pinMode(13, OUTPUT); // Serial.begin(9600); // Variablen definieren bzw. auf Initial-Werte setzen: timeRunning = 0; startTime = 0; currentTime = 0; stoppedTime = 0; bestTime = 3599990; // = 59:59:99 (MM:SS:HH) // Anzeige vorbereiten: lcd.begin(16,2); // initialize the lcd lcd.clear(); lcd.setCursor(0, 0); lcd.print("Jetzt:"); lcd.setCursor(0, 1); lcd.print("Beste:"); updateTimes(); } void loop() { if(timeRunning == 1){ currentTime = millis() - startTime; lcd.setCursor(8, 0); showTime(currentTime); } if (digitalRead(startPin) == LOW) { delay(debounce); startTime = millis(); stoppedTime = 0; currentTime = 0; timeRunning = 1; } if (digitalRead(stopPin) == LOW) { delay(debounce); stoppedTime = millis() - startTime; // Falls gestoppte Zeit kleiner als beste Zeit ODER falls beste Zeit = 0 (eben zurückgesetzt): if(stoppedTime < bestTime || bestTime == 0){ bestTime = stoppedTime; } updateTimes(); timeRunning = 0; } if(digitalRead(resetPin) == LOW) { stoppedTime = 0; bestTime = 0; updateTimes(); timeRunning = 0; } } void updateTimes(){ lcd.setCursor(8, 0); showTime(stoppedTime); lcd.setCursor(8, 1); showTime(bestTime); } void showTime(unsigned long timeMS){ // Minuten, Sekunden und Hundertstel berechnen: minutes = timeMS/60000; seconds = (timeMS-minutes*60000)/1000; hundreds = (timeMS-minutes*60000-seconds*1000)/10; // Werte im gewünschten Format in Array timeString schreiben: sprintf(timeString,"%02d:%02d:%02d", minutes, seconds, hundreds); // ...und ans LCD ausgeben: lcd.print(timeString); }