Hallo, ich habe ein paar Schaltungen durchprobiert und erstellt und jetzt wollte ich eigentlich was einfaches austesten.
Ich möchte einfach eine simple Zweifaden Glühlampe simulieren wie man es beim PKW findet.
Bedeutet, ist das Rücklicht an und man betätigt die Bremse so geht das Bremslicht an.
Das ganze möchte ich aber mit einer LED nachbauen und die jeweils unterschiedlich dimmen. Beim betätigen des Tasters soll die LED einfach heller leuchten. Dazu habe ich folgenden Code geschrieben, aber der Taster bringt keine Reaktion. Liegt es daran das ich den Schalter digital abfrage und den Wert analog schreibe ? Müssten doch zwei unabhängige Dinge sein?
int licht = 3;
int lichthelligkeit = 2;
int bremslichthelligkeit = 250;
int bremslicht = 8;
int bremslichtschalter=0;
Noch mal eine Frage dazu, komme schon wieder nicht weiter.
Habe das ganze verändert, zur Verständnis - das Bremslicht soll immer Vorrang vor dem Blinklicht haben.
Die normale Schaltung funktioniert einwandfrei, wenn ich aber beide Schalter abfrage dann dimmt das Blinklicht nur ab und flackert. Ich weiß nun nicht ob ich es von der Programmierung falsch habe oder ob ich in der Schaltung einen Fehler habe. Habe einen 10K Pulldown Widerstand eingebaut.
int licht = 3; // Ruecklicht wird dem Kanal zugewiesen
int blinker = 5; // Blinker wird dem Kanal zugewiesen
int bremslicht = 8; // Bremslichtschalter wird dem Kanal zugewiesen
int blinklicht = 9; // Blinklichtschalter wird dem Kanal zugewiesen
int lichthelligkeit = 10; // Ruecklicht Helligkeit wird zugewiesen
int bremslichthelligkeit = 250; // Bremslicht Helligkeit wird zugewiesen
int blinklichthelligkeit = 250; // Blinklicht Helligkeit wird zugewiesen
int bremslichtschalter=0; // Bremslichtschalter wird genullt
int blinklichtschalter=0; // Blinklichtschalter wird genullt
void setup()
{
pinMode(bremslicht, INPUT); // Bremslicht wird als INPUT Kanal zugewiesen
pinMode(blinklicht, INPUT); // Blinklicht wird als INPUT Kanal zugewiesen
}
void loop()
{
bremslichtschalter=digitalRead(bremslicht); // Wert des Bremslichtschalters wird Bremslicht zugewiesen
blinklichtschalter=digitalRead(blinklicht); // Wert des Blinklichtschalters wird zugewiesen
if (bremslichtschalter == HIGH )
{
analogWrite(licht,bremslichthelligkeit);
}
else
{
analogWrite(licht,0);
}
if (bremslichtschalter == LOW )
{
analogWrite(licht,0);
}
else
{
analogWrite(licht,bremslichthelligkeit);
}
if (blinklichtschalter == HIGH )
{
analogWrite(blinker,blinklichthelligkeit);
}
else
{
analogWrite(blinker,0);
if (blinklichtschalter == LOW )
{
analogWrite(blinker,0);
}
else
{
analogWrite(blinker,blinklichthelligkeit);
}
}
if (blinklichtschalter == HIGH && bremslichtschalter == HIGH )
{
analogWrite(blinker,0);
analogWrite(licht,bremslichthelligkeit);
}
else
{
}
}
Bitte setze Deinen Sketch in Codetags (oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *).
Das kannst Du auch noch nachträglich durch Editieren tun. Bitte mach das, der Sketch ist besser zu lesen, besonders auf mobilen Geräten.
Ich habe die Widerstände als Pulldown angelegt. Das komische ist das die ja einzeln einwandfrei funktionieren, erst wenn ich die untere IF Schleife durchlaufen lasse kommt dieser Effekt.
Da gebe ich dir recht der Quelltext muss optimiert werden.
if (bremslichtschalter == HIGH ) {
analogWrite(licht,bremslichthelligkeit);
}
else { // Also wenn bremslichtschalter nicht HIGH und damit LOW ist
analogWrite(licht,0);
}
/* das kann damit weg
if (bremslichtschalter == LOW )
{
analogWrite(licht,0);
}
else
{
analogWrite(licht,bremslichthelligkeit);
}
*/
Bereinige doch bitte erst mal Deinen Code und formatiere ihn vernünftig.
Da scheinen auch einige Klammern nicht zu passen. Das sieht man aber erst, wenn der Code vernünftig formatiert und eingerückt ist.
Da hast Du recht, ich habe es mal bereinigt. Wirkt auch viel schlanker.
int licht = 3; // Ruecklicht wird dem Kanal zugewiesen
int blinker = 5; // Blinker wird dem Kanal zugewiesen
int bremslicht = 8; // Bremslichtschalter wird dem Kanal zugewiesen
int blinklicht = 9; // Blinklichtschalter wird dem Kanal zugewiesen
int lichthelligkeit = 10; // Ruecklicht Helligkeit wird zugewiesen
int bremslichthelligkeit = 250; // Bremslicht Helligkeit wird zugewiesen
int blinklichthelligkeit = 250; // Blinklicht Helligkeit wird zugewiesen
int bremslichtschalter=0; // Bremslichtschalter wird genullt
int blinklichtschalter=0; // Blinklichtschalter wird genullt
void setup()
{
pinMode(bremslicht, INPUT); // Bremslicht wird als INPUT Kanal zugewiesen
pinMode(blinklicht, INPUT); // Blinklicht wird als INPUT Kanal zugewiesen
}
void loop()
{
bremslichtschalter=digitalRead(bremslicht); // Wert des Bremslichtschalters wird Bremslicht zugewiesen
blinklichtschalter=digitalRead(blinklicht); // Wert des Blinklichtschalters wird zugewiesen
if (bremslichtschalter == HIGH )
{
analogWrite(licht,bremslichthelligkeit);
}
else
{
analogWrite(licht,0);
}
if (blinklichtschalter == HIGH )
{
analogWrite(blinker,blinklichthelligkeit);
}
else
{
analogWrite(blinker,0);
}
if (blinklichtschalter == HIGH && bremslichtschalter == HIGH )
{
analogWrite(blinker,0);
analogWrite(licht,bremslichthelligkeit);
}
else
{
}
}
Du schreibst Dir in die einzelnen if jeweils aussagekräftige Serial.println rein und oben nach der Eingabe gibst Du die aktuellen Werte der beiden Schalter aus.
Dafür darfst Du ausnahmsweise am Ende vom Loop ein delay(1000) rein machen, das Du es lesen kannst. Das kommt hinterher wieder raus.
Dann siehst Du, was in Deinem Programm passiert.
Du beschäftigst Dich mit dem Thema Entprellen von Schaltern.
Ich würde zuierst 1 empfehlen, das hilft beim Verständnis.
Daran habe ich noch gar nicht gedacht, das hilft wirklich weiter wenn man die Werte sieht.
Also habe die Schalter ausgelesen, jeweils kommt der Wert 1 heraus. Das müsste dann ok sein damit lässt sich ja arbeiten?
Das mit dem Delay war auch eine gute Idee. Jetzt kann ich erkennen das die LED nicht flackert oder gedimmt ist, sondern blinkt.
Die Ausgabe sagt mir das er die letzte Schleife nur einmal durchläuft und wieder ganz an den Anfang von Loop springt. Die Ausgabe sieht so aus :
Beide Schalter gedrueckt
Bremslichtschalter Wert:
1
Bremslichtschalter Wert:
1
Code dazu :
int licht = 3; // Ruecklicht wird dem Kanal zugewiesen
int blinker = 5; // Blinker wird dem Kanal zugewiesen
int bremslicht = 8; // Bremslichtschalter wird dem Kanal zugewiesen
int blinklicht = 9; // Blinklichtschalter wird dem Kanal zugewiesen
int lichthelligkeit = 10; // Ruecklicht Helligkeit wird zugewiesen
int bremslichthelligkeit = 250; // Bremslicht Helligkeit wird zugewiesen
int blinklichthelligkeit = 250; // Blinklicht Helligkeit wird zugewiesen
int bremslichtschalter=0; // Bremslichtschalter wird genullt
int blinklichtschalter=0; // Blinklichtschalter wird genullt
void setup()
{
Serial.begin(9600);
pinMode(bremslicht, INPUT); // Bremslicht wird als INPUT Kanal zugewiesen
pinMode(blinklicht, INPUT); // Blinklicht wird als INPUT Kanal zugewiesen
}
void loop()
{
bremslichtschalter=digitalRead(bremslicht); // Wert des Bremslichtschalters wird Bremslicht zugewiesen
blinklichtschalter=digitalRead(blinklicht); // Wert des Blinklichtschalters wird zugewiesen
if (bremslichtschalter == HIGH )
{
analogWrite(licht,bremslichthelligkeit);
Serial.println("Bremslichtschalter Wert:");
Serial.println(bremslichtschalter);
delay(500);
}
else
{
analogWrite(licht,0);
}
if (blinklichtschalter == HIGH )
{
analogWrite(blinker,blinklichthelligkeit);
Serial.println("Blinklichtschalter Wert:");
Serial.println(blinklichtschalter);
delay(500);
}
else
{
analogWrite(blinker,0);
}
if (blinklichtschalter == HIGH && bremslichtschalter == HIGH )
{
analogWrite(blinker,0);
analogWrite(licht,bremslichthelligkeit);
Serial.println("Beide Schalter gedrueckt");
delay(500);
}
else
{
}
}
Hast Du den 2. Schalter nicht benutzt? Baue es mal etwas anders auf, damit Du alle Verzweigungen sehen kannst:
int licht = 3; // Ruecklicht wird dem Kanal zugewiesen
int blinker = 5; // Blinker wird dem Kanal zugewiesen
int bremslicht = 8; // Bremslichtschalter wird dem Kanal zugewiesen
int blinklicht = 9; // Blinklichtschalter wird dem Kanal zugewiesen
int lichthelligkeit = 10; // Ruecklicht Helligkeit wird zugewiesen
int bremslichthelligkeit = 250; // Bremslicht Helligkeit wird zugewiesen
int blinklichthelligkeit = 250; // Blinklicht Helligkeit wird zugewiesen
int bremslichtschalter=0; // Bremslichtschalter wird genullt
int blinklichtschalter=0; // Blinklichtschalter wird genullt
void setup()
{
Serial.begin(9600);
pinMode(bremslicht, INPUT); // Bremslicht wird als INPUT Kanal zugewiesen
pinMode(blinklicht, INPUT); // Blinklicht wird als INPUT Kanal zugewiesen
}
void loop()
{
bremslichtschalter=digitalRead(bremslicht); // Wert des Bremslichtschalters wird Bremslicht zugewiesen
blinklichtschalter=digitalRead(blinklicht); // Wert des Blinklichtschalters wird zugewiesen
Serial.print("Bremsschalter: "); Serial.print(bremslicht);
Serial.print("Blinkschalter: "); Serial.println(blinklicht);
if (bremslichtschalter == HIGH )
{
analogWrite(licht,bremslichthelligkeit);
Serial.println("Bremslichtschalter HIGH");
}
else
{
analogWrite(licht,0);
Serial.println("Bremslichtschalter LOW");
}
if (blinklichtschalter == HIGH )
{
analogWrite(blinker,blinklichthelligkeit);
Serial.println("Blinklichtschalter HIGH");
}
else
{
analogWrite(blinker,0);
Serial.println("Blinklichtschalter LOW");
}
if (blinklichtschalter == HIGH && bremslichtschalter == HIGH )
{
analogWrite(blinker,0);
analogWrite(licht,bremslichthelligkeit);
Serial.println("Beide Schalter gedrueckt");
}
delay(500);
}
Ganz generell sollte jeder PWM-Ausgang pro loop-Durchlauf maximal nur einmal gesetzt werden.
Und, wenn sich an den Schalterstellungen nichts verändert, höchstens mit dem gleichen Wert (besser aber gar nicht) neu gesetzt werden.
Deine Namensgebung ist (für mich) etwas gewöhnungsbedürftig:
bremslicht ist der Pin an dem der Schalter angeschlossen ist (const) bremslichtschalter ist der aktuelle Wert (HIGH/LOW) licht ist der Ausgangspin, an dem das Rück/Bremslicht angeschossen ist (const)
dasselbe für
blinklicht
blinklichtschalter
blinker
Richtig?
Mit zwei Schaltern hast du theoretisch 4 Zustände und laut aktueller Logik:
Schalter | Ausgang
Brems Blink | licht blinker
LOW LOW | 0 0
LOW HIGH | 0 250
HIGH LOW | 250 0
HIGH HIGH | 250 0
Da ist nun leider die Rückfahrlicht-Helligkeit verloren gegangen. lichthelligkeit (10) kommt auch in deinem Sketch nicht vor.
Mit 3 Schaltern werden es bis zu 8 Zustände, die aber zu effektiv deutlich weniger zusammengefasst werden können. Dann kann man neuZustand mit altZustand vergleichen und nur bei Änderung die Ausgänge neu setzen. Dann ist man sicher, dass ein Ausgang nicht permanent hin- und her-geschaltet wird.
Wow das ist mal echt kompakt und funktioniert! :o Ja da muss ich erst noch mal üben, versuch gerade alles nach zu vollziehen. Vielen dank für die ausführliche Analyse, es ist also kein hardwareseitiges Problem.
Wie Du erkannt hast fehlt noch der Lichtschalter, den wollte ich danach wieder einführen ( hatte ich vorher schon mal getestet ). Im Prinzip ist es ein gedimmtes Bremslicht. Das ist auch der Grund warum ich es auch PWM Ausgänge genommen habe. Später möchte ich dann noch ein aus- und eindimmen der LED einfügen damit es mehr nach Glühlampe aussieht und nicht so hart ein und ausschaltet.
Zur besseren Verständnis, ich möchte die Schaltung in einem Fahrzeug verbauen, das stammt noch aus einer Zeit wo es keine Blinkleuchten gab, ( nur Winker ) teilweise gibt es da nur einen Leuchtfaden fürs Rücklicht. Das Lampengehäuse möchte ich später nutzen um damit auch Blinklicht und Bremslicht per LED dazustellen.
Die Abhängigkeit der Leuchten ist wichtig, denn das Bremslicht muss immer vor allen anderen Leuchten Vorrang haben.
Habe den Code noch mal bearbeitet und die Variablen geändert und den Lichtschalter eingefügt.
Jetzt funktioniert die Schaltung genau so wie es sein soll, allerdings flackert nun das "Licht" Liegt das daran das mehrfach geschrieben wird?
// Ausgaenge
int AUSGANG_licht = 3; // LED Ruecklicht wird dem Kanal zugewiesen
int AUSGANG_blinker = 5; // LED Blinker wird dem Kanal zugewiesen
// Eingaenge
int EINGANG_bremslicht = 8; // Bremslichtschalter wird dem Kanal zugewiesen
int EINGANG_blinklicht = 9; // Blinklichtschalter wird dem Kanal zugewiesen
int EINGANG_licht = 10; // Lichtschalter wird dem Kanal zugewiesen
// Variablen
int lichthelligkeit = 10; // Ruecklicht Helligkeit wird zugewiesen
int bremslichthelligkeit = 250; // Bremslicht Helligkeit wird zugewiesen
int blinklichthelligkeit = 250; // Blinklicht Helligkeit wird zugewiesen
int bremslichtschalter=0; // Bremslichtschalter wird genullt
int blinklichtschalter=0; // Blinklichtschalter wird genullt
int lichtschalter=0; // Lichtschalter wird genullt
void setup()
{
pinMode(EINGANG_bremslicht, INPUT); // Bremslicht wird als INPUT Kanal zugewiesen
pinMode(EINGANG_blinklicht, INPUT); // Blinklicht wird als INPUT Kanal zugewiesen
pinMode(EINGANG_licht, INPUT); // Licht wird als INPUT Kanal zugewiesen
}
void loop()
{
bremslichtschalter=digitalRead(EINGANG_bremslicht); // Wert des Bremslichtschalters wird Bremslicht zugewiesen
blinklichtschalter=digitalRead(EINGANG_blinklicht); // Wert des Blinklichtschalters wird zugewiesen
lichtschalter=digitalRead(EINGANG_licht); // Wert des Lichtschalters wird zugewiesen
if (bremslichtschalter == HIGH)
{
analogWrite(AUSGANG_licht, bremslichthelligkeit);
analogWrite(AUSGANG_blinker, 0);
}
else
{
analogWrite(AUSGANG_licht, 0);
if (blinklichtschalter == HIGH)
analogWrite(AUSGANG_blinker, blinklichthelligkeit);
else
{
analogWrite(AUSGANG_blinker, 0);
if (lichtschalter == HIGH)
analogWrite(AUSGANG_licht, lichthelligkeit);
else
{
analogWrite(AUSGANG_licht, 0);
}
}
}
Ok, korrigiert. Jetzt kapier ich aber gar nichts mehr. Dann ist es also ist nicht möglich der LED zwei verschiedene Helligkeiten zu zuweisen? In einem anderen Sketch habe ich das aber schon geschafft, da leuchtet sie schwach und beim drücken des Schalters wird sie hell.
// Ausgaenge
int AUSGANG_licht = 3; // LED Ruecklicht wird dem Kanal zugewiesen
int AUSGANG_blinker = 5; // LED Blinker wird dem Kanal zugewiesen
// Eingaenge
int EINGANG_bremslicht = 8; // Bremslichtschalter wird dem Kanal zugewiesen
int EINGANG_blinklicht = 9; // Blinklichtschalter wird dem Kanal zugewiesen
int EINGANG_licht = 10; // Lichtschalter wird dem Kanal zugewiesen
// Variablen
int lichthelligkeit = 100; // Ruecklicht Helligkeit wird zugewiesen
int bremslichthelligkeit = 250; // Bremslicht Helligkeit wird zugewiesen
int blinklichthelligkeit = 250; // Blinklicht Helligkeit wird zugewiesen
int bremslichtschalter=0; // Bremslichtschalter wird genullt
int blinklichtschalter=0; // Blinklichtschalter wird genullt
int lichtschalter=0; // Lichtschalter wird genullt
void setup()
{
pinMode(EINGANG_bremslicht, INPUT); // Bremslicht wird als INPUT Kanal zugewiesen
pinMode(EINGANG_blinklicht, INPUT); // Blinklicht wird als INPUT Kanal zugewiesen
pinMode(EINGANG_licht, INPUT); // Licht wird als INPUT Kanal zugewiesen
}
void loop()
{
bremslichtschalter=digitalRead(EINGANG_bremslicht); // Wert des Bremslichtschalters wird Bremslicht zugewiesen
blinklichtschalter=digitalRead(EINGANG_blinklicht); // Wert des Blinklichtschalters wird zugewiesen
lichtschalter=digitalRead(EINGANG_licht); // Wert des Lichtschalters wird zugewiesen
if (bremslichtschalter == HIGH)
{
analogWrite(AUSGANG_licht, bremslichthelligkeit);
analogWrite(AUSGANG_blinker, 0);
}
else
{
analogWrite(AUSGANG_licht, 0);
if (blinklichtschalter == HIGH)
{
analogWrite(AUSGANG_blinker, blinklichthelligkeit);
}
else
{
analogWrite(AUSGANG_blinker, 0);
if (lichtschalter == HIGH)
{
analogWrite(AUSGANG_licht, lichthelligkeit);
}
else
{
analogWrite(AUSGANG_licht, 0);
}
}
}
}