Zeitsteuerung mit Taster und LC-Display

Hi,

ich hätte da mal ein Problem.

Ich möchte eine Zeitsteuerung für ein Belichtungsgerät entwerfen. Ich habe auch schon ein Sketch geschrieben, allerdings hängt es bei mir ein wenig.

Eigentlich möchte ich eine Zeiteingabe via Taster. Einen für +Sekunden und einen für -Sekunden. Letztendlich einen für Start. Einen Stopptaster wäre optional. Vielleicht geht das mit über den Start-Taster. Einen Reset für Programmneustart habe ich auch verbaut.

Ich bin noch relativ am Anfang mit meinen Programmierkünsten. Bisher habe ich folgende Situation mit meinem Prorgamm:

Ich betätige Taster +Sekunden und die Zeit wird pro Tastendruck auf +1 Minute gestellt. Bei -Sekunden wird die Zeit zwar abgezogen, allerdings, je höher die Zeit, desto mehr wird abgezogen. Ich hätte gerne auch einen linearen Abzug.

Leider läuft das Programm auch mit Druck auf +Sekunden los. Möchte eigentlich erst mal eine reine Zeiteingabe und später einen Programmstart.

Hier mein Sketch:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const byte button1 = 10;
const byte button2 = 8;
const byte backgr = 9;
const byte relais = 7;

byte readbutton1 = 1;
byte readbutton2 = 1;

double time = 0;
double timeend = 0;
double secondsa = 0;
int secondsb = 0;
double secondsc = 0;
int minutes = 0;
double timebackgr = 0;
double mic = 0;

void setup() {
pinMode(button1, INPUT);
digitalWrite(button1, 1);
pinMode(button2, INPUT);
digitalWrite(button2, 1);
pinMode(backgr, OUTPUT);
digitalWrite(backgr, HIGH);
pinMode(relais, OUTPUT);
digitalWrite(relais, LOW);

lcd.begin(16, 2);
lcd.clear();

lcd.print(" Zeitsteuerung");
lcd.setCursor(0, 1);
lcd.print(" Belichtung");
delay(3000);

/lcd.clear();
lcd.print(“Plus Min. -->”);
lcd.setCursor(0, 1);
lcd.print(“Minus Min. -->”);
delay(5000);
/

lcd.clear();
}

void loop() {
secondsa = timeend / 1000000;
minutes = secondsa / 60;
secondsc = minutes * 60;
secondsb = secondsa - secondsc;

lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);

if(minutes < 10){
lcd.print(“00”);
lcd.setCursor(1, 1);
}

lcd.print(minutes);
lcd.setCursor(2, 1);
lcd.print(":");
lcd.setCursor(3,1);
lcd.print(" ");
lcd.setCursor(3,1);

if(secondsb < 10){
lcd.print(“00”);
lcd.setCursor(4, 1);
}

lcd.print(secondsb);
delay(50);

if(time !=0){
lcd.setCursor(0, 0);
lcd.print("Countdown ");
timeend = time - micros();
mic = micros();
if(timebackgr < mic){
analogWrite(backgr, 60);
}

while(timeend <= 0){
lcd.setCursor(0, 0);
lcd.print("Fertig! ");
digitalWrite(relais, LOW);
delay(500);
digitalWrite(backgr, LOW);
delay(500);
digitalWrite(backgr, HIGH);
}
}

readbutton1 = digitalRead(button1);
readbutton2 = digitalRead(button2);
if(readbutton1 == LOW){
delay(50);
digitalWrite(backgr, HIGH);
digitalWrite(relais, HIGH);

if(time == 0){
time = time + micros();
timeset1();
}

mic = micros();
if(timebackgr > mic){
timeset1();
}
timebackgr = micros() + 2000000;
readbutton1 = digitalRead(button1);
while(readbutton1 == LOW){
readbutton1 = digitalRead(button1);
delay(50);
}
}
if(readbutton2 == LOW){
delay(50);
digitalWrite(backgr, HIGH);

if(time > 1){
time = time - micros();
timeset2();
}
mic = micros();
if(timebackgr > mic){
timeset2();
}
timebackgr = micros() + 2000000;
readbutton2 = digitalRead(button2);
while(readbutton2 == LOW){
readbutton2 = digitalRead(button2);
delay(50);
}
}

}

