6x LED fading Taster einbinden

Hallo, ich habe ein Problem beim einbinden eines Tasters in mein Program. Ich möchte per Tastendruck das Programm starten und nach 60 sek. Soll es wieder aus gehen und auf einen erneuten Tastendruck warten. Ich habe es schon mit verschiedenen Variablen probiert aber ich komme nicht zum Ziel da ich den die eigentliche Loop ja eigentlich ausklammern muss oder?

Kurz: Taster gedrückt LEDs Faden hintereinander an bis 255 bleiben da 60sek. Und gehen danach aus. Warten bis zum nächsten Taster puls.

int buttonPin = 8; 
int pausen = 500; 
int vals [] = { 0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23, 27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255 }; 
int vals1 [] = { 255, 215, 181, 152, 128, 108, 91, 76, 64, 54, 45, 38, 32, 27, 23, 19, 16, 13, 11, 10, 8, 7, 6, 5, 4, 3, 3, 2, 2, 2, 1, 0, }; 
int numVal = 32; //number of values in array 
byte schwelle = 10; // 70% * 255; Schwelle, bei der die nächste LED einsetzt. 
byte a,b,c,d,e,f; // Zählervariablen für 3 LEDs 
unsigned long sweepstart; // Zeit merken, zu der der Dimmprozess gestartet wurde.

void setup() 
 { 
 for (int i = 2; i < 10; i++) 
 { 
pinMode(i, OUTPUT);
 pinMode(buttonPin, INPUT_PULLUP); // der Taster wird mit internem Pullup verwendet, d.h. er ist mit dem GND und dem digitalen Input verbunden 
 }
 } 
 
 void loop() 
 {
	 bool myCurrentButtonState = digitalRead(buttonPin); // Zählervariablen berechnen 
	 a = min(a++, numVal-1); // Zähler 1. LED wird hochgezählt bis 31 
	 if (vals[a] > schwelle)
	 {
		 b = min(b++, numVal-1); // Zähler 2. LED wird hochgezählt bis 31, wenn Wert 1. LED > Schwelle, 
	 }
	 if (vals[b] > schwelle)
	 {
		 c = min(c++, numVal-1); // Zähler 3. LED wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle, 
	 }
	 if (vals[c] > schwelle)
	 { 
		d = min(d++, numVal-1); // Zähler 4. LED wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle, 
	 }
	 if (vals[d] > schwelle)
	 {
		e = min(e++, numVal-1); // Zähler 5. LED wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle, 
	 }
	 if (vals[e] > schwelle)
	 {
		 f = min(f++, numVal-1); // Zähler 6. LED wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle, 
   	} 
	analogWrite(3, vals[a]); 
	analogWrite(5, vals[b]); 
	analogWrite(6, vals[c]); 
	analogWrite(9, vals[d]); 
	analogWrite(10, vals[e]); 
	analogWrite(11, vals[f]); 
	delay(20); // Rücksetzen alle Variablen und wiederholen nach einer Pause 
	if(millis()-sweepstart > pausen * 128)
	{ // Ist die Wartezeit abgelaufen? (Dauer=pausen*128) 
		a=0; // Zählervariablen rücksetzen 
		b=0; 
		c=0; 
		d=0; 
		e=0; 
		f=0; 
		sweepstart = millis(); // Zeitpunkt des Neustarts merken 
	}
}

Setze deinen Code bitte in Codetags, sonst werden Teile des Codes als Fomatierungszeichen missinterpretiert. Ausserdem ist er dann besser lesbar.
Dazu den Post editieren, den Code markieren und im Editor oben links den Button </> drücken.

Dein Sketch ist so kaum lesbar, wurde dir ja auch schon geschrieben.
Also bitte ändern.

Was du brauchst, ist eine Statusvariable, die du in der Loop abfragst. Davon abhängig kannst du deine Fading-Routine starten oder nicht. Je nachdem eine Taste gedrückt wurde.
Die Zeit kannst du auch per millis lösen und dann einfach die Statusvariable zurück setzen.

