Per Tastendruck LED Ein- und Ausschalten Attiny

Guten Abend zusammen!

Ich habe ein kleines Problem und komme leider nicht auf den Fehler.

Was ich machen will: Eine LED im Tacho vom Auto steuern, mittels einem Attiny24.

Dazu habe ich den Lenkstockschalter genommen und die Zustände der Tasten programmiert, dies war letztes Jahr im November. Nun bin ich soweit, dass ich eine Platine entworfen habe, die das ganze auch bei 12V macht, was mit 5V am Arduino funktioniert hatte.

Nun habe ich aber das Problem, dass das Programm nicht (richtig) läuft und finde den Fehler nicht. Ich weiß leider nicht mehr, ob ich es im nachhinein nochmal geändert hatte.

Funktion sollte so sein: Bei Drücken der Taste I =LED einschalten. Bei Drücken der Taste R = LED einschalten. Bei Taste 0 = LED Ausschalten, ebenso bei BR und KP. Ansonsten ist die LED so lange aus, sobald wieder I oder R gedrückt wird.

Findet jemand den Fehler? Aktuell leuchtet sie nämlich ständig und bei drücken von 0 dimmt Sie leicht ab und beim loslassen wieder auf.. also stimmt was nicht.

Danke schonmal!

int ledPin=6;
int tasterI=9;
int tasterR=8;
int taster0=10;
int tasterBR=11;
int tasterKP=12;
int var,x=0;




void setup()
{
  pinMode(6, OUTPUT);   
  pinMode(9, INPUT);
  pinMode(8, INPUT);
  pinMode(10, INPUT);
  pinMode(11, INPUT);
  pinMode(12, INPUT);
}

 void loop()   
{

  if (digitalRead(8) == HIGH && x==0) {
 digitalWrite(6, HIGH);
 x=1;
 }

 if (digitalRead(9) == HIGH && x==0) {
  digitalWrite(6, HIGH);
  x=1;
 }

if (digitalRead(10) == LOW && x==1) {
  digitalWrite(6, LOW);
  
  x=0;
 }



if (digitalRead(11) == HIGH && x==1) {
  digitalWrite(6, LOW);
  
  x=0;

  
}

if (digitalRead(12) == HIGH && x==1) {
  digitalWrite(6, LOW);
  
  x=0;

  
}}

Warum verwendest du im Sketch die Pinnummern und nicht deine definierten Bezeichnungen ?
Das ist erst mal sehr irreführend.

Und wenn deine Leds anbleiben sollen, musst du den Zustand in einer Statusvariable speichern und diesen abfragen.
Aktuell bleibt die Led ja nur so lange an, wie du die Taste drückst.

Werde ich ändern. Habe ich nicht bedacht.

Ok,.. aber das funktoniert nicht. Die LED ist mit dem Sketch oben immer an. DImmt aber runter, solange man 0 gedrückt hält. Bei den anderen gibt es keine Reaktion. Heißt, der Sketch bekommt ein "Dauerdrücken" signal?

aber geschieht die Abfrage nicht mit && welches ja den Boolean darstellen soll?

Das ständige Leuchten kommt dadurch, dass du keine Pulldown-Widerstände an den Eingangspins verwendest.
Dadurch ist der Pin immer HIGH.

Und nein, dein && in der Abfrage heißt, es müssen beide Zustände zutreffen.

Du kannst statt der externen Pullups auch die internen Pullup-Widerstände verwenden, musst dann aber auf LOW abfragen.

Oh....sorry, hatte mich in deinem Sketch ein wenig verguckt.
Die sollten so schon anbleiben, da du keinen funktionierenden Aus-Status hast.
Zumindest funktioniert der noch nicht.

ahh... Dann habe ich das wohl damals mit Widerstände gelöst!

Dann muss ich das doch ändern, denn im verbauten Zustand, kann ich die Widerstände nicht verwenden...

Jetzt muss ich mich mal wieder einlesen, wie man das dann intern löst.

pinMode(xy,INPUT_PULLUP)

Danke für die schnelle Antwort! Wenn ich dies jetzt nehme und nach LOW abfrage, bleibt die LED aus...

