Timer durch Taster starten

Moin Moin,

ich bin ziemlich neu in der Materie, nur so vorne weg. :slight_smile:

Zu meinem kleinen Projekt:

Ich habe ein 4zeiliges LCD Display, welches ich schon angesteuert bekomme :slight_smile:

Auf diesem LCD soll ein Timer von 3 Minuten ablaufen nachdem ein Taster(T1) gedrĂĽckt wird.
Wenn der Timer abgelaufen ist, soll das Programm wieder auf den nächsten Tastendruck warten.
Wird während des Ablaufens des Timers die Stopptaste(T2) gedrückt, soll der Timer auf 00:00:00 gehen, und nach kurzer Zeit wieder auf den Startbildschirm wo dann nach drücken von (T1) der Timer wieder startet.

Einen Timer habe ich gefunden, der dem gut entspricht was ich mir vorstelle, nur leider irritieren mich die "void" Befehle und das mit dem Taster ansprechen funzt auch leider nicht so richtig.

Das ist mein Code:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//www.brilliantlyeasy.com/

int hours = 0; // start hours
int minutes = 3; //start min
int seconds = 0; //start seconds

//LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //<--removed- Different LCD manufacture
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);;//Pin Code for Arduino SainSmart LCD 1602 KeyPad

void setup() {
}

void loop() {
lcd.begin(20, 4);
lcd.setCursor (1, 0);
lcd.print("Bauteil");
lcd.setCursor (3, 1);
lcd.print("Nr.");
lcd.setCursor (4, 2);
lcd.print("(1) START");
lcd.setCursor (4, 3);
lcd.print("(2) STOPP");
delay(2000);
lcd.clear();

// lcd.scrollDisplayLeft();
// wait a bit:

lcd.setCursor (1, 0);
lcd.print("ATP Backshot Valve ");
lcd.setCursor (3, 1);
lcd.print("GLS31-001-0000");
lcd.setCursor (2, 2);
lcd.print("Pruefung laeuft");
lcd.setCursor (4, 3);
while (hours > 0 || minutes > 0 || seconds >= 0) {

lcd.setCursor(5, 3);

(hours < 10) ? lcd.print("0") : NULL;
lcd.print(hours);
lcd.print(":");
(minutes < 10) ? lcd.print("0") : NULL;
lcd.print(minutes);
lcd.print(":");
(seconds < 10) ? lcd.print("0") : NULL;
lcd.print(seconds);
lcd.display();
stepDown();
delay(1000);
}
}

void stepDown() {
if (seconds > 0) {
seconds -= 1;
} else {
if (minutes > 0) {
seconds = 59;
minutes -= 1;
} else {
if (hours > 0) {
seconds = 59;
minutes = 59;
hours -= 1;
} else {
trigger();
}
}
}
}

void trigger() {
lcd.clear(); // clears the screen and buffer
lcd.setCursor(5, 1); // set timer position on lcd for end.

lcd.print("END");
delay(1000);

lcd.display();
}

Vielen Dank schonmal fĂĽr eure Hilfe.

Simon

nur leider irritieren mich die "void" Befehle

Void ist kein Befehl, sondern ein Datentype!
Void bedeutet soviel wie "nicht vorhanden", oder "unbestimmt"

Zu deinem Code:
Nutze bitte die Code BBCode Tags.
Zu finden oben links in diesem Editor der "</>" Button

Und, delay() gefällt mir da nicht.

und wie verhält sich dann der Datentype "void"?
Er wird ja als Variable oder wie ein Unterprogramm genutzt oder habe ich das aus dem Code falsch gelesen?

und welches delay() gefällt dir nicht und wieso nicht?

Wenn du sowieso keine Taster einliest, ist das mit dem delay erstmal egal :wink:

Ansonsten sorgt delay(1000); dafür, dass eine ganze Sekunde lang gar nichts passiert, und du in der Zeit Taster drücken könntest soviel du willst, ohne dass das bemerkt würde. (nicht sehr benutzerfreundlich)

void loop() ist eine Funktion die nichts zurückliefert ( daher "void" ), der Name soll dir suggerieren, dass du dafür sorgen solltest, dass diese Funktion auch wirklich so oft wie möglich durchlaufen kann...

Deine anderen Funktionen haben auch keinen RĂĽckgabewert und sind deshalb als Datentyp void definiert...

Dasvor dem Funktionsnamen ist der Rückgabewert der Funktion. Also wenn man z.B. den Wert einer Rechnung an die aufrufende Funktion zurückgeben möchte. Hier will man nichts zurückgeben. Also void.

Eine andere Funktion könnte so lauten:

int summe (int a, int b)
{
   return a + b;
}

Hat zwei Parameter a und b und addiert werden. Das Ergebnis wird zurĂĽck geliefert

Wie man Funktionen schreibt und was void bedeutet sind absolute Grundlagen die man wissen muss

Das mit den Taster ansprechen kann auch nicht funktionieren.
Diese hast du nicht definiert bzw. als Eingang eingerichtet.

Du solltest nicht einfach nur Code kopieren sondern auch die Basics lernen
Sieh dir mal die Beispiele in der IDE an, da siehst du auch, wie Taster eingerichtet und definiert werden.

