Tasterzustand erhalten

Hallo Forum,

ich bin der Max und versuche gerade den Einstieg in die Arduino-Welt. Nun stehe ich vor einem Problem. Und hoffe Ihr könnt mir helfen.

Zwei Taster (A und B), wird einer von beiden (A) betätigt soll die LED leuchten, wird (A) zum wieder gedrückt soll die LED ausschalten, auch soll die LED bei (B) ausschalten.

Wie muß ich da vorgehen?

Versuche es erst mal mit nur einem Taster, den komplizierteren Fall kannst Du später immer noch machen, wenn der einfachere funktioniert. Nimm nicht die Pins 0 und 1, da diese schon von der seriellen Schnittstelle belegt sind.

Wenn das funktioniert, versuche die Erweiterung um den zweiten Taster. Sollte das nicht klappen, poste den Code, den Du hast und wir werden versuchen, Dir weiterzuhelfen.

Der zweite Fall (zwei Taster) ist auch nicht komplizierter - einfach die Taster parallel schalten; warum einen zusätzlichen Eingang verschwenden?

Ich habe jetzt mal den Fall mit einem Taster probiert.

Ist das richtig?

int led=13
int knopf=5

void setup()
{
  pinMode(led,OUTPUT);
  pinMode(knopf,INPUT);
  
}

void loop()
{
  if (digitalRead(knopf)==HIGH)
  {
    digitalWrite(led,HIGH);
  } else {
    digitalWrite(led,LOW);
    
    delay(2500);
    
    if(knopf==HIGH);
    digitalWrite(led,LOW)
  }
  
}

@Jürgen so?

Hallo,

hast es schon mal auf den Arduino geladen?
Was passiert?

Grüße,
Jürgen

Ich habe noch keinen Arduino. Ich verwende einen Simulator - möchte erst einmal sehen, ob ich für das ganze nicht zu doof bin.

Hallo Max,
wenn das Programm in den else Zweig kommt wird die LED ausgeschaltet.
Die erneute Abfrage im else Zweig nach knopf==HIGH ist sicher nicht notwendig.
gruß

Was willst du genau.
Wenn ich dein Programm richtig lese bleibt die LED nur so lange an wie du den Taster drückst.
Ist das gewollt?

Nein, das ist nicht gewollt.

Ich möchte Taster A oder B betätigen. --> LED an bis wieder Taster A oder B betätigt wird. Es soll der Zustand gespeichert werden. Der kurze Impuls vom Taster soll solange "aktiv" sein bis ein neuer Impuls kommt, der dann umschaltet.

Zwei Sachen stimmen noch nicht:

  1. Du hast immer noch Pin 0 verwendet. Beim Simulator kann's ja gut gehen, aber als Anfänger solltest Du Pin 0 und 1 nach Möglichkeit meiden.

  2. Deine Taster ziehen den Pin nach Masse, Du hast aber weder in der Verdrahtung einen Pull-Up-Widerstand drin, noch hast Du den internen Pull-Up des Arduino-Pins aktiviert. Das wird also nicht funktionieren. Zudem ist ein Taster-Pin, der nach Masse geht, aktiv LOW und nicht HIGH.

Ich verwende einen Simulator - möchte erst einmal sehen, ob ich für das ganze nicht zu doof bin.

Mit dem Simulator dürfte es deutlich schwieriger werden. Der Arduino ist so ausgelegt, dass er Anfänger-Fehler fast immer verzeiht. So theoretische Schaltungen sind allerdings für den Einstieg eher ungeeignet. Die paar Euro für den Arduino wirst Du nicht bereuen.

pylon:
2. Deine Taster ziehen den Pin nach Masse, Du hast aber weder in der Verdrahtung einen Pull-Up-Widerstand drin, noch hast Du den internen Pull-Up des Arduino-Pins aktiviert. Das wird also nicht funktionieren. Zudem ist ein Taster-Pin, der nach Masse geht, aktiv LOW und nicht HIGH.

Sorry das verstehe ich nicht

pylon:
Mit dem Simulator dürfte es deutlich schwieriger werden. Der Arduino ist so ausgelegt, dass er Anfänger-Fehler fast immer verzeiht. So theoretische Schaltungen sind allerdings für den Einstieg eher ungeeignet. Die paar Euro für den Arduino wirst Du nicht bereuen.