void timeset1(){
if(time < 600000000){
time = time + 60000000;
}else{
lcd.setCursor(0,0);
lcd.print(“Maximale Zeit”);
delay(1500);
}
}
void timeset2(){
if(time > 1000){
time = time - 1000;
}else{
lcd.setCursor(0,0);
lcd.print(“Minimale Zeit”);
delay(1500);
}
}

Danke schonmal.

Gruß Mike

vernom: Ich möchte eine Zeitsteuerung für ein Belichtungsgerät entwerfen. ...

Was die Einstellung der Zeit(en) angeht: Ich habe mir vor >30 Jahren mal eine Belichtungsschaltuhr für/mit C64 gebaut und die Zeitwahl so gemacht (erscheint mir sinnvoller als Dein Weg): Zwei Tasten für +/- (Sekunden), zwei Tasten, um die Zeit zu verdoppeln oder zu halbieren und eine Taste, um die Belichtung auzulösen. IMO kommt man so schneller zu den Zeiten, die man benötigt.

HTH

Gregor

vernom:
Ich möchte eine Zeitsteuerung für ein Belichtungsgerät entwerfen. Ich habe auch schon ein Sketch geschrieben, allerdings hängt es bei mir ein wenig.

Eigentlich möchte ich eine Zeiteingabe via Taster. Einen für +Sekunden und einen für -Sekunden. Letztendlich einen für Start. Einen Stopptaster wäre optional. Vielleicht geht das mit über den Start-Taster. Einen Reset für Programmneustart habe ich auch verbaut.

Kann es sein, dass Du nicht nur eine Zeit einstellen möchtest, sondern ZWEI verschiedene Zeiten (“Maximale Zeit”, “Minimale Zeit”), und jede dieser beiden Zeiten soll plus und minus einstellbar sein, und das mit nur zwei Buttons?

Kannst Du mal die gewünschte Logik beim Betätigen der beiden Buttons skizzieren, wie mit diesen Buttons die beiden Zeiten eingestellt und nebenbei auch noch der Start von irgendeiner anderen Funktion bewerkstelligt werden soll?

Und kannst Du mir mal erklären, weshalb Du da so eine bombastische loop()-Funktion fabrizierst hast, und es in Deinem Programm weder eine saubere Struktur noch eine gewisse Übersichtlichkeit gibt, wie es z.B. mit einer solchen loop-Funktion der Fall wäre:

void loop()
{
  eingabe();
  verarbeitung();
  ausgabe();
}

mit drei selbstgeschriebenen Funktionen, die reihum in der loop() aufgerufen werden?

Hallo,

nein, die Min. Zeit und die Max. Zeit sind Grenzwerte, die durch die Betätigung der Taster nicht über bzw. unterschritten werden sollen. D.h. ich kann mit dem Max-Taster nicht über 10 Min. heraus und mit dem Min-Taster nicht unter 10 Sekunden.

Ich habe drei Taster zur Verfügung. Ein Min-Zeit, ein Max-Zeit und ein Start/ Stopp.

Das ist optional...

Ja es ist wirklich sehr chaotisch. Ich setze mich da nochmal ran. Mir fehlt leider die Gewisse Logik, ob ich einige Funktionen in eigene loop()-Schleifen setzen kann..

Danke schonmal

Du kannst auch mit einem Menü arbeiten und von da aus in die von jurs beschriebenen Funktionen springen.

Menüvorschläge gibt es genügend im Web.

vernom: ... Ich setze mich da nochmal ran. ...

Das ist zumindest nicht verkehrt :-)

Wenn ich solche Sachen mache, fällt mir meistens zuerst auch irgendeine Superluxusversion ein, die im Laufe der Zeit aber heftig zurechtgestutzt wird. Letztlich ist es in jeder Hinsicht einfacher, nur mit dem zurechtzukommen, was man unbedingt braucht (wenig Teile, einfach erreichbare Funktionen usw.). Da etwas mit Menü zu machen, halt ich für weit übertrieben.

Gruß

Gregor

vernom:
Mir fehlt leider die Gewisse Logik, ob ich einige Funktionen in eigene loop()-Schleifen setzen kann…

