Wie programmiert man eine Stromstoßschaltung mit Arduino (5V Taster und LED)?

2 Antworten

Würde erst mal den Eingang auf INPUT_PULLUP setzen und den Taster gegen Masse schalten. Spart den Pulldownwiderstand. Dann abfragen, ob der Taster betätigt ist und entsprechend den Ausgang umschalten. Entweder mit "toggle" oder eben über einen Statusmerker. Also wenn "Eingang LOW" und "Merker ein", dann aus und andersrum. Dazu musst Du aber noch eine Flankenerkennung programmieren. Er muss also erkennen, das der Taster betätigt wurde. Im nächsten Zyklus würde er sonst wieder schalten. Das geht auch mit einem Merker, der den Tasterstatus speichert.


ElamoMichi 
Beitragsersteller
 03.11.2019, 14:41

Bin leider noch nicht so gut in Programmierung.

Ausgang umschalten? toggle Statusmerker?

Soweit war ich schon das ich eine Flankenerkennung programmieren muss, aber leider hat mein Code nicht funktioniert.

0
RareDevil  03.11.2019, 14:51
@ElamoMichi

Was hast DU denn bis jetzt und wo genau klemmt es? Dann kann man darauf aufbauen. Wenn ich jetzt nur eine fertige Lösung poste, geht das zwar, aber willst es auch verstehen und selbst umsetzen können, oder?

0
RareDevil  03.11.2019, 15:15
@RareDevil

Btw ist was her... Hatte in Erinnerung, dass es einen toggle-Befehl gibt... Ich hatte nur den Merker toggle genannt... ^^ Sorry dafür... Hab mal meinen Code rausgesucht, damit ich nicht alles neu schreiben muss... ^^ Hier heißt die Variable aber nicht mehr "toggle" sondern "state1" Poste es als Beispiel trotzdem mal...

int led1 = 9; // 1. LED
int led2 = 7; // 2. LED (für alternatives Beispiel)
int btn1 = 3; // Tastereingang
int btn1_state = LOW; // Variable für Tasterspeicherung
int btn1_last = HIGH; // Variable für Flankenauswertung
int state1 = LOW; // Variable für Status Ein/Aus LED1

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(btn1, INPUT_PULLUP);
}

void loop() {


  // Es folg das Einlesen & speichern des Taster, die Flankenauswertung und umschalten


  btn1_state = digitalRead(btn1); // einlesen des Taster und zwischenspeichern



  if (btn1_state == LOW && btn1_last == HIGH) { //Prüfung auf Tasterveränderung
    btn1_last = btn1_state; // nachführen der Tasterveränderung. Beim nächsten Zyklus ist die Bedingung der if damit nicht mehr erfüllt.
    state1 = !state1; // setzt den Status durch ! immer entgegengesetzt des momentanen Zustandes
    digitalWrite(led2, !digitalRead(led2)); // LED wird direkt angesteuert. ! setzt den Ausgang entgegen des eingelesenen aktuellen Zustand
  }
 
  if (btn1_state == HIGH) { // Prüfung auf losgelassenen Taster
    btn1_last = btn1_state; // speichern des geänderten Tastersignals in Grundzustand
  }


  /* Ab hier beginnt die Ausgabe für led1 über die Variable state1.
   * Die led1 hat dann immer den Zustand, wie die Variable auch...
   * Dient der Übersicht, wenn man alle Ausgänge am Ende setzt,
   * und zuvor nur mir Variablen als Zwischenmerker arbeitet.
   * Vor allem setzt man dann einen Ausgang nicht versehentlich 2x,
   * weil man ihn durch andere Zusammenhänge mit ansteuern möchte.
   */

  digitalWrite(led1, state1); // Ausgang led1 wird der Status der Variable state1 zugewiesen

}
1
ElamoMichi 
Beitragsersteller
 03.11.2019, 15:39
@RareDevil

Danke 😊 Ich werde ihn bei Gelegenheit Mal ausprobieren.

Notfalls kann ich ja nochmal Fragen, wenn ich Abschnitte des Quellcodes nicht verstehe.

1
RareDevil  03.11.2019, 15:40
@ElamoMichi

Hab den Code eben auf die schnelle noch was ausgedünnt und hoffe, es ist kein Fehler drin. Wurde zumindest Fehlerfrei übersetzt... ^^ Ist nicht final geprüft ;)

1

Hallo,

wie Rare schon schrieb würde ich den eingang erstmal entprellen..Und zusätzlich würde ich bei solchen tastern den flankenwechsel von Low auf High (nach dem Drücken den Taster loslassen) das Umschaltprogramm starten..

Der taster ist nur mit GND und dem Digital-Eingang vom ardu verbunden, im Setup Input_Pullup aktivieren..

Woher ich das weiß:Hobby