Led's mit knopf wechseln

Hallo,

Also ich habe 3 LEDs .
Am Anfang soll eine LED leuchten.
Wenn ich dann auf den knopf drücke, soll die erste LED aus gehen und die zweite soll an gehen.
Wenn die Dritte LED dann aus geht soll wieder die erste an gehen.
Das ist mein Code aber es passiert nichts bei ihm.
Ich hoffe ihr könnt mir helfen.
Hier ist mein Code:


int led = 13;
int button = 10;
void setup() {
  pinMode(led,OUTPUT);
 
}

void loop() {
  digitalWrite(led,HIGH);
  if (digitalRead(button) == HIGH)
  {
    led = led - 1;
    }
    
    if (led < 11)
    {
      led = 13;
}
}

Ich hoffe ihr könnt mir helfen :slight_smile:

Du solltest lernen wie man Taster entprellt:

oder:

Alternativ kannst du auch nach dem Auslesen des Zustands ein kleines Delay von 10-50ms machen. Das reicht bei sowas einfachem vollkommen, und du hast nicht mehr Code für das Entprellen als den Rest:

if (digitalRead(button) == HIGH)
{
     delay(30);

     ...
}

Wieso das ganze:

Dann hast du nur Pin 13 als Output definiert. Nicht deine anderen Pins. Das ist dein Haupt-Problem.

Du solltest deine LED Pins in ein Array packen:

const int leds[] = { 11, 12, 13 };

Dann kannst du die alle auf einmal setzen:

for(int i = 0; i < 3; i++)
   pinMode(leds[i], OUTPUT);

Und statt über die Pin Nummern iterierst du über die Indizes:

int index = 0;

...

index = (index + 1) % 3

Das Modulo 3 sorgt dafür dass der Zähler bei 3 wieder auf 0 geht, da 3 geteilt durch 3 den Rest 0 hat. Dadurch geht der Index von 0 bis 2.

Dadurch spart man sich die if-Abfrage auf das Limit und das manuelle zurücksetzen. Wobei das natürlich auch geht.

Dann kann man die LED so schalten:

digitalWrite(leds[index], HIGH);

Dann musst du noch vor dem inkrementieren die aktuelle LED wieder auf LOW setzen und nach dem inkrementieren die neue auf HIGH

Kannst du mir bitte einmal den ganzen Code schreiben :slight_smile:
Ich weiß nicht wie ich die Teile einbauen muss .

sinidus123:
Kannst du mir bitte einmal den ganzen Code schreiben :slight_smile:

Willst Du nur fertigen Code oder was lernen? Die übliche Gretchenfrage ...

Ich will den fertigen Code um mit ihm zu lernen, dann verstehe ich es besser.
Was bringen mir einzelne teile wenn ich die zusammenhänge nicht verstehe.

:roll_eyes: So lernt man nichts!

Fang an, ein Buch zuerst zu lesen. zB. Erik Bartmann.

und die Beispiele in dem Buch auch nachzuvollziehen. Nicht einfach überblättern.
Bau die Beispiele auf, spiele und arbeite mit ihnen…

Hallo Sinidus 321
Ich will hier nicht den Klugsch..... spielen- ich bin selber Anfänger. Ich komme aus aus der alten Maschinensprache und
Basic Umgebung.
Im Moment bin ich soweit, das ich das "C" von Arduino einfacher finde, als das "BasCom"
Fertigen Code wirst Du hier für etwas "leichtes" nicht bekommen.
Die Leute helfen Dir aber auf die Sprünge. Das aber nur am Rande.
Wenn Du eine LED mit EINEM Taster an/ausschalten willst, dann über erst einmal- das entprellen von Tasten.
Mich haben meine NICHT entprellten Tasten fast in den Wahnsinn getrieben.
Falls Du Arduino nicht nur für eine Laune hälst, dann wirst Du um ein Buch nicht umzu kommen.
Gruß und Spaß
Andreas

Alternative: Du kannst jemanden beauftragen, das Programm für Dich zu schreiben.

Ich lerne mit fertigen Codes einfacher , dann muss ich mal in einem anderen Forum nach Hilfe suchen.

Dann erbarme ich mich halt:

const int leds[] = { 11, 12, 13 };
const int button = 10;

void setup()
{
    pinMode(button, INPUT);

    for(int i = 0; i < 3; i++)                  //Alle Pins auf Ausgang schalten
            pinMode(leds[i], OUTPUT);

    digitalWrite(leds[0], HIGH);          //erste LED an
}

