const int Taster = 18; // Pin Nummer des Tasters
const int Led_Rot = 2; // Pin Nummer der Ledfarbe Rot
const int Led_Gruen = 3; // Pin Nummer der Ledfarbe Grün
const int Led_Blau = 4; // Pin Nummer der Ledfarbe Blau
int Zaehler = 1; // Zähler für den aktuellen Programstand
int Tasterstatus = LOW; // aktuelles Signal vom Eingangspin
int TasterGedrueckt = 0; // abfragen ob Taster gedrückt war
int Vorherigerstatus = LOW; // vorheriges Signal vom Eingangspin
int EntprellZeit = 200; // Zeit für Entprellung, anpassen!
unsigned long TasterZeit = 0; // Zeit beim drücken des Tasters
void setup() {
pinMode(Led_Blau, OUTPUT); // LED Pin wird als Ausgang gesetzt
pinMode(Led_Rot, OUTPUT); // LED Pin wird als Ausgang gesetzt
pinMode(Led_Gruen, OUTPUT); // LED Pin wird als Ausgang gesetzt
pinMode(Taster, INPUT); // Taster Pin wird als Eingang gesetzt
}
void loop()
{
Tasterstatus = digitalRead (Taster); // Tasterstatusabfrage
//Flankenwechsel erkennen
if(Vorherigerstatus == LOW && Tasterstatus == HIGH)
{
TasterZeit = millis(); // aktualisiere TasterZeit
TasterGedrueckt = 1; // speichert, dass Taster gedrückt wurde
}
// Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
if ((millis() - TasterZeit > EntprellZeit) && TasterGedrueckt == 1)
{
//abhängig vom Zähler passende funktion aufrufen
switch(Zaehler) {
case 1: Led_1(); // Fall_1 Led Blau
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 2: Led_2(); // Fall_2 Led Rot
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 3: Led_3(); // Fall_3 Led Gruen
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 4: Led_4(); // Fall_4 Led Lila
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 5: Led_5(); // Fall_5 Led Türkis
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 6: Led_6(); // Fall_6 Led Gelb
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 7: Led_7(); // Fall_7 Led Weis
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 8: Led_8(); // Fall_8 Led Farbmisch
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 9: Led_9(); // Fall_9 Led Aus
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
}
Zaehler++; //Zähler erhöhen
if(Zaehler == 10) Zaehler = 1; //Zähler zurücksetzen
}
Vorherigerstatus = Tasterstatus; //letzten Zustand merken
}
void Led_1() // Fall_1 Led Blau
{
digitalWrite(Led_Blau, HIGH); // LED Blau an
digitalWrite(Led_Rot, LOW); // LED Rot aus
digitalWrite(Led_Gruen, LOW); // LED Gruen aus
}
void Led_2() // Fall_2 Led Rot
{
digitalWrite(Led_Blau, LOW); // LED Blau aus
digitalWrite(Led_Rot, HIGH); // LED Rot an
digitalWrite(Led_Gruen, LOW); // LED Gruen aus
}
void Led_3() // Fall_3 Led Grün
{
digitalWrite(Led_Blau, LOW); // LED Blau aus
digitalWrite(Led_Rot, LOW); // LED Rot aus
digitalWrite(Led_Gruen, HIGH); // LED Gruen an
}
void Led_4() // Fall_4 Led Lila
{
digitalWrite(Led_Blau, HIGH); // LED Blau an
digitalWrite(Led_Rot, HIGH); // LED Rot an
digitalWrite(Led_Gruen, LOW); // LED Gruen aus
}
void Led_5() // Fall_5 Led Türkis
{
digitalWrite(Led_Blau, HIGH); // LED Blau an
digitalWrite(Led_Rot, LOW); // LED Rot aus
digitalWrite(Led_Gruen, HIGH); // LED Gruen an
}
void Led_6() // Fall_6 Led Gelb
{
digitalWrite(Led_Blau, LOW); // LED Blau aus
digitalWrite(Led_Rot, HIGH); // LED Rot an
digitalWrite(Led_Gruen, HIGH); // LED Gruen an
}
void Led_7() // Fall_7 Led Weis
{
digitalWrite(Led_Blau, HIGH); // LED Blau an
digitalWrite(Led_Rot, HIGH); // LED Rot an
digitalWrite(Led_Gruen, HIGH); // LED Gruen an
}
void Led_8() // Fall_8 Led aus
{while(1)
{
digitalWrite(Led_Rot, LOW); // LED Rot aus
digitalWrite(Led_Gruen, LOW); // LED Gruen aus
for (int helligkeit =1; helligkeit <= 255; helligkeit = helligkeit +5){
analogWrite(Led_Blau, helligkeit);
delay(20);
}
for (int helligkeit =255; helligkeit >= 0; helligkeit = helligkeit -5){
analogWrite(Led_Blau, helligkeit);
delay(20);
}
}
}
void Led_9() // Fall_9 Led aus
{
digitalWrite(Led_Blau, LOW); // LED Blau aus
digitalWrite(Led_Rot, LOW); // LED Rot aus
digitalWrite(Led_Gruen, LOW); // LED Gruen aus
}
Das ist aber grundlegend falsches Design. Statt in einer Funktion eine Endlos-Schleife zu machen schaut am Anfang der Funktion nach ob was zu tun ist. Wenn ja macht man einen Schritt und verlässt die Funktion wieder. Dann ruft man die Funktion ständig auf.
Wenn man dann noch auf delay() verzichtet kann man so mehrere Dinge quasi-gleichzeitig tun. z.B. LED blinken und Taster abfragen
Ach so. Ganz einfach: Indem Du die Schleife entfernst. Du musst dann natürlich mit Zeiten arbeiten, wie Du das für das Entprellen schon machst und im Farbwechsel-Status jeweils eine Routine anspringen, die weiterschaltet, wenn schon die gewünschte Zeit vergangen ist. Die "delay()"-Aufrufe gehören natürlich entfernt, die sind sowieso Gift für solche Sachen.
Was Du dann hast, nennt man eine State Machine, mit etwas googlen wirst Du ganz viel Information dazu finden.
verstehe ich das richtig. schleife weg und stattdessen: falls z.b. case 8 war aktiv aber die bedingung für case 9 nicht da dann einfach nochmal das ganze?
Wenn du es super richtig machen willst, schmeisst du auch noch die for schleifen raus
Dann dauert Led8() nicht viel länger als Led1() ( na ja, 4 ms ist mehr als 0 )
Musst dir halt die Helligkeitsmerker statisch merken.
Und besser statt in 5erSchritten alle 20 ms lieber in Einerschritten alle 4 ms.
void Led8() {
static byte helligkeit=0;
if (helligkeit < 255) { helligkeit++;
analogWrite(Led_Blau, helligkeit);
delay(4);
} else Zaehler++; // andere Richtung im nächsten case ...
}
Nein, Du musst den Inhalt der Schleife auftrennen und je nach vergangener Zeit den richtigen Teil ausführen.
Beispiel:
uint32_t time_start = millis();
void loop() {
if (millis() - time_start > 5000) time_start = millis();
else if (millis() - time_start > 2000) stop_led2();
else if (millis() - time_start > 1000) stop_led1();
else if (millis() - time_start > 500) start_led2();
else if (millis() - time_start > 50) start_led1();
}
Beachte, dass ich durch die if-else-Abfrage in verkehrter Reihenfolge die Obergrenze nicht abfragen muss. Wenn Du also mit der kleinsten Zeit anfängst, musst Du bei Limiten testen.
Schaltest du denn in Led8 Rot und Grün (noch von Led7 ) aus?
Am Ende, wenn du automatisch auf Schritt 9 weiterschaltest, solltest du helligkeit erst wieder auf 0 setzen. ( das war ein echter Fehler von mir )
oder du merkst dir zusätzlich noch die Richtung ( 1 / -1 ) und fährst Led8 komplett hoch und wieder runter, bis von aussen weitergeschaltet wird.
oder du machst helligkeit zu einer globalen Variable, die du in Led9 zurücksetzen (oder für was anderes verwenden) kannst.
Mit einer schleife funktioniert das nicht, da bei Tastendruck dann nichts mehr passiert.
Schleifen auflösen und durch if-Abfragen ersetzen. Alle delay() Aufrufe raus (jedenfalls die die länger als ein paar ms sind). Dann fragst du bei jedem Funktionsaufruf nur ab ob es Zeit ist was zu tun. Und wenn ja machst du einen Schritt. Und nur einen. Dazu braucht halt Statusvariablen die den aktuellen Zustand festhalten.
Du darfst dein Programm nie anhalten. Dann kannst du auch Taster abfragen während du irgendwelche LED Animation ablaufen lässt.
Mein aktueller Sketch sieht so aus. Leider funktioniert die If Abfrage bei LED_8 nicht die LED behält eine mittlere Helligkeit wird also nicht heller auch schaltet sie nicht zu LED_9 wo dann alles aus sein sollte.
Vielleicht kann mir ja noch jemand einen Tip anhand des geschriebenen Sketches geben. Wäre toll.
const int Taster = 18; // Pin Nummer des Tasters
const int Led_Rot = 2; // Pin Nummer der Ledfarbe Rot
const int Led_Gruen = 3; // Pin Nummer der Ledfarbe Grün
const int Led_Blau = 4; // Pin Nummer der Ledfarbe Blau
int Zaehler = 1; // Zähler für den aktuellen Programstand
int helligkeit = 1;
int Tasterstatus = LOW; // aktuelles Signal vom Eingangspin
int TasterGedrueckt = 0; // abfragen ob Taster gedrückt war
int Vorherigerstatus = LOW; // vorheriges Signal vom Eingangspin
int EntprellZeit = 200; // Zeit für Entprellung, anpassen!
unsigned long TasterZeit = 0; // Zeit beim drücken des Tasters
void setup() {
pinMode(Led_Blau, OUTPUT); // LED Pin wird als Ausgang gesetzt
pinMode(Led_Rot, OUTPUT); // LED Pin wird als Ausgang gesetzt
pinMode(Led_Gruen, OUTPUT); // LED Pin wird als Ausgang gesetzt
pinMode(Taster, INPUT); // Taster Pin wird als Eingang gesetzt
}
void loop()
{
Tasterstatus = digitalRead (Taster); // Tasterstatusabfrage
//Flankenwechsel erkennen
if (Vorherigerstatus == LOW && Tasterstatus == HIGH)
{
TasterZeit = millis(); // aktualisiere TasterZeit
TasterGedrueckt = 1; // speichert, dass Taster gedrückt wurde
}
// Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
if ((millis() - TasterZeit > EntprellZeit) && TasterGedrueckt == 1)
{
//abhängig vom Zähler passende funktion aufrufen
switch (Zaehler) {
case 1: Led_1(); // Fall_1 Led Blau
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 2: Led_2(); // Fall_2 Led Rot
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 3: Led_3(); // Fall_3 Led Gruen
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 4: Led_4(); // Fall_4 Led Lila
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 5: Led_5(); // Fall_5 Led Türkis
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 6: Led_6(); // Fall_6 Led Gelb
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 7: Led_7(); // Fall_7 Led Weis
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 8: Led_8(); // Fall_8 Led Farbmisch
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
case 9: Led_9(); // Fall_9 Led Aus
TasterGedrueckt = 0; // setzt gedrückten Taster zurück
break;
}
Zaehler++; //Zähler erhöhen
if (Zaehler == 10) Zaehler = 1; //Zähler zurücksetzen
}
if (Vorherigerstatus != Tasterstatus && millis() - TasterZeit > 2000) { // Taster losgelassen und war mind. 1 Sek. gedrueckt
Led_9();
TasterGedrueckt = 0;
Zaehler = 10;
}
Vorherigerstatus = Tasterstatus; //letzten Zustand merken
}
void Led_1() // Fall_1 Led Blau
{
digitalWrite(Led_Blau, HIGH); // LED Blau an
digitalWrite(Led_Rot, LOW); // LED Rot aus
digitalWrite(Led_Gruen, LOW); // LED Gruen aus
}
void Led_2() // Fall_2 Led Rot
{
digitalWrite(Led_Blau, LOW); // LED Blau aus
digitalWrite(Led_Rot, HIGH); // LED Rot an
digitalWrite(Led_Gruen, LOW); // LED Gruen aus
}
void Led_3() // Fall_3 Led Grün
{
digitalWrite(Led_Blau, LOW); // LED Blau aus
digitalWrite(Led_Rot, LOW); // LED Rot aus
digitalWrite(Led_Gruen, HIGH); // LED Gruen an
}
void Led_4() // Fall_4 Led Lila
{
digitalWrite(Led_Blau, HIGH); // LED Blau an
digitalWrite(Led_Rot, HIGH); // LED Rot an
digitalWrite(Led_Gruen, LOW); // LED Gruen aus
}
void Led_5() // Fall_5 Led Türkis
{
digitalWrite(Led_Blau, HIGH); // LED Blau an
digitalWrite(Led_Rot, LOW); // LED Rot aus
digitalWrite(Led_Gruen, HIGH); // LED Gruen an
}
void Led_6() // Fall_6 Led Gelb
{
digitalWrite(Led_Blau, LOW); // LED Blau aus
digitalWrite(Led_Rot, HIGH); // LED Rot an
digitalWrite(Led_Gruen, HIGH); // LED Gruen an
}
void Led_7() // Fall_7 Led Weis
{
digitalWrite(Led_Blau, HIGH); // LED Blau an
digitalWrite(Led_Rot, HIGH); // LED Rot an
digitalWrite(Led_Gruen, HIGH); // LED Gruen an
}
void Led_8() // Fall_8 Led aus
{
digitalWrite(Led_Gruen, LOW); // LED Blau aus
digitalWrite(Led_Blau, LOW); // LED Rot aus
if (helligkeit < 255)
{ helligkeit+5;
analogWrite(Led_Rot, helligkeit);
delay(20);
} else Zaehler++;
if (helligkeit == 255) helligkeit = 1; //helligkeit zurücksetzen
}
void Led_9() // Fall_9 Led aus
{
digitalWrite(Led_Blau, LOW); // LED Blau aus
digitalWrite(Led_Rot, LOW); // LED Rot aus
digitalWrite(Led_Gruen, LOW); // LED Gruen aus
}
also die Farben lassen sich wirklich gut schalten. nur case 8 funzt nicht.
wenn der switch case nicht immer funktionieren sollte dann würde doch gar nicht durchgeschaltet werden.
Aber vielleicht ist ja auch meine herangehensweise völlig verquer.
Also es sollen mit einem Taster alle Farbzustände der RGB-Leiste durchgeschaltet werden.
Vielleicht später noch Farbvarianten durch verschiedene Helligkeiten der LEDs.
Dann möchte ich noch ein paar Modis zufügen wie Flash und Fade usw.
Vom Prinzip so wie man ín jedem Baumarkt solche Lichtleisten kaufen kann.
Es ist allerding für ein beleuchtetes Namenschild das an einer 12v KfZ-Steckdose betrieben wird.
Ich weis ja das ich euch bestimmt schon nerfe, aber ich bin halt ein Feinwerkmechanickermeister. Ich bringe meinen Jungs den ganzen Tag ne Menge bei und programiere CNC gesteuerte Werkzeugmaschinen im Schlaf.
Aber dieser kleine Haufen Elektronik in Form eines Arduinos ist halt eine ganz eigene Welt.
Es wäre halt nur toll wenn ich mal dieses Projekt vom Tisch bekomme. Für meinen kleinen LKW.
Und ja ich hab es mir auch einfacher vorgestellt so etwas zu programieren
also die Farben lassen sich wirklich gut schalten. nur case 8 funzt nicht.
Weil es bei den anderen Fällen egal ist, ob sie immmer wieder oder nur einmal aufgerufen werden.
case 8 lebt davon, dass er "oft" drankommt, also in jedem loop Durchlauf und nicht nur einmal, wenn du den Taster gedrückt hast.
Den anderen cases ist es egal, die schalten einfach immer wieder die Farbe, die eh schon zu sehen ist.