LED konstant aber Taster-Abfrage mit delay

Hallo zusammen,
ich versuche gerade mit einer Count Funktion die Anzahl der LED´s die angeschaltet sein sollen zu steuern. Damit, wenn ich den Taster drücke die Count-Anzahl nicht zu schnell hoch geht nutze ich hier ein delay.
Das Problem ist jetzt allerdings, dass dementsprechend auch die LED´s im selben Intervall an und ausgehen.
Hat jemand eine Idee wie ich das umgehen kann?

Hier mein Code:

int taster1 = 12;
int taster2 = 13;
int tasters1 = 0;
int tasters2 = 0;
int count;
int anzahl;
 int led1 = 1;
  int led2 = 2;
   int led3 = 3;
    int led4 = 4;
     int led5 = 5;
      int led6 = 6;
       int led7 = 7;
        int led8 = 8;
         int led9 = 9;
          int led10 = 10;





void setup() {
pinMode(taster1, INPUT);
pinMode(taster2, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
pinMode(led10, OUTPUT);
Serial.begin(9600);

}

void loop() {
tasters1 = digitalRead(taster1);
  tasters2 = digitalRead(taster2);


if (tasters1 == HIGH){
  anzahl = count ++ ;
}
if (tasters2 == HIGH){
  anzahl = count --;
}

if(anzahl == 1){
  digitalWrite(led1, HIGH);  
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led6, LOW);
  digitalWrite(led7, LOW);
  digitalWrite(led8, LOW);
  digitalWrite(led9, LOW);
  digitalWrite(led10, LOW);
}
  if(anzahl == 2){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);
    digitalWrite(led10, LOW);
  }
    if(anzahl ==  3){
      digitalWrite(led1, HIGH);
      digitalWrite(led2, HIGH);
      digitalWrite(led3, 1);
      digitalWrite(led4, LOW);
      digitalWrite(led5, LOW);
      digitalWrite(led6, LOW);
      digitalWrite(led7, LOW);
      digitalWrite(led8, LOW);
      digitalWrite(led9, LOW);
      digitalWrite(led10, LOW);
    }
    if(anzahl == 4){
   
      digitalWrite(led1, 1);
      digitalWrite(led2, 1);
      digitalWrite(led3, 1);
      digitalWrite(led4, 1);
      digitalWrite(led5, LOW);
      digitalWrite(led6, LOW);
      digitalWrite(led7, LOW);
      digitalWrite(led8, LOW);
      digitalWrite(led9, LOW);
      digitalWrite(led10, LOW);

}
if(anzahl == 5){
        digitalWrite(led1, 1);
        digitalWrite(led2, 1);
        digitalWrite(led3, 1);
        digitalWrite(led4, 1);
        digitalWrite(led5, 1);
        digitalWrite(led6, LOW);
        digitalWrite(led7, LOW);
        digitalWrite(led8, LOW);
        digitalWrite(led9, LOW);
        digitalWrite(led10, LOW);
}
if(anzahl == 6){
          digitalWrite(led1, 1);
          digitalWrite(led2, 1);
          digitalWrite(led3, 1);
          digitalWrite(led4, 1);
          digitalWrite(led5, 1);
          digitalWrite(led6, 1);
          digitalWrite(led7, LOW);
          digitalWrite(led8, LOW);
          digitalWrite(led9, LOW);
          digitalWrite(led10, LOW);
}
if(anzahl == 7){
            digitalWrite(led1, 1);
            digitalWrite(led2, 1);
            digitalWrite(led3, 1);
            digitalWrite(led4, 1);
            digitalWrite(led5, 1);
            digitalWrite(led6, 1);
            digitalWrite(led7, 1);
            digitalWrite(led8, LOW);
            digitalWrite(led9, LOW);
            digitalWrite(led10, LOW);
}
if(anzahl == 8){
                digitalWrite(led1, 1);
                digitalWrite(led2, 1);
                digitalWrite(led3, 1);
                digitalWrite(led4, 1);
                digitalWrite(led5, 1);
                digitalWrite(led6, 1);
                digitalWrite(led7, 1);
                digitalWrite(led8, 1);
                digitalWrite(led9, LOW);
                digitalWrite(led10, LOW);
              }
