Fahrrad Blinker,433Mhz, Interrupts...

Hallo,

Ich baue als mein Gesellenstück ein "Fahrradblinker" bestehend aus dem Blinker mit 12 WS2812B LEDs und der Fernbedienung bestehend aus 2 Tastern (Links und Rechts).
Die Verbindung wird über 433Mhz Module realisiert.
Wenn der Linke Taster gedückt wird, sendet die Fernbedienung "2210" an den Blinker, beim rechten Taster "1998".
Der Blinker arbeitet dann die Linke oder Rechte Blink Animation ab (Wie die neuen Audi Blinker).

Testweiße habe ich das ganze mit Delay() aufgebaut:

void loop() {
   if(mySwitch.getReceivedValue() == 2210){
     pixels.setPixelColor(6, pixels.Color(255,255,0));
     pixels.setPixelColor(7, pixels.Color(255,255,0));
     pixels.show();
     delay(100);
     pixels.setPixelColor(6, pixels.Color(0,0,0));
     pixels.setPixelColor(8, pixels.Color(255,255,0));
     pixels.show();
     delay(100);
     pixels.setPixelColor(7, pixels.Color(0,0,0));
     pixels.setPixelColor(9, pixels.Color(255,255,0));
     pixels.show();
     delay(100);
     pixels.setPixelColor(8, pixels.Color(0,0,0));
     pixels.setPixelColor(10, pixels.Color(255,255,0));
     pixels.show();
     delay(100);
     pixels.setPixelColor(9, pixels.Color(0,0,0));
     pixels.setPixelColor(11, pixels.Color(255,255,0));
     pixels.show();
     delay(100);
     pixels.setPixelColor(10, pixels.Color(0,0,0));
     pixels.setPixelColor(11, pixels.Color(0,0,0));
     pixels.show(); 
   }
   if(mySwitch.getReceivedValue() == 1998){
     pixels.setPixelColor(5, pixels.Color(255,255,0));
    pixels.setPixelColor(4, pixels.Color(255,255,0));
    pixels.show();
     delay(100);
     pixels.setPixelColor(5, pixels.Color(0,0,0));
     pixels.setPixelColor(3, pixels.Color(255,255,0));
     pixels.show();
     delay(100);
     pixels.setPixelColor(4, pixels.Color(0,0,0));
     pixels.setPixelColor(2, pixels.Color(255,255,0));
     pixels.show();
     delay(100);
     pixels.setPixelColor(3, pixels.Color(0,0,0));
     pixels.setPixelColor(1, pixels.Color(255,255,0));
     pixels.show();
     delay(100);
     pixels.setPixelColor(2, pixels.Color(0,0,0));
     pixels.setPixelColor(0, pixels.Color(255,255,0));
     pixels.show();
     delay(100);
     pixels.setPixelColor(1, pixels.Color(0,0,0));
     pixels.setPixelColor(0, pixels.Color(0,0,0));
     pixels.show();
   }
mySwitch.resetAvailable();
}

funktioniert auch und sieht toll aus, aber logischerweiße gibts dabei ein dickes Problem was ich nicht gelöst bekomme, Wenn ein Taster betätigt wird, fängt der uC mit einer der beiden if schleifen an und es ist keine neueingabe möglich bis diese If schleife abgearbeitet ist.
Ich hätte es aber gerne das man sozusagen zwichen links und rechts blinken jederzeit wechseln kann.
Habe schon einiges mit Interrupts und SerialEvent probiert aber ohne Erfolg....
Hoffe hier kann mir jemand helfen :slight_smile:

Gruß
Patrick

  1. Keinen Spaghetticode sondern mach die Animation mit einer Variablen im loop. Eine FOR schleife blockiert den Sketch.
  2. lerne den Gebrauch von millis() statt delay() siehe blink without delay beispiel in der IDe oder die Nachtwächtererklährung hier im Forum.
    Grüße Uwe

FaRmeZZ:
Hallo,

Ich baue als mein Gesellenstück ein "Fahrradblinker" bestehend aus dem Blinker mit 12 WS2812B LEDs und der Fernbedienung bestehend aus 2 Tastern (Links und Rechts).
Die Verbindung wird über 433Mhz Module realisiert.
Wenn der Linke Taster gedückt wird, sendet die Fernbedienung "2210" an den Blinker, beim rechten Taster "1998".

Wow, das habe ich einst mit nem NE555 und einem Schalter realisiert.

Wozu man heute alles µC nötig hat?

Verrückte Welt...

Es sind Ws2812B LEDs, sprich RGB LEDs die einzeln adresierbar sind :wink:
und habe ja noch mehr verbaut wie zb ein G Sensor für das Bremslicht.

1 Like

Hallo,

