Skip to content

Commit ca95694

Browse files
authored
Merge pull request #402 from sterisa/WS2811
add support for WS2811 timing (IEC-194)
2 parents 4769e0a + fba23ce commit ca95694

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

led_strip/include/led_strip_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ typedef struct led_strip_t *led_strip_handle_t;
2323
typedef enum {
2424
LED_MODEL_WS2812, /*!< LED strip model: WS2812 */
2525
LED_MODEL_SK6812, /*!< LED strip model: SK6812 */
26+
LED_MODEL_WS2811, /*!< LED strip model: WS2811 */
2627
LED_MODEL_INVALID /*!< Invalid LED strip model */
2728
} led_model_t;
2829

led_strip/src/led_strip_rmt_encoder.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rm
8383
led_encoder->base.del = rmt_del_led_strip_encoder;
8484
led_encoder->base.reset = rmt_led_strip_encoder_reset;
8585
rmt_bytes_encoder_config_t bytes_encoder_config;
86+
uint32_t reset_ticks = config->resolution / 1000000 * 280 / 2; // reset code duration defaults to 280us to accomodate WS2812B-V5
8687
if (config->led_model == LED_MODEL_SK6812) {
8788
bytes_encoder_config = (rmt_bytes_encoder_config_t) {
8889
.bit0 = {
@@ -116,14 +117,31 @@ esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rm
116117
},
117118
.flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0
118119
};
120+
} else if (config->led_model == LED_MODEL_WS2811) {
121+
// different led strip might have its own timing requirements, following parameter is for WS2811
122+
bytes_encoder_config = (rmt_bytes_encoder_config_t) {
123+
.bit0 = {
124+
.level0 = 1,
125+
.duration0 = 0.5 * config->resolution / 1000000., // T0H=0.5us
126+
.level1 = 0,
127+
.duration1 = 2.0 * config->resolution / 1000000., // T0L=2.0us
128+
},
129+
.bit1 = {
130+
.level0 = 1,
131+
.duration0 = 1.2 * config->resolution / 1000000., // T1H=1.2us
132+
.level1 = 0,
133+
.duration1 = 1.3 * config->resolution / 1000000., // T1L=1.3us
134+
},
135+
.flags.msb_first = 1
136+
};
137+
reset_ticks = config->resolution / 1000000 * 50 / 2; // divide by 2... signal is sent twice
119138
} else {
120139
assert(false);
121140
}
122141
ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG, "create bytes encoder failed");
123142
rmt_copy_encoder_config_t copy_encoder_config = {};
124143
ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(&copy_encoder_config, &led_encoder->copy_encoder), err, TAG, "create copy encoder failed");
125144

126-
uint32_t reset_ticks = config->resolution / 1000000 * 280 / 2; // reset code duration defaults to 280us to accomodate WS2812B-V5
127145
led_encoder->reset_code = (rmt_symbol_word_t) {
128146
.level0 = 0,
129147
.duration0 = reset_ticks,

0 commit comments

Comments
 (0)