Tasterstatus HIGH schalten ?

1 Antwort

  • Zum einen fehlen Dir in dem Code zwei geschlossene Klammern. Der Code ist also nicht vollständig.
  • Deine "if (oldButtonState == HIGH && newButtonState == LOW) {" ist nur einmal erfüllt, danach nie wieder, denn oldButtonState wird zwar danach auf den Tasterstatus gesetzt, aber nie wieder zurückgesetzt, egal was it dem Taster ist.
  • Dein Zähler zählt also auch nur einmal eins hoch.
  • Was der Zähler überhaupt bewirken soll, erschließt sich mir auch noch nicht, denn die Blinkreihenfolge ist immer die gleiche, nur eine andere StartLED. Bei zyklischem endlosen Blinken würde sich also letztlich gar nichts ändern.
  • Delay ist für so eine Steuerung sehr schlecht, da bei jedem Delay der Code solange stoppt. Es werden also keine Taster eingelesen, keine Statusänderungen abgearbeitet ect... Erst wenn alle Delays durch sind und der Zyklus am Ende angekommen ist, liest er am Anfang wieder ein. Also nur dann werden Taster erfasst.

Alles in allem ist sehr viel Code überflüsseg, und die Funktionsweise erschließt sich mit nicht, was er letztlich machen soll. Schreibe mal eine vollständige Funktionsbeschreibung. Also Taster(x) soll folgende Funktoin ausführen, Taster(y) sool den Blinkablauf ein/Ausschalten oder so... ect...


simbi172 
Fragesteller
 29.01.2022, 22:30
Hey 
danke deiner Antwort.
das mit den brauch ich später nochmal, und das mit der delay passt mir auch den ich muss es nur einmal richtig einstellen und dan sollen die leds ja dan auch durchgehend leuchten.

weißt du was ich da ergänzen muss ??



int taster1=7;
int taster2=8;


int tasterstatus1=0;
int tasterstatus2=0;


int led1=12;
int led2=11;
int led3=10;
int led4=9;








bool oldButtonState = HIGH;
bool newButtonState;
int count = 0;


void setup() {
 pinMode (taster1,INPUT);
pinMode (taster2,INPUT);




pinMode (led1,OUTPUT);
pinMode (led2,OUTPUT);
pinMode (led3,OUTPUT);
pinMode (led4,OUTPUT);




}


void loop() {
  newButtonState = digitalRead(taster1);
  
  tasterstatus2 = digitalRead(taster2);
  
  if (oldButtonState == HIGH && newButtonState == LOW) {
    count++;
    oldButtonState = newButtonState;


    if (count == 1) {
      digitalWrite(led1, HIGH);
    }
    if (count == 2) {
      digitalWrite(led1, LOW);
      digitalWrite (led2,HIGH);
    }


    if (count == 3 ){
      digitalWrite (led2,LOW);
      digitalWrite (led3,HIGH);
    }


    if (count == 4){
      digitalWrite (led3,LOW);
      digitalWrite (led4,HIGH);
    }


    if (count == 5){
      digitalWrite (led4,LOW);
      count = 0;
    }


if ((tasterstatus2 == HIGH) && (count == 1)){
  
  
  digitalWrite (led1,HIGH);
  digitalWrite (led2,LOW);
  digitalWrite (led3,LOW);
  digitalWrite (led4,LOW);
  delay (1000);


  digitalWrite (led1,LOW);
  digitalWrite (led2,HIGH);
  delay (1000);
  digitalWrite (led2,LOW);
  digitalWrite (led3,HIGH);
  delay (1000);
  digitalWrite (led3,LOW);
  digitalWrite (led4,HIGH);
  delay (1000);
  digitalWrite (led4,LOW);
}








    if ((tasterstatus2 == HIGH ) &&( count == 2)){


      digitalWrite (led1,LOW);
      digitalWrite (led2,HIGH);
      digitalWrite (led3,LOW);
      digitalWrite (led4,LOW);
      delay (1000);
      digitalWrite (led3,HIGH);
      digitalWrite (led2,LOW);
      delay (1000);
      digitalWrite (led3,LOW);
      digitalWrite (led4,HIGH);
      delay (1000);
      digitalWrite (led4,LOW);
      digitalWrite (led1,HIGH);
      delay (1000);
      digitalWrite (led1,LOW);
      
    }




    if ((tasterstatus2 == HIGH) && (count == 3)){


digitalWrite (led1,LOW);
digitalWrite (led2,LOW);
digitalWrite (led3,HIGH);
digitalWrite (led4,LOW);
delay (1000);


digitalWrite (led3,LOW);
digitalWrite (led4,HIGH);
delay (1000);


digitalWrite (led4,LOW);
digitalWrite (led1,HIGH);
delay (1000);


digitalWrite (led1,LOW);
digitalWrite(led2,HIGH);
delay (1000);


digitalWrite (led2,LOW);
delay (1000);
}


if ((tasterstatus2 == HIGH) && (count == 4)){


  digitalWrite (led1,LOW);
  digitalWrite (led2,LOW);
  digitalWrite (led3,LOW);
  digitalWrite (led4,HIGH);
  delay (1000);


  digitalWrite (led4,LOW);
  digitalWrite (led1,HIGH);
  delay (1000);


  digitalWrite (led1,LOW);
  digitalWrite (led2,HIGH);
  delay (1000);


  digitalWrite (led2,LOW);
  digitalWrite (led3,HIGH);
  delay (1000);


  digitalWrite (led3,LOW);
  
}
    
        
    delay(100);
  } else if (oldButtonState == LOW && newButtonState == HIGH) {
    oldButtonState = newButtonState;
  }

}

