Go Down

Topic: Wo habe ich den denk Fehler? (Read 558 times) previous topic - next topic

Jetiman

Ich möchte das wenn der Knopf gedrückt wird. Es 1 mal pipt. Wenn ich ihn los lasse, dann 2 mal.
Nach dem Spannung anlegen Pipt er 2 mal.
Beim Drücken 1 mal

Dann passiert nichts mehr.
Wo ist da der Fehler?

Code: [Select]
int buzzer = 8;
const int taster = 12;
int buttonState = 0;
int buzzertimer = 1;
int buzzertimer2 = 2;

void setup()
{
pinMode(taster, INPUT);
Serial.begin(9600);
}

 
  void loop(){
buttonState = digitalRead(taster);

if (buttonState == HIGH)
    {
        while (buzzertimer>0)
        {
        buzzertimer--;
       
        tone(buzzer, 4000, 1000);
        delay(1000);
        Serial.println(buzzertimer2);
        }
        int buzzertimer2 = 2;
    }
else
    {
        while (buzzertimer2>0)
        {
        buzzertimer2--;
       
        tone(buzzer, 4000, 500);
        delay(1000);
        Serial.println(buzzertimer);
        }
        int buzzertimer = 1;
    }
}

eberduino

#1
Nov 05, 2013, 04:50 pm Last Edit: Nov 05, 2013, 05:02 pm by eberduino Reason: 1
Du hast hier die Software gezeigt, wie sieht die Hardware aus? Zeig' mal die Beschaltung.

Beide buzzertimer sind bereits deklariert worden. Warum in der loop() noch einmal?

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."

Jetiman

Mit dem "buzzertimer--" Zählt er die buzzertimer auf 0.

Ich möchte die mit dem buzzertimer im loop wieder zurücksetzen.

Hardware Arduino Nano

Speaker an Pin D8

D12 -Taster-+5V
      | Widerstand 4,7 - Massen

Serenifly

#3
Nov 05, 2013, 05:11 pm Last Edit: Nov 05, 2013, 05:25 pm by Serenifly Reason: 1
Du hast Variablen doppelt definiert. Die existieren zweimal in unterschiedlichen Scopes/Gültigkeitsbereichen.

Mach mal spaßhalber das:

Code: [Select]

int test =  1;

void loop()
{
   int test = 2;
   Serial.println(test);
   Serial.println(::test);
   delay(2000);
}


Das wird dir "2" und "1" ausgeben. Die globale Variable steht immer noch auf "1", weil du lediglich eine lokale Variable gleichen Namens anlegst.

Lass einfach das "int" weg wenn du die Variable beschreibst. Dann ist es auch die gleiche.

EDIT:
Wenn du das machst:
Code: [Select]

else
{
   int buzzertimer = 1;
}

Ist das eine lokale Variable die nur zwischen den geschweiften Klammern existiert. Oben fragst du dann die globale Variable ab, die nie geändert wurde.

So ist es richtig:
Code: [Select]

else
{
   buzzertimer = 1;
}

Jetiman

Super, danke.

Auf nur "buzzertimer = 1;" bin ich gar nicht gekommen.

Go Up