So geändert, wie könnte die Routine ausehen da ich ja keinen LedPin habe muss ich ja etwas anderes eintragen.

void loop() {

if (digitalRead(tasterPin)==HIGH){
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);

Eine Variable hat erst mal nix mit if und else zu tun.

Du kannst aber mit einer if-Abfrage auf diese Variable abfragen.
Verwende als Variable ein boolesche Variable, dann kannst du auf true oder false abfragen.

Du könntest es mal so versuchen:

  if (a > 0 || !digitalRead(buttonPin))
  {
    a = min(a++, numVal - 1); // Zähler 1. LED wird hochgezählt bis 31

ok danke bis dahin, leider tut sich da nichts bei mir, dein Vorschlag sagt mir nicht was was kommen soll wenn der taster gedrückt ist ? oder verstehe ich gerade etwas falsch?

void loop() {

    if (a > 0 || !digitalRead(buttonPin))
  
  
    // Zählervariablen berechnen
    a = min(a++, numVal-1);  // Zähler 1. LED   wird hochgezählt bis 31

ich habe es nocheinmal anders probiert und es passiert einfach nichts ich bin zu Blöd dafür. Bitte trotzdem nochmals um Hilfe.

const int tasterPin = 8; 
int tasterStatus = LOW;
boolean gedrueckt = false;
int pausen = 500;
int vals [] = {     0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23,
                    27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255
              };

int numVal = 32; //number of values in array
byte schwelle = 10;  // 70% * 255; Schwelle, bei der die nächste LED einsetzt.
byte a,b,c,d,e,f;           // Zählervariablen für 3 LEDs

unsigned long sweepstart;  // Zeit merken, zu der der Dimmprozess gestartet wurde.

void setup() {
   pinMode(tasterPin, INPUT); 
  for (int i = 2; i < 10; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {


tasterStatus = digitalRead(tasterPin);
   if (tasterStatus == HIGH)
   
    if (!gedrueckt) {  // war vorher nicht gedrueckt
      gedrueckt = true;
      byte a,b,c,d,e,f = HIGH;
          
      delay(10);       // 10ms warten zum Entprellen
    }
  
    // Zählervariablen berechnen
    a = min(a++, numVal-1);  // Zähler 1. LED   wird hochgezählt bis 31
    if (vals[a] > schwelle){   
      b = min(b++, numVal-1);  // Zähler 2. LED  wird hochgezählt bis 31, wenn Wert 1. LED > Schwelle,
    }
    if (vals[b] > schwelle){   
      c = min(c++, numVal-1);  // Zähler 3. LED  wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle,
    }
    if (vals[c] > schwelle){
      d = min(d++, numVal-1); // Zähler 4. LED  wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle,
    }
    if (vals[d] > schwelle){
      e = min(e++, numVal-1); // Zähler 5. LED  wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle,
    }
     if (vals[e] > schwelle){
      f = min(f++, numVal-1); // Zähler 6. LED  wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle,

      
    }
    analogWrite(3, vals[a]);
    analogWrite(5, vals[b]);
    analogWrite(6, vals[c]); 
    analogWrite(9, vals[d]);
    analogWrite(10, vals[e]);
    analogWrite(11, vals[f]);
    delay(20); 
    


    // Rücksetzen alle Variablen und wiederholen nach einer Pause
    if(millis()-sweepstart > pausen * 128){  // Ist die Wartezeit abgelaufen? (Dauer=pausen*128)
      a=0;                                   // Zählervariablen rücksetzen
      b=0;
      c=0;
      d=0;
      e=0;
      f=0;
      sweepstart = millis();                  // Zeitpunkt des Neustarts merken
    }
}
const int tasterPin = 8;
...
pinMode(tasterPin, INPUT);

for (int i = 2; i < 10; i++) {
    pinMode(i, OUTPUT);
  }

Was nun? ist Pin 8 Eingang oder Ausgang?

Zu was brauchst Du

  for (int i = 2; i < 10; i++) {
    pinMode(i, OUTPUT);

?

Grüße Uwe

Pin 8 ist der Tastereingang for (int i = 2; i < 10; i++) { pinMode(i, OUTPUT); ist zum Hochzählen

Markus2018:
Pin 8 ist der Tastereingang
for (int i = 2; i < 10; i++) { pinMode(i, OUTPUT); ist zum Hochzählen

genau; aber ein Pin kann nicht gleichzeitig Ausgang und Eingang sein.
In diesem Fall ist es am Ende ein Ausgang, den Du als Eingang liest. Darum funktioniert der Taster nicht.

Grüße Uwe

danke denkfehler jetzt läuft es mit dem Einschalten. Nun muss ich das nur noch mit den 60sec. hinbekommen und mit dem ausschalten :o

void setup() {
 pinMode(buttonPin, INPUT_PULLUP);
  
  }


void loop() {
bool myCurrentbuttonPin = digitalRead(buttonPin);                           // liest den aktuellen Zustand des Tasters aus
  if ((lastbuttonPin!=myCurrentbuttonPin)&&(myCurrentbuttonPin==LOW))   // wenn dieser HIGH ist, aber beim letzten Durchlauf nicht
 
    // Zählervariablen berechnen
    a = min(a++, numVal-1);  // Zähler 1. LED   wird hochgezählt bis 31
    if (vals[a] > schwelle){   
      b = min(b++, numVal-1);  //

Markus2018:
oder verstehe ich gerade etwas falsch?

Ja, denn bei Dir fehlt eine Klammer, die bei mir drin ist!

(deleted)

ich habe jetzt mal einen Sketch so umgebaut das er “isolierte” Abschnitte besitzt damit ich die Pause von 3Skunden belibig ändern kann ohne das ein delay den Ablauf stört.Desweiteren ist der Taster eingebunden.Das Program hat aber nur einen Led Ausgang, wie bekomme ich nun meine “nacheinander einschaltpunkte” in den Code??

hier die Routine von meinem Code oben, die ich einfügen möchte leider geht das nicht mehr in der LOOP !

 // Zählervariablen berechnen stand vorher in der LOOP! nach 31 Sek. wird die nächste LED angefahren unsw.

    a = min(a++, numVal-1);  // Zähler 1. LED   wird hochgezählt bis 31
    if (vals[a] > schwelle){   
      b = min(b++, numVal-1);  // Zähler 2. LED  wird hochgezählt bis 31, wenn Wert 1. LED > Schwelle,
    }
    if (vals[b] > schwelle){   
      c = min(c++, numVal-1);  // Zähler 3. LED  wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle,
    }
    if (vals[c] > schwelle){
      d = min(d++, numVal-1); // Zähler 4. LED  wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle,
    }
    if (vals[d] > schwelle){
      e = min(e++, numVal-1); // Zähler 5. LED  wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle,
    }
     if (vals[e] > schwelle){
      f = min(f++, numVal-1); // Zähler 6. LED  wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle,

      
    }
    analogWrite(3, vals[a]);
    analogWrite(5, vals[b]);
    analogWrite(6, vals[c]); 
    analogWrite(9, vals[d]);
    analogWrite(10, vals[e]);
    analogWrite(11, vals[f]);
    delay(20);

hier der Sketch mit den einzelnen Abläufen:

const int buttonStartPin = 2;

const int LEDPin = 5;      // LED

/*
 * global states for main state machine
 */

enum states : int {
  stateIdle = 0,
  stateFadeUp,
  stateFadeDown 
};


/*
 *  Global Variables
 */
 
int actualState = stateIdle;    // main state
int oldState = -1;              // previous state
unsigned long waitTime = 0;     // watit time 0: inactive
unsigned long timeStart;        // start time marker
unsigned long debounceTime;     // debouncing timer

int buttonStartOld = 1;         // button old state

/*
 * start a non blocking delay
 */
void startDelay(unsigned long delayTime_ms)
{
  Serial.print("start Delay: ");
  Serial.println(delayTime_ms);
  timeStart = millis();
  waitTime = delayTime_ms;
}

/*
 *  start saw sequence
 */
void startSequence()
{
  Serial.println("Start");          // print start message
  actualState = stateFadeUp;
}


/*
 * stop everything
 */
void stop()
{
    Serial.println("Stop");           // print stop message
    digitalWrite(LEDPin, LOW);
    timeStart = 0;                    // abort any running delay
    actualState = stateIdle;          // set state to idle
}

/*
 * non blocking delay
 */
void processDelay()
{
   if (waitTime > 0) {
      if (millis() >= (timeStart + waitTime)) {
        waitTime = 0;    // time elapsed
      } else {
        return;          // timer is running, wait
      }
   }
}

/*
 * check inputs for changes
 */
void checkInputs()
{
  // simple debouncing check
  unsigned long actTime = millis();
  if (actTime < (debounceTime + 20)) {
    return;
  }
  debounceTime = actTime;
  
  int button;

  // buttons low active
  button = digitalRead(buttonStartPin);
  if ((button != buttonStartOld) && (button == 0)) {
    startSequence();
  }
  buttonStartOld = button;
}

/*
 * fade(int setpooint)
 * setpoint: target value for fading
 * return:  false: in prograess
 *          true: setpoint value ready
 */

bool fade(bool up, int setpoint)
{
  static int currentBrightness = 0;
  static unsigned long fadeTimeOld = 0;

  // one step in 100 ms
  unsigned long fadeTime = millis();
  if (fadeTime < (fadeTimeOld + 100)) {
    return false;
  }
  fadeTimeOld = fadeTime;

  
  if (up) { // fading up
    currentBrightness += 5;
    analogWrite(LEDPin, currentBrightness);
    Serial.print("LED up: ");
    Serial.println(currentBrightness);
    if (currentBrightness >= setpoint) {
      return true;    // ready
    }
  } else {  // fading down
    currentBrightness -= 5;
    analogWrite(LEDPin, currentBrightness);
    Serial.print("LED down: ");
    Serial.println(currentBrightness);
    if (currentBrightness <= setpoint) {
      return true;    // ready
    }
  }

  return false;   // not ready
}
 
/*
 * the main state machine
 */
void processStateMachine()
{
  // do nothing if delay is active
  if (waitTime > 0)
    return;
    
  // debug output
  if (actualState != oldState) {
    Serial.print("State changed to: ");
    Serial.print(actualState);
    Serial.println();
    oldState = actualState;
  }
  
  switch(actualState) {
    case stateIdle:
      break;
      
    case stateFadeUp:
      {
        if (fade(true, 100.0)) {
          // fade ready, start delay and set next step
          startDelay(3000);
          actualState = stateFadeDown;
        }
      }
      break;
    
    case stateFadeDown:
    {
      if (fade(false, 0.0)) {
        // fade ready, set idle
        actualState = stateIdle;
      }
    }
    break;
  }

}


/*
 * the setup function runs once when you press reset or power the board
 */
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LEDPin, OUTPUT);
  
  // initialize inputs with PullUp enabled
  pinMode(buttonStartPin, INPUT_PULLUP);
  
  Serial.begin(115200);
  Serial.println("controller started");
}

/*
 * the loop function runs over and over again forever
 */
void loop() {
  checkInputs();            // read inputs and check for changes
  processDelay();
  processStateMachine();
}

Hallo Markus,
in den MobaTools gibt es ein Beispiel 'runningLight'. Das sollte sich doch rel. leicht an deine Wünsche anpassen lassen.