Mit einem Taste zwei LEDs hintereinander einschalten

Hallo zusammen binn komplett neu im Bereich Arduino und ich habe volgendes Problem mit dem ich einfach nicht klar komme, bitte um Hilfe:

Also wenn ich einen Taster einmal betätige soll die erste LED angehen und anbleiben, wenn ich den Taster erneut drücke soll die zweite LED angehen und anbleiben, wenn ich den Taster dann nocheinmal drücke sollen die zwei LEDs wieder ausgehen.

Bestimmt gibt es eine einfache Lösung aba ich binn wie gesagt ein Neuling in dem Thema

Dann fange doch erst mal ganz einfach an und bringe 1 LED zum leuchten.
Wenn Du das geschafft hast, sucht Du nach state maschine oder endlicher Automat.
Damit kannst Du das lösen. Du musst Dir also den Status merken und mit jedem Tastendruck diesen weiter schalten.

Gruß Tommy

Danke für die schnelle Antwort könntest du mir ein Beispiel geben?

Das ist ein klassischer Fall für eine Statemachine oder einen endlichen Automaten.

Du hast verschiedene Zustände in denen auf gleiche Ereignis (Tastendruck) verschieden reagiert werden soll.

du kannst im Internet nach "endlicher Automat" oder "state machine" suchen, oder hier im Forum mal diesen Fred ansehen: Anleitung Ein Endlicher Automat entsteht - Deutsch - Arduino Forum

Könntet ihr das anhand meines Beispiels zeigen?

In der URL, die Dir guntherb gegeben hat, sind Beispiele drin und die sind auch erklärt. Lesen und lernen musst Du schon selbst.

Gruß Tommy

Heislflo:
Könntet ihr das anhand meines Beispiels zeigen?

i = 0; //Modus

Wenn(tasterGedrückt) dann:

Wenn (i==0) dann:
led1 = on und led2 = off und
i++ //Du änderst den Modus von 0 auf 1

Wenn i=1 dann:
led1 = on und led2 = on und
i++ //Um zum nächsten Schritt zu springen

Wenn i=2 dann:
led1 = off und led2 = off
i=0 //Alle Schritte durchlaufen, jetzt kannst du wieder zum Anfang springen.

Programmieren musst du es schon selbst und ich würde die switch/case Variante anstelle von if verwenden. Aber du solltest Dir wirklich den Link von guntherb anschauen, werd ich auch tun.

Lg Donny

Heislflo:
Danke für die schnelle Antwort könntest du mir ein Beispiel geben?

Wie schon geschrieben, solltest du als "Anfänger" tatsächlich mit den einfachen Beispielen anfangen und damit die Grundlagen lernen.

Diese Beispiele findest du auch in deiner IDE unter "Datei - Beispiele".
Danach kannst du dich viel leichter in weitere Dinge einarbeiten.

Ohne diese Grundlagen wirst du auch unsere Vorschläge schwer verstehen.

Ich schliesse mit Thommy an: Erstmal lernen eine LED zu schalten.

Probiere dazu z.B. das Beispiel "Button" in der IDE.

