Warum ist das falsch(Arduino 3 mal Taster drücken,damit Lampe leuchtet)?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Nun, du liest Buttonpressed gar nicht ein, sondern prüfst, ob es HIGH ist. Da fehlt das digitalRead und eine Variable, wo der Status drin gespeichert wird, und außerdem ist ein Zyklus so schnell, dass digitalRead ggf bei einem Tastendruck schon höher wie drei zählt... Zykluszeiten sind um die Mikrosekunden.. Deshalb meinte ich eben noch, dass Du eine Prüfung einbauen musst, ob der Button gerade gedrückt wurde, oder noch gedrückt ist...


RareDevil  15.12.2021, 20:44

Und i wird nie höher wie 2... Denn Du weist i nicht i+1 zu, sondern 1+1 und das bleibt immer 2

0
Bestimmtnichtso 
Beitragsersteller
 15.12.2021, 20:58
@RareDevil

int i;

i = 2;

if (digitalRead(4) == HIGH){

delay(500);

i = i + 1;

delay(500);

}

if (i == 5) {

digitalWrite(8, HIGH);

}

if (digitalRead(5) == HIGH) {

delay(500);

i = i + 1;

delay(500);

}

if (i == 10) {

digitalWrite(8, LOW);

}

Serial.println(i);
-------------------------------------------------
das ist was mir als lösung geschickt worden ist

0
RareDevil  15.12.2021, 21:47
@Bestimmtnichtso

Sagen wir so, der Code ist nicht vollständig, zählt beide Taster hoch, setzt sich nie zurück und warum i direkt mit 2 initialisiert wird, ist mir ein Rätsel... Zudem ist die Lösung mit 500ms Delay zum entprellen des Tasters auch nicht schön gelöst, aber einfache Lösung. Nachteil ist, dass der Taster eine Sekunde gesperrt ist und der Code stoppt (500ms vor dem Zähleraddieren und noch mal 500ms danach)

0
RareDevil  15.12.2021, 22:04
@Bestimmtnichtso

Hier mein Code, wie ich es schreiben würde:

int i = 0;                //Zählervariable
bool buttonState2 = LOW;  //Taster2 Statusspeicher für Flanke
bool button2 = LOW;       //Taster2 Status eingelesen

void setup() {
  // put your setup code here, to run once:
  pinMode (2, INPUT); //Pin2 als Eingang
  pinMode (3, INPUT); //Pin3 als Eingang
  pinMode (4, OUTPUT); //Pin4 als Ausgang
}

void loop() {
  // put your main code here, to run repeatedly:
 
  button2 = digitalRead(2); //Taster an Pin 2 einlesen und speichern
  delay(3); // kurzes Delay zum entprellen, eig nicht unbedingt nötig..

/* Im nachstehenden if wird geprüft, ob der Taster gedrückt wurde, aber zuvor noch nicht gedrückt wurde.
 *  Wird der Taster fest gehalten, so ist buttonState2 bereits HIGH und die Bedingung nicht mehr erfüllt.
 *  Es wird verhindert, dass der Zähler in jedem Zyklus weiter zählt
 */

  if (button2 == HIGH && buttonState2 == LOW) { //Flankenauswertung steigend
    buttonState2 = HIGH;  //Tasterdruck nachführen für Flankenauswertung
    i = i + 1;  // Zähler addieren
  }
 
  if (button2 == LOW && buttonState2 == HIGH) { //Flankenauswertung fallend
    buttonState2 = LOW; //Rücksetzen der Tasternachführung, Zähler wieder scharf
  }
 
  if (i == 3) {             //prüft, ob Zähler den Wert erreicht hat
    digitalWrite(4, HIGH);  //Ausgang einschalten
    delay(2000);            //2sek Verzögerung
    digitalWrite(4, LOW);   //Ausgang ausschalten
    i = 0;                  //Zähler auf 0 setzen, damit wieder er wieder von vorne zählen kann
  }

}
1

Ich gehe den Code von oben nach unten durch. Zuerst ist

Zeile 4: Buttonpressed = 2

Zeile 20: if(Buttonpressed = HIGH){....}

Es steht also in der if eigentlich

Zeile 20: if(2= HIGH){....}

Die If wird also ausgeführt wenn 2 == HIGH ist. Ist es das oder ist das Blödsinn?

Weiterhin steht bei der if ein = statt einem == Vergleichszeichen.


RareDevil  15.12.2021, 20:52

Ich merke gerade, dass ich zu flüchtig geschaut habe... Hast noch mehr gefunden wie ich... ^^

1

Der schwerste Fehler:

i=1+1.

Du setzt damit i jedesmal auf 2. Du meinst sicher "i= i+1" oder in kurzfrom "i++" oder "i+=1".

Dann fehlt da ein debounce, da sonst ein druck zu mehreren gezählten tastendrücken führen kann (z.B. mit nem Delay o.ä.).

Woher ich das weiß:Hobby