ich beschäftige mich erst seit kurzem mit Arduino und möchte über 'switch case' folgendes realisieren:
ich habe mehrere Taster mit verschiedenen Aufgaben und mit EINEM davon soll beim ersten Mal drücken die erste LED ansteuern, beim zweiten Mal drücken des selben Tasters zusätzlich die nächste LED usw. Also mit jedem Mal drücken kommt eine weitere Lampe hinzu.
Wenn ich switch case anwenden möchte, geht dies nur über eine einzige Variable, richtig? Wie kann ich dann in diese Variable, die ich in switch case abfrage, vorher speichern, welcher Zustand jeweils aktuell ist? (Meine Idee war, dass das Programm für Fall 1 (keine Lampe an) dann die erste Lampe brennen lässt, für Fall zwei (bereits erste Lampe an) zusätzlich die zweite Lampe brennen lässt, für Fall drei (bereits Lampen 1 bis zwei an) zusätzlich die 3. brennen lässt usw.
Meine Frage: Wie kann ich dafür das hinter 'switch' in Klammern stehende als Variable schreiben? Oder sind außer Variablen auch andere Möglichkeiten vorhanden - z. B. einen Zustand zu nennen wie (Lampe 1 brennt bereits...natürlich in die PINs umgeschrieben)?
Warum hast du dich so auf switch/case festgebissen, wenn das doch offensichtlich nicht das Mittel der Wahl sein kann, wie du doch auch selber schon erkannt hast?
Elabearo:
Meine Frage: Wie kann ich dafür das hinter 'switch' in Klammern stehende als Variable schreiben?
Ich fürchte, Deine Frage nicht zu verstehen, da hinter switch nach meinem Verständnis immer eine Variable folgt. Sonst macht es für mich auch keinen Sinn. Also switch(zaehler) {} und dann zaehler mit dem entprellten Taster hochzählen.
alleine mit einem Zähler ist noch lange keine LED-Leiste zum leuchten gebracht. Der Zähler muss ja auch ausgewertet werden was dann gemacht werden soll. Switch-Case finde ich erstmal nicht falsch. Ich würde gern combies Lösung anschauen. Also wie das ein anderer Kaninchenzüchter machen würde ...
Edit:
ich wette combie macht das über einen Indexzugriff
Ich würde es als Ablauf mit switch case so machen:
Variable Zähler global als byte definieren
...
if Taste gedrückt {Zähler++;
switch(Zähler) {
case 1: Schalte Led1 ein; break;
case 2: Schalte Led2 ein; break;
case 3: ...
case 8: schalte alle Leds ab; Zähler=0; break;
}
}
....
Den Pseudo-Code musst du noch in dein Programm übersetzen.
Wahrscheinlich würde ich aber auch eher mit einem Array für die Pinnummern und einem Index arbeiten.
beide Vorschläge sind wie ich erahnt hatte. Jetzt kann sich der TO eine Variante aussuchen.
Ich befürchte nur das die combietools den TO eher verwirren werden. Wie auch immer, Vorschläge sind gemacht.
Vielen Dank schon einmal für alle Antworten! @doc_arduino: Dass die LED nicht alleine über den Zähler leuchtet, weiß ich. Ich wollte nur wissen, wie man die Variable für switch aus mehreren Komponenten/Zuständen verschiedener LED-PINs definieren kann. Mit "Combietools" kann ich tatsächlich nicht viel anfangen. Ich kenne aus einem anderen Programm arrays, aber mit Index in dem Zusammenhang weiß ich noch nicht bescheid.
Bitte lacht mich nicht aus mit der Frage, aber kann ich also in die Variable einen Array speichern? Ich habe natürlich auch woanders gesucht und nachgelesen, aber bisher ist mir direkt zu dieser Frage nichts aufgetaucht.
umgekehrt, man kann Werte in ein Array ablegen. Die Größe des Array muss vorher festgelegt sein.
Der Zugriff auf die Werte da drin erfolgt über eine Indexnummer.
Combies Lösung kann man auch abändern ohne die combieTools.
Jetzt müßtest du dich entscheiden ob du die Index- oder switch-case Variante bevozugst.
Ohne combieTools musste erstmal mit herkömmlicher Methode den Taster enprellen.
Wenn das gemacht ist, ist der Rest ein Kinderspiel.
Vielen Dank. Kann ich mit switch case prüfen, welcher von den vorher definierten und angeschlossenen Tastern gedrückt wurde? Nein, oder? Müsste ja auch wieder über eine Variable gemacht werden, was ja nicht geht. Richtig?
warum jetzt mehrere Taster? Ist aber auch egal. Das Prinzip ist immer gleich. switch kann immer nur eine Variable verarbeiten um dann in den entsprechenden case zu springen. Mit einem Array kannste über den Indexzugriff mit einer for Schleife alle festgelegten Taster oder sonstige Pins abfragen, ändern was auch immer.
ein Bsp. zum anschauen, bei den Eingängen wird der Pullup aktiviert und die anderen Pins werden auf Ausgang konfiguriert.
Ich verstehe deine letzte Frage nicht. Beschreibe mal genauer, wie viele Taster und wofür?
Bei mehreren Tasten arbeitet man gewöhnlich mit IF-ELSE-Abfrage. Gibt es mehrere gleichartige Aktionen, kann das gut in eine For-Schleife packen. Z.B. Wenn Taste 1-4 gedrückt, dann schalte die LED 1-4 an. In meinem obigen Pseudo-Code, habe ich erst eine IF-Abfrage, ob die Taste überhaupt gedrückt wurde. Wenn dann wird erst Switch-Case aufgerufen.
Also mein Hauptproblem ist, dass ich nicht weiß, wie ich die Variable "Zähler" für die switch-case-Anwendung vorher definieren kann, um dann die verschiedenen 'case'-Varianten "plötzlich" mit Zahlenwerten benennen zu können, also case 1, case 2 usw. Was ordne ich also ganz am Anfang des gesamten Codes überhaupt dieser Variable zu?
Zur Frage mehrerer Taster: Das hatte ich am Anfang nicht erwähnt, weil ich mir bereits dachte, dass es auch nur eine entweder oder Frage wird und eben das gleiche Prinzip ist. Der zweite Taster soll nur - egal wann man ihn drückt - immer alle Lampen ausschalten. ABer das ist für meine Frage hier erstmal nicht wichtig, weil ich das mit digitalWrite draufhabe.
Doc_Arduino:
Also wie das ein anderer Kaninchenzüchter machen würde ...
Ich gehe mal vereinfachend davon aus, dass max 6 LEDs anzusteuern sind.
Die werden an D8-D13 angeschlossen, so dass ich sie mit einem Port ansprechen kann.
setup:
byte led hält meine 6 LED Zustände und beginnt mit 0.
loop:
Ich mache eine einfache Flankenerkennung auf Taste 1
Erst dann shifte ich links 1 in led
wenn Taste 2 (ohne Flankenerkennung), dann led = 0
led wird in PortB fortgeschrieben.
Dann delay(500), so dass man kein Entprellen braucht.
das war's.
P.S. Man kann es auch aufwändiger, aber leicht lesbar mit switch(step) machen:
Wenn Taste 2, dann step=0
Wenn Taste 1, (mit Flankenerkennung) und step < 4, step = step+1
In jeden Schritt werden die entsprechende Ausgänge in- und ausgeschaltet.
delay(500)
auf direkten Ports getrimmt wäre das viel zu steif. Mit Array Index ist das flexibel.
Also wenn das jetzt mehrere LEDs und mehrere Taster werden, dann vergiss switch case.
Über Array Index und fertig.
Hast du das Bsp. verstanden?
Wenn du mit den combietools nichts anfangen kannst, vielleicht später, dann entprelle erstmal einen Taster und lasse mit jeden drücken einen Zähler um genau eins erhöhen. Um millis() kommste nicht drum herum.
Elabearo:
Also mein Hauptproblem ist, dass ich nicht weiß, wie ich die Variable "Zähler" für die switch-case-Anwendung vorher definieren kann, um dann die verschiedenen 'case'-Varianten "plötzlich" mit Zahlenwerten benennen zu können, also case 1, case 2 usw. Was ordne ich also ganz am Anfang des gesamten Codes überhaupt dieser Variable zu?
Hallo,
Sorry aber ich verstehe die Frage nicht bzw ist sie, ich gehe mal davon aus, dass Du dich auf #7 beziehst, wegen dem Variabelnamen. In #7 wurde eigentlich alles gesagt.
Den zweiten Taster kannst Du fast gleichzeitig mit dem ersten Abfragen.
byte Zähler = 0; // ganz oben, vorm Setup
taster1 = digitalRead(Taster1PIN);
taster2 = digitalRead(Taster2PIN);
delay(300); // <- Die Taster gehören eigentlich anders entprellt aber eines nach dem anderen.
if(taster1) { // <- Abfrage von Taster1
// Hier den Zähler und die Switch case rein
}
if(taster2) { // <- Ausschalten aller LEDs
for(byte led:leds) digitalWrite(led, LOW); // <- combies Methode
// ohne Array, ok man kan eine for schleifen bauen und bei dem Pin beginnen bei dem die LEDs angeschlossen sind, keine gute Idee <- imho
digitalWrite(led1, low);
digitalWrite(led2, low);
...
}
edit: Ich würde hier auch nur mit array's arbeiten!