mirror of
https://github.com/esphome/esphome.git
synced 2024-12-26 07:24:54 +01:00
add FastLED YAML option for data rate (#1338)
* 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
This commit is contained in:
parent
20dd744680
commit
3fcdaaefe0
4 changed files with 18 additions and 6 deletions
|
@ -38,7 +38,7 @@ class FastLEDLightOutput : public light::AddressableLight {
|
|||
return *this->controller_;
|
||||
}
|
||||
|
||||
template<ESPIChipsets CHIPSET, uint8_t DATA_PIN, uint8_t CLOCK_PIN, EOrder RGB_ORDER, uint8_t SPI_DATA_RATE>
|
||||
template<ESPIChipsets CHIPSET, uint8_t DATA_PIN, uint8_t CLOCK_PIN, EOrder RGB_ORDER, uint32_t SPI_DATA_RATE>
|
||||
CLEDController &add_leds(int num_leds) {
|
||||
switch (CHIPSET) {
|
||||
case LPD8806: {
|
||||
|
|
|
@ -2,7 +2,8 @@ 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_NUM_LEDS, CONF_RGB_ORDER
|
||||
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']
|
||||
|
||||
|
@ -21,15 +22,24 @@ 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 = None
|
||||
if CONF_RGB_ORDER in config:
|
||||
rgb_order = cg.RawExpression(config[CONF_RGB_ORDER])
|
||||
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)
|
||||
config[CONF_DATA_PIN], config[CONF_CLOCK_PIN], rgb_order,
|
||||
data_rate)
|
||||
cg.add(var.add_leds(template_args, config[CONF_NUM_LEDS]))
|
||||
|
|
|
@ -136,6 +136,7 @@ CONF_DALLAS_ID = 'dallas_id'
|
|||
CONF_DATA = 'data'
|
||||
CONF_DATA_PIN = 'data_pin'
|
||||
CONF_DATA_PINS = 'data_pins'
|
||||
CONF_DATA_RATE = 'data_rate'
|
||||
CONF_DATA_TEMPLATE = 'data_template'
|
||||
CONF_DAYS_OF_MONTH = 'days_of_month'
|
||||
CONF_DAYS_OF_WEEK = 'days_of_week'
|
||||
|
|
|
@ -1230,6 +1230,7 @@ light:
|
|||
chipset: WS2801
|
||||
data_pin: GPIO23
|
||||
clock_pin: GPIO22
|
||||
data_rate: 2MHz
|
||||
num_leds: 60
|
||||
rgb_order: BRG
|
||||
name: "FastLED SPI Light"
|
||||
|
|
Loading…
Reference in a new issue