Stoppuhr auf LCD

Guten Abend liebes Forum,

ich habe folgendes Problem: Ich würde gerne eine Stoppuhr auf einem LC-Display anzeigen lassen. Am besten so einfach wie möglich, ohne viel Schnick Schnack und am besten ohne eine Bibliothek zu verwenden.
Gibt es da eine Möglichkeit?
Im Grunde so etwas wie eine For-Schleife nur ohne einen festen Endwert, sondern dass man einfach einen Taster drückt wenn es zu Ende sein soll. Gibt es da eine Möglichkeit?
Vielen dank schon mal!

Because...you like to reinvent the wheel and would like to do more than you strictly need to? No...because that is contrary to your other requirements. The straightforward way that best suits your situation is really to use libraries where it helps, and one of those things would be controlling the necessary display.

Sure, it's not a very complicated project and a nice way to get started with Arduino!

Keine Bibliothek verwenden zu wollen und am Besten so einfach wie möglich sind zwei sich ausschliessende Anforderungen, wenn man eine Stoppuhr auf einem LC-Display anzeigen lassen will.

Nicht wegen der Programmierung einer Stoppuhr oder der Abfrage von Tasten ... dafür braucht es keine Bibliothek. Aber die Ausgabe auf einem LCD ist keine ganz so triviale Angelegenheit.

Gibt es da eine Möglichkeit?

Wenn eine Library zum Ansteuern eines LCD erlaubt ist, ist der Rest tatsächlich eher eine kleine Fingerübung.

Gibt es denn schon eine Idee

Welches Arduino -Board infrage kommt?
Welches LCD genutzt werden soll (Ansteuerung über I2C oder über Parallelinterface)?

Sehr viel wurde bereits dazu geschrieben.
Wenn deine Stoppuhr keine große Genauigkeit benötigt, kannst du es mit millis() machen.
Da musst du keine extra Library einbinden.
Die Anzeige machst du dann auf einem Nextion-Display, auch dafür brauchst du keine Library.
Das Display steuerst du über UART (Serial) und verwendest dazu die Hardware-Serial.
Je nach verwendetem Controller ist das allerdings mit Einschränkungen verbunden.

Eine extra Schleife musst du auch nicht einsetzen, da hast du ja schon die loop(), die du dafür nutzen kannst.

Hallo,

ein übliches HD44780 16x2 LCD anzusteuern ist nur eine Fingerübung, kann man mit DigitalWrite() problemlos erledigen. Im 4Bit-Mode sind es auch nicht soviele Pins um die man sich kümmern muß.
Ist grundsätzlich eine gute Programmierübung ohne allzuviele Fallen.

Frzß aus Berlin
Michael

Ich habe mich tatsächlich sehr ungenau ausgedrückt...
Ich verwende einen Arduio Mega, und das HD44780 16x2 LCD mit dem I2C Modul.
Das ganze wird Teil eines größeren Projektes, und die Stoppuhr ist nur ein kleiner Teil davon. Sie soll mit einem Taster gestartet und mit dem selben Taster auch gestoppt werden. Während die Uhr läuft, soll die Zeit auf dem Display ausgegeben werden.
Ich möchte keine Library dafür verwenden, da ich alles selbst programmieren möchte. Außer natürlich die Library für das LCD, die habe ich verwendet.
Also ich möchte im Grunde nur auf einen Knopf drücken, dann zählt die Stoppuhr auf dem LCD hoch und beim erneuten drücken soll die Stoppuhr anhalten. Am besten sollte sie sekunden:millisekunden anzeigen können. Hat da jemand einen Rat? Stehe ein wenig auf dem Schlauch..
Bitte keine Rückfragen über den Sinn und Zweck davon.

Ja, steht doch schon geschrieben.
Verwende millis() und zeige diese ab Start bis Stopp auf dem Display an.

du wirst etwas brauchen um den Taster zu debouncen.
Hast du dir die Beispiele in der IDE dazu schon angesehen?

Wenn du einen Taster auslesen kannst:
Bei Tasterdruck

  • in einem uint32_t startMillis die aktuellen millis() merken,
  • ein flag setzen dass die Uhr läuft

Bei zweitem Tasterdruck

  • in einem uint32_t endMillis die aktuellen millis() merken
  • differenz ausrechnen,
  • auf LCD ausgeben
  • flag wieder zurücksetzen

dazwischen kannst du einfach die angelaufene Zeit mit startMillis - millis() ermitteln und am LCD ausgeben. Mit dem flag weist du ob die Stoppuhr läuft.

#include <LiquidCrystal.h>

const uint32_t MICROS_PER_TENTH = 100000UL;
uint32_t microsAtLastTenth = 0UL;
uint16_t days=0;
uint8_t hours=0, minutes=0, seconds=0, tenths=0;
bool countTime = false;

const uint8_t START_PIN = 2;
const uint8_t RESET_PIN = 3;
uint8_t previousState = HIGH;
char buf[20];

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

void setup() {
  lcd.begin(16, 2);
  pinMode(START_PIN, INPUT_PULLUP);
  pinMode(RESET_PIN, INPUT_PULLUP);
}

void loop() {

  // deal with start/stop button
  uint8_t currentState = digitalRead(START_PIN);
  if (currentState != previousState) {
    if (currentState == LOW) {
      // button just pressed
      countTime = !countTime;
    }
    previousState = currentState;
    delay(12); // debounce
  }

  // deal with reset button
  if (digitalRead(RESET_PIN)==LOW) {
    days = 0;
    hours = 0;
    minutes = 0;
    seconds = 0;
    tenths = 0;
    // no need to debounce
  }

  if ((micros() - microsAtLastTenth) >= MICROS_PER_TENTH) {
    // do the actual timekeeping
    microsAtLastTenth += MICROS_PER_TENTH;
    if (countTime) tenths++;
    if (tenths >= 10) {
      tenths -= 10;
      seconds++;
    }
    if (seconds >= 60) {
      seconds -= 60;
      minutes++; 
    }
    if (minutes >= 60) {
      minutes -= 60;
      hours++;
    }
    if (hours >= 24) {
      hours -= 24;
      days++;
    }
    
    // format time for display
    buf[0] = '0' + (days/10000);
    buf[1] = '0' + ((days/1000)%10);
    buf[2] = '0' + ((days/100)%10);
    buf[3] = '0' + ((days/10)%10);
    buf[4] = '0' + (days%10);
    buf[5] = 'd';
    buf[6] = '0' + (hours/10);
    buf[7] = '0' + (hours%10);
    buf[8] = ':';
    buf[9] = '0' + (minutes/10);
    buf[10] = '0' + (minutes%10);
    buf[11] = ':';
    buf[12] = '0' + (seconds/10);
    buf[13] = '0' + (seconds%10);
    buf[14] = '.';
    buf[15] = '0' + tenths;
    buf[16] = 0;

    // print the time
    lcd.setCursor(0,0);
    lcd.print(buf);
  }
}

Demo: sketch.ino - Wokwi Arduino and ESP32 Simulator

1 Like

Vielen dank für eure Hilfe. Hab das Programm welches @odometer dargestellt hat für mich angepasst und umgeschrieben und nun funktioniert alles und vorallem kann ich das alles auch nachvollziehen

@brja256

du kannst (du sollst) den Sketch von @odometer als Lösung markieren.
Helfer freuen sich über die Verwendung des Herzchens...

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.