Led mit 2 Tastern ein-aus schalten

Wolfgang Rischke

Neues Mitglied
04. Aug. 2026
11
1
3
Sprachen
  1. C++
Wer hat ein klleines Programm zum schalten mit 2 Tastern und einer LED.Mit einem Taster soll die LED eingeschaltet,mitn dem anderen Taster ausgeschaltet werden.
Viele Grüße Wolfgang.Stehe ganz am Anfang mit Arduino
 
Ein Taster sollte erstmal entprellt werden. In Deinem Fall könnte man allerdings darauf verzichten wenn Du jedem Taster nur eine Aktion zuweisen möchtest.

Der Pin wird als Eingang definiert. Der Pin sollte einen definierten Ruhezustand haben. Z.B. kannst Du ihn HIGH lassen und mit dem Taster auf LOW ziehen. Das macht man mit einem relativ hochohmigen Pull-up Widerstand, z.B. einen 10k nach VCC. Wenn der µC an den Pins über interne Pull-ups verfügt kannst Du die über Software aktivieren.
Code:
#define PIN_EIN 2
#define PIN_AUS 3
#define LED_PIN 13

void setup() {
  pinMode(PIN_EIN, INPUT_PULLUP);
  pinMode(PIN_AUS, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);
}
Der Taster wird mit GND verbunden. Wenn Du ihn drückst fließt dann ein geringer Strom durch den Widerstand. Ausrechnen kannst Du das mit dem Ohmschen Gesetz U = R × I (nach I umstellen)

Dann sagst Du dem Programm was es machen soll. Die einfache Form sieht so aus.
Code:
void loop() {
  bool on = digitalRead(PIN_EIN);
  bool off = digitalRead(PIN_AUS);
  if (on) {
    digitalWrite(LED_PIN, HIGH);
  } else if (off) {
    digitalWrite(LED_PIN, LOW);
  }
  delay(10);
}

Ich würde das Programm nicht so schreiben, aber ist ein guter Einstieg wenn Du noch nie programmiert hast.
 
