Anfänger braucht hilfe bei Taster led schaltung.

Hallo,

irgendwie funktioniert mein Programm nicht. Die led will nicht angehen, wenn ich den taster drücke.
Kann mir wer sagen, wo der fehler liegt?

// LED mit Taster ein.
// pinnummer der ein/ausgänge und bezeichnung
const int ta1 = 10;
const int led1 = 9;
void setup() {
pinMode(led1, OUTPUT);
pinMode(ta1, INPUT);
}
void loop(){
if (ta1 == HIGH) {
digitalWrite(led1, HIGH);
}
else {
digitalWrite(led1, LOW);
}
}

Als weitererSchritt soll die LED beim 1 mal tasten angehen, und beim 2 mal tasten ausgehen.

Hi,

wie hast du den schalter Angeschlossen? Ein schalter schaltet nicht direkt nur High z.B. schau dir mal Debouncen von schaltern an, da ist auch ein beispiel welches genau das was du suchst machst

gibt's auch auf deutsch

Chaos_Lord:
Hi,

wie hast du den schalter Angeschlossen? Ein schalter schaltet nicht direkt nur High z.B. schau dir mal Debouncen von schaltern an, da ist auch ein beispiel welches genau das was du suchst machst

Learning Arduino Episode 006 -- Digital In with a button - YouTube

gibt's auch auf deutsch

@Chaos_Lord Bei dem Code welchen er jetzt verwendet braucht er kein Debouncen. Nur wenn er das mit dem "tasten" machen will.

Wie hast du den Taster denn angeschlossen?

Hi,

In der Variablen ta1 steht nicht der Wert, den du suchst, sondern die Pin-Nummer.
Wenn du auf High vergleichen willst, musst du vorher ein "digitalread" machen.

@J3RE ok gutes Argument :smiley: Ist ja ein Taster hatte ich falsch gelesen :smiley:

Ah Danke.

Funktioniert nun. Der Taster ist wie in den Video angeschlossen, auch mit einem 10 KOhm Wiederstand am Eingang vom Ardoino gegen Masse.

