Frage zu setTime(t)

Hallo,
ich bin neu hier im Forum und beschäftige mich seit ein paar Wochen zum ersten Mal mit Arduino.
Meine Programmiererfahrung beschränkt sich bisher auf ein bisschen Delphi vor über 10 Jahren.

Momentan sitze ich an einem sketch, der mir einfach nicht abschließend gelingen will.

über die time labrary lasse ich eine Uhr laufen. Die wird zu Beginn der Loop per setTime(0,0,0,1,1,1970) genullt. Da ich eh nur die Minuten und Sekunden als eine Art Stopuhr brauche, kümmert mich das Datum nicht weiter. Ein Counter verhindert, dass die Uhr erneut genullt werden kann.

Nun habe ich einen "Pause-Button", der die Zeit zwar nicht anhält, dafür aber die aktuelle Zeit auf dem Display "einfriert" und per time_t=now() die aktuelle Zeit speichert.
Wenn ich nun auf meinen "Weiter-Button" klicke, sollte die Zeit doch eigentlich durch setTime(t) auf die gespeicherte Zeit eingestellt werden. Stattdessen wird sie aber wieder genullt.
Was mache ich da falsch?
oder gibt es sogar eine Möglichkeit die Time-Funktion anzuhalten?

Grüße
Tobi

Bitte poste doch einfach mal Deinen Sketch, damit wir Dir helfen können. Du beschreibst ja nur, was Du machen willst und wir sehen nicht was Du tatsächlich gemacht hast :slight_smile:
Bitte auch die "code"-Tags verwenden, damit ist der Quellcode deutlich besser zu lesen.

Mario.

gut, ausgelacht wird hier ja hoffentich keiner, für seinen anfängermäßig-unnötig-kompliziert geschriebenen code! :slight_smile:

zur Erklärung: Der Sketch steuert das dfrobot lcd-shield (16x2) und ein 16-Kanal Relais-Board.
Das ganze soll wenn es fertig ist ein elektronisches Feuerwerks-Zündsystem werden.
Das elektronische Zündsystem existiert schon länger und wurde bisher einfach per knopfdruck für jeden einzelnen Kanal ausgelöst. In Zukunft soll es dann automatisiert ablaufen.
Sowas gibt es zwar für vergleichsweise wenig Geld auch fertig zu kaufen, aber wer fertige Lösungen bevorzugt, hält sich bestimmt nicht hier im Forum auf! :wink:

der code ist teilweise aus allen möglichen Quellen "zusammengeklaut" somit erklären sich die teilweise komischen bezeichnungen.
wenn erst mal alles läuft pass ich das dann noch an.
Wenn jemand allgemeine verbesserungstips hat, nehme ich die natürlich auch gerne an!!!

/*
  Feuerwerk
  Zündung
  
 */

int Kanal1 = 2;
int Kanal2 = 3;
int Kanal3 = 11;
int Kanal4 = 12;
int Kanal5 = 13;
int Kanal6 = A1;
int Kanal7 = A2;
int ModulA = A3;
int ModulB = A4;
int ModulC = A5;

int Kanal[21] ={Kanal1, Kanal2, Kanal3, Kanal4, Kanal5, Kanal6, Kanal7, Kanal1, Kanal2, Kanal3, Kanal4, Kanal5, Kanal6, Kanal7, Kanal1, Kanal2, Kanal3, Kanal4, Kanal5, Kanal6, Kanal7};
int Modul[21] ={ModulA, ModulA, ModulA, ModulA, ModulA, ModulA, ModulA, ModulB, ModulB, ModulB, ModulB, ModulB, ModulB, ModulB, ModulC, ModulC, ModulC, ModulC, ModulC, ModulC, ModulC};



 int i = 0;
 int zuendungen = 0;
 int anzahlzuender = 7;

int UhrenStart = 0;
int Start = 0;


#include <LiquidCrystal.h>
#include <Time.h>  