Zudem musst du die Taster noch entprellen und denke auch an Pullup-Widerstände.

Und setze bitte deinen Sketch in Code-Tags, das wurde dir bereits mitgeteilt.

Moin,
vielen Dank fĂĽr eure Antworten.

Ich habe jetzt die Taster eingebaut und es funktioniert auch soweit schonmal wie es soll.
Wenn der Timer einmal auf 00:00:00 gelaufen ist und END eingeblendet wird, geht er nicht wieder in die Start postion, also an den Beginn des loop, so dass er quasi auf den nächsten Tastendruck wartet.

Habt ihr da nen Tipp fĂĽr mich?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 //www.brilliantlyeasy.com/ 

const int button1Pin = 2;
const int button2Pin = 3;

int hours = 0; // start hours
int minutes = 3; //start min
int seconds = 0; //start seconds
 
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //<--removed- Different LCD manufacture
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);;//Pin Code for Arduino SainSmart LCD 1602 KeyPad
 
void setup() {

pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);


 lcd.begin(20, 4);
 lcd.setCursor (1, 0);
 lcd.print("NAME");
lcd.setCursor (3, 1);
 lcd.print("NR.");
 lcd.setCursor (5, 2);
 lcd.print("(1) START");
  lcd.setCursor (5, 3);
 lcd.print("(2) STOPP");
   
}
 
void loop() 
{
 int button1State, button2State;


 button1State = digitalRead(button1Pin);
 button2State = digitalRead(button2Pin);

 if (((button1State == LOW))
 
 && !
 
 ((button2State == LOW)))
 
 {
  countDown();
  


delay(20);
}
}
 void countDown() {{
  

 lcd.clear();
 
 
 // lcd.scrollDisplayLeft();
 // wait a bit:

  lcd.setCursor (1, 0);
 lcd.print("NAME");
  lcd.setCursor (3, 1);
 lcd.print("NR.");
lcd.setCursor (2, 2);
 lcd.print("Pruefung laeuft");
lcd.setCursor (4, 3);


 while (hours > 0 || minutes > 0 || seconds >= 0) 
 {
 lcd.setCursor(5, 3);
 
 (hours < 10) ? lcd.print("0") : NULL;
 lcd.print(hours);
 lcd.print(":");
 (minutes < 10) ? lcd.print("0") : NULL;
 lcd.print(minutes);
 lcd.print(":");
 (seconds < 10) ? lcd.print("0") : NULL;
 lcd.print(seconds);
 lcd.display();
 stepDown();
 delay(1000);
 }
}
 }
void stepDown() {
 if (seconds > 0) {
 seconds -= 1;
 } else {
 if (minutes > 0) {
 seconds = 59;
 minutes -= 1;
 } else {
 if (hours > 0) {
 seconds = 59;
 minutes = 59;
 hours -= 1;
 } else {
 trigger();
 }
 }
 }
}
 
void trigger() {
 lcd.clear(); // clears the screen and buffer
 lcd.setCursor(5, 2); // set timer position on lcd for end.
 
 lcd.print("END");

 
}

also an den Beginn des loop, so dass er quasi auf den nächsten Tastendruck wartet.

Während die Zeit läuft, sollen deine Taster also tot sein?

Habt ihr da nen Tipp fĂĽr mich?

  • loop() heisst loop, weil du es in der Regel einfacher hast, wenn diese Funktion eine schnell durchlaufene Schleife bildet. (In der die meiste Zeit gar nichts gemacht wird, nur ab und zu mal eine andere Zeit angezeigt wird)

  • {{ und

}
}

sind entweder Mist oder schlecht formatiert. Erschweren allen (auch dir selbst) das Verständnis.

  • Ein Tastendruck-Ereignis ist in der Regel eher an einem Wechsel von LOW nach HIGH oder umgekehrt zu erkennen.

Letztlich soll noch ein bisschen mehr dazu kommen, wollte aber erstmal mit der Grundfunktion anfangen, d.h.

  • nach DrĂĽcken des Tasters T1 soll der Countdown runterzählen
  • nach DrĂĽcken des Tasters T2, egal wann soll der Timer auf 00:00:00 gehen
  • egal ob der Timer normal runtergelaufen ist oder durch T2 abgebrochen wurde, soll der Timer wieder "bereit" sein und durch T1 wieder starten.

später sollen dann noch Sensoren und eine Relaisplatte mit eingebaut werden, so dass der Timer erst startet nach Knopfdruck T1 und Sensor S1 HIGH ist.
Wie gesagt dass soll dann später folgen.

Wenn zwischenzeitig der Countdown unterbrochen werden soll, ist deine delay()-basierte Programmierung für die Tonne, das wurde dir schon zuvor gesagt. Schau dir mal das Beispiel blinkwithoutdelay an, hier wird mit der millis()-Funktion gearbeitet. Statt eine LED blinken zu lassen zählst du einfach an dieser Stelle deinen Countdown runter.
Und wenn du schon am neuschreiben bist: Formatierung des Codes ist nicht nur Optik, sondern trägt zum eigenen Verständnis bei. Sowohl bei dir als Einsteiger als auch bei externer Begutachtung durch uns. Kaum etwas ist nerviger als die geschweiften Klammern zu zählen...