mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 11:16:34 +00:00
v5.8.0d - Add Color/Dimmer control to PWM
5.8.0d * Remove previous GPIO configuration when another module is selected * Fix inverted relay power on state (#909) * Change default PWM assignments for H801 RGB(CW) led controller to support optional Color/Dimmer control * GPIO04 (W2) from GPIO_PWM2 to GPIO_USER to be user configurable for GPIO_PWM5 (second White - Warm if W1 is Cold) * GPIO12 (Blue) GPIO_PWM3 no change * GPIO13 (Green) from GPIO_PWM4 to GPIO_PWM2 * GPIO14 (W1) from GPIO_PWM1 to GPIO_USER to be user configurable for GPIO_PWM4 (first White - Cold or Warm) * GPIO15 (Red) from GPIO_PWM5 to GPIO_PWM1 * Change default PWM assignments for MagicHome RGB(W) led controller to support optional Color/Dimmer control * GPIO05 (Green) from GPIO_PWM4 to GPIO_PWM2 * GPIO12 (Blue) from GPIO_PWM5 to GPIO_PWM3 * GPIO13 (White) GPIO_USER to be user configurable for GPIO_PWM4 (White - Cold or Warm) * GPIO14 (Red) from GPIO_PWM3 to GPIO_PWM1 * Add command SetOption15 0 (default) for command PWM control or SetOption15 1 for commands Color/Dimmer control to PWM RGB(CW) leds (#941)
This commit is contained in:
parent
d609433b34
commit
48faeaa2ce
@ -1,7 +1,7 @@
|
||||
## Sonoff-Tasmota
|
||||
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
|
||||
|
||||
Current version is **5.8.0c** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
|
||||
Current version is **5.8.0d** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
|
||||
|
||||
### ATTENTION All versions
|
||||
|
||||
|
@ -1,4 +1,20 @@
|
||||
/* 5.8.0c
|
||||
/* 5.8.0d
|
||||
* Remove previous GPIO configuration when another module is selected
|
||||
* Fix inverted relay power on state (#909)
|
||||
* Change default PWM assignments for H801 RGB(CW) led controller to support optional Color/Dimmer control
|
||||
* GPIO04 (W2) from GPIO_PWM2 to GPIO_USER to be user configurable for GPIO_PWM5 (second White - Warm if W1 is Cold)
|
||||
* GPIO12 (Blue) GPIO_PWM3 no change
|
||||
* GPIO13 (Green) from GPIO_PWM4 to GPIO_PWM2
|
||||
* GPIO14 (W1) from GPIO_PWM1 to GPIO_USER to be user configurable for GPIO_PWM4 (first White - Cold or Warm)
|
||||
* GPIO15 (Red) from GPIO_PWM5 to GPIO_PWM1
|
||||
* Change default PWM assignments for MagicHome RGB(W) led controller to support optional Color/Dimmer control
|
||||
* GPIO05 (Green) from GPIO_PWM4 to GPIO_PWM2
|
||||
* GPIO12 (Blue) from GPIO_PWM5 to GPIO_PWM3
|
||||
* GPIO13 (White) GPIO_USER to be user configurable for GPIO_PWM4 (White - Cold or Warm)
|
||||
* GPIO14 (Red) from GPIO_PWM3 to GPIO_PWM1
|
||||
* Add command SetOption15 0 (default) for command PWM control or SetOption15 1 for commands Color/Dimmer control to PWM RGB(CW) leds (#941)
|
||||
*
|
||||
* 5.8.0c
|
||||
* Add warning to webpage when USE_MINIMAL is selected (#929)
|
||||
* Fix compile error when DOMOTICZ_UPDATE_TIMER is not defined (#930)
|
||||
* Fix alignment of web page items in some browsers (#935)
|
||||
|
@ -37,7 +37,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
|
||||
uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0)
|
||||
uint32_t button_single : 1; // bit 13 (v5.4.0)
|
||||
uint32_t interlock : 1; // bit 14 (v5.6.0)
|
||||
uint32_t spare15 : 1;
|
||||
uint32_t pwm_control : 1; // bit 15 (v5.8.1)
|
||||
uint32_t spare16 : 1;
|
||||
uint32_t spare17 : 1;
|
||||
uint32_t spare18 : 1;
|
||||
|
@ -25,7 +25,7 @@
|
||||
- Select IDE Tools - Flash Size: "1M (no SPIFFS)"
|
||||
====================================================*/
|
||||
|
||||
#define VERSION 0x05080003 // 5.8.0c
|
||||
#define VERSION 0x05080004 // 5.8.0d
|
||||
|
||||
enum week_t {Last, First, Second, Third, Fourth};
|
||||
enum dow_t {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat};
|
||||
@ -290,7 +290,7 @@ uint8_t hlw_flg = 0; // Power monitor configured
|
||||
uint8_t i2c_flg = 0; // I2C configured
|
||||
uint8_t spi_flg = 0; // SPI configured
|
||||
uint8_t pwm_flg = 0; // PWM configured
|
||||
uint8_t sfl_flg = 0; // Sonoff Led flag (0 = No led, 1 = BN-SZ01, 2 = Sonoff Led, 5 = Sonoff B1)
|
||||
uint8_t sfl_flg = 0; // Sonoff Led flag (0 = No led, 1 = BN-SZ01, 2 = Sonoff Led, 3 = H801/MagicHome, 4 = H801/MagicHome, 5 = H801, 11 = WS2812, 12 = AiLight, 13 = Sonoff B1)
|
||||
uint8_t pwm_idxoffset = 0; // Allowed PWM command offset (change for Sonoff Led)
|
||||
|
||||
boolean mDNSbegun = false;
|
||||
@ -1079,7 +1079,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_SAVEDATA "\":\"%s\"}"), (sysCfg.savedata > 1) ? stemp1 : getStateText(sysCfg.savedata));
|
||||
}
|
||||
else if (!strcasecmp_P(type, PSTR(D_CMND_SETOPTION)) && ((index >= 0) && (index <= 14)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) {
|
||||
else if (!strcasecmp_P(type, PSTR(D_CMND_SETOPTION)) && ((index >= 0) && (index <= 15)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) {
|
||||
if (index <= 31) {
|
||||
ptype = 0; // SetOption0 .. 31
|
||||
} else {
|
||||
@ -1091,6 +1091,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
|
||||
if (payload <= 1) {
|
||||
switch (index) {
|
||||
case 3: // mqtt
|
||||
case 15: // pwm_control
|
||||
restartflag = 2;
|
||||
case 0: // savestate
|
||||
case 1: // button_restrict
|
||||
@ -2324,7 +2325,7 @@ void stateloop()
|
||||
button_handler();
|
||||
switch_handler();
|
||||
|
||||
if (sfl_flg) { // Sonoff B1, AiLight, Sonoff led or BN-SZ01
|
||||
if (sfl_flg) {
|
||||
sl_animate();
|
||||
}
|
||||
|
||||
@ -2619,6 +2620,15 @@ void GPIO_init()
|
||||
analogWriteRange(PWM_RANGE); // Default is 1023 (Arduino.h)
|
||||
analogWriteFreq(PWM_FREQ); // Default is 1000 (core_esp8266_wiring_pwm.c)
|
||||
|
||||
if (sysCfg.flag.pwm_control) {
|
||||
sfl_flg = 0;
|
||||
for (byte i = 0; i < 5; i++) {
|
||||
if (pin[GPIO_PWM1 +i] < 99) {
|
||||
sfl_flg++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Maxdevice = 1;
|
||||
if (SONOFF_BRIDGE == sysCfg.module) {
|
||||
Baudrate = 19200;
|
||||
@ -2635,17 +2645,22 @@ void GPIO_init()
|
||||
Maxdevice = 0;
|
||||
Baudrate = 19200;
|
||||
}
|
||||
else if (SONOFF_BN == sysCfg.module) { // Single color led (White)
|
||||
else if ((H801 == sysCfg.module) || (MAGICHOME == sysCfg.module)) { // PWM RGBCW led
|
||||
if (!sysCfg.flag.pwm_control) {
|
||||
sfl_flg = 0;
|
||||
}
|
||||
}
|
||||
else if (SONOFF_BN == sysCfg.module) { // PWM Single color led (White)
|
||||
sfl_flg = 1;
|
||||
}
|
||||
else if (SONOFF_LED == sysCfg.module) { // Dual color led (White warm and cold)
|
||||
else if (SONOFF_LED == sysCfg.module) { // PWM Dual color led (White warm and cold)
|
||||
sfl_flg = 2;
|
||||
}
|
||||
else if (AILIGHT == sysCfg.module) { // RGBW led
|
||||
sfl_flg = 4;
|
||||
sfl_flg = 12;
|
||||
}
|
||||
else if (SONOFF_B1 == sysCfg.module) { // RGBWC led
|
||||
sfl_flg = 5;
|
||||
sfl_flg = 13;
|
||||
}
|
||||
else {
|
||||
Maxdevice = 0;
|
||||
@ -2674,14 +2689,14 @@ void GPIO_init()
|
||||
}
|
||||
|
||||
#ifdef USE_WS2812
|
||||
if (!sfl_flg && (pin[GPIO_WS2812] < 99)) {
|
||||
if (!sfl_flg && (pin[GPIO_WS2812] < 99)) { // RGB led
|
||||
Maxdevice++;
|
||||
sfl_flg = 3;
|
||||
sfl_flg = 11;
|
||||
}
|
||||
#endif // USE_WS2812
|
||||
if (sfl_flg) { // Sonoff B1, AiLight, Sonoff Led or BN-SZ01, WS2812
|
||||
if (sfl_flg < 3) {
|
||||
pwm_idxoffset = sfl_flg; // 1 for BN-SZ01, 2 for Sonoff Led
|
||||
if (sfl_flg < 6) {
|
||||
pwm_idxoffset = sfl_flg; // 1 for BN-SZ01, 2 for Sonoff Led, 3,4,5 for H801 and MagicHome
|
||||
}
|
||||
sl_init();
|
||||
}
|
||||
@ -2833,7 +2848,7 @@ void setup()
|
||||
|
||||
// Issue #526
|
||||
for (byte i = 0; i < Maxdevice; i++) {
|
||||
if ((pin[GPIO_REL1 +i] < 99) && (digitalRead(pin[GPIO_REL1 +i]))) {
|
||||
if ((pin[GPIO_REL1 +i] < 99) && (digitalRead(pin[GPIO_REL1 +i]) ^ rel_inverted[i])) {
|
||||
bitSet(power, i);
|
||||
pulse_timer[i] = sysCfg.pulsetime[i];
|
||||
}
|
||||
|
@ -52,11 +52,11 @@ enum upins_t {
|
||||
GPIO_LED2_INV,
|
||||
GPIO_LED3_INV,
|
||||
GPIO_LED4_INV,
|
||||
GPIO_PWM1, // Sonoff Led Cold
|
||||
GPIO_PWM2, // Sonoff Led Warm
|
||||
GPIO_PWM3, // Red (swapped with Blue from original)
|
||||
GPIO_PWM4, // Green
|
||||
GPIO_PWM5, // Blue (swapped with Red from original)
|
||||
GPIO_PWM1, // RGB Red or C Cold White
|
||||
GPIO_PWM2, // RGB Green or CW Warm White
|
||||
GPIO_PWM3, // RGB Blue
|
||||
GPIO_PWM4, // RGBW (Cold) White
|
||||
GPIO_PWM5, // RGBCW Warm White
|
||||
GPIO_CNTR1,
|
||||
GPIO_CNTR2,
|
||||
GPIO_CNTR3,
|
||||
@ -467,13 +467,13 @@ const mytmplt modules[MAXMODULE] PROGMEM = {
|
||||
GPIO_LED1, // GPIO01 Green LED
|
||||
GPIO_TXD, // GPIO02 RX - Pin next to TX on the PCB
|
||||
GPIO_RXD, // GPIO03 TX - Pin next to GND on the PCB
|
||||
GPIO_PWM2, // GPIO04 W2
|
||||
GPIO_USER, // GPIO04 W2 - PWM5
|
||||
GPIO_LED2_INV, // GPIO05 Red LED
|
||||
0, 0, 0, 0, 0, 0, // Flash connection
|
||||
GPIO_PWM3, // GPIO12 Blue
|
||||
GPIO_PWM4, // GPIO13 Green
|
||||
GPIO_PWM1, // GPIO14 W1
|
||||
GPIO_PWM5, // GPIO15 Red
|
||||
GPIO_PWM2, // GPIO13 Green
|
||||
GPIO_USER, // GPIO14 W1 - PWM4
|
||||
GPIO_PWM1, // GPIO15 Red
|
||||
0, 0
|
||||
},
|
||||
{ "Sonoff SC", // Sonoff SC (ESP8266)
|
||||
@ -658,11 +658,11 @@ const mytmplt modules[MAXMODULE] PROGMEM = {
|
||||
GPIO_LED1_INV, // GPIO02 Blue onboard LED
|
||||
0,
|
||||
GPIO_USER, // GPIO04 IR receiver (optional)
|
||||
GPIO_PWM4, // GPIO05 RGB LED Green
|
||||
GPIO_PWM2, // GPIO05 RGB LED Green
|
||||
0, 0, 0, 0, 0, 0, // Flash connection
|
||||
GPIO_PWM5, // GPIO12 RGB LED Blue
|
||||
GPIO_USER, // GPIO13 RGBW LED White (optional - set to PWM1 for Cold White or PWM2 for Warm White)
|
||||
GPIO_PWM3, // GPIO14 RGB LED Red
|
||||
GPIO_PWM3, // GPIO12 RGB LED Blue
|
||||
GPIO_USER, // GPIO13 RGBW LED White (optional - set to PWM4 for Cold White or Warm White)
|
||||
GPIO_PWM1, // GPIO14 RGB LED Red
|
||||
0, 0, 0
|
||||
}
|
||||
};
|
||||
|
@ -443,7 +443,7 @@ void handleRoot()
|
||||
page += F("<div id='l1' name='l1'></div>");
|
||||
if (Maxdevice) {
|
||||
if (sfl_flg) {
|
||||
if ((2 == sfl_flg) || (5 == sfl_flg)) {
|
||||
if ((2 == (sfl_flg &7)) || (5 == (sfl_flg &7))) {
|
||||
snprintf_P(line, sizeof(line), HTTP_MSG_SLIDER1, sl_getColorTemp());
|
||||
page += line;
|
||||
}
|
||||
@ -1051,11 +1051,12 @@ void handleSave()
|
||||
for (byte i = 0; i < MAX_GPIO_PIN; i++) {
|
||||
if (new_modflg) {
|
||||
sysCfg.my_module.gp.io[i] = 0;
|
||||
}
|
||||
if (GPIO_USER == cmodule.gp.io[i]) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("g%d"), i);
|
||||
sysCfg.my_module.gp.io[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str());
|
||||
gpios += F(", " D_GPIO ); gpios += String(i); gpios += F(" "); gpios += String(sysCfg.my_module.gp.io[i]);
|
||||
} else {
|
||||
if (GPIO_USER == cmodule.gp.io[i]) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("g%d"), i);
|
||||
sysCfg.my_module.gp.io[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str());
|
||||
gpios += F(", " D_GPIO ); gpios += String(i); gpios += F(" "); gpios += String(sysCfg.my_module.gp.io[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
snprintf_P(stemp, sizeof(stemp), modules[sysCfg.module].name);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
xdrv_snfled.ino - WS2812 and sonoff led support for Sonoff-Tasmota
|
||||
xdrv_snfled.ino - PWM, WS2812 and sonoff led support for Sonoff-Tasmota
|
||||
|
||||
Copyright (C) 2017 Theo Arends
|
||||
|
||||
@ -18,14 +18,19 @@
|
||||
*/
|
||||
|
||||
/*********************************************************************************************\
|
||||
* WS2812, Sonoff B1, AiLight, Sonoff Led and BN-SZ01
|
||||
* PWM, WS2812, Sonoff B1, AiLight, Sonoff Led and BN-SZ01
|
||||
*
|
||||
* sfl_flg Module Color ColorTemp
|
||||
* 1 Sonoff BN-SZ W no
|
||||
* 2 Sonoff Led CW yes
|
||||
* 3 +WS2812 RGB no
|
||||
* 4 AiLight RGBW no
|
||||
* 5 Sonoff B1 RGBCW yes
|
||||
* sfl_flg Module Color ColorTemp
|
||||
* 1 PWM1 W no (Sonoff BN-SZ)
|
||||
* 2 PWM2 CW yes (Sonoff Led)
|
||||
* 3 PWM3 RGB no (H801 and MagicHome)
|
||||
* 4 PWM4 RGBW no (H801 and MagicHome)
|
||||
* 5 PWM5 RGBCW yes (H801)
|
||||
* 9 reserved no
|
||||
* 10 reserved yes
|
||||
* 11 +WS2812 RGB no
|
||||
* 12 AiLight RGBW no
|
||||
* 13 Sonoff B1 RGBCW yes
|
||||
*
|
||||
* led_scheme WS2812 Others Effect
|
||||
* 0 yes yes Color On/Off
|
||||
@ -114,7 +119,7 @@ void sl_my92x1_write(uint8_t data)
|
||||
|
||||
void sl_my92x1_init()
|
||||
{
|
||||
uint8_t chips = sfl_flg -3; // 1 (AiLight) or 2 (Sonoff B1)
|
||||
uint8_t chips = sfl_flg -11; // 1 (AiLight) or 2 (Sonoff B1)
|
||||
|
||||
sl_dcki_pulse(chips * 32); // Clear all duty register
|
||||
os_delay_us(12); // TStop > 12us.
|
||||
@ -136,7 +141,7 @@ void sl_my92x1_duty(uint8_t duty_r, uint8_t duty_g, uint8_t duty_b, uint8_t duty
|
||||
{
|
||||
uint8_t channels[2] = { 4, 6 };
|
||||
|
||||
uint8_t didx = sfl_flg -4; // 0 or 1
|
||||
uint8_t didx = sfl_flg -12; // 0 or 1
|
||||
|
||||
uint8_t duty[2][6] = {{ duty_r, duty_g, duty_b, duty_w, 0, 0 }, // Definition for RGBW channels
|
||||
{ duty_w, duty_c, 0, duty_g, duty_r, duty_b }}; // Definition for RGBWC channels
|
||||
@ -154,27 +159,28 @@ void sl_my92x1_duty(uint8_t duty_r, uint8_t duty_g, uint8_t duty_b, uint8_t duty
|
||||
|
||||
void sl_init(void)
|
||||
{
|
||||
if (sfl_flg < 3) {
|
||||
if (!my_module.gp.io[4]) {
|
||||
pinMode(4, OUTPUT); // Stop floating outputs
|
||||
digitalWrite(4, LOW);
|
||||
if (sfl_flg < 6) { // PWM
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
sysCfg.pwmvalue[i] = 0; // Disable direct PWM control
|
||||
}
|
||||
if (!my_module.gp.io[5]) {
|
||||
pinMode(5, OUTPUT); // Stop floating outputs
|
||||
digitalWrite(5, LOW);
|
||||
}
|
||||
if (!my_module.gp.io[14]) {
|
||||
pinMode(14, OUTPUT); // Stop floating outputs
|
||||
digitalWrite(14, LOW);
|
||||
}
|
||||
sysCfg.pwmvalue[0] = 0; // We use dimmer / led_color
|
||||
if (2 == sfl_flg) {
|
||||
sysCfg.pwmvalue[1] = 0; // We use led_color
|
||||
if (SONOFF_LED == sysCfg.module) { // Fix Sonoff Led instabilities
|
||||
if (!my_module.gp.io[4]) {
|
||||
pinMode(4, OUTPUT); // Stop floating outputs
|
||||
digitalWrite(4, LOW);
|
||||
}
|
||||
if (!my_module.gp.io[5]) {
|
||||
pinMode(5, OUTPUT); // Stop floating outputs
|
||||
digitalWrite(5, LOW);
|
||||
}
|
||||
if (!my_module.gp.io[14]) {
|
||||
pinMode(14, OUTPUT); // Stop floating outputs
|
||||
digitalWrite(14, LOW);
|
||||
}
|
||||
}
|
||||
sysCfg.led_scheme = 0;
|
||||
}
|
||||
#ifdef USE_WS2812 // ************************************************************************
|
||||
else if (3 == sfl_flg) {
|
||||
else if (11 == sfl_flg) {
|
||||
ws2812_init();
|
||||
if (1 == sysCfg.led_scheme) {
|
||||
sysCfg.led_scheme = 0;
|
||||
@ -212,7 +218,7 @@ void sl_setColorTemp(uint16_t ct)
|
||||
}
|
||||
uint16_t icold = (100 * (347 - my_ct)) / 136;
|
||||
uint16_t iwarm = (100 * my_ct) / 136;
|
||||
if (5 == sfl_flg) {
|
||||
if (5 == (sfl_flg &7)) {
|
||||
sysCfg.led_color[0] = 0;
|
||||
sysCfg.led_color[1] = 0;
|
||||
sysCfg.led_color[2] = 0;
|
||||
@ -227,7 +233,7 @@ void sl_setColorTemp(uint16_t ct)
|
||||
uint16_t sl_getColorTemp()
|
||||
{
|
||||
uint8_t ct_idx = 0;
|
||||
if (5 == sfl_flg) {
|
||||
if (5 == (sfl_flg &7)) {
|
||||
ct_idx = 3;
|
||||
}
|
||||
uint16_t my_ct = sysCfg.led_color[ct_idx +1];
|
||||
@ -243,11 +249,11 @@ void sl_setDim(uint8_t myDimmer)
|
||||
{
|
||||
float temp;
|
||||
|
||||
if ((1 == sfl_flg) && (100 == myDimmer)) {
|
||||
if ((SONOFF_BN == sysCfg.module) && (100 == myDimmer)) {
|
||||
myDimmer = 99; // BN-SZ01 starts flickering at dimmer = 100
|
||||
}
|
||||
float newDim = 100 / (float)myDimmer;
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
temp = (float)sysCfg.led_color[i] / newDim;
|
||||
sl_dcolor[i] = (uint8_t)temp;
|
||||
}
|
||||
@ -258,7 +264,7 @@ void sl_setColor()
|
||||
uint8_t highest = 0;
|
||||
float temp;
|
||||
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
if (highest < sl_dcolor[i]) {
|
||||
highest = sl_dcolor[i];
|
||||
}
|
||||
@ -266,7 +272,7 @@ void sl_setColor()
|
||||
float mDim = (float)highest / 2.55;
|
||||
sysCfg.led_dimmer[0] = (uint8_t)mDim;
|
||||
float newDim = 100 / mDim;
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
temp = (float)sl_dcolor[i] * newDim;
|
||||
sysCfg.led_color[i] = (uint8_t)temp;
|
||||
}
|
||||
@ -276,7 +282,7 @@ char* sl_getColor(char* scolor)
|
||||
{
|
||||
sl_setDim(sysCfg.led_dimmer[0]);
|
||||
scolor[0] = '\0';
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
snprintf_P(scolor, 11, PSTR("%s%02X"), scolor, sl_dcolor[i]);
|
||||
}
|
||||
return scolor;
|
||||
@ -297,7 +303,7 @@ void sl_prepPower()
|
||||
// mqtt_publishDomoticzPowerState(1);
|
||||
domoticz_updatePowerState(Maxdevice);
|
||||
#endif // USE_DOMOTICZ
|
||||
if (sfl_flg > 1) {
|
||||
if ((sfl_flg &7) > 1) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_RSLT_POWER "\":\"%s\", \"" D_CMND_DIMMER "\":%d, \"" D_CMND_COLOR "\":\"%s\"}"),
|
||||
getStateText(sl_power), sysCfg.led_dimmer[0], sl_getColor(scolor));
|
||||
} else {
|
||||
@ -328,7 +334,7 @@ void sl_animate()
|
||||
if (!sl_power) { // Power Off
|
||||
sleep = sysCfg.sleep;
|
||||
stripTimerCntr = 0;
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
sl_tcolor[i] = 0;
|
||||
}
|
||||
}
|
||||
@ -338,11 +344,11 @@ void sl_animate()
|
||||
case 0: // Power On
|
||||
sl_setDim(sysCfg.led_dimmer[0]); // Power On
|
||||
if (0 == sysCfg.led_fade) {
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
sl_tcolor[i] = sl_dcolor[i];
|
||||
}
|
||||
} else {
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
if (sl_tcolor[i] != sl_dcolor[i]) {
|
||||
if (sl_tcolor[i] < sl_dcolor[i]) {
|
||||
sl_tcolor[i] += ((sl_dcolor[i] - sl_tcolor[i]) >> sysCfg.led_speed) +1;
|
||||
@ -357,7 +363,7 @@ void sl_animate()
|
||||
case 1: // Power On using wake up duration
|
||||
if (2 == sl_wakeupActive) {
|
||||
sl_wakeupActive = 1;
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
sl_tcolor[i] = 0;
|
||||
}
|
||||
sl_wakeupCntr = 0;
|
||||
@ -369,7 +375,7 @@ void sl_animate()
|
||||
sl_wakeupDimmer++;
|
||||
if (sl_wakeupDimmer <= sysCfg.led_dimmer[0]) {
|
||||
sl_setDim(sl_wakeupDimmer);
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
sl_tcolor[i] = sl_dcolor[i];
|
||||
}
|
||||
} else {
|
||||
@ -382,7 +388,7 @@ void sl_animate()
|
||||
break;
|
||||
#ifdef USE_WS2812 // ************************************************************************
|
||||
default:
|
||||
if (3 == sfl_flg) {
|
||||
if (11 == sfl_flg) {
|
||||
ws2812_showScheme(sysCfg.led_scheme -2);
|
||||
}
|
||||
#endif // USE_WS2812 ************************************************************************
|
||||
@ -390,28 +396,28 @@ void sl_animate()
|
||||
}
|
||||
|
||||
if ((sysCfg.led_scheme < 2) || !sl_power) {
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
if (sl_lcolor[i] != sl_tcolor[i]) {
|
||||
sl_any = 1;
|
||||
}
|
||||
}
|
||||
if (sl_any) {
|
||||
sl_any = 0;
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
sl_lcolor[i] = sl_tcolor[i];
|
||||
cur_col[i] = (sysCfg.led_table) ? ledTable[sl_lcolor[i]] : sl_lcolor[i];
|
||||
if (sfl_flg < 3) {
|
||||
if (sfl_flg < 6) {
|
||||
if (pin[GPIO_PWM1 +i] < 99) {
|
||||
analogWrite(pin[GPIO_PWM1 +i], cur_col[i] * (PWM_RANGE / 255));
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef USE_WS2812 // ************************************************************************
|
||||
if (3 == sfl_flg) {
|
||||
if (11 == sfl_flg) {
|
||||
ws2812_setColor(0, cur_col[0], cur_col[1], cur_col[2]);
|
||||
}
|
||||
#endif // USE_ES2812 ************************************************************************
|
||||
if (sfl_flg > 3) {
|
||||
if (sfl_flg > 11) {
|
||||
sl_my92x1_duty(cur_col[0], cur_col[1], cur_col[2], cur_col[3], cur_col[4]);
|
||||
}
|
||||
}
|
||||
@ -525,7 +531,7 @@ void sl_hsb2rgb()
|
||||
|
||||
void sl_replaceHSB(String *response)
|
||||
{
|
||||
if (sfl_flg > 2) {
|
||||
if ((sfl_flg &7) > 2) {
|
||||
sl_rgb2hsb();
|
||||
response->replace("{h}", String((uint16_t)(65535.0f * sl_Hue)));
|
||||
response->replace("{s}", String((uint8_t)(254.0f * sl_Sat)));
|
||||
@ -540,7 +546,7 @@ void sl_replaceHSB(String *response)
|
||||
|
||||
void sl_getHSB(float *hue, float *sat, float *bri)
|
||||
{
|
||||
if (sfl_flg > 2) {
|
||||
if ((sfl_flg &7) > 2) {
|
||||
sl_rgb2hsb();
|
||||
*hue = sl_Hue;
|
||||
*sat = sl_Sat;
|
||||
@ -567,7 +573,7 @@ void sl_setHSB(float hue, float sat, float bri, uint16_t ct)
|
||||
*/
|
||||
|
||||
if (sfl_flg > 2) {
|
||||
if ((5 == sfl_flg) && (ct > 0)) {
|
||||
if ((5 == (sfl_flg &7)) && (ct > 0)) {
|
||||
sl_setColorTemp(ct);
|
||||
} else {
|
||||
sl_Hue = hue;
|
||||
@ -581,7 +587,7 @@ void sl_setHSB(float hue, float sat, float bri, uint16_t ct)
|
||||
} else {
|
||||
uint8_t tmp = (uint8_t)(bri * 100);
|
||||
sysCfg.led_dimmer[0] = tmp;
|
||||
if (2 == sfl_flg) {
|
||||
if (2 == (sfl_flg &7)) {
|
||||
if (ct > 0) {
|
||||
sl_setColorTemp(ct);
|
||||
}
|
||||
@ -605,13 +611,13 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len,
|
||||
char scolor[11];
|
||||
char *p;
|
||||
|
||||
if ((sfl_flg > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR))) {
|
||||
if (((sfl_flg &7) > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR))) {
|
||||
if (dataBuf[0] == '#') {
|
||||
dataBuf++;
|
||||
data_len--;
|
||||
}
|
||||
if ((2 * sfl_flg) == data_len) {
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
if ((2 * (sfl_flg &7)) == data_len) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
strlcpy(scolor, dataBuf + (i *2), 3);
|
||||
sl_dcolor[i] = (uint8_t)strtol(scolor, &p, 16);
|
||||
}
|
||||
@ -622,14 +628,14 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len,
|
||||
}
|
||||
}
|
||||
#ifdef USE_WS2812 // ***********************************************************************
|
||||
else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= sysCfg.led_pixels)) {
|
||||
else if ((11 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= sysCfg.led_pixels)) {
|
||||
if (dataBuf[0] == '#') {
|
||||
dataBuf++;
|
||||
data_len--;
|
||||
}
|
||||
uint8_t sl_ledcolor[3];
|
||||
if ((2 * sfl_flg) == data_len) {
|
||||
for (byte i = 0; i < sfl_flg; i++) {
|
||||
if ((2 * (sfl_flg &7)) == data_len) {
|
||||
for (byte i = 0; i < (sfl_flg &7); i++) {
|
||||
strlcpy(scolor, dataBuf + (i *2), 3);
|
||||
sl_ledcolor[i] = (uint8_t)strtol(scolor, &p, 16);
|
||||
}
|
||||
@ -637,7 +643,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len,
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_LED "%d\":\"%s\"}"), index, ws2812_getColor(index, scolor));
|
||||
}
|
||||
else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_PIXELS))) {
|
||||
else if ((11 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_PIXELS))) {
|
||||
if ((payload > 0) && (payload <= WS2812_MAX_LEDS)) {
|
||||
sysCfg.led_pixels = payload;
|
||||
ws2812_clear();
|
||||
@ -645,13 +651,13 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len,
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_PIXELS "\":%d}"), sysCfg.led_pixels);
|
||||
}
|
||||
else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_WIDTH))) {
|
||||
else if ((11 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_WIDTH))) {
|
||||
if ((payload >= 0) && (payload <= 4)) {
|
||||
sysCfg.led_width = payload;
|
||||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WIDTH "\":%d}"), sysCfg.led_width);
|
||||
}
|
||||
else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_SCHEME))) {
|
||||
else if ((11 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_SCHEME))) {
|
||||
if ((payload >= 0) && (payload <= 9)) {
|
||||
sysCfg.led_scheme = payload;
|
||||
if (1 == sysCfg.led_scheme) {
|
||||
@ -672,7 +678,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len,
|
||||
do_cmnd_power(Maxdevice, 1);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_STARTED "\"}"));
|
||||
}
|
||||
else if (!strcasecmp_P(type, PSTR(D_CMND_COLORTEMPERATURE)) && ((2 == sfl_flg) || (5 == sfl_flg))) { // ColorTemp
|
||||
else if (!strcasecmp_P(type, PSTR(D_CMND_COLORTEMPERATURE)) && ((2 == (sfl_flg &7)) || (5 == (sfl_flg &7)))) { // ColorTemp
|
||||
if ((payload >= 153) && (payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts
|
||||
sl_setColorTemp(payload);
|
||||
coldim = true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user