unsigned long prev_time1;
unsigned long prev_time2;   
unsigned long feuerdauer;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Define some values used by the LCD panel and buttons:
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5


unsigned int Ende = 0;
unsigned int Pause = 0;
unsigned int naechsterzuender = 1;
unsigned int Feuer = 1;

 time_t t;
 time_t dif;
 time_t z[7] ={5,10,15,20,25,30,35};


void setup() {               
  // initialize the digital pin as an output.
 
  lcd.begin(16, 2); 
  pinMode(Kanal1, OUTPUT); 
  pinMode(Kanal2, OUTPUT);
  pinMode(Kanal3, OUTPUT); 
  pinMode(Kanal4, OUTPUT); 
  pinMode(Kanal5, OUTPUT);
  pinMode(Kanal6, OUTPUT);
  pinMode(ModulA, OUTPUT);
  pinMode(ModulB, OUTPUT);
  pinMode(ModulC, OUTPUT);
 
 lcd.setCursor(0,0);             // 1st char in 1st line
 lcd.print("Start Show?");
 prev_time1=millis();
 
 


}

void loop() {


readButtons();
    
  if(adc_key_in < 790)   //Select-taste gedrückt
  {
  Start++;
  }
  
  if(Start >= 1 && Ende == 0)
  {
  if(UhrenStart == 0)
  {
  lcd.clear();
  setTime(0,0,0,1,1,1970);
  UhrenStart++;
  }
  if((millis()-prev_time1)>999 && Pause == 0)
  {  
  digitalUhrAnzeige(); // ruft Uhren-Subroutine im Sekeundentakt auf

  prev_time1=millis();
  
  }
  
  if (Pause == 0)
  {
  Feuerwerk();}   //Subroutine-Feuerwerk
  }
  
if (adc_key_in < 555)    //Left, bzw. PauseTaste
  {
   Pause = 1;
   time_t t = now();
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("mit Zuender ");
   lcd.setCursor(11,0);
   lcd.print("    ");
   lcd.print(Feuer);
   lcd.setCursor(0,1);
   lcd.print("weiter?");
   lcd.print(" ");
   printZiffernGenulltOhnePunkt(minute(t));
   printZiffernGenulltmitPunkt(second(t));
  }
  
if (adc_key_in < 50)    // Right, bzw. WeiterTaste
  {
  lcd.clear();
  Pause = 0;  
  setTime(t);
  lcd.setCursor(0, 1);
  lcd.print("        Zuender");
  lcd.print(Feuer);
  }   
  
if((millis()-prev_time2)>1000 && Pause == 0 && Ende ==0 && Start >= 1)
  {  
  Countdown(); // ruft Countdown-Subroutine im Sekeundentakt auf

  prev_time2=millis();
  
  }  
  
  }


 
void Feuerwerk()			 //Subroutine für Feuerwerk
{               
	 if(i == 0)
	{
	  lcd.setCursor(0, 1);
	  lcd.print("        Zuender");
	  lcd.print(Feuer);
    }
		
	
    if(now() == z[i] && zuendungen <= anzahlzuender)
	{
	  lcd.setCursor(0, 1);
	  lcd.print("Feuer");
	  lcd.print(Feuer);
      feuerdauer=millis();
      while(millis() - feuerdauer < 30)
      {
	  digitalWrite(Kanal[i], HIGH);
	  digitalWrite(Modul[i], HIGH);
	  }
        //schaltet nach 30ms Zündung aus
      digitalWrite(Kanal[i], LOW);
	  digitalWrite(Modul[i], LOW);
	  Feuer ++;
	  zuendungen ++;
	  i=i+1;
	  

    }

	if(now()==(z[i-1]+1))			//entfernt letztes Feuer und zeigt neues Feuer
	{					
      lcd.setCursor(0, 1);
	  lcd.print("        Zuender");
	  lcd.print(Feuer);
	  
	}

	
	if(now() == (z[(anzahlzuender-1)]+2))
	{					//entfernt letztes Feuer und zeigt neues Feuer
      lcd.setCursor(7,0);
	  lcd.print("   Ende  ");
	  lcd.setCursor(0, 1);
	  printZiffernGenulltOhnePunkt(Feuer);
	  lcd.print(" Zuendungen   ");
	  Ende++;
	} 
  
} 