Das geht aber def. nicht. Es gibt nur eine Loop.
Alles andere sind Funktionen, oder auch “For-Schleifen”, die du aber sicher nicht meinst.

@gregorss
Was da Menü betrifft, hängt sehr davon ab, was man letztendlich alles damit machen möchte. In jedem Fall ist die Anwendung dadurch nach oben offen, und es wird von der Bedienung her übersichtlicher.

Aber letztendlich muss das jeder für sich entscheiden.

HotSystems: @gregorss Was da Menü betrifft, hängt sehr davon ab, was man letztendlich alles damit machen möchte. In jedem Fall ist die Anwendung dadurch nach oben offen, und es wird von der Bedienung her übersichtlicher.

„Nach oben offen“, ja, aber was soll an einer Belichtungssteuerung denn noch obendrauf kommen? Eine Eismaschine? :-))

HotSystems: Aber letztendlich muss das jeder für sich entscheiden.

Sowieso.

Gruß

Gregor

gregorss: „Nach oben offen“, ja, aber was soll an einer Belichtungssteuerung denn noch obendrauf kommen? Eine Eismaschine? :-))

Da kannst du mal sehen, wie flexibel es mit einem Menü wird.

Und ich wollte erst schreiben, da kann man alles mit erschlagen.

Jetzt möchte ich aber deinen Kommentar lesen. :grin:

vernom: nein, die Min. Zeit und die Max. Zeit sind Grenzwerte, die durch die Betätigung der Taster nicht über bzw. unterschritten werden sollen. D.h. ich kann mit dem Max-Taster nicht über 10 Min. heraus und mit dem Min-Taster nicht unter 10 Sekunden.

Ich habe drei Taster zur Verfügung. Ein Min-Zeit, ein Max-Zeit und ein Start/ Stopp.

Ach so. Dann beschreibe mal im Detail, was für Zeiten Du wie genau einstellen möchtest.

Offenbar gar nicht sekundengenau, sondern in Sprügen? Nur diese Zeiten einstellbar 00:10 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 09:00 10:00

Und dann ein mit einem dritten Button startbarer Countdown, der bis 00:00 rückwärts zählt?

Wenn ich genau wüßte, was da wie eingestellt werden soll, könnte ich ggf. mal das Programmbeispiel von Antwort #2 etwas weiter ausarbeiten. Momentan ist mir das nicht ganz klar mit den einstellbaren Werten, und welche Werte einstellbar sein sollen, wenn keine sekundengenaue Einstellung gewünscht wird.

Am Besten wäre es, wenn ich die Zeit in 10 Sekunden-Schritte einstellen könnte.

Deine Idee war es doch auch die einzelnen Funktionen auszulagern und in der Loop() wieder auf zu rufen?!

Zur besseren Strukturierung allemahl besser als mein Sketch.

Ich habe grad das Problem, dass ich nicht weiß, wie ich die "Countdown" Funktion am einfachsten beschreibe. Wieso muss ich denn alles in µSekunden "rechnen"?

"Und dann ein mit einem dritten Button startbarer Countdown, der bis 00:00 rückwärts zählt?"

-Genau, Ein Knopf für Start/ Stopp

Hallo,
ich bin nicht der große Programmierer, ich hab´s gern einfach und verständlich.
Wenn Du gerade mit dem Arduino anfängst, DANN GEWÖHNE ES DIR AB- delay() ZU
BENUTZEN!!
Mit delay() macht der Arduino genau- NICHTS! Der hängt dort dann so in der
Gegend rum. Vergesse delay, ganz schnell.

Wenn Du etwas nicht- zeitkritisches machen möchtest, dann benutze nicht
micros() sonder millis() sind hier üblich.

Ich habe Dir einmal einen Sketch angehängt, der über zwei Taster rauf/runter
zählt. Hier bis 24.

“buttonPresses” liefert Dir einen Wert X

Nimmst Du z.B. buttonPresses*1000 dann sind es millis()

Beispiel: buttonPresses = 7
buttonPresses * 1000 gleich 7000 gleich 7000 millis() gleich 7 Sekunden

Die Einheiten dafür mußt Du selbst festlegen.

Wenn Du jetzt noch eine StartTaste hast, dann könnte beim betätigen folgendes
passieren:

Wenn StartTaste gedrückt
Zeit = millis() + buttonPresses

wenn millis() == Zeit
dann ist die eingestellte Zeit abgelaufen- mach was.
Du kannst den Sketch ja mal probieren.
Gruß und Spaß
Andreas

/* * Tastendrücke zählen */   
int switchPinV = 26;
int switchPinR = 28;// Schalter ist mit Pin
int val;                                // Variable für den Pin Zustand 
int buttonState;                        // Variable für den letzten Schalterzustand 
int buttonPresses = 0;                  // Wie oft ist der Schalter gedrückt

int valS28;                                // Variable für den Pin Zustand 
int buttonStateS28;                        // Variable für den letzten Schalterzustand 
int buttonPressesS28 = 0;                  // Wie oft ist der Schalter gedrückt   
                // Wie oft ist der Schalter gedrückt  

const int LED = 13;



void setup() 

{
pinMode(LED, OUTPUT);

digitalWrite(LED, LOW);

 pinMode(switchPinV, INPUT);           
pinMode(switchPinR, INPUT); 
Serial.begin(19200);                     
buttonState = (digitalRead(switchPinV));

}    
void loop()
{ 
 val = (digitalRead(switchPinV));

if (val != buttonState) 
{                                      
if (val == LOW) 
{

buttonPresses++;
if (buttonPresses > 23)
{(buttonPresses = 0);}



Serial.print("Schalter wurde "); 
Serial.print(buttonPresses);

Serial.println(" gedrueckt"); }
} buttonState = val;

 valS28 = (digitalRead(switchPinR));
buttonPressesS28=buttonPresses;
if (valS28 != buttonStateS28) 
{                                      
if (valS28 == LOW) 
{

if (buttonPresses < 1)
{(buttonPresses = 24);} 

buttonPresses--;

Serial.print("Schalter S28 wurde "); 
Serial.print(buttonPresses);

Serial.println(" gedrueckt"); }
} buttonStateS28 = valS28;

HotSystems: Da kannst du mal sehen, wie flexibel es mit einem Menü wird.

Und ich wollte erst schreiben, da kann man alles mit erschlagen.

Ich bastle derzeit an einem Ding, das ein OLED-Display mit 128 x 64 Pixeln steuert. Da könnte man bestimmt was mit Fenstern und Maussteuerung machen :-)))

Gruß

Gregor

vernom:
Am Besten wäre es, wenn ich die Zeit in 10 Sekunden-Schritte einstellen könnte.

Deine Idee war es doch auch die einzelnen Funktionen auszulagern und in der Loop() wieder auf zu rufen?!

Zur besseren Strukturierung allemahl besser als mein Sketch.

So, hier dann der erste Schritt zur Verfeinerung des von mir oben geposteten Codes:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

struct button_t{byte pin; byte val; boolean pressed;};

const byte NUMBUTTONS=3;
button_t buttons[NUMBUTTONS]={ 
  {8},  // Pin-Nummer für Minus-Button
  {9},  // Pin-Nummer für Plus-Button
  {10}, // Pin-Nummer für Start-Button
};

long zeit=30000; // in Millisekunden

enum {EINSTELLEN, COUNTDOWN};
byte mode=EINSTELLEN;

void eingabe()
{
  static unsigned long lastTime;
  long now=millis();
  if (now-lastTime<5) return;
  lastTime=now;
  byte val;
  for (int i=0;i<NUMBUTTONS;i++)
  {
    val=!digitalRead(buttons[i].pin);
    if (val==HIGH && buttons[i].val==LOW) buttons[i].pressed=true;
    else buttons[i].pressed=false;
    buttons[i].val=val;
  }
}

void verarbeitung()
{
  if (buttons[0].pressed)
  {
    zeit-=10000L; // 10 Sekunden abziehen
    if (zeit<0) zeit=0;
  }
  if (buttons[1].pressed)
  {
    zeit+=10000L; // 10 Sekunden draufschlagen
    if (zeit>600000L) zeit=600000L;
  }
}

void ausgabe()
{
  int seconds=zeit/1000;
  int minutes=seconds/60;
  seconds=seconds%60;
  char buf[17];
  snprintf(buf,sizeof(buf),"%02d:%02d",minutes,seconds);
  lcd.setCursor(0,0);
  lcd.print(buf);
}