Lässt sich aber nicht durch drücken der Tasten wieder einschalten.. Also entweder das anschließen funktioniert so nicht, oder der Sketch ist dennoch fehlerhaft/unvollständig.

fusinoco:
Danke für die schnelle Antwort! Wenn ich dies jetzt nehme und nach LOW abfrage, bleibt die LED aus...

Lässt sich aber nicht durch drücken der Tasten wieder einschalten.. Also entweder das anschließen funktioniert so nicht, oder der Sketch ist dennoch fehlerhaft/unvollständig.

Du musst schon deinen aktuellen Sketch posten, damit wir auch sehen können, was du geändert hast.

ich habe nicht viel geändert...

int ledPin=6;
int tasterI=9;
int tasterR=8;
int taster0=10;
int tasterBR=11;
int tasterKP=12;
int var,x=0;




void setup()
{
  pinMode(ledPin, OUTPUT);   
  pinMode(9, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
}

 void loop()   
{

  if (digitalRead(tasterR) == LOW && x==0) {
 digitalWrite(ledPin, HIGH);
 x=1;
 }

 if (digitalRead(tasterI) == LOW && x==0) {
  digitalWrite(ledPin, HIGH);
  x=1;
 }

if (digitalRead(taster0) == HIGH && x==1) {
  digitalWrite(ledPin, LOW);
  
  x=0;
 }



if (digitalRead(tasterBR) == LOW && x==1) {
  digitalWrite(ledPin, LOW);
  
  x=0;

  
}

if (digitalRead(tasterKP) == LOW && x==1) {
  digitalWrite(ledPin, LOW);
  
  x=0;

  
}}

Ich versteh immer noch nicht, was das "&& x==0" in den Abfragen soll.

Warum machst du das nicht so wie nachstehend.
Ungetestet.

int ledPin = 6;
int tasterI = 9;
int tasterR = 8;
int taster0 = 10;
int tasterBR = 11;
int tasterKP = 12;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(tasterI, INPUT_PULLUP);
  pinMode(tasterR, INPUT_PULLUP);
  pinMode(taster0, INPUT_PULLUP);
  pinMode(tasterBR, INPUT_PULLUP);
  pinMode(tasterKP, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(tasterR) == LOW) {
    digitalWrite(ledPin, HIGH);
  }

  if (digitalRead(tasterI) == LOW) {
    digitalWrite(ledPin, HIGH);
  }

  if (digitalRead(taster0) == LOW) {
    digitalWrite(ledPin, LOW);
  }

  if (digitalRead(tasterBR) == LOW) {
    digitalWrite(ledPin, LOW);
  }

  if (digitalRead(tasterKP) == LOW) {
    digitalWrite(ledPin, LOW);
  }
}

Code entsprechend neuster Beschreibung geändert.

Wieso kontrollierst Du einen Eingang ob er HIGH ist und alle anderen ob sie LOW sind?

if (digitalRead(taster0) == HIGH && x==1) {
  digitalWrite(ledPin, LOW);
 
  x=0;
 }

schaltet die LED aus sobald sie eingeschaltet wurde bzw x 1 gesetzt wird.
Dies passiert nicht wenn Du den Taster taster0 dauernd gedrückt hälst.
Grüße Uwe

Also da es ein Tempomatschalter ist, wird die Taste 0 nur einmal gedrückt, um die LED bzw. den Tempomat auszuschalten. Low deshalb, da beim Drücken dieser Taste 0 die Spannungsversorgung unterbrochen wird, das heißt, es liegt in dem Moment keine 12 V an. Da ist quasi ne Brücke drin, die angehoben wird beim Drücken. Deswegen das Low.

Wie gesagt, mit 5V und Widerständen hatte der Code damals funktioniert.. Da habe ich das durchprobiert.

Jetzt hatte ich eine kleine Schaltung erstellt und das Programm auf den Attiny geschrieben, jedoch nicht mehr dran gedacht, dass der Test ein wenig anders lief..

Jetzt muss ich eben die Fehler beseitigen, damit es hoffentlich trotzdem noch mit 12 V und ohne Widerstände läuft..