if(anzahl == 9){
                  digitalWrite(led1, 1);
                  digitalWrite(led2, 1);
                  digitalWrite(led3, 1);
                  digitalWrite(led4, 1);
                  digitalWrite(led5, 1);
                  digitalWrite(led6, 1);
                  digitalWrite(led7, 1);
                  digitalWrite(led8, 1);
                  digitalWrite(led9, 1);
                  digitalWrite(led10, LOW);
}
if(anzahl == 10){
                    digitalWrite(led1, 1);
                    digitalWrite(led2, 1);
                    digitalWrite(led3, 1);
                    digitalWrite(led4, 1);
                    digitalWrite(led5, 1);
                    digitalWrite(led6, 1);
                    digitalWrite(led7, 1);
                    digitalWrite(led8, 1);
                    digitalWrite(led9, 1);
                    digitalWrite(led10, 1);
}
else{
                        digitalWrite(led1, LOW);
                        digitalWrite(led2, LOW);
                        digitalWrite(led3, LOW);
                        digitalWrite(led4, LOW);
                        digitalWrite(led5, LOW);
                        digitalWrite(led6, LOW);
                        digitalWrite(led7, LOW);
                        digitalWrite(led8, LOW);
                        digitalWrite(led9, LOW);
                        digitalWrite(led10,LOW);
}
delay(100);

}

Ja!

combie:
Ja!

? Äh was

Und wie is die Beschaltung der Input Pin´s mit den Tasten.

Was?

Ich weiß wie man eine Taste ohne delay() abfragt/entprellt und dabei Flanken vereinzelt und hochzählt.

Ich kann dir auch den ein oder anderen Rat geben!
z.B.
Keine Variablen durchzählen!
Dann kannst du sie nicht mehr als Gruppe anfassen.

Also, nicht so schön:

 int led2 = 2;

int led3 = 3;
   int led4 = 4;

Im Array besser:

byte leds[] {2,3,4};

// und später dann

for(byte led:leds) pinMode(led,OUTPUT);

Anstatt delay könntest du auch sagen :
while digital read taster 1 oder... Taster 2 ein

Also warte bis beide taster wieder aus sind

Franz54:
Und wie is die Beschaltung der Input Pin´s mit den Tasten.

Ich bin mir nicht sicher ob du das meinst, aber die Taster sind an den digitalen Pins angeschlossen und funktionieren auch. Daran liegt es eher nicht. Das Problem ist, dass durch den delay die LED´s blinken. Wenn man den Delay weglässt und den Taster "zu lange" drückt geht der Wert halt extrem hoch. Deshalb braucht man diesen delay

jojome:
Deshalb braucht man diesen delay

Nein, es gibt fast keinen Fall wo man ein delay() braucht.

In nahezu allen Fällen kann man mit millis() die aktuelle Systemzeit holen, mit einem vorher gespeicherten Wert + der zu wartenden Zeit vergleichen und dann abhängig vom Ergebnis des Vergleichs irgendetwas tun oder lassen.

jojome:
Ich bin mir nicht sicher ob du das meinst, aber die Taster sind an den digitalen Pins angeschlossen und funktionieren auch.

Ich frage das nicht aus Spass. Und dass die Tasten irgendwie an den Pins angeschlossen sind, das glaube ich dir gerne. Die brauchst aber mehr als nur die Taster an den Pins. Deshalb frage ich nach. Wenn du nur Taster an den Pins angeschloßen hast, machen sich die Selbsständig sobald du die Taster los lässt. Ein kleiner Schaltplan, wie die Pins beschalten sind, wäre sehr sinnvoll.

Du machst die Tasterabfrage auf HIGH, dann sollten an den Pins Taster gegen Plus (VCC) und Widerstände gegen Minus (GND) angeschloßen sein.

Franz54:
Ich frage das nicht aus Spass. Und dass die tasten irgendwie an den Pins angeschlossen sind, das glaube ich dir gerne. Die brauchst aber mehr als nur die Taster an den Pins. Deshalb frage ich nach. Wenn du nur Taster an den Pins angeschoßen hast, machen sich die Selbsständig sobald du die Taster los lässt. Ein kleiner Schaltplan, wie die Pins beschalten sind, wäre sehr sinnvoll.

