Hallo Gemeinde!
so ...hab mich jetzt auch endlich entschlossen, mich mit arduino zu beschäftigen. learning by doing ...
Bin blutiger anfänger, was programmierung angeht. aber ich kämpfe mich durch!!
solide grundkenntnisse elektronik sind vorhanden ... das macht den mc sehr spannend für mich...
manchmal ist ein problem aber mit einem problem verknüpft, nämlich: wie frage ich blöd?!?
ich suche zum verstehen eine tasterchaltung ... und weiss nicht wie man die nennt ...
ich nenns mal: radio-taster ... wie beim radio, senderspeicher: ich habe eine anzahl taster und genau die gleiche anzahl funktionen, hier nenn ichs led's. taster 1 bringt led 1 zum leuchten. taster 2 => led 2, löscht dabei alle anderen led's wieder etc. Einschaltzustand: led1 = on.
wie nennt sich für die suche mal prinzipiell so ne schaltung?
ich würd gern mit dem uno experimentieren und -sofern möglich- die sache auf nen kleineren attiny übertragen.
schau mal hier. Da findest Du super Tutorials in deutsch und so erklärt das man es auch versteht.
Unter anderen auch einen Lösungsansatz für Dein Tasterproblem!
folgende Themen werden dich damit beschäftigen.
Wie entprelle ich einen Taster,
Programmlogik entwerfen, was soll alles wann und wie gemacht werden,
keine festen delay() verwenden, gleich mit millis() usw. anfangen
und daran denken das der µC ohne Pause die loop durchläuft
Eine Frage kann man eigentlich erst dann richtig formulieren, wenn man die Antwort kennt! Diese Erkenntnis hast Du mit Wissenschaftlern gemein.
Als ich Deine Frage laß, mußte ich an mein altes Röhrenradio denken:
Vor meinem geistigen Auge hat jeder Taster (INPUT_PULLUP) eine Statusvariable mit dem letzten bekannten Status, der dann mit dem aktuellen verglichen wird, um eine Veränderung festzustellen (Flankenerkennung):
if (alterStatusTaster1 == HIGH && digitalRead(pinTaster1 == LOW) {
// LED1 an, alle anderen aus
} else if ...
Ja ... tatsächlich hatte ich bei der Beschreibung ein altes Grundig-AutoRadio im Sinn, das ähnliche Bedingung hatte ...
Danke schonmal für die Tipps, werd mich auf die Suche machn auf Programmcodes, wo die Funktion so enthalten sein mag. Hab ehrlich ein wenig Schwierigkeiten, aus der Theorie neu zu lernen ... bisher hats gut geklappt, aus Betrachten und nachbauen von schon existierenden Projekten die Funktion zu verstehen und den aha! -Effekt auszulösen ... und über abändern oder Neu-Schaffung das so zu schaffen, wie ichs mir vorstelle.
ohne zu wissen was es machen soll, kann dazu niemand was sagen. Es kann für die Aufgabe reichen. Aber ich denke durch die delays wirst Du irgendwann merken das es nicht immer so reagiert wie gewünscht.
Mit folgendem Schnipsel kannst du das einfacher schreiben. Du musst aber die LEDs anders mappen.
Button 14 -> Led 10
Button 15 -> Led 11
Button 16 -> Led 12
u.s.w.
dadurch entsteht die Regel: Led = Button - 4
Der Code ist nicht getestet, sollte aber die grundsätzliche Idee verdeutlichen
int activeChannel = 0;
void loop() {
boolean buttonPressed = false;
for (int pin = 14; i<= 17; i++) {
if (digitalRead(pin) == HIGH) {
activeChannel = pin;
buttonPressed = true;
break;
}
}
if (buttonPressed) {
int activeLed = activeChannel - 4;
for (int pin = 10; i<= 13; i++) {
if (pin == activeLed) {
digitalWrite(pin, HIGH);
} else {
digitalWrite(pin, LOW);
}
}
}
}
In activeChannel steht immer der zuletzt gedrückte Button drin. So kannst du dann jederzeit abhängig davon irgendwas anderes steuern.
Damit wirds dann flexibler, da hast du recht.
Worauf ich im Endeffekt rauswollte war die Nutzung der Schleife.
Ob man jetzt implizit mappt (so wie im Beispiel), das Mapping in ein Array packt oder ob man sich ne kleine Klasse für das Mapping schreibt und davon dann X Objekte in ein Array packt und das dann iteriert oder sonst noch wie ist dann der andere Schuh.
Erstmal muss diese ungemein hohe Redundanz weg.
Ich hab nur die Befürchtung, dass Mendel das Konstrukt sowieso nicht so leicht durchblickt (hat ja geschrieben, dass er Anfänger ist). Aber dann kann er ja hier weiter nachhaken
was es machen soll: hier im versuch erst mal nur LED leuchten lassen, unabhängig was jemals dahinter angesteuert wird.
die delays kamen mir in sinn für eine gewisse "entschärfung" ... werden aus versehen zwei taster gedrückt, leuchten auch beide LEDs im takt des void-loops.
ok, für mich ein erfolgserlebnis wenn auch primitiv ... es macht mit 4 LEDs mal das wie ichs vorgestellt hab.
Ich hab nur die Befürchtung, dass Mendel das Konstrukt sowieso nicht so leicht durchblickt (hat ja geschrieben, dass er Anfänger ist). Aber dann kann er ja hier weiter nachhaken
äh ... jupp. aber setzen wir das wörtchen "noch" nach "sowieso" ... ok?
Dass das ein "noch" ist, sollte selbstverständlich sein, wir wollen dir ja weiterhelfen und dir ja was beibringen.
Was das Tasterprellen angeht: Solange du nur eine Umschaltung brauchst und es nicht drauf ankommt, wie oft ein Knopf gedrückt wurde, dann kann dir das Prellen egal sein. Ob du jetzt den aktiven Kanal (ich nenne das mal so, analog zum Radio Beispiel) 1x auf die 3 setzt oder 10x auf die 3 ist ja egal, solange da nicht gleichzeitig noch irgend was anderes ausgelöst wird.
das dachte ich mir auch ... ob der taster gschwind 50x durchs prellen "gedrückt" wird sollte hier wurscht sein. es war eben nur die situation, dass bei zwei tastern drücken auch die entsprechenden leds leuchten. durchs delay ist das soweit eliminiert.
ok ... ich werd mich mal an die wirkungsweise der arrays machen und boolean ...
Hallo, kleine formale Bitte, Deinen Code in Codetags zu setzen, geht mit dem Button </>.
Mendel13:
die delays kamen mir in sinn für eine gewisse "entschärfung" ... werden aus versehen zwei taster gedrückt, leuchten auch beide LEDs im takt des void-loops.
Mein etwas einfacher gestrickter Vorschlag (ungetestet):
if (t01 == HIGH) { // wenn t01 gleich HIGH dann...
digitalWrite(13, HIGH); // setze Pin 15 auf HIGH ... und alle anderen auf LOW
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
}
else if (t02 == HIGH)
{
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
}
else if (t03 == HIGH)
{
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
}
else if (t04 == HIGH)
{
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
}
Über else hast Du eine Priorisierung für die Taste mit der niedrigeren Nummer und kein Blinken.
Mir wurde hier im Forum geschrieben, vor der Verwendung von structs müßte ich noch viiiiiiiel lernen, darum hatte ich dieses Thema bisher umgangen. Dein Beispiel erklärt sich ja von selbst, könnte ein Einstieg sein.
agmue:
Mir wurde hier im Forum geschrieben, vor der Verwendung von structs müßte ich noch viiiiiiiel lernen ...
Och...
Das würde ich nicht sagen.
"Struct bringt (Daten)Struktur ins Projekt!"
Das kann man nicht früh genug verstehen.
Die Feinheiten kommen durch Übung.