Frage Taster

if (pinstate2 == HIGH)
  {
    client.publish("topic2", "1");
  }
  if (pinstate2 == LOW)
  {
    client.publish("topic2", "0");
  }

Durch einen Tastendruck möchte ich bei einem HIGH Signal eine 1 und bei einem LOW Signal eine 0 an einen MQTT Server schicken. LEIDER wird bei losgelassenem Schalter die 0 unenendlich mal und in sehr kurzen Abständen versendet. Mein Ziel ist es, dass die bei Zustandsänderung des Tasters die 0 nur einmal versendt wird!

(deleted)

  pinstate1 = digitalRead(pin1);
  pinstate2 = digitalRead(pin2);
  pinstate3 = digitalRead(pin3);
  pinstate4 = digitalRead(pin4);
  pinstate5 = digitalRead(pin5);

Durch diesen Teil des Codes werden die Zustandsänderungen doch in einer Variable festgehalten?
Nein die Taster sind nicht entprellt.

(deleted)

Wie können Änderungen festgestellt und gespeichert werden?

(deleted)

Hättest du dafür ein Beispiel für mich?

(deleted)

h-marco:
Hättest du dafür ein Beispiel für mich?

Moin, das ist garnicht soo schwer. Ich nehm mal als Basis Dein Ausgangspost.

Du legst keine Statusvariable an, sondern übernimmst den Wert des digitalpin in eine Variable um mit diesem Wert weiterzuarbeiten.
Prinzipiell benötigst Du die Statusvariable um einen Vergleich anzustellen, ob sich der Wert zum Status verändert hat.
Dabei kannst Du auf Gleichheit (==) oder Ungleichheit(!=) prüfen.
Bei PIN-Abfragen macht sich das arbeiten mit != ganz gut.

Wenn also die Statusvariable HIGH ist und der PIN ebenfalls HIGH, dann passiert nichts, weil sich der Zustand nicht geändert hat.
Geht der PIN jetzt auf LOW und ist die Statusvariable HIGH, dann führe Aktion aus und merke den Zustand
Jetzt passiert wieder solange nichts, bis der Taster losgelassen wird.
Dann geht der PIN auf HIGH und die Variable ist LOW - also Bedingung wieder erfüllt.

Aufpassen musst Du nur, das Du mit der Statusvariablen weiterarbeitest, denn wenn der Taster prellt ändert sich der Zustand in der Zeit, wo der Code ausgeführt wird.

Zu schwer erklärt?

boolean statusvariable = HIGH;
const int digitalpin = 6;
void setup()
{
  pinMode (digitalpin , INPUT_PULLUP);
}

void loop()
{
  if (digitalRead (digitalpin) != statusvariable)
  {
    statusvariable = !statusvariable;
    // löse hier deinen Vorgang auf Basis der statusvariablen aus
    if (statusvariable)
    {
      // führe hier code aus, wenn status HIGH
    }
    else
    {
      // führe hier code aus, wenn status LOW
    }
  }
}