Hi also die Taster sind jeweils wie in diesem Bild angeschlossen. Im seriellen Monitor hat die selbe Schaltung auch schon eine Anzahl jeweils ausgespuckt.


LG

jojome:
Hi also die Taster sind jeweils wie in diesem Bild angeschlossen. Im seriellen Monitor hat die selbe Schaltung auch schon eine Anzahl jeweils ausgespuckt.
https://www.arduino.cc/en/uploads/Tutorial/button_sch.png
LG

Ja, so passt das schon mal.

Also ich habe das Problem jetzt mit folgendem Code gelöst.
Danke an alle für die schnelle Antwort :smiley:

int taster1 = 12;
int taster2 = 13;
int tasters1 = 0;
int tasters2 = 0;
int count;
int anzahl;
 int led1 = 11;
  int led2 = 2;
   int led3 = 3;
    int led4 = 4;
     int led5 = 5;
      int led6 = 6;
       int led7 = 7;
        int led8 = 8;
         int led9 = 9;
          int led10 = 10;

int lasttasters1 ;
int lasttasters2;


void setup() {
pinMode(taster1, INPUT);
pinMode(taster2, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
pinMode(led10, OUTPUT);
Serial.begin(9600);

}

void loop() {
tasters1 = digitalRead(taster1);
  tasters2 = digitalRead(taster2);

if (tasters1 != lasttasters1){
    if (tasters1 == HIGH){
      anzahl = count ++ ;
    }
}
if (tasters2 != lasttasters2){
    if (tasters2 == HIGH){
      anzahl = count --;
    }
}
lasttasters2 = tasters2;
lasttasters1 = tasters1;


if(anzahl == 1){
  digitalWrite(led1, HIGH);  
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led6, LOW);
  digitalWrite(led7, LOW);
  digitalWrite(led8, LOW);
  digitalWrite(led9, LOW);
  digitalWrite(led10, LOW);
}
  if(anzahl == 2){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);
    digitalWrite(led10, LOW);
  }
    if(anzahl ==  3){
      digitalWrite(led1, HIGH);
      digitalWrite(led2, HIGH);
      digitalWrite(led3, 1);
      digitalWrite(led4, LOW);
      digitalWrite(led5, LOW);
      digitalWrite(led6, LOW);
      digitalWrite(led7, LOW);
      digitalWrite(led8, LOW);
      digitalWrite(led9, LOW);
      digitalWrite(led10, LOW);
    }
    if(anzahl == 4){
   
      digitalWrite(led1, 1);
      digitalWrite(led2, 1);
      digitalWrite(led3, 1);
      digitalWrite(led4, 1);
      digitalWrite(led5, LOW);
      digitalWrite(led6, LOW);
      digitalWrite(led7, LOW);
      digitalWrite(led8, LOW);
      digitalWrite(led9, LOW);
      digitalWrite(led10, LOW);

}
if(anzahl == 5){
        digitalWrite(led1, 1);
        digitalWrite(led2, 1);
        digitalWrite(led3, 1);
        digitalWrite(led4, 1);
        digitalWrite(led5, 1);
        digitalWrite(led6, LOW);
        digitalWrite(led7, LOW);
        digitalWrite(led8, LOW);
        digitalWrite(led9, LOW);
        digitalWrite(led10, LOW);
}
if(anzahl == 6){
          digitalWrite(led1, 1);
          digitalWrite(led2, 1);
          digitalWrite(led3, 1);
          digitalWrite(led4, 1);
          digitalWrite(led5, 1);
          digitalWrite(led6, 1);
          digitalWrite(led7, LOW);
          digitalWrite(led8, LOW);
          digitalWrite(led9, LOW);
          digitalWrite(led10, LOW);
}
if(anzahl == 7){
            digitalWrite(led1, 1);
            digitalWrite(led2, 1);
            digitalWrite(led3, 1);
            digitalWrite(led4, 1);
            digitalWrite(led5, 1);
            digitalWrite(led6, 1);
            digitalWrite(led7, 1);
            digitalWrite(led8, LOW);
            digitalWrite(led9, LOW);
            digitalWrite(led10, LOW);
}
if(anzahl == 8){
                digitalWrite(led1, 1);
                digitalWrite(led2, 1);
                digitalWrite(led3, 1);
                digitalWrite(led4, 1);
                digitalWrite(led5, 1);
                digitalWrite(led6, 1);
                digitalWrite(led7, 1);
                digitalWrite(led8, 1);
                digitalWrite(led9, LOW);
                digitalWrite(led10, LOW);
              }
