Go Down

Topic: Tasterschaltung (Read 10433 times) previous topic - next topic

Mendel13

Jun 10, 2015, 07:51 am Last Edit: Jun 10, 2015, 07:57 am by Mendel13
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.

würde mich über anschubser sehr freuen,

grüße, der mendel

ronald_paul

Hi,

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!

Grüße,
Ron

Doc_Arduino

Hallo,

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
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

agmue

#3
Jun 10, 2015, 08:51 pm Last Edit: Jun 10, 2015, 08:52 pm by agmue
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 ...

So in der Art.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Mendel13

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.


grüsse, der Mendel

Mendel13

#5
Jun 22, 2015, 09:11 am Last Edit: Jul 22, 2015, 08:15 am by uwefed Reason: add [CODE] TAGs </>
Hallo,

was haltet Ihr von dem sketsch :-)

Code: [Select]
int t01 = LOW; // setze die Variable mit Namen "t01" und gib ihr den Wert LOW
int t02 = LOW;
int t03 = LOW ;
int t04 = LOW;

void setup() {
  pinMode(14, INPUT); // Pin 14 = A0 ist Eingang für Taster, PullDown
  pinMode(15, INPUT);
  pinMode(16, INPUT);
  pinMode(17, INPUT);
  pinMode(13, OUTPUT); // Pin13 .. als Ausgang
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  digitalWrite(13, HIGH); // Programmstart Pin 13 auf HIGH


}

void loop() {
  t01 = digitalRead(14); // setze Var. t01-04 gleich dem Eingangspegel
  t02 = digitalRead(15);
  t03 = digitalRead(16);
  t04 = digitalRead(17);


  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);
    delay(1000);
  
  }
  if (t02 == HIGH) {
    digitalWrite(13, LOW);
    digitalWrite(12, HIGH);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    delay(1000);
  }
  if (t03 == HIGH) {
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
    digitalWrite(11, HIGH);
    digitalWrite(10, LOW);
    delay(1000);
  }
  if (t04 == HIGH) {
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, HIGH);
    delay(1000);
  }

}



mal von entprellung abgesehen, soweit funktioniert es.
das ganze wird erweitert auf 7 taster...
ist primitiv ... anderer lösungsweg, was meint ihr?

Doc_Arduino

Hallo,

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.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

TelosNox

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
Code: [Select]

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.

Serenifly

@TelosNox

Bei sowas packt man die Pins besser in ein Array. Dann ist die eigentliche Belegung egal, da man über die Array Indices iterieren kann

TelosNox

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

Mendel13

hey leute ... danke für das feedback.

ja .. anfänger ... blutiger ...

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.

Quote
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?

TelosNox

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.

Mendel13

danke ... *schnüff* ... bin gerührt ....

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 ...

agmue

#13
Jun 22, 2015, 05:55 pm Last Edit: Jun 22, 2015, 05:56 pm by agmue
Hallo, kleine formale Bitte, Deinen Code in Codetags zu setzen, geht mit dem Button </>.

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):
Code: [Select]
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.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

agmue

#14
Jun 22, 2015, 06:00 pm Last Edit: Jun 22, 2015, 06:01 pm by agmue
Code: [Select]
int t01 = LOW; // setze die Variable mit Namen "t01" und gib ihr den Wert LOW
int t02 = LOW;
int t03 = LOW ;
int t04 = LOW;

 Da diese Variable nur zwei Zustände haben kann, würde boolean t01 = LOW reichen. Spart vier Byte  :) ist aber auch deutlicher in der Aussage.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Go Up