Tasterabfrage blockiert

Hallo zusammen,

ich will 4 LED-Taster in der loop abfragen. Wenn die Bedindung erfüllt ist , soll kurz ein Motor beschleunigt werden. Danach soll die jeweilige Taste für x Sek gesperrt sein und dabei blinken.

Die jeweilige Taste bekomme ich zwar gesperrt und sie blinkt, aber alle anderen Tasten reagieren in dieser Zeit nicht.
Jede sollte ihr eigene Sperrzeit haben und unabhängig von den anderen reagieren.
Und das obwohl ich mit millis gearbeitet habe, was dieses Problem doch umgehen sollte!?

Ich hoffe ihr könnt mir weiterhelfen. Danke für ein paar Ratschläge.
Die Vergabe der Variablen und Setup hab ich mir mal gespart.

Viele Grüße
Crumble

void loop(){

digitalWrite(motorA,HIGH);
digitalWrite(motorB,LOW); 
analogWrite(motorSpeed, 40); //normale Geschwindigkeit/Richtung Motor
        
    int i;
    for(i=0; i<4; i++){ //dauerabfrage 4 Taster
        if (tasterEnable[i] = 1){
        tasterCheck(i);
        }     
    }
}

void tasterCheck (int i ){  
          
        tasterStatus[i] = digitalRead(tasterPin[i]);
        if (tasterStatus[i] == HIGH){ //wenn taster gedrückt ...
              tasterEnable[i] = 0;
              digitalWrite(motorA,HIGH); //A =HIGH, B =LOW motor rechts
              digitalWrite(motorB,LOW); 
   	      analogWrite(motorSpeed, 200); // Motorboost
              delay(boostTime); //minimal klein - kann vernachlässigt werden
              analogWrite(motorSpeed, 40); // normale Geschwindigkeit
             
              blinken(i);
              digitalWrite(tasterLed[i], HIGH);
        }
 }

void blinken (int i){   
                        
  blinkTimer[i] = millis();
  
 while (millis() - blinkTimer[i] < blinkDauer){        // taster wird für x Sek in ...
 
            new_time[i] = millis();
  
	    if (new_time[i]- old_time[i] > interval){   // ...bestimmtem Intervall blinken - 
            old_time[i] = new_time[i];   // aktuelle Zeit abspeichern
 
            // LED Zustand wecheln.
            tasterLedStatus[i] = !tasterLedStatus[i];
 
            // Wert auf den Ausgang schreiben
            digitalWrite(tasterLed[i], tasterLedStatus[i]);
            tasterEnable[i] = 1;  // ...erst dann wird er wieder freigegeben
            }        
     } 
}

ein kurzer Blick: if (tasterEnable = 1){ ist immer true muss == heißen vielleicht ist es das ja schon

Stimmt da is n Fehler, aber ändern tut sich dadurch nichts. Wird die Abfrage durch die while schleife verhindert?? :~

Ich denke auch dass es die whileschleife ist. das sollte wahrscheinlich IF sein. Denn bei while bleibt er solange in dieser schleife gefangen bis die Bedingung erfüllt ist. In dieser Zeit wird auch kein anderer Taster abgefragt.

If wird ja nur einmal abgefragt, das bringt mir leider nix. Hmm..wie kann ich das denn ohne while schleife formulieren?? Irgendwie muss ich doch mit einer Schleife die Flag auf 0 halten bzw. blinken lassen.

Boolean ist dein Freund. Du kannst z.B. wenn der Taster gedrückt wird eine Variable auf true setzen. Dann machst du solange was wie das true ist. Und wenn die Zeit abgelaufen ist setzt du sie wieder auf false.

Setzte blinkTimer[index] beim drücken des Tasters auf millis(). Dann mach nur den Vergleich wenn der boolean auf true ist. Wenn die Zeit dann > blinkDauer ist, ist die entsprechende Zeit abgelaufen. Geht alles mit if. Theoretisch kann man auch blinkTimer[index] == 0 für false nehmen und sich die extra Variable sparen, aber das macht das Ganze etwas unleserlicher.

Ach so, ich hatte übersehen, dass Blinken nur in der if aufgerufen wird.

Ich denke, du sollest blinken() direkt in der loop aufrufen, dann wird es immer durchlaufen und du kannst das mit if (millis()... ) machen. Verknüpfen kannst du es ja mit tasterEnable*.*