void digitalUhrAnzeige() // definieren Subroutine
{
   // digitale Anzeige der Zeit
  
   lcd.setCursor(0, 0); // positionieren LCD-Cursor, 1. Zeile, 1. Spalte
   printZiffernGenulltOhnePunkt(minute()); // rufen Subroutine auf
   printZiffernGenulltmitPunkt(second()); // rufen Subroutine auf
}

void printZiffernGenulltOhnePunkt(int zahl) // definiert Subroutine
{
  // verschoenern Anzeige, indem wir ...
  if(zahl < 10) // wenn kleiner als 10 ...
   {
	 lcd.print("0");
   }
	lcd.print(zahl);
}

void printZiffernGenulltmitPunkt(int zahl) // definiert Subroutine
{
  // verschoenern Anzeige, indem wir ...
  lcd.print(":");
  if(zahl < 10) // wenn kleiner als 10 ...
  {
	lcd.print('0');
  }
 lcd.print(zahl);
}

void Countdown()
{
time_t dif=z[i]-now();
lcd.setCursor(11,0);
printZiffernGenulltOhnePunkt(dif);
}


void readButtons(){
// Read Buttons from analog port
lcd_key = read_LCD_buttons();    // read the buttons
switch (lcd_key)                         // perform button action
{

/*case btnRIGHT:
{
lcd.setCursor(11,0);
lcd.print("Pause");
break;
}
case btnLEFT:
{
lcd.setCursor(13,0);
lcd.print("LFT");
break;
}
case btnUP:
{
lcd.setCursor(13,0);
lcd.print("UP ");
break;
}
case btnDOWN:
{
lcd.setCursor(13,0);
lcd.print("DWN");
break;
}
case btnSELECT:
{
lcd.setCursor(11,0);
lcd.print("Start");
break;
}
case btnNONE:
{
lcd.setCursor(11,0);
lcd.print("     ");
break;
}*/
}   
}

// Read the buttons from analog interface:
int read_LCD_buttons()
{
adc_key_in = analogRead(0);      // read the value from the sensor
// my buttons when read are centered at these valies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50)   return btnRIGHT;
if (adc_key_in < 195)  return btnUP;
if (adc_key_in < 380)  return btnDOWN;
if (adc_key_in < 555)  return btnLEFT;
if (adc_key_in < 790)  return btnSELECT; 
return btnNONE;  // when all others fail, return this...
}

Nein, ausgelacht wird keiner. Wir haben alle mal angefangen (oder wieder angefangen :)), und so schlimm sieht der Code doch nicht aus. Die Struktur ist erkennbar und wenn man einige Dinge ein wenig umsortiert, wird es noch etwas übersichtlicher.
Ich fange einfach mal oben an.

1.) Includes am besten immer oben im Code eintragen, sonst besteht die Gefahr, das man Dinge schon verwendet die dann noch nicht vorhanden sind. "#include" ist für den Compiler ein reines Text ersetzen.
2.) Du definierst Dir einen Stapel int Variablen, die dann aber nur als "Platzhalter" in den Arrays verwendet werden. Das löst man besser mit den "#define" Regeln, denn auch hier ersetzt der Compiler wieder den Text und Du verschenkst keine 10x16 Byte für die Variablen. Die Übersicht bleibt trotzdem erhalten.

#define KANAL_1    2
#define KANAL_2    3
...
#define MODUL_C   A5

int Kanal[21] ={KANAL_1, KANAL_2 .... KANAL_7};
int Modul[21] ={MODUL_A, ... MODUL_C};