void loop()
{
    static int index = 0;           //static Variablen behalten ihren Wert beim nächsten Durchlauf von loop

    if (digitalRead(button) == HIGH)
    {
         delay(50);            //Taster entprellen

        digitalWrite(leds[index], LOW);     //aktuelle LED aus
        index = (index + 1) % 3;                  //Index erhöhen und auf 0-2 begrenzen
        digitalWrite(leds[index], HIGH);     //neue LED an
   }
}

Kann aber sein, dass da noch irgendwo ein Fehler ist :slight_smile:

Und du kannst wie gesagt auch das machen:

index++;
if(index > 2)
     index = 0;

index kann auch global außerhalb von loop() und setup() sein wenn das für dich einfacher ist. Dann muss es auch nicht explizit static sein (sondern wird vom Compiler automatisch so behandelt)

EDIT:
Was natürlich noch gefehlt hat ist den Taster Pin auf INPUT zu schalten :frowning:
Da auch darauf achten ob du einen externen Pulldown hast (Widerstand am Pin gegen Masse). Wenn du einen Pullup hast (Widerstand gegen Plus), dann ist der Taster gedrückt LOW. Du kannst auch mit pinMode(button, INPUT_PULLUP); die internen Pullups verwenden. Dann brauchst du keinen externen Widerstand. Aber auch da in loop() auf LOW statt HIGH abfragen!

Siehe hier:
http://arduino.cc/de/Reference/PinMode

sinidus123:
Das ist mein Code aber es passiert nichts bei ihm.

Dein Code ist in mehreren Punkten fehlerhaft.

Zum Beispiel im setup:
int led = 13;
...
pinMode(led,OUTPUT);

Da wird nur Pin-13 auf OUTPUT gesetzt. Wenn Du im Sketch verschiedene Pins als OUTPUT benutzen möchtest, müßten an dieser Stelle auch verschiedene Pins auf OUTPUT gesetzt werden. Z.B. die Pins 11, 12 und 13:
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);

Der nächste Fehler ist, dass Du in der loop nur Code zum Einschalten von LEDs geschrieben hast:
digitalWrite(led,HIGH);
Du schaltest niemals irgendeine LED aus. Womöglich möchtest Du zuerst die alte LED ausschalten (LOW), dann die Variable verändern, dann die neue LED einschalten?

Und last but not least ist womöglich Deine Hardwareschaltung fehlerhaft:
Ist an Deinen Schalter überhaupt ein "Pulldown-Widerstand" korrekt angeschlossen?

So wie Dein Code geschrieben ist, benötigt der Schalter einen externen Pulldown-Widerstand als zusätzliche externe Beschaltung.

Wenn Du ohne diesen zusätzlichen Pulldown-Widerstand einen funktionsfähigen Sketch bekommen möchtest, müßtest Du für den Schalter den internen PullUp-Widerstand im setup aktivieren.

sinidus123:
Ich lerne mit fertigen Codes einfacher , dann muss ich mal in einem anderen Forum nach Hilfe suchen.

Die Codehäppchen von Serenifly sind 90% des gesamten Programms. Wenn du noch das das arduinotypische void setup() und void loop() hinzufügst, bist du bereits bei 95%. Die restlichen 5% ist nur noch etwas Denksport, zumal dir damit gesagt wurde was letztlich noch programmiert werden muss:

Serenifly:
Dann musst du noch vor dem inkrementieren die aktuelle LED wieder auf LOW setzen und nach dem inkrementieren die neue auf HIGH

Ich befürchte, wenn du nicht diesen Elan aufbringst, wirst du einen fertigen Code auch nicht verstehen können…

const int leds[] = { 11, 12, 13 };
const int button = 10;
int index = 0;

void setup(){
  pinMode (button, INPUT_PULLUP); // aktivierter Pullup ---> inverse Logik
  for(int i = 0; i < 3; i++) pinMode(leds[i], OUTPUT);
}

void loop(){
  if (digitalRead(button) == LOW){
    digitalWrite(leds[index], LOW);
    index = (index + 1) % 3;
    delay(30);
    digitalWrite(leds[index], HIGH);
  }
}

[edit] Verdammt, zu spät… :slight_smile:

Das mit dem Pullup/Pulldown hatte ich vergessen. Der Pin war gar nicht auf Eingang geschaltet. Habe mein Post mal editiert (für externen Pulldown).

Danke serenifly für den Code ich verstehe ihn auch jetzt.

Naja, dass ein Anfänger den Code nach 2 Std versteht und auch noch zu der Stunde...

Aber dass ein Anfänger den kompletten Code braucht um zu verstehen/lernen, kann ich bestätigen.