Vielen Dank.Bin schon 76 Jahre,und hatte mit nprogrammieren bis jetzt nichts zu tun.Aber ich will nicht dumm sterben.
Mit der Arduino-Schaltung soll ein Bahnübergang(Modellbahn mit 4 Schranken als Demonstrationsobjekt gesteuert werden.
Man drückt aufn die rote Taste-die Straßenampel zeigt Gelblicht.Nach 3 Sekunden Lichtwechsel von Gelb auf Rot.Rotlicht bleibt an.
Nach 3 Sekunden Rotlich beginnt sich Schranke 1 zu nsenken,nach 2 Sekunden Schranke 2,nach 2 Sekunden Schranke 3,nach 2 Sekunden Schranke 4.
So weit hatte ich das programmiert,und hat auch einwandfrei funktioniert.
Aber das Öffnen der Schranken ging nicht,wenn ich auf den grünen Taster gedrückt habe.Auch das Rotlicht an der Straßenampel blieb an.Ich hab keine Lösung gefunden.
Viele Grüße
Wolfgang
 
Zunächst kannst Du abklären ob das ein elektrisches oder ein Programm Problem ist.
 
Ist ein Programmproblem.Taster(Rafi) und LED`S funktionieren.LED`S wurden ersatzweise statt Schranken eingesetzt.Schranken werden dann über Relais angesteuert.
Viele Grüße
Wolfgang
 
Wie kann ich einen Scetch ( .ino Datei) hier im Forum hochladen?Vielen Dank für die Antwort.Hab`s schon probiert,aber nicht hinbekommen.Wolfgang
 
Hallo Wolfgang,

poste den Sourcecode im Beitrag (Code Einfügen Button) oder packe deine ino Datei als zip und hänge die Zip-Datei an den Beitrag an.

Dirk :ciao:
 
Ich schicke das Programmj als ZIP Datei. D.h.ich versuch es wenigstens.Fragen dazu werden gerne beantwortetHab mit einem Trick Öffnen der Schranken erreicht.Mache mit dem grünen Taster(Schranken öffnen)einen Reset.Funktioniert zwar,ist aber nicht so elegant,wie ich es gerne machen würde.
Grüße und danke
Wolfgang
 

Anhänge

  • Schranke.zip
    633 Bytes · Aufrufe: 1
ch schicke das Programmj als ZIP Datei. D.h.ich versuch es wenigstens.Fragen dazu werden gerne beantwortetHab mit einem Trick Öffnen der Schranken erreicht.Mache mit dem grünen Taster(Schranken öffnen)einen Reset.Funktioniert zwar,ist aber nicht so elegant,wie ich es gerne machen würde.
Grüße und danke
Wolfgang
 

Anhänge

  • Schranke.zip
    633 Bytes · Aufrufe: 1
Das Programm dürfte durch die 4 mal define SchrankePin eigentlich nicht kompilieren.
Die Delays blockieren die Tastenerkennung.
Tasten abfragen ohne Entprellung (nicht so schlimm).

So habe ich dein programm verstanden:
  • Roter Taster → Vorwarnung (gelbe LED), dann Schranken schließen (4 Motoren/Servos nacheinander), rote LED an
  • Grüner Taster → Schranken wieder öffnen

Ich kann es selber nicht testen, aber probiere mal den unteren Code.

Es ist eine leichte Entprellung vorhanden, die Delays sind entfernt, Zeiten sind flexibler wählbar.
Bei den Tastern muss jeweils ein externer Pulldown Widerstand vorhanden sein.

Dirk :ciao:




CodeBox C
// ---------- Pin-Definitionen ----------
const byte tasterRotPin   = 2;   // Taster "Schranke schließen"
const byte tasterGruenPin = 12;  // Taster "Schranke öffnen"
const byte ledGelbPin     = 7;   // Warnblinker
const byte ledRotPin      = 6;   // Dauerlicht, wenn geschlossen
const byte schranke1Pin   = 4;
const byte schranke2Pin   = 5;
const byte schranke3Pin   = 8;
const byte schranke4Pin   = 9;

// ---------- Einstellbare Zeiten (ms) ----------
const unsigned long VORWARNZEIT      = 3000; // Gelb blinkt, bevor die Schranken zugehen
const unsigned long BLINKINTERVALL   = 400;  // Blinkgeschwindigkeit Gelb
const unsigned long SCHRANKENVERSATZ = 800;  // zeitlicher Abstand zwischen den 4 Schranken
const unsigned long ENTPRELLZEIT     = 50;   // Taster-Entprellung

// ---------- Zustandsmaschine ----------
enum Zustand { RUHE, WARNEN, SCHLIESSEN, GESCHLOSSEN };
Zustand zustand = RUHE;

unsigned long stateTimer   = 0;   // Startzeitpunkt des aktuellen Zustands
unsigned long letzterBlink = 0;
bool gelbAn = false;
byte schrankenSchritt = 0;

unsigned long letzteTasterZeit = 0;

void setup() {
  pinMode(tasterRotPin, INPUT);     
  pinMode(tasterGruenPin, INPUT);
  pinMode(ledGelbPin, OUTPUT);
  pinMode(ledRotPin, OUTPUT);
  pinMode(schranke1Pin, OUTPUT);
  pinMode(schranke2Pin, OUTPUT);
  pinMode(schranke3Pin, OUTPUT);
  pinMode(schranke4Pin, OUTPUT);
}



void loop() {
  unsigned long jetzt = millis();

  switch (zustand) {

    case RUHE:
      if (tasterGedrueckt(tasterRotPin)) {
        zustand = WARNEN;
        stateTimer = jetzt;
        letzterBlink = jetzt;
        gelbAn = false;
      }
      break;

    case WARNEN:
      // Gelbe LED blinkt, solange die Vorwarnzeit läuft
      if (jetzt - letzterBlink >= BLINKINTERVALL) {
        letzterBlink = jetzt;
        gelbAn = !gelbAn;
        digitalWrite(ledGelbPin, gelbAn ? HIGH : LOW);
      }
      if (jetzt - stateTimer >= VORWARNZEIT) {
        digitalWrite(ledGelbPin, LOW);
        digitalWrite(ledRotPin, HIGH);
        zustand = SCHLIESSEN;
        stateTimer = jetzt;
        schrankenSchritt = 0;
      }
      break;

    case SCHLIESSEN:
      // Die 4 Schranken nacheinander mit Versatz schließen
      if (jetzt - stateTimer >= (unsigned long)schrankenSchritt * SCHRANKENVERSATZ) {
        switch (schrankenSchritt) {
          case 0: digitalWrite(schranke1Pin, HIGH); break;
          case 1: digitalWrite(schranke2Pin, HIGH); break;
          case 2: digitalWrite(schranke3Pin, HIGH); break;
          case 3: digitalWrite(schranke4Pin, HIGH);
                  zustand = GESCHLOSSEN;
                  break;
        }
        schrankenSchritt++;
      }
      break;

    case GESCHLOSSEN:
      // Wartet, bis der grüne Taster gedrückt wird – egal wie lange
      if (tasterGedrueckt(tasterGruenPin)) {
        digitalWrite(ledRotPin, LOW);
        digitalWrite(schranke1Pin, LOW);
        digitalWrite(schranke2Pin, LOW);
        digitalWrite(schranke3Pin, LOW);
        digitalWrite(schranke4Pin, LOW);
        zustand = RUHE;
      }
      break;
  }
}

// Liest einen Taster mit einfacher Entprellung
bool tasterGedrueckt(byte pin) {
  if (digitalRead(pin) == HIGH) {
    unsigned long jetzt = millis();
    if (jetzt - letzteTasterZeit > ENTPRELLZEIT) {
      letzteTasterZeit = jetzt;
      return true;
    }
  }
  return false;
}
 
Zuletzt bearbeitet:
  • Like
Reaktionen: alecxs
Vielen Dank Dirk,ich werde es ausprobieren.Wie gesagt,ich bin ganz neu in der Arduino Sache,und für jede Hilfe dankbar.
Liebe Grüße
Wolfgang
 
Hallo Dirk erst mal vielen Dank.Hab`s Programm abgetippt und 5 mal auf Rechtschreibfehler und dergleichen überprüft.Scheint alles richtig.Nur der Compiler meckert über verschiedene Fehler.Warum auch immer.Ich würde es Dir gerne mal schicken,Vielleicht kann dein geschultes Auge mehr erblicken als meines.
Als was soll ich die .ino Datei schicken? Zip gepackt oder anders.Ist anscheinend nicht so einfach eine .ino Dtei hier im Forum zu versenden.
Viele Grüße
Wolfgang
 
Hallo Wolfgang,

du musst das Programm nicht abtippen, kopiere es über die Zwischenablage.

Was interessant wäre: welches Arduino Board verwendest du?

Wenn du etwas hochladen möchtest, einfach in eine Zip datei packen und an einen Beitrag anhängen, so wie du es schon gemacht hast.

Du kannst auch mal die Fehlermeldung posten.

Dirk :ciao:
 
Zuletzt bearbeitet:
Hallo Dirk,ich habe hier Board Arduino Uno R3 und Arduino Mega.Verwende aber Arduino UNO R3.Ich hänge die abgetippte Datei als ZIP gepackt an.Vielen Dank
Wolfgang
 

Anhänge

  • Schranke_3.zip
    641 Bytes · Aufrufe: 2
Hallo Wolfgang, was du hochgeladen hast ist dein Programm, das hat unter anderem dem Fehler mit den wiederholten #define.

C:
#define SchrankePin 4
#define SchrankePin 5
#define SchrankePin 8
#define SchrankePin 9

Kopiere meinen Code oben in die Zwischenablage ünd füge diesen bei dir ein.
 
Habs gerade gemerkt.Bei deinem Programm bringt mein Compiler (IDE Entwicklungsumgebung) komischerweise auchFehlermeldungen.Hänge es als Schranke_5 ZIP an.
 

Anhänge

  • Schranke_5.zip
    1,2 KB · Aufrufe: 1
Du hast mehrere Fehler beim Abtippen gemacht.

u.a.
Groß-Kleinschreibung nicht konsistent (wichtig bei C/C++).
Geschweifte Klammer } bei switch() zu viel
break; zu viel
return true, anstelle return true;

.ino habe ich im Forum freigeschaltet und meinen Code angehängt. Probiere es direkt damit.
 

Anhänge

  • Schranke_VersionDirk.ino
    3,4 KB · Aufrufe: 11
  • Like
Reaktionen: alecxs
Hallo Dirk,vielen Dank.Wie sagt man :Nobody is perfect,besonders wenn man am Anfang steht.Jetzt funktioniert es.
Liebe Grüße
Wolfgang
 
  • Like
Reaktionen: Dirk