Ich habe heute früh angefangen...

Maexle:

pylon:
2. Deine Taster ziehen den Pin nach Masse, Du hast aber weder in der Verdrahtung einen Pull-Up-Widerstand drin, noch hast Du den internen Pull-Up des Arduino-Pins aktiviert. Das wird also nicht funktionieren. Zudem ist ein Taster-Pin, der nach Masse geht, aktiv LOW und nicht HIGH.

Sorry das verstehe ich nicht

So wie Du den (die) Taster beschaltet hast, wird beim Drücken des Tasters das Pin des Arduino mit GND (Masse) verbunden. Damit geht das Pin auf den Zustand LOW. Damit Du aber eine Zustandsänderung erkennen kannst, muss das Pin vorher auf HIGH stehen (also gegen 5V geschaltet sein). Das macht man mit einem sogenannten Pullup (hochziehen auf 5V) Widerstand. Diesen hat der Arduino bereits eingebaut. Um ihn zu aktivieren mußt Du einfach nur ein pinMode(PIN,INPUT_PULLUP) statt nur pinMode(PIN,INPUT) für Dein Eingabe-Pin machen. Wenn Du dann per digitalRead() das Pin einliest, wird es immer ein HIGH liefern, außer es wird (wie mit deinem Taster) auf Masse gezogen, dann liefert es ein LOW.

Dein Programm ist aber trotzdem noch nicht korrekt, unabhängig davon, das Du auf LOW statt HIGH prüfen musst. Du schaltest die LED immer dann, wenn der Taster gedrückt wird ein. Dein Programm macht umgangssprachlich folgendes:

Prüfe ob gerade in diesem Moment der Taster gedrückt wird. Wenn ja mach die LED an, wenn nicht, mach die LED aus.
Damit wird die LED immer aus gehen, sobald Du den Taster wieder los läßt.

Was Du machen musst, ist Die den Zustand der LED (AN oder AUS) in einer eigenen Variable merken. Immer wenn ein Tastendruck erkannt wird, schaltest Du den Zustnad dieser Variablen um (von AN zu AUS, oder umgekehrt).

Außerdem ist das delay(2500) sehr ungünstig, weil das eine Pause von 2,5 Sekunden im Programm ist. Solange wird aber auch der Taster nicht abgefragt und es ist Glückssache, ob Du genau den minimalen Zeitpunkt erwischst, wenn der Taster abgefragt wird. (Oder du drückst länger als 2,5 Sekunden auf den Taster)

Mario.

Ein Eingang liest eine Spannung. Ein bestimmter Bereich wird als HIGH übersetzt ein anderer als LOW. Wenn Du einen Taster zwischen masse und Eingang schaltest kannst Du den Eingang ein LOW-Spannung geben aber keine HIGH. Damit der Eingang HIGH liest mußt Du ihm mit hilfe eines Widerstandes einen HIGH-Pegel geben. Diesen Widerstand nennt man PULLUP (hinaufziehen). Also einen 10kOhm Widerstand zwischen Eingang und +5V schalten oder den internen Pullup-Widerstand mit
pinMode(knopf,INPUT);
digitalWrite(knopf,HIGH); aktivieren.

Grüße Uwe

Sorry, ich muß nochmal nachfragen.

Ich dachte: Stromkreis ist geöffnet --> Taster wird betätigt --> Strom fließt zum Pin 0 (ist ungünstig hab ich gelernt - danke dafür) --> Pin wird "umgeschaltet" von LOW - kein Strom auf HIGH - Strom. Aber scheinbar bin ich da falsch informiert.

Die 2,5 Sekunden sind noch von der "2-Taster-Version" ich wollte damit vermeiden, dass die beiden Taster nicht zu schnell "hintereinander reagieren".

Der Eingang des Arduinos misst nicht "Strom" oder "nicht Strom", sondern er gibt die aktuell anliegende Spannung an (OK, intern ist es am Ende schon eine Strom-Messung, aber das tut hier nichts zur Sache). Bei einem nicht-verbunden Pin (die Insider sprechen von floating) ist diese Spannung nicht definiert, d.h. sie kann zufällig mal HIGH (5V) oder LOW (0V) sein. Da Zufälligkeit normalerweise nicht akzeptabel ist, schafft man reproduzierbare Verhältnisse, indem man den "Ruhezustand" definiert, der Pull-Up ist genau dafür vorgesehen.