void setup() 
{
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print(" Zeitsteuerung");
  lcd.setCursor(0, 1);
  lcd.print("   Belichtung");  
  delay(3000);
  lcd.clear();
  for (int i=0;i<NUMBUTTONS;i++)
  {
    pinMode(buttons[i].pin,INPUT_PULLUP);
  }
  eingabe();
}

void loop() 
{
  eingabe();
  verarbeitung();
  ausgabe();
}

Folgendes sollte funktionieren:

  • Abfragen von drei Buttons (Plus-Button, Minus-Button, Start-Button)
  • Bei gedrücktem Plus-Button: +10 Sekunden
  • Bei gedrücktem Minus-Button: -10 Sekunden
  • Aktualisierung der LCD-Anzeige
  • Bei gedrücktem Start-Button: passiert noch nichts

Die Zeit wird in Millisekunden gerechnet, und zum Anzeigen im mm:ss Format werden die Millisekunden abgeschnitten und Minuten:Sekunden angezeig.

Wenn Du das mit dem Einstellen soweit ans Laufen bekommst, wäre als nächstes dann die Auswertung des Start-Buttons und der Countdown an der Reihe.

Stichwort: “Schrittweise Verfeinerung”.

Wenn nicht mal das Einstellen Deines Zeit-Startwertes wie gewünscht funktioniert, brauchst Du gar nicht erst versuchen, einen Countdown für einen nicht funktionierenden Startwert zu programmieren. Immer schön eins nach dem anderen.

Die Funktion ist wie folgt:
eingabe() ==> Abfragen, ob und welche Taste gedrückt wird
verarbeitung() ==> je nach Eingabe Zeit entweder draufschlagen oder abziehen
ausgabe() ==> LCD Anzeige aktualisieren

jurs: So, hier dann der erste Schritt zur Verfeinerung des von mir oben geposteten Codes: ...

Oh, Du programmierst auf Zuruf? Das muss ich mir merken :-)

Gruß

Gregor

gregorss: Oh, Du programmierst auf Zuruf? Das muss ich mir merken :-)

It depends on. :wink:

@ jurs:

Das funktioniert schonmal ;-) Danke.

Was bedeutet das große 'L' hinter den Millisekunden?

Im großen und ganzen verstehe ich was du geschrieben hast. Manche Dinge sind mir unklar, wie man darauf kommt. :o

Ich hatte einfach zu wenig C++ Vorlesung....

EDTIT: Wenn ich die Zeit einstelle, bspw. auf 10 Min, möchte aber zurück auf 5 Min, macht das Programm -30 Sek. Schritte, ab 05:30 springt er bei erneutem Drücken auf 'Minus' auf 05:10. Ist jetz nicht schlimm, nur verwirrend.

vernom:
@ jurs:

Das funktioniert schonmal :wink: Danke.

OK, dann kann man darauf aufbauen.

vernom:
Was bedeutet das große ‘L’ hinter den Millisekunden?

Standard-Ganzzahlvariable bei C/C++ ist “int” und das ist bei den Atmegas ein 16-bit Integerwert mit sehr begrenztem Wertebereich. Das nachgestellte L hinter einer Ganzzahl-Konstanten bedeutet, dass diese Variable als “long” Ganzzahl mit deutlich größerem Wertebereich behandelt werden soll.

vernom:
EDTIT: Wenn ich die Zeit einstelle, bspw. auf 10 Min, möchte aber zurück auf 5 Min, macht das Programm -30 Sek. Schritte, ab 05:30 springt er bei erneutem Drücken auf ‘Minus’ auf 05:10. Ist jetz nicht schlimm, nur verwirrend.

Wenn das Programm nicht in 10-Sekunden-Schritten hoch- und runterzählt, dann prellt möglicherweise ein Schalter.

Bitte festen und wackelkontaktfreien Anschluss der Leitungen zu den Schaltern prüfen!

Und ggf. die Zeit zum Entprellen noch etwas höher setzen, obwohl diese mit 5 Millisekunden schon recht hoch ist. Vielleicht mal probieren:

if (now-lastTime<10) return;

Ändert sich dann etwas beim fehlerhaften Runterzählen?

