Ich möchte immer 12 angeschlossenen LEDs ausschalten wenn ich einen Taster betätige.
Hintergrund ist folgender: Jeder Taster schaltet eine bestimmte LED an und gibt einen Wert über die Serielle Schnittstelle an den PC. Diese LED soll ausgehen, wenn ein anderer Taster betätigt wird und "seine" LED anschaltet. Als VB Programmiere hätte ich ein Unterprogram (Sub), in dem alle LEDs gelöscht werden und das ich bei jedem Tastendruck aufrufe.
Geht das mit dem Arduino auch? Habe natürlich schon gegoogelt und eine mögliche Lösung gefunden über ein separates "Void"
void loop() {
for (i=0; i<3; i++) {
if (digitalRead (TasterPin [i]) == HIGH) {
**Hier würde dann das Unterprogramm aufgerufen werden.**
**Diode** (LedPin [i], 0);
}
}
if (digitalRead (TasterPin [0]) == LOW) {
Diode (LedPin [0], 25);
}
if (digitalRead(TasterPin [1]) == LOW) {
Diode (LedPin [1], 150);
}
if (digitalRead(TasterPin [2]) == LOW) {
Diode (LedPin [2], 250);
}
}
**Das währe das Unterprogramm, in dem die LEDs gelöscht werden:**
**void Diode ( int PinNr, int Wert ) {**
** analogWrite(PinNr, Wert);**
}
du machst dir einfach eine FUNKTION in der du alle Ausgänge ausschaltest
Die Funktion braucht keinen Parameter und braucht keinen Wert zurückgeben, daher ist die Rückgabe "void".
void allesAus()
{
for (int i = 0; i < noOfPins; i++)
analogWrite(pin[i], 0);
}
einige kennzeichnen auch dass kein Parameter übergeben wird:
void allesAus(void)
aber wie schon angemerkt, wenn eh immer nur eine LED leuchten kann, dann könntest dir auch die letzte gesetzte LED merken und diese das nächste Mal einfach abschalten wenn du die neue LED einschaltest (und merkst).
ca so:
// https://forum.arduino.cc/t/routine-aufrufen-unterprogramm/968713/3
struct Group
{
const byte ledPin;
const byte buttonPin;
};
Group group[]
{
{13, A0},
{6, A1},
{5, A2},
{11, A3}
};
void readButtons()
{
static byte previousActive = 0;
for (size_t i = 0; i < sizeof(group) / sizeof(group[0]); i++)
{
if (digitalRead(group[i].buttonPin) == LOW) // evtl. auch noch auf != previousAction
{
Serial.print(F("button pressed ")); Serial.println(i);
digitalWrite(group[previousActive].ledPin, LOW);
previousActive = i;
digitalWrite(group[i].ledPin, HIGH);
//tbd measures to debounce...
}
}
}
void setup() {
Serial.begin(115200);
Serial.println(F("taster und LEDs in gruppen"));
for (auto &i : group)
{
pinMode(i.ledPin, OUTPUT);
pinMode(i.buttonPin, INPUT_PULLUP);
}
}
void loop() {
readButtons();
}
@ DrDiettrich
Da Void ja benutzt wird scheint es schon was zu sein. Und da es Teil des Arduino Sketches ist hat es wohl auch mit Arduino zu tun. Aber Danke für deine Antwort.
@ noiasca
Super. Das wollte ich wissen. Das hilft mir wirklich weiter.
Keine Ahnung, was du da nimmst.....
Ich will nix davon!
Meinst du vielleicht die Endeavour?
Und wenn, was hat das mit statischen Klasseneigenschaften zu tun?
Weil es Stock in die Speichen der Wiederverwendung der Klasse/Struktur wirft.
Das einzige OOP Designpattern, welches sowas einfordert, ist das Singleton Pattern. Und das ist noch schlimmer in Verruf geraten, als das Goto. Mit Recht.
Statische Variablen, in Funktionen, sind ja schon schlimm, aber in Klassen......
Aus meiner Sicht gibt es nur einen einzigen (halbwegs respektablen) Grund sowas zu tun: Faulheit!
Die anderen Gründe haben sicherlich irgendwas mit Wahnsinn oder Dummheit zu tun.
Übrigens:
Ja, ich setze auch an einer einzelnen Stelle, meiner Libs, auf das Singletonpattern. Habe da aber pingelig darauf geachtet, dass dort keinerlei "unerwünschten Seiteneffekte" auftreten können. Und ja, auch dieses wird noch eliminiert werden, der Plan ist schon 3/4 fertig.