5 LEDs mit 3 Taster ansteuern

Guten Tag,

Ich bin gerade an einem kleinen Projekt dran mit meinem Arduino Uno und habe folgendes Problem:

Ich habe 5 LEDs und 3 Taster. Jeder Taster steuert verschiedene LEDs an, z.B. Taster1 steuert LED 1 und 3 an, wodurch die LEDs leuchten sollen. Wenn aber Taster2 betätigt wird, sollen LED 2, 3 und 5 angesteuert werden, wodurch sich die LED 2 wieder ausschaltet.

Wie löse ich sowas am besten? Sollte ich die Zustände der Outputs, also der LEDs, einzeln überprüfen oder gibt es eine elegantere Lösung?

Hat der dritte Taster auch eine Funktion oder dient er nur der Zierde?

Damit willkommen im Forum!

du sollst erst mal eine komplette Logiktabelle machen welcher Taster welche LEDs steuern soll.
Und definiere was du unter "steuern" verstehst. Ein umschalten des aktuellen Status? Dann kannst einfach den Ausgang auch mit digitalRead einlesen, wie er aktuell ist.

Danach sind es imho nur einfache Ifs und hinschreiben was du dir ausgedacht hast.

agmue:
Hat der dritte Taster auch eine Funktion oder dient er nur der Zierde?

Ja, jeder Taster schaltet gibt ein Signal an die LEDs.

Zustände muss man nicht unbedingt abspeichern. Kommt auf die Logik an. Du kannst auch die LEDs jedesmal ausschalten. Wenn die vorher schon aus waren ist das egal

Weil mich das gerade an ein altes Buch erinnert hat und ich eh testen wollte, ob mein neues System meinen alten Scanner beherrscht, habe ich mal eben einen Scan aus einem 40 Jahre alten Buch angefertigt:

Viel Spaß beim Knobeln :slight_smile:

Gregor

Danke für die Hilfe :smiley:

Hallo,

Hallo,
Du könntest die 3 Taster binär codieren, das geht mit logisch “UND” , dann mit den jeweiligen Zuständen die LED´s einschalten wie du das haben willst.

0,0,0 Zustand =0
1,0,0 Zustand =1
0,1,0 Zustand= 2
1,1,0 Zustand= 3
.
.
1,1,1 Zustand= 7

damit kannst Du dann mittels if und else Afragen 7 verschiedene “Muster” für deine 5 LED´ deffinieren.

ist eigendlich eine schöne Übung zum Einlesen von Eingängen, If , else, und Ausgabe an LED´s. Es gibt sicher auch bessere Lösungen, aber fan mal so an.

Heinz

Andere Variante: Aus den 3 Bit mit bitSet ein Byte nachen mit dem Wert von 0 bis 7 und damit in ein switch/case gehen.

Oder die 3 Taster an A0/A1/A2 anschließen (nach GND) und direkt auslesen:

const byte e1 = A0;  // 1er Wert
const byte e2 = A1;  // 2er Wert
const byte e4 = A2;  // 4er Wert
byte oldIn = 99;
void setup() {
  Serial.begin(115200);
  Serial.println("\nStart");
  pinMode(e1,INPUT_PULLUP);
  pinMode(e2,INPUT_PULLUP);
  pinMode(e4,INPUT_PULLUP);
}

byte getWert() {
  byte b = ~PINC; // Port C auslesen und bitweise negieren (wegen Schalten nach GND)
  return b & 0x07; // nur die unteren 3 Bit nutzen
}

void loop() {
  byte in = getWert();
  if (in != oldIn) {
    Serial.println(in);
    oldIn = in;
  }
}

Gruß Tommy

Genau wie man mit 3 Tastern 1 von 8 Zuständen einstellen kann, kann man aber mit 5 LED 32 verschiedene Zustände anzeigen.
Wobei LED auch noch in unterschiedlicher Helligkeit leuchten können.
Die Aufgabe ist also

  1. nicht so einfach
  2. ziemlich unklar

Ausserdem kann man die 3 Taster mit
{ + / - / ENTER} beschriften und sich ganz was anderes ausdenken.

Bei meinem Uno mag er das oder ging es hier um einen anderen MC?

Gruß Tommy

Edit: Es compiliert nicht nur, es funktioniert auch (erweitert um 1 Eingang und an einem Hex-Kodierschalter).

Bei meinem Uno mag er das oder ging es hier um einen anderen MC?

Dass die Arduino-Digitaleingänge A0, A1, A2 die niederwertigsten des Port PINC sind, passt auf atmega328 - basierte Arduinos.
Damit legt man den Arduino-Ansatz einer Hardwareunabhängigkeit aufs Kreuz.
Allein dass es eine Variable namens PINC gibt, garantiert "Arduino" nicht. Und es ist auch nicht erforderlich, dass irgendein dazugepackter Fremd-core das simuliert.

Das ist richtig. Es war aber nach UNO gefragt und man muss auch nicht jede Kleinigkeit krampfhaft auf Universalität und Wiederverwendbarkeit trimmen. Das halte ich für übertrieben und es erzeugt meistens unnötigen Overhead.

Ich hatte aber auch setBit nach digitalRead angeboten, das wäre wohl wieder universeller, aber langsamer.

Gruß Tommy

aber langsamer

Und doch tausendmal schneller als man eine Led leuchten sieht.
Was nochmal um Größenordnungen schneller als ein handbetätigter Taster ist.

Ich mag halt effizente Lösungen für eine reale Situation, die nicht universell und nicht wiederverwendbar sein muss.

Darüber mache ich mir Gedanken, wenn ich eine Lib bauen will.

Gruß Tommy

Hallo,

ich möchte dich nicht verärgern Tommy, wirklich nicht, aber wenn schon direkter Portzugriff usw. dann bitte 100% konsequent. pinMode, setup(), loop() ist diesem nicht würdig. :slight_smile:
Zwischen getSchalter() und getWert() müßtest du dich noch entscheiden. :slight_smile:
Sorry, dass mußte raus.

Kann Fobbe von alledem irgendwas mitnehmen?

Doc_Arduino:
Kann Fobbe von alledem irgendwas mitnehmen?

Würde mich wundern. Sein letztes Posting in diesem Thread ist gut 5 Stunden alt und dort bedankt er sich für die Hilfe (#6).

Gruß

Gregor

Doc_Arduino:
aber wenn schon direkter Portzugriff usw. dann bitte 100% konsequent. pinMode, setup(), loop() ist diesem nicht würdig. :slight_smile:
Zwischen getSchalter() und getWert() müßtest du dich noch entscheiden. :slight_smile:

Den Bezeichnungsfehler habe ich korrigiert. Danke für den Hinweis.

Warum sollte ich die anderen Sachen umschreiben? Das ist doch nicht notwendig.
Ich wollte doch lediglich zeigen, wie man das mit einfachen Mitteln einlesen kann. Wer es so nicht will, kann ja auch die Variante mit bitSet oder eine andere benutzen.
Viele Wege führen zum Ziel und diese müssen nicht von falsch verstandenem "Perfektionismus" geprägt sein.

Gruß Tommy

Hallo,

ich wollte dich nur etwas necken, Tommy. Mehr nicht. Verärgern erst recht nicht.
Ich dachte nur an den “armen” TO.

Der war doch schon weg. Ansonsten hätte er aus den verschiedenen Varianten lernen können.

Gruß Tommy