Du hast hoffentlich auch nicht irgendeinen Button an einem Pin angeschlossen, der für irgendwas anderes bereits verwendet wird. Zum Beispiel: Viele LCDs haben eine Hintergrundbeleuchtung. Hat Dein LCD eine Hintergrundbeleuchtung? Wenn ja: An welchem Pin hängt die LCD-Hintergrundbeleuchtung?

Ansonsten müßte man nach einem Fehler in der Programmlogik suchen.

jurs:
Ansonsten müßte man nach einem Fehler in der Programmlogik suchen.

Die “eingabe()” Funktion zum Abfragen der drei Buttons enthielt tatsächlich einen Fehler: Der “gedrückt” Status der Buttons wurde beim Entprellen nicht gelöscht.

Anbei die korrigierte Eingabefunktion, zusammen mit der gesamten Programmlogik für den Countdown.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

struct button_t{byte pin; byte val; boolean pressed;};

const byte NUMBUTTONS=3;
button_t buttons[NUMBUTTONS]={ 
  {8},  // Pin-Nummer für Minus-Button
  {9},  // Pin-Nummer für Plus-Button
  {10}, // Pin-Nummer für Start-Button
};

const long defaultZeit=30000L;
long zeit=defaultZeit; // in Millisekunden

enum {EINSTELLEN, COUNTDOWN};
byte mode=EINSTELLEN;

void eingabe()
{
  static unsigned long lastTime;
  long now=millis();
  for (int i=0;i<NUMBUTTONS;i++) buttons[i].pressed=false;
  if (now-lastTime<5) return;
  lastTime=now;
  byte val;
  for (int i=0;i<NUMBUTTONS;i++)
  {
    val=!digitalRead(buttons[i].pin);
    if (val==HIGH && buttons[i].val==LOW) buttons[i].pressed=true;
    buttons[i].val=val;
  }
}

void verarbeitungEinstellen()
{
  if (buttons[0].pressed)
  {
    zeit-=10000L; // 1ß Sekunden abziehen
    if (zeit<0) zeit=0;
  }
  if (buttons[1].pressed)
  {
    zeit+=10000L; // 1ß Sekunden draufschlagen
    if (zeit>600000L) zeit=600000L;
  }
}


unsigned long countDownStart;

void verarbeitungCountDown()
{
  long diff=millis()-countDownStart;
  if (diff==0) return;
  countDownStart+=diff;
  zeit-=diff;
  if (zeit>0) return;
  zeit=defaultZeit;
  mode=EINSTELLEN;
}

void verarbeitung()
{
  if (buttons[2].pressed) // Start-Button gedrückt: Wechsel zwischen EINSTELLEN und COUNTDOWN
  {
    if (mode==EINSTELLEN)
    {
      countDownStart=millis();
      mode=COUNTDOWN;
    }
    else mode=EINSTELLEN;
  }
  else if (mode==EINSTELLEN) verarbeitungEinstellen();
  else if (mode==COUNTDOWN) verarbeitungCountDown();
}



void ausgabe()
{
  int seconds=zeit/1000;
  int minutes=seconds/60;
  seconds=seconds%60;
  char buf[17];
  snprintf(buf,sizeof(buf),"%02d:%02d",minutes,seconds);
  lcd.setCursor(0,0);
  lcd.print(buf);
  lcd.setCursor(0,1);
  if (mode==EINSTELLEN) lcd.print("Einstellen");
  else if (mode==COUNTDOWN) lcd.print("Countdown ");
}

void setup() 
{
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print(" Zeitsteuerung");
  lcd.setCursor(0, 1);
  lcd.print("   Belichtung");  
  delay(3000);
  lcd.clear();
  for (int i=0;i<NUMBUTTONS;i++)
  {
    pinMode(buttons[i].pin,INPUT_PULLUP);
  }
  eingabe();
}

void loop() 
{
  eingabe();
  verarbeitung();
  ausgabe();
}

Viel Spass damit!

Ich werde verrückt :astonished:

Vielen vielen Dank!!!

.. jetzt müsste ich nur noch durchblicken, wo ich die Funktion einbaue, dass mein Ausgang ausschaltet, wenn die Zeit rum ist. :-)

MfG

Mike