Anfängerprojekt Problem

Hallo an alle, die dies lesen.

Ich habe mit dem programmieren neu angefangen und ein Projekt überlegt welches momentan leider nicht funktioniert.

Projekt:

Ich habe eine Led an pin 13 angeschlossen und einen Druckschalter benutzt, welcher über Pin 2 eine Ausgabe an meinen Arduino sendet.
Mein Ziel ist es, dass meine LED n mal blinkt, wenn ich meinen Druckschalter n-mal betätige.
Ich dachte ich wäre bereits fertig, doch als ich meinen Code auf den Arduino lud, passierte nichts:D
Ich hoffe ihr könnt mir weiterhelfen.

Im Anhang ist meine Schaltung zu sehen.

Mit freundlichen Grüßen
Lucas

Code:

int InputPin = 2;
int LEDPin = 13;
int i = 0;

void setup()
{
 Serial.begin(9600);
 pinMode(InputPin,INPUT);
 pinMode(LEDPin,OUTPUT); 
}


void loop()
{
 int SchalterZustand = digitalRead(InputPin);
 
    if(SchalterZustand = HIGH)
    {
    i++;
    }

        while(i>0);
        {
         digitalWrite(LEDPin,HIGH);
         delay(500);
         digitalWrite(LEDPin,LOW);
         delay(500);
         i--;
        }
}

Setze deinen Sketch bitte in Code-Tags, Schaltfläche </> oben links im Editorfenster.
Dann ist dieser für alle besser lesbar. Das kannst du auch nachträglich noch machen.

Deine if-Abfrage ist falsch: = ist nicht ==

Hast Du einen Vorwiderstand an der LED?

Definiere genauer innerhalb welcher Zeit der Taster gedrückz werden darf und wann die LED blinken soll.

Grüße Uwe

Es tut mir leid, aber ich finde nicht wie ich im nachhinein den Code makiere.

Ja ich habe einen 220Ohm Widerstand angeschlossen.

Auch ist in deinem Fall wichtig, den Taster zu entprellen.
Das geht per Hardware oder per Software.
Ohne diese Entprellung wirst du nie ein funktionierendes Ergebnis erhalten.

Hallo
Bau Mal ein serial.print(schalterzustand) hinter das einlesen des Schalters damit du sehen kannst ob sich der Pegel überhaupt ändert . Ich glaube die Schaltung stimmt nicht
Heinz

LJ350:
Es tut mir leid, aber ich finde nicht wie ich im nachhinein den Code makiere.

Hast du keine Cursor Tasten?

Danke für all die Antworten.
Ich werde sie mir Morgen mal durchlesen, und bei Bedarf nochmal nachhacken:)

LJ350:
Danke für all die Antworten.
Ich werde sie mir Morgen mal durchlesen, und bei Bedarf nochmal nachhacken:)

????

LJ350:
Danke für all die Antworten.
Ich werde sie mir Morgen mal durchlesen, und bei Bedarf nochmal nachhacken:)

Bist Du Gärtner? :wink:

Gruß Tommy

LJ350:
Danke für all die Antworten.
.....

Und vergiss die Code-Tags nicht.

Rentner:
Hallo
Bau Mal ein serial.print(schalterzustand) hinter das einlesen des Schalters damit du sehen kannst ob sich der Pegel überhaupt ändert . Ich glaube die Schaltung stimmt nicht
Heinz

Ich habe dies getan und erhalte im Seriellen Monitor eine 0, wenn er nicht betätigt, und eine 1, wenn er betätigt wird. Dies funktioniert auch.
Außerdem habe ich nach meiner If-Schleife ebenfalls ein Serial.print(i) eingefügt und stelle nun fest, dass mein i wächst, wenn mein Schalter nicht getätigt wird. Habe ich dem Arduino aber nicht versucht zu sagen, dass i nur dann erhöht werden soll, wenn mein SchalterZustand High ist, also 1?

Und Entschuldigung für den Rechtschreibfehler :wink:

Hast du deinen Fehler hier erkannt ?

  if(SchalterZustand = HIGH)

Das muss heißen:

  if(SchalterZustand == HIGH)

HotSystems:
Hast du deinen Fehler hier erkannt ?

  if(SchalterZustand = HIGH)

Das muss heißen:

  if(SchalterZustand == HIGH)

Habe ich vergessen zu sagen, ist bereits geändert. danke:)

Hallo,
Eigendlich soll dein i ja um 1 größer werden wenn der Taster von 0 auf 1 wechselt und nicht während der gesamten Zeit.
Du brauchst also eine Flanken Erkennung für die pos Flanke.

Aber der ganz Skatch hat sein Problem er fängt ja bereits an mit der Bearbeitung der LeD wenn du eventuell noch hoch zahlen willst.
Zudem werden die LED nur bearbeitet wenn der Taster ein ist.

Dann während des dekay ist der Uno am am schlafen nix geht mehr . Damit kannst du auch während der Zeit keine Taster mehr erkennen.

Du musst die Struktur noch Mal überdenken

Mach erst Mal mit einer Flanke zahlen bis 5 und wenn der Zähler bei 5 angekommen ist lässt du 5 Mal blinken

Dazu siehst du dir dann das Beispiel blink without delay an , wenn du das verstanden hast ist das sicher das was du haben wolltest .

LJ350:
Habe ich vergessen zu sagen, ist bereits geändert. danke:)

Ok, das war der Fehler....hast du deinen Taster schon entprellt, wie ich es in Post #4 geschrieben hatte ?

ich habe mal einen Sketch geschrieben, schau ihn dir mal an, ob er das macht was du möchtest.

/*
 *© Ardubu Mai 2018
 *Led blinkt so oft wie ein Taster gedrückt wurde und macht dann 1 sek. Pause
 *Taster wird zwischen GND und pin_x angeschlossen
 *interner Pullup Widerstand aktiviert
 *der counter zählt von 0 bis 255 jeden Tastendruck
 *am seriellen Monitor sieht man wie oft der Taster gedrückt wurde
*/

 #define DEBUG //Nur zur Fehlersuche aktivieren
 #define tasterPin 2//Taster an D2 und GND
  const uint8_t ledPin = 13;   // LED an D13
  uint8_t counter; //Zählt wie oft die Taste gedrückt wurde
  
void setup() {
  #ifdef DEBUG
  Serial.begin(115200);
  Serial.println("Setup");
  #endif
  pinMode(tasterPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
 }

void loop() {
tasterAbfrage();
if(counter) blink_anz(counter,ledPin);

}//Ende loop

void tasterAbfrage()
{
 const uint8_t debounce_delay = 10; //Entprellzeit für den Taster in ms
 static bool tasterState, tasterState_alt;// Variablendeklaration (lokal)
 static uint32_t debounce_time;
 if (millis()-debounce_time>debounce_delay)tasterState = digitalRead(tasterPin); //einlesen des Tasters
   
 if (tasterState != tasterState_alt) // bei Pegelwechsel 
    {
     debounce_time=millis();
     #ifdef DEBUG
               Serial.println(counter);
     #endif
     if(!tasterState)//wenn Taster gedrückt
        counter++;
       
        tasterState_alt = tasterState; // state aktualisieren
        }
}
void blink_anz(const uint8_t anz,const uint8_t ledPin)
{
  static uint32_t previousMillis_led;        
  static uint32_t millisalt_led;
  static bool     ledState;
  static uint8_t  count;
  const uint16_t  interval = 300;           
  if(millis()-millisalt_led>1000)
  {
   if(millis() - previousMillis_led > interval)
     {
       previousMillis_led = millis();   
       if (!ledState) ledState = HIGH;
       else{
            ledState = LOW; 
            count++;
            if(count>=anz){count=0;millisalt_led=millis();}
            }
       digitalWrite(ledPin, ledState);
     }
   }
}