Maexle:
Ich dachte: Stromkreis ist geöffnet --> Taster wird betätigt --> Strom fließt zum Pin 0 (ist ungünstig hab ich gelernt - danke dafür) --> Pin wird "umgeschaltet" von LOW - kein Strom auf HIGH - Strom. Aber scheinbar bin ich da falsch informiert.

Das ist nicht falsch im grundsätzlichen Sinne, aber nicht korrekt in Bezug auf deine Schaltung.

Es gibt im Prinzip zwei Möglichkeiten.

  1. Das Arduino-Pin ist mit einem Widerstand an GND (Masse angeschlossen) und sorgt damit dafür, das der Eingang auf LOW Pegel liegt. Das nennt man Pulldown-Widerstand. Mit Deinem Taster kannst Du dann das Pin auf 5V schalten (siehe das Button Beispiel). Dann wird beim Drücken des Tasters das Pin auf HIGH gezogen.

  2. Das Arduino-Pin ist wie in Deinem Beispiel über den Taster mit GND verbunden. In diesem Fall brauchst Du eigentlich einen Widerstand (Pullup in diesem Fall), der an 5V und das Pin angeschlossen ist, um dafür zu sorgen, das immer 5V am Pin anliegen und es somit immer im HIGH Zustand ist. Wenn Du dann den Taster betätigst, verbindest Du das Pin mit GND (Masse) und der Strom fliesst vereinfacht gesagt über die Masse-Verbindung ab und nicht mehr über das Pin. Damit geht das Pin auf LOW.
    Der Vorteil dieser Lösung ist, das der Arduino den Pullup Widerstand schon eingebaut hat und Du Dir damit ein externes Bauteil sparen kannst. Wichtig ist aber, das Du diesen Widerstand auch aktivierst und das Du dann auf LOW prüfen musst, wenn Du wissen willst ob der Taster gedrückt wurde.
    Mario.

Ich glaube ich habe im Ansatz verstanden was ihr mir sagen wolltet.

Nur bin ich jetzt total verwirrt wie ich das im Programm umsetzen soll, bzw was ich machen muß, damit sich der arduino den Tasterzustand "merkt"

Maexle:
Nur bin ich jetzt total verwirrt wie ich das im Programm umsetzen soll, bzw was ich machen muß, damit sich der arduino den Tasterzustand "merkt"

Ach, die Logik dahinter hast du doch schon begriffen und sogar ausformuliert: Wenn sich der Mikrocontroller einen Zustand merken soll, schreibst du diesen einfach in eine Variable. Du brauchst also eine zusätzliche Status- bzw. Zustandsvariable, die abhängig vom Tastendruck ihren Wert ändert.

Achtung Pseudocode:

//boolean variable LEDzustand  speichert ob die LED gerade an ( true ) oder aus ( false ) ist

If knopf==gedrückt & LEDzustand== false{   //wenn der knopf gedrückt wird und die LED ist aus, 
                                                                 //soll die  LED an gehen
LEDzustand=true}

If knopf==gedrückt & LEDzustand== true{   //wenn der knopf gedrückt wird und die LED ist an,
                                                                //soll die  LED ausgehen
LEDzustand=false}

case LEDzustand                                       //hier wird die LED dann ein oder ausgeschaltet
   switch false
    digitalwrite ( LEDport, LOW )
  break;
   switch true
    digitalwrite (LEDport, HIGH )
   break  

Achtung Pseudocode

Man kann die case/switch auswertung auch in die if-Schleife integrieren, aber so ist es einfacher zu verstehen, glaube ich.

Zwei Dinge.

  1. Das Statement "if" ist keine Schleife, sondern eine Verzweigung. Siehe auch http://www.if-schleife.de/ :slight_smile:
  2. In Deinem Pseudo-Code hast Du switch und case vertauscht. Siehe http://arduino.cc/en/Reference/SwitchCase

Auch wenn es Pseudo-Code ist, für jemanden der gerade erst anfängt mit Programmieren können solche Kleinigkeiten zusätzlich zur Verwirrung und damit Frustation sorgen.

Mario.