Schleifenproblem, Zustandänderung Button

Hallo Leute,
ich checke grad nicht was in meinem primitiven Code falsch läuft.

Versuche in einer Dauerschleife den Zustand eines Button abzufragen und bei einer Änderung(1 oder 0) eine einmalige Aktion auszuführen. Diese Aktion sollte aber nicht jedem Schleifendurchgang wiederholt werden sondern nur ein Mal bei der jeweiligen Zustandänderung auf 1 oder auf 0.

const int buttonPin = 2;     // the number of the pushbutton pin
int buttonState = 0;         // variable for reading the pushbutton status
int lastState = 0;

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

void loop()
{
  Serial.println("... neue Runde ...");
  buttonState = digitalRead(buttonPin); //aktuellen Zustand merken
    

  digitalWrite(LED_BUILTIN, buttonState); //Zustand durch LED anzeigen
  
  
    while (lastState != buttonState) //bei Zustandänderung
    {
      if (buttonState == LOW) Serial.println("Zustand geändert: 0"); // hier ne einmalige Aktion Tor_0;
      if (buttonState == HIGH) Serial.println("Zustand geändert: 1"); // hier ne einmalige Aktion Tor_1;
    }
  
  lastState=buttonState; //letzter Zustand = aktueller Zustand
}

Wenn ich nun Die Pinne "D2" und "GND" verbinde passiert nix. Die (built_in)LED zeigt keine Reaktion und im Seriellen Monitor läuft nur "... neue Runde..." aber nicht "Zustand geändert: 0/1"
Hintergrund der ganzen Geschichte. Ich habe ein Tor dessen Lichtshranke ich abfragen weill. Wenn die Lichtschranke auf/zu meldet, soll das einmalig über Ethernet(enc28j60) gemeldet werden. Aber das ist ne andere Baustelle.

Kann mir eine/r nen Tip geben was ich anders machen soll.
Irgendwie scheint das setzen der Variable "buttonState" nicht richtig zu funzen.

Ach ja, ich nutze einen original Arduino Nano.
Parameter in der IDE:
Board: "Arduino Nano", Prozessor: "ATmega328P", Programmer: "ArduinoISP"

Irgendwie scheint das setzen der Variable "buttonState" nicht richtig zu funzen.

Das stimmt!
In der while Schleife wird sich buttonState niemals ändern.
Die Schleife muss also weg.

Tipp:
Du möchtest eine Ablaufsteuerung bauen.
Einen endlichen Automaten.

Hast Du schon mal das StateChangeDetection Beispiel angeschaut?

Dein Problem ist die while Schleife, die nicht mehr aufhört. Ein if wäre da schon weit sinnvoller.

Hallo nochmal,
danke für eure Antworten.

Ich hatte anfänglich auch schon mit "if".
Da ging es auch nicht. Aber die "while" Schleife ist da echt überflüssig.

Das Beispiel ist im Prinzip mit meinem Fall identisch. Nur dass ich keinen Zähler brauche.

Habe den Fehler gefunden.
Hatte immer D2 mit GND verbunden.
Wie es aussieht hatte ich den falschen Ansatz und einfach verwechselt was überbrückt werden muss.

Wenn ich D2 und 5V oder 3,3V überbrücke, funzt es wie gewollt.
Nur wozu muss D2 auf GND durch nen Widerstand verbunden werden? (wie es im Beispiel beschrieben ist)

Was mich nun wundert ist, dass wenn ich die Pins überbrücke der Arduino sofort reagiert. Wenn die Überbrückung rausnehme, dauert es ca.2 Sekunden bevor Arduino das meldet obwohl ein Schleifendurchgang nur wenige Millisekunden dauert.

Lesestoff

Danke "combie"