Hallo Zusammen,
ich habe mir einen Sketch für einen Timer zusammen gebastetelt. Die Stopuhr hat zwei Timer. Leider bekomme ich keine gestartet und finde den Fehler nicht. Die Uhr soll starten sobald der Taster gedrückt wird. Allerdings passiert dies leider nicht. Das Display läufte, aber die Uhr startet nicht wenn der Taster gedrückt wird. Wo ist mein (Denk-)fehler? ![]()
Der Code ist noch nicht komplett. Bis jetzt habe ich nur die Funktion zum starten der Uhr eingebaut.
Auf dem seriellen monitor läuft die Uhr sofort
#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x27, 16, 2); //Hier wird festgelegt um was für einen Display es sich handelt. In diesem Fall eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x27. Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)"
int i = 0;
int TASTER_1 = 2;
int TASTER_2 = 3;
// Anzahl an Millisekunden, die das Programm nach Tastendruck wartet,
// bevor erneut ein Druck auf einen Taster ausgewertet wird.
const unsigned int BUTTON_DELAY = 300;
// Mehrdimensionales Array für Zeitmessung
// [0][0] = Start 1
// [0][1] = Start 2
// [1][0] = Ende 1
// [1][1] = Ende 2
unsigned long timer[2][2] = {{0, 0}, {0, 0}};
unsigned long buttonPressed[2] = {0, 0};
// TasterStatus sorgt für Start/Neustart
bool TasterStatus = true;
void setup()
{
lcd.init(); //Im Setup wird der LCD gestartet
lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus).
pinMode(2, INPUT);
pinMode(3, INPUT);
delay(500);
}
void loop() {
TASTER_1=digitalRead(2);
TASTER_2=digitalRead(3);
refreshLCD(getTimerDauer(0), getTimerDauer(1));
delay(50);
}
unsigned long getTimerDauer(int index){
unsigned long timerStart = timer[0][index]; // Startzeit für gewählten Timer ermitteln
unsigned long timerEnde = timer[1][index]==0 ? millis() : timer[1][index]; // Endzeit für gewählten Timer ermitteln
// wird die aktuelle Zeit als Endpunkt verwendet
return timerStart==0 ? 0 : timerEnde - timerStart; // Wenn Startzeit gesetzt ist, Differenz von Start- und Endzeit zurückgeben. Sonst 0.
}
void startTimer(int index){
timer[0][index] = millis(); // Startzeit des Timers setzen
}
void stopTimer(int index){
timer[1][index] = millis(); // Endzeit des Timers setzen
}
void resetTimer(int index){
timer[0][index] = 0; // Startpunkt für Timer zurücksetzen
timer[1][index] = 0; // Endpunkt für Timer zurücksetzen
}
void refreshLCD(unsigned long time1, unsigned long time2){
lcd.setCursor(0,0);
lcd.print("ROT : ");
printFormattedTime(time1);
lcd.setCursor(0,1);
lcd.print("BLAU: ");
printFormattedTime(time2);
}
void printFormattedTime(unsigned long timeInMs){
// Zeit in Millisekunden umrechnen in Stunden/Minuten/Sekunden
unsigned long sekunde = (timeInMs/1000) % 60;
unsigned long minute = (timeInMs/60000) % 60;
unsigned long stunde = (timeInMs/3600000) % 24;
Serial.print("Time: ");
Serial.println(timeInMs);
Serial.println(sekunde);
Serial.println(minute);
Serial.println(stunde);
char str1[12];
sprintf(str1, "%02ld:%02ld:%02ld", stunde, minute, sekunde );
lcd.print(str1);
}
void Taster(){
buttonPressed[i] = millis();
if (digitalRead(i) == HIGH
&& buttonPressed[i] + BUTTON_DELAY < millis()){
Serial.print("Start Timer ");
startTimer(i);
}
Serial.println(i);
}
boolean isTimerRunning(int index){
return timer[0][index] > 0 && timer[1][index] == 0; // Timer läuft, wenn Startzeit gesetzt, aber die Endzeit noch 0 ist.
}
boolean isTimerStopped(int index){
return timer[0][index] > 0 && timer[1][index] > 0; // Timer wurde gestoppt, wenn Startzeit und Endzeit gesetzt sind.
}