if(anzahl == 9){
                  digitalWrite(led1, 1);
                  digitalWrite(led2, 1);
                  digitalWrite(led3, 1);
                  digitalWrite(led4, 1);
                  digitalWrite(led5, 1);
                  digitalWrite(led6, 1);
                  digitalWrite(led7, 1);
                  digitalWrite(led8, 1);
                  digitalWrite(led9, 1);
                  digitalWrite(led10, LOW);
}
if(anzahl == 10){
                    digitalWrite(led1, 1);
                    digitalWrite(led2, 1);
                    digitalWrite(led3, 1);
                    digitalWrite(led4, 1);
                    digitalWrite(led5, 1);
                    digitalWrite(led6, 1);
                    digitalWrite(led7, 1);
                    digitalWrite(led8, 1);
                    digitalWrite(led9, 1);
                    digitalWrite(led10, 1);
}
else{
                        digitalWrite(led1, LOW);
                        digitalWrite(led2, LOW);
                        digitalWrite(led3, LOW);
                        digitalWrite(led4, LOW);
                        digitalWrite(led5, LOW);
                        digitalWrite(led6, LOW);
                        digitalWrite(led7, LOW);
                        digitalWrite(led8, LOW);
                        digitalWrite(led9, LOW);
                        digitalWrite(led10,LOW);
}


}

jojome:
Hi also die Taster sind jeweils wie in diesem Bild angeschlossen.
https://www.arduino.cc/en/uploads/Tutorial/button_sch.png

Ok.
Jetzt weiss ich woher die alle diese Anschaltung haben und sich wundern, wenn so Technik ganz unvorhergesehen und ungewollt sich selbständig macht.

Und ja, das geht unter Idealumständen so.

Du fängst im Übrigen nicht ab, wenn count grösser oder kleiner der tatsächlichenAnzahl benutzter LED-PIN ist.

schau dir mal das Beispiel

StateChangeDetection an: http://www.arduino.cc/en/Tutorial/ButtonStateChange

Dabei geht es darum, dass Tastendrücke abgefragt werden.
Vor einem neuen Tastendruck muss man die Taste loslassen.

Wenn du das anwendest, dann zählt da nichts automatisch hoch.
Das Delay dient dann nur mehr zum Debouncen/entprellen des Tasters.

Und dass man mit Arrays viele Codeduplikate einsparen kann wurde dir eh schon mitgeteilt. Hast du das schon umgebaut? Zeig mal deinen aktuellen Code.

my_xy_projekt:
Ok.
Jetzt weiss ich woher die alle diese Anschaltung haben und sich wundern, wenn so Technik ganz unvorhergesehen und ungewollt sich selbständig macht.

Was gefällt dir an der Anschaltung nicht??? Wenn der Widerstand so um die 1000 Ohm hat, ist das einwandfrei. Dass es bessere Möglichkeiten gibt, ist eine andere Baustelle. Aber widerstand gegen GND und Taster auf VCC war am Anfang auch wunderderbar, ist nur aufwändiger als nötig.

Moin, mojn,

Franz54:
Was gefällt dir an der Anschaltung nicht???

Ich schrieb nicht, das sie mir nicht gefällt.
Du stimmst mir doch sicher zu, das es eher wahrscheinlich ist, das Energie fremd zugeführt wird, z.B. durch Induktion, etc., als abgezogen. :wink:

my_xy_projekt:
Du stimmst mir doch sicher zu, das es eher wahrscheinlich ist, das Energie fremd zugeführt wird, z.B. durch Induktion, etc., als abgezogen. :wink:

Und du bist dir sicher, dass du da nicht einer mittelschweren Verwirrung unterliegst?