wie kann ich (digitalRead(ta1)==HIGH) und (digitalRead(ta2)==HIGH) verknüpfen? Besser ausgedrückt, wie kann ich mit if (digitalRead.... 2 Eingänge (ta1 und ta2) abfragen?

LG. Rene

if (digitalRead(ta1) && digitalRead (ta2)) {
// tue irgendwas wenn beide Schalter gedrückt sind
}

if (digitalRead(ta1) | digitalRead (ta2)) {
// tue irgendwas wenn entweder ta1 ODER ta2 gedrückt ist
}

if (!digitalRead(ta1) && digitalRead (ta2)) {
// tue irgendwas wenn nicht ta1 aber ta2 gedrückt ist
}

if (digitalRead(ta1)){}
ist übrigens die Kurzform von
if (digitalRead(ta1) == HIGH) {}

etc.

Irgenwie klappt es grad nicht. Und zwar möchte ich, wenn beide Taster gedrückt werden, Beide Ausgänge auf LOW gesetzt werden.?

void loop(){
if (digitalRead(ta1)==HIGH){
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
}
else
{
if (digitalRead(ta2)==HIGH){
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
}
else
{
if (digitalRead(ta1)==HIGH && digitalRead(ta2)==HIGH){
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
}

Das Programm kommt erst zu dieser Kontrolle

else
  {
  if (digitalRead(ta1)==HIGH && digitalRead(ta2)==HIGH){
  digitalWrite(led1,LOW);
  digitalWrite(led2,LOW);
  }

wenn in den 2 vorhergehenden kontrollen TA1 und TA2 LOW waren. Diese können dann sofort nacher nicht HIGH sein.

So funktionierts:

 if (digitalRead(ta1)==HIGH){
  digitalWrite(led1,HIGH);
   }
 if (digitalRead(ta2)==HIGH){
  digitalWrite(led2,HIGH);
   }
 if (digitalRead(ta1)==LOW and digitalRead(ta2)==LOW){
  digitalWrite(led1,LOW);
  digitalWrite(led2,LOW);
   }

Grüße Uwe

uwefed:
So funktionierts:

 if (digitalRead(ta1)==HIGH){

digitalWrite(led1,HIGH);
  }
if (digitalRead(ta2)==HIGH){
  digitalWrite(led2,HIGH);
  }
if (digitalRead(ta1)==LOW and digitalRead(ta2)==LOW){
  digitalWrite(led1,LOW);
  digitalWrite(led2,LOW);
  }




Grüße Uwe

Er will ja das beide LED's LOW sind, wenn beide Taster gedrückt sind.
Somit müsste der letzte Teil so aussehen:

if (digitalRead(ta1)==HIGH && digitalRead(ta2)==HIGH){
  digitalWrite(led1,LOW);
  digitalWrite(led2,LOW);
}

und was willst Du wenn kein Taster gedrückt ist?
Grüße Uwe

benötige noch mal ein bischen hilfe bei einem timer. Eigentlich solte die led nach drücken des tasters für 5s angehen. Geht aber nicht, es sei denn ich drücke den taster mid. 5s. Dann bleibt die led 5s an.

Wo liegt der fehler?
ps: Auch wenn ich mit buttonState arbeite geht es nicht.

// Timer.

const int led1=9;
const int taster=10;  

void setup()
{
  pinMode(led1,OUTPUT);
  pinMode(taster,INPUT);
}

void loop() 
{
  if (digitalRead(taster)==HIGH)
  digitalWrite(led1,HIGH);
  delay(5000);
  digitalWrite(led1,LOW);
}

Du hast nur die geschwungenen Klammern vergessen.

if (digitalRead(taster)==HIGH){
  digitalWrite(led1,HIGH);
  delay(5000);
  digitalWrite(led1,LOW);
}

Jetzt sollte es funktionieren :slight_smile:

Thanks.

Der eigentliche code nach void loop kommt in einer geschwungene Klammer. Wenn ich nach if (digitalRead(taster)==HIGH) eine neue "Anweisung" mache, muss die ebenfalls in einer geschwungene Klammer. OK.

Also ist es dann eine Anweisung in einer Anweisung. Oder sehe ich es falsch?

Ja genau.

Und wenn du nur eine Anweisung hast kannst du es auch so machen:

if (digitalRead(taster) == HIGH) digitalWrite(led1, HIGH);

also ohne die geschwungenen Klammern

Beachte : "kannst" heisst: kannst stattdessen natürlich auch geschweifte Klammern setzen.

Eigentlich ist die if Syntax:

if (Bedingung) Anweisung

Anweisung kann eine einzelne, oder ein { Block } sein.
Die geschweiften Klammern bilden einen Block, der von aussen als Einheit gesehen werden kann, im Innern aber wieder beliebig komplex sein kann.

Erst mal recht Herzlichen Dank an alle, die mir das alles so toll erklären, auch wenn sich meine fragen "dumm" anhören. Ich möcht nur die einzelnen "anweisungen" etc. verstehen.

Ich werd auch mal erst bei Taster / LED Schaltungen bleiben, damit kann mann noch viel machen. Mein Dad hat da auch spass dran, und wir sind heut angefangen eine Liste zu machen, mit erklärung, was die einzelnen Parameter bedeuten. Dadurch versteht mann einiges besser.

Hier mal mein fertiger Timer Code.

// Timer.

const int led1=9;
const int taster=10;  

void setup()
{
  pinMode(led1,OUTPUT);
  pinMode(taster,INPUT);
}

void loop() 
{
  if (digitalRead(taster)==HIGH);
  {
  digitalWrite(led1,HIGH);
  delay(5000);
  }
  digitalWrite(led1,LOW);
}

So,

Nun habe ich in den Void Tag, eine Anweisung in einer Anweisung. Ergo, eine Anweisung ist immer zwischen { und }. Wir sagen mal, ich möchte über einen 2 Taster eine weiter LED einschlaten können, aber nur dann, wenn die die 1 LED an ist.

Das würde ja bedeuten, das hinter der zusätzlichen if Abfrage eine weitere Anweisung kommt. Da es ein Loop Tag ist, durchläuft der Atmel eh den Code andauernt, und müsste doch eine 3 Anweisung ausführen, wenn der timer noch nicht abgelaufen ist.

Abfragen könnte mann ja so.

if (digitalRead(led1)==HIGH && digitalRead(taster2)==HIGH)

Werd das morgen mal ausprobieren. Entweder funktioniert es, oder ich war aufem Holzweg. Möglichkeit 2 wäre hinter digitalWrite(led1,HIGH); eine Aabfrage zu machen. Das dürfte aber nicht gehen, weil digital Write in { } gehört, und mann somit die 3 Anweisung so wie so hätte.

Berichtigt mich rhuig, wenn ich einen denkfehler hab.

LG. Rene

Dann kannst Du nicht mehr delay() verwenden da delay() das Programm Aufhält. Du mußt millis() verwenden.
Siehe http://arduino.cc/en/Tutorial/BlinkWithoutDelay
grüße Uwe