Go Down

Topic: Fahrrad Blinker,433Mhz, Interrupts... (Read 1 time) previous topic - next topic

FaRmeZZ

Jan 03, 2019, 08:41 pm Last Edit: Jan 03, 2019, 08:49 pm by uwefed Reason: add CODE TAGs </>
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:
Code: [Select]
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 :)

Gruß
Patrick

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

Finnlay

Quote from: 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...

FaRmeZZ

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

Rentner

#4
Jan 03, 2019, 09:22 pm Last Edit: Jan 03, 2019, 09:24 pm by Rentner
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 ;)

Gruß Heinz

Finnlay

#5
Jan 03, 2019, 09:25 pm Last Edit: Jan 03, 2019, 09:26 pm by Finnlay
Quote from: FaRmeZZ
Es sind Ws2812B LEDs, sprich RGB LEDs die einzeln adresierbar sind ;)
Bewirk was bei einem Blinklicht?

Quote from: 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?

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....

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

Finnlay

Quote from: 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.

HotSystems

#8
Jan 03, 2019, 09:57 pm Last Edit: Jan 03, 2019, 10:38 pm by HotSystems
Interessantes Projekt, aber was soll 433 MHz da machen ?

Edit:
Sorry hatte ich überlesen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

FaRmeZZ

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....

FaRmeZZ

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?

Hausknecht

___________________________________________________
Grüße Hans

FaRmeZZ

#12
Jan 03, 2019, 11:38 pm Last Edit: Jan 04, 2019, 12:28 am by uwefed Reason: add CODE TAGs </>
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:
Quote
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:
   
Code: [Select]
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?

Finnlay

Quote from: 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.

ardubu

#14
Jan 04, 2019, 02:15 am Last Edit: Jan 04, 2019, 02:45 am by ardubu
was hälst du davon wenn du das in der Art machst
Code: [Select]
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;
}

Go Up