Blinker mit WS2812b und Atmega328p

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Blinker mit WS2812b und Atmega328p

      Hallo Bascom Freunde.

      Ich möchte mir mit der WS2812b und dem Atmega328p einen Blinker bauen.
      Dazu möchte ich 10 LEDs verwenden und es soll alle 100ms eine Led angehen bis alle 10 Leds an sind Led1 = an / Led2 = an ect,
      dann sollen die Leds wieder nacheinander ausgehen, LED1 = Aus / Led2 = Aus ect.

      Ich steh hier voll auf dem schlauch und weiß nicht weiter, nach 2h suche im www bin ich auch nicht weiter.

      Eventuell könnte mir jemand auf die Sprünge helfen, bin Anfänger und versuche mich jetzt mal an LEDs mit den WS2812ern.

      Bis zur Elseif meine ich mal das es passt, aber dann weiß ich nicht weiter. ?(
      Kann mich aber auch Irren ;(

      BASCOM Source Code

      1. ' Blinker mit WS2812b und Atmega328p
      2. $Regfile = "m328pdef.dat"
      3. $Crystal = 8000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 32
      7. Config Rainbow = 1 , Rb0_len = LedZahl , Rb0_port = Portb , Rb0_pin = 0
      8. ' ^ connected to pin 0
      9. ' ^-------------- connected to portB
      10. ' ^-------------------------- 2 leds on stripe
      11. ' ^------------------------------------- 1 channel
      12. Dim LedZahl As Integer
      13. Dim I As Integer
      14. Dim Color(3) as Byte
      15. R alias Color(_base) : G alias Color(_base + 1) : B alias Color(_base + 2)
      16. Rb_selectchannel 0
      17. R = 50 : G = 50 : B = 0 'gelb
      18. LedZahl = 10 'Anzahl LEDs
      19. I = -1 'begin bei Led
      20. Do
      21. If I =< LedZahl then
      22. I = I+1
      23. Rb_setcolor I, Color(1) 'LED Pos
      24. Rb_send 'und raus senden
      25. Waitms 100 'warte
      26. Elseif I => -1 then
      27. R = 0 : G = 0 : B = 0 'abschalten???
      28. I = I+1 ' aus
      29. Rb_setcolor I, Color(1) 'LED Pos
      30. Rb_send 'und raus senden
      31. Waitms 100 'warte
      32. Endif
      33. Waitms 300
      34. Loop
      35. End
      Display All
    • Hi Wasi,
      hier mal ein Beispiel dafür

      BASCOM Source Code

      1. ' Blinker mit WS2812b und Atmega328p
      2. $Regfile = "m328pdef.dat"
      3. $Crystal = 8000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 32
      7. Const Ledzahl = 10
      8. Config Rainbow = 1 , Rb0_len = Ledzahl , Rb0_port = Portb , Rb0_pin = 0
      9. Dim Led_zaehler As Byte
      10. Dim Color(3) As Byte
      11. R Alias Color(_base)
      12. G Alias Color(_base + 1)
      13. B Alias Color(_base + 2)
      14. R = 255
      15. G = 0
      16. B = 0
      17. Rb_selectchannel 0
      18. Do
      19. R = 255
      20. G = 0
      21. B = 0
      22. For Led_zaehler = 0 To Ledzahl - 1
      23. Rb_setcolor Led_zaehler , Color(1)
      24. Rb_send
      25. Waitms 100
      26. Next Led_zaehler
      27. Wait 1
      28. R = 0
      29. G = 0
      30. B = 0
      31. For Led_zaehler = Ledzahl - 1 To 0 Step - 1
      32. Rb_setcolor Led_zaehler , Color(1)
      33. Rb_send
      34. Waitms 100
      35. Next Led_zaehler
      36. Wait 1
      37. Loop
      38. End
      Display All
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Du schaust, in welcher Richtung du unterwegs bist und zählst in die entsprechende Richtung

      Dim Richtung as Bit, I As Byte

      Do

      If Richtung = 0 Then

      Incr I
      If I = Ledzahl Then
      Richtung = 1
      End If
      Color auf Farbe
      Rb_setcolor I, Color(1)
      End If


      If Richtung = 1 Then
      Decr I
      If I = 1 Then
      Richtung = 0
      End If
      Color auf Null
      Rb_setcolor I, Color(1)
      End If

      Waitms 100

      Loop

      Da gibt es noch andere Ansätze, aber eins nach dem Anderen ;)
    • djmsc wrote:

      Hi Wasi,
      hier mal ein Beispiel dafür
      Danke djmsc, werde ich mir mal anschauen.

      Ist das Richtig?
      Werden dann die Leds ausgeschaltet?

      R = 0
      G = 0
      B = 0

      Michael wrote:

      Du schaust, in welcher Richtung du unterwegs bist und zählst in die entsprechende Richtung

      Dim Richtung as Bit, I As Byte

      Do

      If Richtung = 0 Then

      Incr I
      If I = Ledzahl Then
      Richtung = 1
      End If
      Color auf Farbe
      Rb_setcolor I, Color(1)
      End If


      If Richtung = 1 Then
      Decr I
      If I = 1 Then
      Richtung = 0
      End If
      Color auf Null
      Rb_setcolor I, Color(1)
      End If

      Waitms 100

      Loop

      Da gibt es noch andere Ansätze, aber eins nach dem Anderen ;)
      Danke Michael, jetzt muß ich mich erstmal da rein denken :D

      Mir geht es darum es zu verstehen um dann auch eigene Projekte umsetzen zu können.

      Danke für die 2 Progs a_22_9ac28a82
    • Wasi wrote:

      Ist das Richtig?
      Werden dann die Leds ausgeschaltet?

      R = 0
      G = 0
      B = 0
      Also mit R, G und B bestimmst du ja die Farbe von jeder LED. Also wenn du einzelne LEDs in unterschiedlichen Farben leuchten lassen willst musst du die Werte für R, G und B anpassen. Und genau so wenn eine LED dunkel/aus sein soll, dann setzt man R, G und B auf 0.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • djmsc wrote:

      Wasi wrote:

      Ist das Richtig?
      Werden dann die Leds ausgeschaltet?

      R = 0
      G = 0
      B = 0
      Also mit R, G und B bestimmst du ja die Farbe von jeder LED. Also wenn du einzelne LEDs in unterschiedlichen Farben leuchten lassen willst musst du die Werte für R, G und B anpassen. Und genau so wenn eine LED dunkel/aus sein soll, dann setzt man R, G und B auf 0.
      Da es sich hier ja um eine WS2812b handelt wusste ich nicht genau wie man die aus macht, wenn ich leds am Pin habe wird die ja mit High und Low geschaltet, das wusste ich, daher die Frage.
      Danke :D

      Hab jetzt mal das erste Programm meinen Vorstellungen angepasst und bin so zufrieden.

      BASCOM Source Code

      1. ' Blinker mit WS2812b und Atmega328p
      2. $Regfile = "m328pdef.dat"
      3. $Crystal = 8000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 32
      7. Const Ledzahl = 10 'Festlegen wieviel LEDs
      8. Config Rainbow = 1 , Rb0_len = Ledzahl , Rb0_port = Portb , Rb0_pin = 0
      9. Dim Led_zaehler As Byte 'Dec variable
      10. Dim Color(3) As Byte 'Dec variable
      11. R Alias Color(_base) 'Alias für farbe Rot
      12. G Alias Color(_base + 1) 'Alias für farbe Gruen
      13. B Alias Color(_base + 2) 'Alias für farbe Blau
      14. 'Gelbe Leds festlegen
      15. R = 50
      16. G = 50
      17. B = 0
      18. Rb_selectchannel 0 'Kanal wahl
      19. Do
      20. 'Gelbe Leds festlegen
      21. R = 50
      22. G = 50
      23. B = 0
      24. For Led_zaehler = 0 To Ledzahl - 1 'Schleife
      25. Rb_setcolor Led_zaehler , Color(1) 'Led zuweisen der Farbe
      26. Rb_send 'Farbe an Led senden
      27. Waitms 30 'warte
      28. Next Led_zaehler 'Led_zaehler wir hochgezählt um 1
      29. Waitms 30
      30. 'Leds aus
      31. R = 0
      32. G = 0
      33. B = 0
      34. For Led_zaehler = 0 To Ledzahl - 1 'Schleife
      35. Rb_setcolor Led_zaehler , Color(1) 'Led zuweisen der Farbe
      36. Rb_send 'Farbe an Led senden
      37. Waitms 30 'warte
      38. Next Led_zaehler 'Led_zaehler wir hochgezählt um 1
      39. Waitms 30
      40. Loop
      41. End
      Display All
      Wie schon oben erwähnt soll das ein Blinker darstellen, wie man Sie von den neuen Fahrzeugen kennt.
      Ich hab mal das wichtigste Kommentiert, hoffe das richtig verstanden zu haben.
    • Wasi wrote:

      Wie schon oben erwähnt soll das ein Blinker darstellen, wie man Sie von den neuen Fahrzeugen kennt.
      Neun, das hattest du nicht erwähnt. Das Wort Blinker wird eher als Blinkschaltung interpretiert.

      In dem Fall musst du immer nur aufwärts zählen, wenn der Zähler auf Maximum ist, schaltest du die LEDs wieder von 1 beginnend aus.

      Dim Hell As Bit

      Do
      incr I
      If Hell = 1 Then
      Color auf Farbe
      Else
      Color auf Null
      End If
      Rb_setcolor I , Color(1)
      If I = Maximum Then
      Toggle Hell
      I = 0
      End If
      Waitms 100
      Loop
    • Michael wrote:

      Neun, das hattest du nicht erwähnt. Das Wort Blinker wird eher als Blinkschaltung interpretiert.
      Hallo Michael, ja explizit hab ich das nicht erwähnt, ich dachte durch LED1 = An - LED2 = An und LED1 = Aus - LED2 = Aus - könnte man es erkennen.

      Michael wrote:

      In dem Fall musst du immer nur aufwärts zählen, wenn der Zähler auf Maximum ist, schaltest du die LEDs wieder von 1 beginnend aus.

      Dim Hell As Bit

      Do
      incr I
      If Hell = 1 Then
      Color auf Farbe
      Else
      Color auf Null
      End If
      Rb_setcolor I , Color(1)
      If I = Maximum Then
      Toggle Hell
      I = 0
      End If
      Waitms 100
      Loop
      Danke für den neuen Denkanstoss. :thumbup:
      Werde mal versuchen das auch umzusetzen.