mirror of
https://github.com/esphome/esphome.git
synced 2025-11-15 06:15:47 +00:00
* fix: FastLED SPI_DATA_RATE being truncated to 8 bits
FastLED expects SPI_DATA_RATE as an uint32_t, but we had it as uint8_t.
Fix that to avoid the data rate being truncated.
* fastled: allow specifying data rate
Previously, we've just taken the default data rate from FastLED.
However, that does not always work properly. In my case, I had a
slow level shifter that couldn't keep up with the 1 MHz data
rate default for WS2801. Long cabling might also be a reason why
one might want to reduce the data rate.
This will add a new optional "data_rate" config option where one
may specify the desired data rate as a frequency:
light:
- platform: fastled_spi
chipset: WS2801
data_pin: GPIO23
clock_pin: GPIO22
data_rate: 500kHz
num_leds: 178
46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
import esphome.codegen as cg
|
|
import esphome.config_validation as cv
|
|
from esphome import pins
|
|
from esphome.components import fastled_base
|
|
from esphome.const import CONF_CHIPSET, CONF_CLOCK_PIN, CONF_DATA_PIN, CONF_DATA_RATE, \
|
|
CONF_NUM_LEDS, CONF_RGB_ORDER
|
|
|
|
AUTO_LOAD = ['fastled_base']
|
|
|
|
CHIPSETS = [
|
|
'LPD8806',
|
|
'WS2801',
|
|
'WS2803',
|
|
'SM16716',
|
|
'P9813',
|
|
'APA102',
|
|
'SK9822',
|
|
'DOTSTAR',
|
|
]
|
|
|
|
CONFIG_SCHEMA = fastled_base.BASE_SCHEMA.extend({
|
|
cv.Required(CONF_CHIPSET): cv.one_of(*CHIPSETS, upper=True),
|
|
cv.Required(CONF_DATA_PIN): pins.output_pin,
|
|
cv.Required(CONF_CLOCK_PIN): pins.output_pin,
|
|
cv.Optional(CONF_DATA_RATE): cv.frequency,
|
|
})
|
|
|
|
|
|
def to_code(config):
|
|
var = yield fastled_base.new_fastled_light(config)
|
|
|
|
rgb_order = cg.RawExpression(config[CONF_RGB_ORDER] if CONF_RGB_ORDER in config else "RGB")
|
|
data_rate = None
|
|
|
|
if CONF_DATA_RATE in config:
|
|
data_rate_khz = int(config[CONF_DATA_RATE] / 1000)
|
|
if data_rate_khz < 1000:
|
|
data_rate = cg.RawExpression(f"DATA_RATE_KHZ({data_rate_khz})")
|
|
else:
|
|
data_rate_mhz = int(data_rate_khz / 1000)
|
|
data_rate = cg.RawExpression(f"DATA_RATE_MHZ({data_rate_mhz})")
|
|
template_args = cg.TemplateArguments(cg.RawExpression(config[CONF_CHIPSET]),
|
|
config[CONF_DATA_PIN], config[CONF_CLOCK_PIN], rgb_order,
|
|
data_rate)
|
|
cg.add(var.add_leds(template_args, config[CONF_NUM_LEDS]))
|