Solche Konstanten schreibt man in der Regel groß, damit man sie im Code gut von Variablen unterscheiden kann. Wichtig ist, das ein "#define" keine Variablenzuweisung ist, also kein "=" und auch kein ";" am Ende verwendet wird.

3.) In folgendem Abschnitt gibt es schon einen kleinen Logikfehler:

void loop() {

readButtons();
    
  if(adc_key_in < 790)   //Select-taste gedrückt
  {
  Start++;
  }

Du verwendest die Funktion "readButtons()", ohne deren Rückgabewert zu verwenden. Stattdessen greifst Du direkt auf die Variable "adc_key_in" zu. Das ist nicht falsch, aber unübersichtlich. Dadurch hast Du vermutlich übersehen, das Du nur auf "< 790" vergleichst. Das trifft aber für alle Tasten zu, nicht nur für die "select" Taste. Schau Dir dazu die Funktion "readButtons()" mal genauer an. Besser, übersichtlicher und damit lesbarer wäre vermutlich sowas wie

loop() {

    if(readButtons() == btnSELECT) {    // select-Taste gedrückt
        Start++;
    }

Das Problem hast Du im übrigen an allen Stellen Deines Codes. Hier würde ich als erstes "aufräumen".

4.) Das nächste ist diese Stelle:

  if (Pause == 0)
  {
  Feuerwerk();}   //Subroutine-Feuerwerk
  }

Hier steht hinter dem "Feuerwerk();" vermutlich fälschlicherweise eine "}" die den if(Pause==0) Block schliesst. Die folgende Klammer eine Zeile tiefer schliesst dann den umschliessenden Block und damit das "if(Start >= 1 && Ende == 0)" von viel weiter oben.

Ich persönlich habe mir folgende Schreibweise angewöhnt:

if ( BEDIGNUNG ) {
    CODE
    for ( SCHLEIFENKOPF) {
        CODE
        ...
    } // schleife ende
    ...
} // if ende

Also die öffnende Klammer eines Blocks hinter den öffnenden Befehl und die schliessende Klammer in eine eigene Zeile. Bei langen Codeblöcken am besten mit einem eindeutigen Kommentar, damit man die Klammer zuordnen kann. Die meisten Editoren oder IDEs können Klammern zuordnen, so sieht man gleich ob das passt oder nicht. Deinen Bug habe ich so auch gefunden.
Einrücken ist auch ganz wichtig bei komplexem Code. In der Regel reichen 4 Zeichen, 8 können bei vielen Schachtelungsebenen schon zu viel sein. Zeilen sollten nicht länger als 80 Zeichen werden. Nichts ist schlimmer als eine Zeile die umbricht und dann den Code unsleserlich macht.

Weiter habe ich erstmal nicht geschaut, evtl. reicht das ja schon, um Dich auf die richtige Spur zu bringen.

Grüße,
Mario.

Gerade noch gesehen. Da Du "adc_key_in" ja mehrmals verwendest, würde folgendes vermutlich noch besser funktionieren:

int button = 0;

...
setup() {
...
}

loop() {
    button = readButtons();

    if(button == btnSELECT) {
    ... 
    }

    ...

    if(button == btnDOWN) {
    ...
    }

}

Somit reicht es , die Tasten einmal am Anfang der loop zu lesen.

vielen Dank schon mal!

hab das mit den readButtons() schon mal angepasst, und auch auch auch die doppelte } hinter feuerwerk. Die Klammer war dort aber "halb" korrekt. denn die feuerwerk-routine sollte innerhalb der hauptrountine laufen. ich habe die Klammer jetzt sogar noch tiefer gesetzt, damit die pause- und weiter- funktionen auch umfasst sind.

ich passe den code noch ein wenig an und lade ihn dann noch mal hoch.

wär klasse wenn wir es noch schaffen, dass die Uhr nach dem drücken der "weiter" Taste tatsächlich wieder bei time(t) losläuft und nicht wieder bei 0....

So, hier ist nun der bereinigte und vollständig kommentierte Code.
Die Verbesserungsvorschläge von mkl0815 sind auch schon vollständig miteingeflossen.

