Einsteiger benötigt Hilfe - einfache Schaltung für ein Projekt

Hallo Community :neutral_face: ,

ich erspare euch das lange Erklären, Fakt ist ich habe mich erst ein paar Tage mit der Programmiersprache C++ auseinander gesetzt, doch benötige für ein Projekt in der Uni eine für euch einfache Steuerung. - Problem Zeitfaktor.

Um was geht es?

  • 20 Taster und 20 LED's und ein Rest-Knopf

LED X leuchtet und wird mit Taster X quittiert, danach leuchtet LED Y auf und wird mit Taster Y quittiert usw. Mit der Resttaste soll an den Anfang der Schleife gesprungen werden.

Zum Lernen habe ich die Steuerung erstmal auf drei Taster und drei Lampen reduziert.

Mein Problem bereitet mir die Wiederholung...Habe ich die falsche Schleife benutzt - bitte um Rat. Bitte Anfängerfehler nach ein paar Stunden nicht so hoch verurteilen :smiley:

int Taster1=7;
int Taster2=8; // Zuweisung der Bauteile
int Taster3=9;
int LED1=10;
int LED2=11;
int LED3=12;

void setup() {
  pinMode(LED1, OUTPUT); //Zuweisung Input oder Output 
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(Taster1,  INPUT);
  pinMode(Taster2,  INPUT);
  pinMode(Taster3,  INPUT);
}