@Finnlay der Audi benutzt, glaube ich , eine LED Kette, sind sicher so um die 10 LED in jeder Leuchte die als Lauflicht annimiert sind. Ist mit einem NE555 etwas ... 8) 8) müsste halt noch ein FIFO rein

ich kenne blinker noch mit einen Heizdraht drin man waren das Zeiten :wink:

Gruß Heinz

FaRmeZZ:
Es sind Ws2812B LEDs, sprich RGB LEDs die einzeln adresierbar sind :wink:

Bewirk was bei einem Blinklicht?

FaRmeZZ:
und habe ja noch mehr verbaut wie zb ein G Sensor für das Bremslicht.

Bewirkt was?

Wir reden von einem Fahrrad, bei dem solch Schnickschnack durch die STV(Z)O nicht zulässig ist, nicht war?

Es geht hier im ein Abschlussprojekt wo so viele Funktionen wie möglich eingebaut werden sollen....
ob das ein Sinn hat oder nicht ist dabei egal.
Das war wohl mein erster und letzter Foren Post....

Danke Uwe für die einzig hilfreiche und vernünftige Antwort :slight_smile:

FaRmeZZ:
Es geht hier im ein Abschlussprojekt wo so viele Funktionen wie möglich eingebaut werden sollen....
ob das ein Sinn hat oder nicht ist dabei egal.
Das war wohl mein erster und letzter Foren Post....

Wenn eine Gesellenprüfung nicht mehr abverlangt, verstehe ich die Arbeitgeber, die über mangelnde Kompetenz bei den Auszubildenden klagen. Bisher habe ich deren klagen nicht verstanden. Nun schon, danke.

Wenn dem so ist, freue ich mich dich auf das Leben vorbereitet zu haben. Mach was draus.

Interessantes Projekt, aber was soll 433 MHz da machen ?

Edit:
Sorry hatte ich überlesen.

Finnlay:
Wenn eine Gesellenprüfung nicht mehr abverlangt, verstehe ich die Arbeitgeber, die über mangelnde Kompetenz bei den Auszubildenden klagen. Bisher habe ich deren klagen nicht verstanden. Nun schon, danke.

Wenn dem so ist, freue ich mich dich auf das Leben vorbereitet zu haben. Mach was draus.

nicht mehr abverlangt?
Ich habe eine Platine entworfen mit einem Atmega328p, adresierbaren RGB LEDs, einem G Sensor der über I²C angebunden ist und das alles wird über einen 3,7V Akku betrieben aus denen ein Buck Booster 5V macht....
Das Gehäuse kompeltt in 3D entworfen und gedruckt...

Die anderen Lehrlinge machen einen Conrad Bausatz....

Was würdest du denn erwarten? für die Gesellenprüfung eines Informationselektronikers?

Duale Studenten bei uns im Betrieb machen weniger aufwändige Projekte wie ich....

uwefed:

  1. Keinen Spaghetticode sondern mach die Animation mit einer Variablen im loop. Eine FOR schleife blockiert den Sketch.
  2. lerne den Gebrauch von millis() statt delay() siehe blink without delay beispiel in der IDe oder die Nachtwächtererklährung hier im Forum.
    Grüße Uwe

Danke für deine Antwort, ich habe mich mal ein bisin daran probiert:

LEDON = 6;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
LEDON = 7;
}
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
LEDON = 8;
LEDOFF = 6;
}
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
LEDON = 9;
LEDOFF = 7;
}
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
LEDON = 10;
LEDOFF = 8;
}
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
LEDON = 11;
LEDOFF = 9;
}
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
LEDOFF = 10;
}
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
LEDOFF = 11;
}

pixels.setPixelColor(LEDON, pixels.Color(255,255,0));
pixels.setPixelColor(LEDOFF, pixels.Color(0,0,0));
pixels.show();

leider gehen nur die ersten beiden LEDs an, dann passiert nix mehr.
eigentlich müsste ich doch auch jedesmal "currentMillis" wieder auf die derzeitgen millis() setzen oder? also vor jeder neuen if schleife?

Schau dir mal dies an.

Den Sinn hinter millis() habe ich schon verstanden und es auch schon öfters mal benutzt,
allerdings habe ich jetzt die situation das ich ganz oft hintereinander millis() benutzen muss und es einfach nicht funktionieren will.

also imprinzip:

LED1 an
Intervall 1000ms
LED2 an
Intervall 1000ms
LED1 aus
LED3 an
Intervall 1000ms
LED2 aus
LED4 an
Intervall 1000ms
usw....

Ausschnitt aus meinem aktuellen Code:

LEDON = 6;
    unsigned long currentMillis = millis();
     if (currentMillis - previousMillis >= interval) {
       previousMillis = currentMillis;
       LEDON = 7;
     }
     if (currentMillis - previousMillis >= interval) {
       previousMillis = currentMillis;
       LEDON = 8;
       LEDOFF = 6;
     }
     if (currentMillis - previousMillis >= interval) {
       previousMillis = currentMillis;
       LEDON = 9;
       LEDOFF = 7;
     }