Wer findet den Fehler, der die Uhr nach drücken auf "weiter" wieder auf 0 setzt? :astonished:

/*
  Feuerwerk
  Zündung
  
 */

#include <LiquidCrystal.h>
#include <Time.h>  

// Kanäle und Module für Zündung, 7 Kanäle auf 3 Modulen --> 21 Kanäle
#define KANAL_1    2
#define KANAL_2    3
#define KANAL_3	  11
#define KANAL_4   12
#define KANAL_5   13
#define KANAL_6   A1
#define KANAL_7   A2
#define MODUL_A   A3
#define MODUL_B   A4
#define MODUL_C   A5

int Kanal[21] =
{KANAL_1, KANAL_2, KANAL_3, KANAL_4, KANAL_5, KANAL_6, KANAL_7, KANAL_1, KANAL_2, KANAL_3, KANAL_4, KANAL_5, KANAL_6, KANAL_7, 
KANAL_1, KANAL_2, KANAL_3, KANAL_4, KANAL_5, KANAL_6, KANAL_7};

int Modul[21] =
{MODUL_A, MODUL_A, MODUL_A, MODUL_A, MODUL_A, MODUL_A, MODUL_A, MODUL_B, MODUL_B, MODUL_B, MODUL_B, MODUL_B, MODUL_B, MODUL_B, 
MODUL_C, MODUL_C, MODUL_C, MODUL_C, MODUL_C, MODUL_C, MODUL_C};

// Variablen die den Ablauf steuern
int i = 0;						// wird nach jeder Zündung erhöht
int anzahlzuender = 7;			// Anzahl der Kanäle die tatsächlich genutzt werden
int Start = 0;					// solange Wert 0 bleibt, läuft Loop nicht. Wird durch drücken des Startknopfs erhöht
int UhrenStart = 0;				// wird nach Start der Uhr erhöht und verhindert somit, dass die Uhr nicht noch einmal bei neu anfängt zu laufen
unsigned int Ende = 0;     		// sobald Wert 1 ist, wird Display gelöscht und Ende-Nachricht erstellt
unsigned int Pause = 0;			// solange 0 läuft die Feuerwerks-Routine, sobald 1 wird diese angehalten
unsigned int Feuer = 1;			// Variable um den jeweiligen Zünder auf dem Display zu bennenen, wird nach jeder Zündung erhöht


unsigned long prev_time;  		// wird für die Uhren und Countdown Routine benötigt

unsigned long feuerdauer;		// soll die die Zeit in der der jeweilige Pin auf HIGH steht begrenzen

// Werte für LCD-Display
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 	//Pins, die LCD ansteuern
int lcd_key     = 0;					// LCD-Buttons
int adc_key_in  = 0;					// Wert des analogen Eingangs der die Displayknöpfe überwacht
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// Zeitvariablen
time_t t;								// dient dem speichern der Zeit sobald Pause Taste gedrückt wird
time_t dif;								// berechnet die Zeit bis zum Abschuss des nächsten Zünders
time_t z[7] ={5,10,15,20,25,30,35};		// die einzelen Zündzeitpunkte


void setup() {               
 
  pinMode(KANAL_1, OUTPUT);
  pinMode(KANAL_2, OUTPUT);  
  pinMode(KANAL_3, OUTPUT); 
  pinMode(KANAL_4, OUTPUT); 
  pinMode(KANAL_5, OUTPUT); 
  pinMode(KANAL_6, OUTPUT); 
  pinMode(KANAL_7, OUTPUT); 
  pinMode(MODUL_A, OUTPUT); 
  pinMode(MODUL_B, OUTPUT);
  pinMode(MODUL_C, OUTPUT);
  
  lcd.begin(16, 2); 
  lcd.setCursor(0,0);             
  lcd.print("Feuerwerk");        
  delay(2000);
  lcd.clear();
  lcd.print("Start Show?");
  prev_time=millis();
 
}   													// beendet setup