void loop () {
 digitalWrite(LED1, HIGH); // eine LED1 soll leuchten ... alle anderen aus 
if (digitalRead(Taster1)==LOW) // Taster ist ein Öffner {
  digitalWrite(LED1,LOW); //LED1 aus und LED2 soll angehen
  digitalWrite(LED2,HIGH); 
if (digitalRead(Taster2)==LOW) {
  digitalWrite(LED2,LOW); //LED2 aus und LED3 soll angehen
  digitalWrite(LED3,HIGH);
if (digitalRead(Taster3)==LOW) //  {
  digitalWrite(LED3,LOW); //LED3 aus und LED1 soll angehen
  digitalWrite(LED1,HIGH);
  }
        // Wie springe ich von if-Bedingung zur nächten? Statt im Loop alles zu wiederholen?

Vorweg ich würde gerne das Programmieren in der kurzen Zeit für die Steuerung lernen. Ich hätte Anfangs gerne nur ein paar Hinweise, wie man es am besten umsetzen könnte und würde dann Fortschritte posten.

Und ja ich habe schon zwei Bücher zu dem Thema überflogen, aber nicht alles explizit verstanden. Wie gesagt komplett neu in dieser Materie.

Es sollte ungefähr, wie in diesem Video aussehen (pick to light (ARDUINO) - YouTube).
Sollte eine Teach-Funktion realisierbar sein und "einfach" zu gestalten, dann wäre das auch sehr interessant.

Beste Grüße & schonmal Danke im Voraus
Cryp

Schon gelesen wie Taster erfasst werden ( Pulldown Widerstand, INPUT_PULLUP)?
Schon von Prellen gehört?

Schau dir die Basics an

loop() heisst loop weil sie andauernd wieder dran kommt
(idealerweise mehrfach je millisekunde, jedenfalls schneller als du schauen kannst)

Du merkst dir also was war, vergeichst es mit dem was gerade ist, und machst meistens nichts, manchmal merkst du dir den neuen Zustand...

void setup() {
  for(int i=0; i < 20; i++){
    pinMode(LED[i], OUTPUT);
    digitalWrite(LED[i],LOW);
  }
  for(int i=0; i < 20; i++){
    pinMode(Taster[i], INPUT);
    digitalWrite(Taster[i],HIGH);
  }
}

void loop () {
  for(int i=0; i < 20; i++){
    digitalWrite(LED[i],HIGH); //es werde Licht
    while( digitalRead(Taster[i]) ); //warte solange der Schalter nicht gedrückt ist
    digitalWrite(LED[i],LOW); //Licht aus
  }
}

Hier mal ein kleines Konzept mit Arrays. Da du keinen Auslöser für das Leuchten der Leds genannt hast Leuchten sie jetzt einfach nacheinander auf. Kannst du Anzahl ja mal Anpassen und gucken ob es klappt.

Danke für die Antworten! :slight_smile:

michael_x:
Schon gelesen wie Taster erfasst werden ( Pulldown Widerstand, INPUT_PULLUP)?
Schon von Prellen gehört?

Den physikalischen Hintergedanken der Taster habe ich verstanden und auch umgesetzt in der Schaltung. Das Prellen nicht ganz und auch nicht angewendet bis jetzt.

Genosse:
Hier mal ein kleines Konzept mit Arrays. Da du keinen Auslöser für das Leuchten der Leds genannt hast Leuchten sie jetzt einfach nacheinander auf. Kannst du Anzahl ja mal Anpassen und gucken ob es klappt.

Die Reihenfolge der Auslöser sollte im Programm variabel angepasst werden können.
Für das erste wäre aber die Array-Sache sehr interessant, die ich mir mal genauer ansehen werde.

Leider weißt dein Code ein paar Fehler auf, die ich auf die schnelle nicht verstehe, aber ich schaue es mir genauer an.

Für weitere Tipps bin ich gerne offen

Cryp:
Das Prellen nicht ganz und auch nicht angewendet bis jetzt.

Die Taster prellen egal ob du es willst oder nicht :slight_smile:

Die Kontakte springen beim Schalten ein paar mal und her. So werden mehrere Millisekunden lang Impulse ausgelöst und registriert. Das muss man abfangen. Wenn du was fertiges willst, gibt es das:

Bounce Objekte kann man auch in ein Array verpacken

Cryp:
Leider weißt dein Code ein paar Fehler auf, die ich auf die schnelle nicht verstehe, aber ich schaue es mir genauer an.

Ich wollte dir eigentlich nicht alles vorkauen, aber Kritik an meinem Code kann ich auch nicht einfach so stehen lassen :grinning:
Das Array muss natürlich noch initialisiert und mit Werten gefüllt werden, also den entsprechenden Pins. So etwa:

const int anzahl=2;
int LED[anzahl]={3,4}; //LED pins
int Taster[anzahl]={5,6}; //Taster pins


void setup() {
  for(int i=0; i < anzahl; i++){
    pinMode(LED[i], OUTPUT);
    digitalWrite(LED[i],LOW);
  }
  for(int i=0; i < anzahl; i++){
    pinMode(Taster[i], INPUT);
    digitalWrite(Taster[i],HIGH);
  }
}

void loop () {
  for(int i=0; i < anzahl; i++){
    digitalWrite(LED[i],HIGH); //es werde Licht
    while( digitalRead(Taster[i]) ); //warte solange der Schalter nicht gedrückt ist
    digitalWrite(LED[i],LOW); //Licht aus
  }
}

Compiler sagt, funzt.

Genosse:
Ich wollte dir eigentlich nicht alles vorkauen, aber Kritik an meinem Code kann ich auch nicht einfach so stehen lassen :grinning:
Das Array muss natürlich noch initialisiert und mit Werten gefüllt werden, also den entsprechenden Pins. So etwa:

Das war auch keine Kritik, sondern meine Unwissenheit :neutral_face: . Nächstes Mal schaue ich zweimal bevor ich los schreibe :zipper_mouth_face:

Sorry !

Genosse:
Ich wollte dir eigentlich nicht alles vorkauen, aber Kritik an meinem Code kann ich auch nicht einfach so stehen lassen :grinning:

Mit Prinzip Code muss man leider vorsichtig sein.

Manchmal sieht es vom Eingangspost her so aus dass Leute die Grundlagen verstehen und in der Lage sind Code einfache Fetzen entsprechend anzupassen und zu verwenden. Dem ist oft aber nicht so.

Serenifly:
Mit Prinzip Code muss man leider vorsichtig sein.

Manchmal sieht es vom Eingangspost her so aus dass Leute die Grundlagen verstehen und in der Lage sind Code einfache Fetzen entsprechend anzupassen und zu verwenden. Dem ist oft aber nicht so.

Das ist möglich.
Durch seine Hilfe konnte ich aber nun die Anwendung des Arrays verstehen. Habe die While-Schleife aufgeschnappt und somit gelernt. Ich weiß das "Vorkauen" muss man kritisch sehen und eigentlich sollte man auf dem normalen Weg lernen und wenn es Try and Error ist. Ich muss gestehen nach der kurzen Zeit, wie ich diese Plattform benutzte, wäre ich nicht auf den Weg gestoßen.

Die Schaltung funktioniert nun so, wie ich es mir gedacht habe.

Vielen Dank!