Hallo,
ich möchte mit einem ESP32 einen WS2812b LED-Streifen ansteuern.
Dazu benutze ich die ESP32 LED Strip Library
https://github.com/Lucas-Bruder/ESP32_LED_STRIP .
1 | #define LED_STRIP_DATA_PIN GPIO_NUM_16
|
2 | #define LED_STRIP_LENGTH 17U
|
3 | #define LED_STRIM_RMT_INTR_NUM 19U
|
4 |
|
5 | static struct led_color_t led_strip_buf_1[LED_STRIP_LENGTH];
|
6 | static struct led_color_t led_strip_buf_2[LED_STRIP_LENGTH];
|
7 |
|
8 | static void ledTask(void* pvParameters);
|
9 | static void ledTask(void* pvParameters)
|
10 | {
|
11 |
|
12 | struct led_strip_t led_strip = {
|
13 | .rgb_led_type = RGB_LED_TYPE_WS2812,
|
14 | .led_strip_length = LED_STRIP_LENGTH
|
15 | .rmt_channel = RMT_CHANNEL_1,
|
16 | .rmt_interrupt_num = LED_STRIM_RMT_INTR_NUM,
|
17 | .gpio = LED_STRIP_DATA_PIN,
|
18 | .led_strip_buf_1 = led_strip_buf_1,
|
19 | .led_strip_buf_2 = led_strip_buf_2,
|
20 | };
|
21 | led_strip.access_semaphore = xSemaphoreCreateBinary();
|
22 |
|
23 | bool led_init_ok = led_strip_init(&led_strip);
|
24 |
|
25 |
|
26 | if (true == led_init_ok)
|
27 | {
|
28 | ESP_LOGI(TASK_TAG, "initialisation LED: OK");
|
29 | }
|
30 | else
|
31 | {
|
32 | ESP_LOGI(TASK_TAG, "initialisation LED: NOK");
|
33 | }
|
34 |
|
35 | TickType_t xLastWakeTime = xTaskGetTickCount();
|
36 |
|
37 | while (1) {
|
38 |
|
39 | vTaskDelayUntil(&xLastWakeTime, 100);
|
40 | }
|
41 | }
|
42 |
|
43 | void initLed(void)
|
44 | {
|
45 | xTaskCreate(ledTask, "ledTask", 8000, (void*)1, tskIDLE_PRIORITY, NULL);
|
46 | }
|
Die Initialisierung scheint auch erfolgreich zu sein.
Doch wenn ich einen Logikanalyzer dran halte bekomme ich die Ausgabe wie
im Anhang zu sehen.
Ich habe diese Lib an zwei stellen modifizieren müssen.
led_strip.h: hinzufügen der header semphr.h
1 | #include freertos/semphr.h"
|
led_strip.c
rmt_wait_tx_done erwartet ein zweites argument
1 | rmt_wait_tx_done(led_strip->rmt_channel, portMAX_DELAY);
|
Warum kommen da zwischendrinn immer Signale?
ich setze ja kein Signal, von daher sollte es eigentlich immer auf low
bleiben.