void loop() {

  readButtons();            							// Wartet auf Tastendruck
 
  if(lcd_key == btnSELECT)   							//Starttaste gedrückt
  {
	Start++;
  }
  
	if(Start >= 1 && Ende == 0)  						//Hauptroutine, die durch Betätigung des Startknopfs losläuft
	{
		if(UhrenStart == 0)       						// Führt Uhren-Reset herbei, nur beim ersten drücken des Startknopfes!
		{
			lcd.clear();
			setTime(0,0,0,1,1,1970);
			UhrenStart++;
		}   // beendet Uhr-Reset
	  
		if((millis()-prev_time)>999 && Pause == 0)    	// Ruft Uhren- und Countdownsubroutine im Sekundentakt auf
		{  
			digitalUhrAnzeige(); 
			Countdown(); 
			prev_time=millis();
		}  												// beendet Uhren und Countdown Routine
	  
		if (Pause == 0)
		{
			Feuerwerk();      //Subroutine-Feuerwerk
		}  //beendet Subroutinenaufruf
	  
	  
		if (lcd_key == btnLEFT)   						 //Left, bzw. PauseTaste
		{
			Pause = 1;
			time_t t = now();
			lcd.clear();
			lcd.setCursor(0,0);
			lcd.print("mit Zuender ");
			lcd.setCursor(11,0);
			lcd.print("    ");
			lcd.print(Feuer);
			lcd.setCursor(0,1);
			lcd.print("weiter?");
			lcd.print(" ");
			printZiffernGenulltOhnePunkt(minute(t));
			printZiffernGenulltmitPunkt(second(t));
		}  // beendet Pause Routine
	  
		if (lcd_key == btnRIGHT)    					// Right, bzw. WeiterTaste
		{
			lcd.clear();
			Pause = 0;  
			setTime(t);
			lcd.setCursor(0, 1);
			lcd.print("        Zuender");
			lcd.print(Feuer);
		}   
  
	}  													// beendet die Routine, die durch Start ausgelöst wird

} 														// beendet den gesamten Loop
 
 
void Feuerwerk(){ 								 		//Subroutine für Feuerwerk
              
	 if(i == 0)
	{
	  lcd.setCursor(0, 1);
	  lcd.print("        Zuender");
	  lcd.print(Feuer);
    }
		
	
    if(now() == z[i] && i <= anzahlzuender)
	{
	  lcd.setCursor(0, 1);
	  lcd.print("Feuer");								// Zeigt aktuelle Zündung auf LCD an
	  lcd.print(Feuer);
      feuerdauer=millis();
		  while(millis() - feuerdauer < 30)				// Begrenzt Zeit in der Pin auf HIGH steht auf 30ms
		  {
			  digitalWrite(Kanal[i], HIGH);
			  digitalWrite(Modul[i], HIGH);
		  }
        
      digitalWrite(Kanal[i], LOW);						//schaltet nach 30ms Pin auf LOW
	  digitalWrite(Modul[i], LOW);						//schaltet nach 30ms Pin auf LOW
	  Feuer ++;
	  i=i+1;
	  

    }

	if(now()==(z[i-1]+1))								// entfernt aktuelle Zündung 1 Sekunde später von LCD
	{					
      lcd.setCursor(0, 1);
	  lcd.print("        Zuender");						// zeigt dafür nächsten Zünder an
	  lcd.print(Feuer);
	  
	}

	
	if(now() == (z[(anzahlzuender-1)]+2))				// sobald alle Zünder gezündet haben, wird das Programm beendet
	{													// und die Ende Nachricht erscheint auf dem Display
      lcd.setCursor(7,0);								// mit der Anzeige wie viele Zünder gezündet wurden
	  lcd.print("   Ende  ");
	  lcd.setCursor(0, 1);
	  printZiffernGenulltOhnePunkt(Feuer);
	  lcd.print(" Zuendungen   ");
	  Ende++;
	} 
  
} 