0
RareDevil  30.01.2022, 11:20
@simbi172

Puh, so ist zwar der Code vollständig, aber falsch strukturiert für das, was Du vor hast... Alles VOR dem "else if" wird nur ausgeführt, wenn die aller erste If-Bedingung erfüllt ist. Also nur ein Zyklus nach Tastendruck. Und dann erst wieder, wenn die Taste1 neu gedrückt wird. Unabhängig was mit Taste2 ist. Der Code für die Blinkabläufe muss also hinter die geschlossene Klammer vom "else if"

Dann ist die Frage, ab wann der Blinkzyklus laufen soll.. Erst nach dem anwählen des Zählers, wenn Taste2 betätigt wurde? Soll Taste2 das auch wieder stoppen? Oder soll es gestoppt werden, wenn ein neues Programm per Taste1 angewählt wurde? Dazu hast Du auch noch nichts geschrieben. Ich kann keine Gedanken lesen und einen vollständige Funktionseschreibung lieferst Du einfach nicht... Wie soll man dann helfen? So wird das nix. Also schreibe mal einen vollständigen Ablauf, also Taste sowieso soll "..." machen und dann soll z.B. das blinken stoppen.. Starten soll das blinken erst, wenn... oder so ähnlich.. Das ist momentan alles ungeklärt... Oder soll es nur blinken, so lange man den Taster2 gedrückt hält???

0
simbi172 
Fragesteller
 30.01.2022, 13:37
@RareDevil

Also

Ich will das man mit dem count die LEDS wechseln kann.

Wenn dann der taster2 gedrückt wird soll ab diesem Zeitpunkt der Blinkzyklus beginnen und nicht mehr aufhören.

0
simbi172 
Fragesteller
 30.01.2022, 13:39
@simbi172

Es soll eigentlich ab dem Zeitpunkt ab dem der Blinkzyklus beginnt der tasterstatus dauerhaft HIGH geschaltet werden, count soll gleich bleiben.

0
RareDevil  30.01.2022, 13:45
@simbi172

Na dann setze mit dem Taster2 eine variable auf HIGH

if(tasterstaus2==HIGH){
blinkenEIN=HIGH
}

und verknüpfe die Blinkfogen mit

if(count==x && blinkenEIN==HIGH) 

statt auf den Tasterstatus zu prüfen...

Wenn Du das dann aus haben willst, musst Du nur irgendwo noch mal definieren, wann blinkenEIN wieder zurückgesetzt werden soll.

Aber wie gesagt, die Blinksequenzen müssen aus aus der ersten if raus, damit die Abfragen überhaupt geprüft werden...

0
RareDevil  30.01.2022, 13:46
@RareDevil

Alternativ kannst Du auch statt tasterstatus2 einzulesen, direkt digitalRead nehmen. Dann sparst Du Dir eine Variable im Programmspeicher...

0