LED Streifen Fade in / out, light_ws2812

Gast #4417496
Lesenswert?
• ▲
▼
Hi,


nachdem die ersten light_ws2812 bastelein funktionieren würde ich gerne 
Led's ein/aus faden.

Ein ganz stupider Ansatz wie der hier:
1
#include <util/delay.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include "light_ws2812.h"
5

6

7
//const uint8_t NUM_LEDS = 24; // Anzahl Leds
8
#define NUM_LEDS 1
9
struct cRGB leds[NUM_LEDS];
10

11
int main(void)
12
{
13
  while(1)
14
  {
15
    for(uint8_t step = 0; step < 255; step++)
16
    {
17
      // Led einschalten
18
      leds[0].r = 0;
19
      leds[0].g = 0;
20
      leds[0].b = step;
21
      ws2812_setleds(leds, NUM_LEDS);
22

23
      _delay_ms(100);
24

25
    }
26
  }
27
}

funktioniert natürlich nich.


In diesem Artikel:
https://www.mikrocontroller.net/articles/LED-Fading

wird beschrieben wie man Leds vernünftig ein/aus faded.
Funktioniert auch für eine Led ganz toll, da aber der ws2812 controller 
die Leuchtdauer/Intensität der Led kontrolliert kann man nicht einfach 
+5v des Led Streifens kontrollieren.



Eine Idee wäre in der Funktion:
1
void pwm_up_down (const uint16_t pwm_table[], int16_t size, uint16_t delay)
2
{
3
    int16_t tmp;
4
 
5
    for (tmp = 0; tmp < size; tmp++)
6
    {
7
        OCR1A = pgm_read_word (& pwm_table[tmp]);
8
        ws2812_setleds(leds, NUM_LEDS);
9
        my_delay (delay);
10
    }
11
 
12
    for (tmp = size-1; tmp >= 0; tmp--)
13
    {
14
        OCR1A = pgm_read_word (& pwm_table[tmp]);
15
        ws2812_setleds(leds, NUM_LEDS);
16
        my_delay (delay);
17
    }
18
}

 ws2812_setleds(leds, NUM_LEDS);
einzubauen, und damit die Led komplett ein/auszuschalten.

bin mir hier aber nicht ganz sicher wie man den festen PWM Pin mit dem 
Pin der für ws2812 definiert wird kombinieren kann?
1
#define ws2812_port B     // Data port 
2
#define ws2812_pin  1     // Data out pin

Hat da jemand eine Idee?
#4417671
Lesenswert?
• ▲
▼
hmmm, ungetestet sowas?
1
#include <util/delay.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include "light_ws2812.h"
5

6

7
//const uint8_t NUM_LEDS = 24; // Anzahl Leds
8
#define NUM_LEDS 1
9
struct cRGB leds[NUM_LEDS];
10
const uint8_t gammaTable18[32] = { 0, 1, 2, 4, 6, 10, 13, 18, 22, 28, 33, 39, 46, 53, 61, 69, 78, 86, 96, 106, 116, 126, 138, 149, 161, 173, 186, 199, 212, 226, 240, 255};
11

12
int main(void)
13
{
14
  while(1)
15
  {
16
    for(uint8_t step = 0; step < 32; step++)
17
    {
18
      // Led einschalten
19
      leds[0].r = 0;
20
      leds[0].g = 0;
21
      leds[0].b = gammaTable18[step];
22
      ws2812_setleds(leds, NUM_LEDS);
23

24
      _delay_ms(100);
25

26
    }
27
  }
28
}

Die Leds des WS2812 haben zwar 256 Stufen, aber sind nicht 
Gamma-korrigiert. Effektiv bedeutet das, du hast nur 32 Stufen zur 
Verfügung. Eventuell auch 48, aber der Flaschenhals sind nun mal die für 
das menschliche Auge "großen" Unterschiede in den dunklen Stufen.
Gast #4417814
Lesenswert?
• ▲
▼
Hatte den pwmtable der 16bit pwm aus dem oben genanntem Led fade Artikel 
getestet, das funktionierte aber nicht weil die Werte bis 1024 laufen.
Die Led aber nur bis 255 geht.

Werde deins mal kompilieren.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.