Werde heute Abend mal den Vorschlag testen! Vielen Dank.

Im Prinzip soll das Programm folgendes machen:

Grundsätzlich soll die LED aus sein. Sobald jedoch I oder R gedrückt wird, soll sie leuchten. Sie soll dann so lange leuchten bis 0, BR oder KP gedrückt werden, denn dann soll sie wieder ausgehen.

fusinoco:
Also da es ein Tempomatschalter ist, wird die Taste 0 nur einmal gedrückt, um die LED bzw. den Tempomat auszuschalten. Low deshalb, da beim Drücken dieser Taste 0 die Spannungsversorgung unterbrochen wird, das heißt, es liegt in dem Moment keine 12 V an. Da ist quasi ne Brücke drin, die angehoben wird beim Drücken. Deswegen das Low.

Sorry, aber das verstehe ich nicht.
Kannst du das mal verständlicher schreiben ?

Wie gesagt, mit 5V und Widerständen hatte der Code damals funktioniert.. Da habe ich das durchprobiert.

Dein obiger Sketch sicher nicht.

Jetzt muss ich eben die Fehler beseitigen, damit es hoffentlich trotzdem noch mit 12 V und ohne Widerstände läuft..

Da solltest du aufpassen.
Du kannst deine Schaltung nicht einfach an 12 Volt betreiben. Damit tötest du den ATtiny.
Der kann nur 5V ab.

fusinoco:
Im Prinzip soll das Programm folgendes machen:

Grundsätzlich soll die LED aus sein. Sobald jedoch I oder R gedrückt wird, soll sie leuchten. Sie soll dann so lange leuchten bis 0, BR oder KP gedrückt werden, denn dann soll sie wieder ausgehen.

Aufgrund dieser Beschreibung habe ich mein Sketch-Beispiel angepasst.

Du weißt schon daß Modifizierungen an PKW bzw Motorräder nicht erlaubt sind?
Grüße Uwe

Hallo,

zu deiner Logik

links oder rechts -> LED ein

0 oder BR oder KP -> LED aus

faß doch erst mal die beiden Bedingungen zusammen zu je einer bool Variablen, "ein" , "aus". Mit den beiden ist es dann doch ganz einfach.

Heinz

Rentner:
faß doch erst mal die beiden Bedingungen zusammen zu je einer bool Variablen, “ein” , “aus”. Mit den beiden ist es dann doch ganz einfach.

Warum soll der TO alles wieder umstellen ?
Bis auf ein paar Fehler ist sein Sketch nach den Änderungen auch nutzbar.

Er muss es nur machen.

Hallo,

ich denke weil es Sinn macht wenn man etwas ein oder aus schaltet das jeweils nur an einer Stelle zu tut. Dient eigentlich der Lesbarkeit und in einem umfangreicheren Program ist es einfacher Fehler zu finden.

Heinz

ich dachte da an sowas

Gruß Heinz

int ledPin = 6;
int tasterI = 9;
int tasterR = 8;
int taster0 = 10;
int tasterBR = 11;
int tasterKP = 12;

//Hilfsvariable
bool stateI, stateR, state0, stateBR, stateKP;
bool ein, aus;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(tasterI, INPUT_PULLUP);
  pinMode(tasterR, INPUT_PULLUP);
  pinMode(taster0, INPUT_PULLUP);
  pinMode(tasterBR, INPUT_PULLUP);
  pinMode(tasterKP, INPUT_PULLUP);
}

void loop()
{
  // Taster invertier einlesen und auf Hilfsvariabel legen
  stateI = !digitalRead(tasterI);
  stateR = !digitalRead(tasterR);
  state0 = !digitalRead(taster0);
  stateBR = !digitalRead(tasterBR);
  stateKP = !digitalRead(tasterKP);

  ein = stateR | stateI; //Logik für ein
  aus = state0 | stateBR | stateKP;//Logik für aus

  // Auasgänge schalten
  if (ein) digitalWrite(ledPin, HIGH); 
  if (aus) digitalWrite(ledPin, LOW);

}