Zu deiner State Machine:
Du könntest 3 Zustände definieren:
0: Eingang (alle LEDs aus)
1: EineLED (LEd1 an)
2: ZweiLED (beide an.

zwischen den Zuständen wechselst du mit einem Tastendruck.

z.B.:

byte Zustand;
switch(Zustand){
case 0:  // Eingangszustand
  if (Tastendruck){
    LED1 an;
    Zustand = 1;
break;
case 1:   // Eine LED an
  if (Tastendruck){
    LED2 an;
    Zustand = 2;
break;
case 2:   // zwei LED an
  if (Tastendruck){
    LEDs aus;
    Zustand = 0;
break;
}

denk dran, deine Tasterabfrage zu entprellen!
So ein Taster sendet, wenn gedrückt, immer gleich mehrere sehr kurze Pulse, die ein Arduino, der noch schneller ist, gleich als mehrere Tastendrück interpretiert.

Heislflo:
Könntet ihr das anhand meines Beispiels zeigen?

Eine weitere Anregung für eine LED mit LED2 ready:

const byte LED1 = 13;
const byte TASTER = 2;
const uint32_t ENTPRELLZEIT = 30;
uint32_t aktMillis, tasterMillis;
bool aktTaster, altTaster;
enum {AUS, AN1};
byte zustand = AUS;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(TASTER, INPUT_PULLUP);  // Taster schaltet nach GND
}

void loop() {
  aktMillis = millis();
  altTaster = aktTaster;
  // einfaches Entprellen
  if (aktMillis - tasterMillis >= ENTPRELLZEIT)
  {
    tasterMillis = aktMillis;
    aktTaster = digitalRead(TASTER);
  }
  // Endlicher Automat mit switch/case
  switch (zustand) {
    case AUS:
      if (altTaster && !aktTaster)
      {
        digitalWrite(LED1, HIGH);
        zustand = AN1;
      }
      break;
    case AN1:
      if (altTaster && !aktTaster)
      {
        digitalWrite(LED1, LOW);
        zustand = AUS;
      }
      break;
  }
}

Heislflo:
Könntet ihr das anhand meines Beispiels zeigen?

In dem Punkt stimme ich mit dem folgenden überein:

HotSystems:
Ohne diese Grundlagen wirst du auch unsere Vorschläge schwer verstehen.

Bestimmt gibt es eine einfache Lösung

Wie du schon an den anderen Postings siehst, ganz so "einfach" ist es nicht.

Aber dennoch zeige ich dir hier ein Beispiel!

Denn ich habe deine Anforderungsliste als Anregung genommen, um ein Beispiel für meine Codesammlung zu bauen.

Ich bin dankbar für die Anregung.
Und vielleicht kannst du, oder irgendwer anders, ja ein paar Anregungen aus dem Wust rausholen.....

/**
 * 
 * LED Schaltfolge
 * 
 * Ein Taster, zwei LEDs
 * 
 * Startzustand beide aus.
 * Erster Tastendruck, led1 geht an
 * Zweiter Tastendruck, led2 geht an
 * Dritter Tastendruck, beide LEDs gehen aus, Automat geht in den Startzustand
 * 
 * 
 * 
 */

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>

using Combie::Tools::FlankenErkennung;
using Combie::Timer::EntprellTimer;
using Combie::Pin::OutputPin; 
using Combie::Pin::TasterGND; 

using Counter = Combie::Tools::Counter<byte>;


TasterGND<2>      taster; // Taster gegen GND geschaltet
OutputPin<13>     led1;
OutputPin<12>     led2;
EntprellTimer     entprellen(20);
FlankenErkennung  flankenerkennung;
Counter           counter;


void ledAction(Counter &counter) 
{
    switch(counter) // "counter" haelt den Zustand des Automaten
    {
      case 1: led1.setHigh();  // Erster Tastendruck, led1 geht an
              break;
              
      case 2: led2.setHigh();  // Zweiter Tastendruck, led2 geht an
              break;
              
      case 3:                  // Dritter Tastendruck, beide LEDs gehen aus
      default: led1.setLow();
               led2.setLow();
               counter.reStart();  // Startzustand wieder herstellen
    }
}

void setup() 
{
    taster.initPullup();
    led1.init();
    led2.init();
    counter.onCount(ledAction);
}

void loop() 
{ 
  counter = flankenerkennung = entprellen = taster;
}

CombieLib.zip (58.7 KB)

1 Like

Ich versuche mal eine mögliche Lösung anders zu umschreiben.

Was du dir in jedem Fall erst mal selbst klar machen mußt, ist was du als Eingabe hast, was deine Ausgabe sein soll und wie die Verarbeitung dazwischen aussehen muss.

Du hast als Eingang einen Taster, als Ausgang aber 3 verschiedene Zustände. Nun mußt du dir also erstmal überlegen, wie du mit einem Taster auf 3 verschiedene Zustände kommst.

Man kann das darüber lösen, dass der Taster einen Zähler hoch zählt. Bei Überschreitung des höchsten gewünschten Zählerstandes muß dieser auf den niedrigsten gewünschten zurück gesetzt werden.

Fange erstmal an dir Gedanken darüber zu machen, was der Taster macht - er kann einen Eingang high oder low setzen. Am sichersten ist es den Wechsel von einen Zustand in den nächsten als Trigger zu verwenden- hierfür gibt es Beispiele. Der Wechsel muss entprellt sein, sonst löst das Schwingen der Kontakte im Taster ganz viele Zählungen aus. Als (üble) Krücke, kannst du dafür delay() nehmen- aber eleganter geht es mit millis().

So, nun solltest du schon mal einen Taster sauber einlesen können.

Damit kannst du nun eine Variable als Zähler nutzen der bei jeder Betätigung hochzählt- du brauchst hier 3 Zustände- wenn du nichts anderes definierst, geht es bei 0 los, überschreitet der Zähler 2 setzt du den wieder auf 0 - das geht mit "if" recht einfach.

Naja- und mit den Zählerwerten kannst du über eine if- Schleife oder case dann die Ausgänge steuern. Denke aber daran, dass du den LEDs aber jeden Status mitteilen mußt, den sie annehmen sollen- also nicht nur an- sondern auch ausschalten mußt.

Alle Einzelschritte findest du auch in den Basis- Beispielen von Arduino- du mußt es nur sinnvoll verknüpfen.

Während du das ganze in einen Sketch schreibst, wirst du merken, dass du mit ganz wenigen Änderungen das ganze beliebig erweitern kannst.