es müsste doch funktionieren? oder hab ich ein denkfehler?

FaRmeZZ:
Was würdest du denn erwarten? für die Gesellenprüfung eines Informationselektronikers?

Projekte und Anforderungen, die der Realität näher sind als Blinklichter fürs Rad.

was hälst du davon wenn du das in der Art machst

const byte firstLED = 6;
const byte lastLED = 11;
void setup()
{
}

void loop() 
{

if (currentMillis - previousMillis >= interval)
   { LEDON ++;
     LEDOFF = LEDON - 2;
   }
if (LEDON > lastLED) LEDON = firstLED;
}

FaRmeZZ:
... eigentlich müsste ich doch ...

Ich habe den Thread nur sehr oberflächlich quergelesen.

Nach allem, was ich dabei aufgeschnappt habe, fällt mir dazu nur ein, Dich (wahrscheinlich wie schon andere) auf den „endlichen Automaten“ aufmerksam zu machen. Wirklich sehr gut ist in diesem Zusammenhang die „Nachtwächter-Erklärung“. Auch mir ist dazu ein bisschen was eingefallen. Vielleicht ist das ja hilfreich.

Gruß

Gregor

Hallo,
danke für deine Hilfe, damit hab ichs hinbekommen :slight_smile:

So sieht mein Code jetzt aus und funktioniert auch:

void loop() {

if(mySwitch.getReceivedValue() == 2210){
 const int firstLED = 5;
 const int lastLED = 13;
 unsigned long currentMillis = millis();
 if (currentMillis - previousMillis >= interval){
   previousMillis = currentMillis;
   LEDON ++;
   LEDOFF = LEDON - 2;
   pixels.setPixelColor(LEDON, pixels.Color(255,255,0));
   pixels.setPixelColor(LEDOFF, pixels.Color(0,0,0));
   pixels.show();
 }
 if (LEDON > lastLED){
   LEDON = firstLED;
 }  
}

if(mySwitch.getReceivedValue() == 1998){
 const int firstLED1 = 6;
 const int lastLED1 = -2;
 unsigned long currentMillis1 = millis();
 if (currentMillis1 - previousMillis1 >= interval){
   previousMillis1 = currentMillis1;
   LEDON1 --;
   LEDOFF1 = LEDON1 + 2;
   pixels.setPixelColor(LEDON1, pixels.Color(255,255,0));
   pixels.setPixelColor(LEDOFF1, pixels.Color(0,0,0));
   pixels.show();
 }
 if (LEDON1 < lastLED1){
   LEDON1 = firstLED1;
 }  
}
}

wenn die Fernbedienung "2210" sendet wird die Binker Links animation abgespielt und die rechte bei "1998" und es kann auch zwischen den beiden animationen "gewechselt werden"

Jetzt habe ich nurnoch ein Problem, aktuell läuft die jeweilige animation nach betätigen des Tasters unendlich oft oder bis der andere Taster gedrückt wird und dann läuft die andere animation unendlich oft.

Ich hätte aber gerne das nach einmaligen betätigen des Tasters die Animation 5 mal durchlaufen wird und dann alle LEDs ausgehen bis wieder ein Taster gedrückt wird.

Wie bekomme ich das hin?

Vielen Dank und Gruß
Patrick

Hi

if (LEDON > lastLED){
   LEDON = firstLED;
 }

Dort zählst Du mit.
Wenn Du bis 5 gezählt hast, brichst Du das Blinken ab.
Denke, Du musst dann mySwitch.getReceivedValue() leeren.
Bzw. 'die ganze Zeit abfragen' und den Zähler wieder auf Null zurück setzen - solange der Knopf gedrückt ist, soll der Blinker doch wohl blinken, oder?
Dann musst DU Dir aber 'merken', daß Du gerade 'links' oder 'rechts' am Blinken bist, wenn die Variable beim Einlesen selber geleert wird, wenn kein neuer Funk empfangen wird.
Ist aber ebenfalls eine 'ganz normale' State-Maschine.

MfG

Immer wieder mein gleicher Tip :

Erst C und/oder C++ auf dem PC lernen (Kommandozeile) und sich selber erst
dann auf die Microcontrollerwelt loslassen.
Sonst hat man einfach zu viele Probleme auf einmal.

Ulli

FaRmeZZ:
Ich hätte aber gerne ...

Der Tipp von Postmaster-ino ist schon mal ganz gut. Ich würde aber eher einen zusätzlichen „Modus“ einbauen, nämlich „Blinker aus“. Dann funktioniert der Blinker „wie in echt“. Wer weiß, vielleicht macht das das Sternchen an der Eins aus :slight_smile:

Gruß

Gregor