void digitalUhrAnzeige(){								// Subroutine für Uhrenanzeige

   lcd.setCursor(0, 0); 
   printZiffernGenulltOhnePunkt(minute());              // Subroutine, die den Minuten eine 0 voranstellt, falls einstellig
   printZiffernGenulltmitPunkt(second());               // Subroutine, die den Sekunden : und 0 voranstellt, falls einstellig
}														// beendet Subroutine Uhr

void printZiffernGenulltOhnePunkt(int zahl){			// definiert Subroutine Minuten

  if(zahl < 10) // wenn kleiner als 10 ...
   {
	 lcd.print("0");
   }
	lcd.print(zahl);
}														// beendet Subroutine Minuten

void printZiffernGenulltmitPunkt(int zahl){ 			// definiert Subroutine Sekunden

  lcd.print(":");
  if(zahl < 10) // wenn kleiner als 10 ...
  {
	lcd.print('0');
  }
	lcd.print(zahl);
}														// beendet Subroutine Sekunden

void Countdown(){										// Subroutine Countdown

	time_t dif=z[i]-now();
	lcd.setCursor(11,0);
	printZiffernGenulltOhnePunkt(dif);
}														// beendet Subroutine Countdown


void readButtons(){										// Liest LCD Buttons vom analogen Eingang

      lcd_key = read_LCD_buttons();    					// Buttons auslesen
	
}													// beendet Read-Buttons


int read_LCD_buttons()								// Variablen-Funktion um auszulesen, welcher Knopf gedrückt wird
{
	adc_key_in = analogRead(0);      				// Sensorwert auslesen
													// Die Standardwerte sind: 0, 144, 329, 504, 741
													// zur Sicherheit wird ein bisschen aufgerundet
	if (adc_key_in > 1000) return btnNONE;
	if (adc_key_in < 50)   return btnRIGHT;
	if (adc_key_in < 195 && adc_key_in > 60)  return btnUP;
	if (adc_key_in < 380 && adc_key_in > 200)  return btnDOWN;
	if (adc_key_in < 555 && adc_key_in > 390)  return btnLEFT;
	if (adc_key_in < 790 && adc_key_in > 560)  return btnSELECT; 
	return btnNONE;  								// Falls gar kein Wert ausgelesen wird
}													// beendet Button-Sensor Funktion

Was mir auffällt ist, das Du eine globale Variable "time_t t" hast und im "loop()" selbst nochmal eine Variable "time_t t = now();" definierst. Ich würde vermuten, das diese dann die globale Variable überdeckt. Ein "t = now();" im Pause Abschnitt könnte evtl. schon helfen.
Mario.

Jaaaaa! Das wars! :grin:
ganz ganz herzlichen Dank!

Dann bitte ich aber um ein Video, wenn der Arduino ein Feuerwerk zündet :slight_smile:
Das klingt nämlich richtig spannend.

Das nächste legale Feuerwerk gibt es leider erst wieder am 31.12.2012, da ich kein Pyrotechniker bin. Somit kann ein Video davon erst frühstens am 01. januar 2013 hier ankommen! :wink:
Sobald der Arduino allerdings fertig im Zündkoffer eingebaut ist, kann ich gerne mal Fotos davon hochladen, bzw. ein Video erstellen, wie damit Leds "gezündet" werden. :wink:

Der Zündkoffer in den der Arduino eingebaut wird hat insgesamt 32 Kanäle. 21 davon werden durch den Arduino automatisch abgefeuert, die restlichen 11 sind für manuelle Auslösungen übrig, wo es nicht auf sekundengenaues abfeuern ankommt.

Da pro Zündung bis zu 5 Elektro-Zünder gleichzeitig zünden können, und diese dann ja auch noch mittels normaler Zündschnur mehrere Effekte verbinden können, kann damit schon ein stattliches Feuerwerk abgebrannt werden.
Begrenzt eigentlich nur noch durch das zur Verfügung stehende Budget...