diff --git a/sonoff/_changelog.ino b/sonoff/_changelog.ino index ec7267839..b02af7c9c 100644 --- a/sonoff/_changelog.ino +++ b/sonoff/_changelog.ino @@ -2,6 +2,8 @@ * 6.6.0.3 20190725 * Change filename of configuration backup from using FriendlyName1 to Hostname solving diacritic issues (#2422) * Upgrade library IRRemoteEsp8266 to 2.6.4, now using sendPioneer() + * Add support for MAX31865 Thermocouple sensor by Alberto Lopez Siemens + * Add option 0 to Width1 (Marker), Width2 (Second), Width3 (Minute) and Width4 (Hour) disabling display (#6152) * * 6.6.0.2 20190714 * Change commands Var and Mem to show all parameters when no index is given (#6107) diff --git a/sonoff/my_user_config.h b/sonoff/my_user_config.h index c3a4afa72..d14d5ce6c 100644 --- a/sonoff/my_user_config.h +++ b/sonoff/my_user_config.h @@ -427,13 +427,10 @@ //#define USE_MAX31855 // Add support for MAX31855 K-Type thermocouple sensor using softSPI //#define USE_MAX31865 // Add support for MAX31865 RTD sensors using softSPI - -#ifdef USE_MAX31865 #define MAX31865_PTD_WIRES 2 // PTDs come in several flavors. Pick yours #define MAX31865_PTD_RES 100 // Nominal PTD resistance at 0°C (100Ω for a PT100, 1000Ω for a PT1000, YMMV!) #define MAX31865_REF_RES 430 // Reference resistor (Usually 430Ω for a PT100, 4300Ω for a PT1000) #define MAX31865_PTD_BIAS 0 // To calibrate your not-so-good PTD -#endif // -- IR Remote features -------------------------- #define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+4k3 code, 0k3 mem, 48 iram) diff --git a/sonoff/xdrv_04_light.ino b/sonoff/xdrv_04_light.ino index af65e8463..a08df1c09 100644 --- a/sonoff/xdrv_04_light.ino +++ b/sonoff/xdrv_04_light.ino @@ -2197,7 +2197,7 @@ bool LightCommand(void) } Response_P(S_JSON_COMMAND_NVALUE, command, Settings.light_width); } else { - if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 32)) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 32)) { Settings.ws_width[XdrvMailbox.index -2] = XdrvMailbox.payload; } Response_P(S_JSON_COMMAND_INDEX_NVALUE, command, XdrvMailbox.index, Settings.ws_width[XdrvMailbox.index -2]); diff --git a/sonoff/xplg_ws2812.ino b/sonoff/xplg_ws2812.ino index ff8884462..d1b8bb9df 100644 --- a/sonoff/xplg_ws2812.ino +++ b/sonoff/xplg_ws2812.ino @@ -87,6 +87,7 @@ uint8_t kWsRepeat[5] = { uint8_t ws_show_next = 1; bool ws_suspend_update = false; + /********************************************************************************************/ void Ws2812StripShow(void) @@ -119,7 +120,6 @@ int mod(int a, int b) return ret; } - void Ws2812UpdatePixelColor(int position, struct WsColor hand_color, float offset) { #if (USE_WS2812_CTYPE > NEO_3LED) @@ -128,7 +128,7 @@ void Ws2812UpdatePixelColor(int position, struct WsColor hand_color, float offse RgbColor color; #endif - uint16_t mod_position = mod(position, (int)Settings.light_pixels); + uint32_t mod_position = mod(position, (int)Settings.light_pixels); color = strip->GetPixelColor(mod_position); float dimmer = 100 / (float)Settings.light_dimmer; @@ -138,8 +138,12 @@ void Ws2812UpdatePixelColor(int position, struct WsColor hand_color, float offse strip->SetPixelColor(mod_position, color); } -void Ws2812UpdateHand(int position, uint8_t index) +void Ws2812UpdateHand(int position, uint32_t index) { + uint32_t width = Settings.light_width; + if (index < WS_MARKER) { width = Settings.ws_width[index]; } + if (!width) { return; } // Skip + position = (position + Settings.light_rotation) % Settings.light_pixels; if (Settings.flag.ws_clock_reverse) position = Settings.light_pixels -position; @@ -147,8 +151,7 @@ void Ws2812UpdateHand(int position, uint8_t index) Ws2812UpdatePixelColor(position, hand_color, 1); - uint8_t range = 1; - if (index < WS_MARKER) range = ((Settings.ws_width[index] -1) / 2) +1; + uint32_t range = ((width -1) / 2) +1; for (uint32_t h = 1; h < range; h++) { float offset = (float)(range - h) / (float)range; Ws2812UpdatePixelColor(position -h, hand_color, offset); @@ -173,18 +176,18 @@ void Ws2812Clock(void) Ws2812StripShow(); } -void Ws2812GradientColor(uint8_t schemenr, struct WsColor* mColor, uint16_t range, uint16_t gradRange, uint16_t i) +void Ws2812GradientColor(uint32_t schemenr, struct WsColor* mColor, uint32_t range, uint32_t gradRange, uint32_t i) { /* * Compute the color of a pixel at position i using a gradient of the color scheme. * This function is used internally by the gradient function. */ ColorScheme scheme = kSchemes[schemenr]; - uint16_t curRange = i / range; - uint16_t rangeIndex = i % range; - uint16_t colorIndex = rangeIndex / gradRange; - uint16_t start = colorIndex; - uint16_t end = colorIndex +1; + uint32_t curRange = i / range; + uint32_t rangeIndex = i % range; + uint32_t colorIndex = rangeIndex / gradRange; + uint32_t start = colorIndex; + uint32_t end = colorIndex +1; if (curRange % 2 != 0) { start = (scheme.count -1) - start; end = (scheme.count -1) - end; @@ -198,7 +201,7 @@ void Ws2812GradientColor(uint8_t schemenr, struct WsColor* mColor, uint16_t rang mColor->blue = (uint8_t)fmyBlu; } -void Ws2812Gradient(uint8_t schemenr) +void Ws2812Gradient(uint32_t schemenr) { /* * This routine courtesy Tony DiCola (Adafruit) @@ -213,13 +216,13 @@ void Ws2812Gradient(uint8_t schemenr) #endif ColorScheme scheme = kSchemes[schemenr]; - if (scheme.count < 2) return; + if (scheme.count < 2) { return; } - uint8_t repeat = kWsRepeat[Settings.light_width]; // number of scheme.count per ledcount - uint16_t range = (uint16_t)ceil((float)Settings.light_pixels / (float)repeat); - uint16_t gradRange = (uint16_t)ceil((float)range / (float)(scheme.count - 1)); - uint16_t speed = ((Settings.light_speed * 2) -1) * (STATES / 10); - uint16_t offset = speed > 0 ? strip_timer_counter / speed : 0; + uint32_t repeat = kWsRepeat[Settings.light_width]; // number of scheme.count per ledcount + uint32_t range = (uint32_t)ceil((float)Settings.light_pixels / (float)repeat); + uint32_t gradRange = (uint32_t)ceil((float)range / (float)(scheme.count - 1)); + uint32_t speed = ((Settings.light_speed * 2) -1) * (STATES / 10); + uint32_t offset = speed > 0 ? strip_timer_counter / speed : 0; WsColor oldColor, currentColor; Ws2812GradientColor(schemenr, &oldColor, range, gradRange, offset); @@ -246,7 +249,7 @@ void Ws2812Gradient(uint8_t schemenr) Ws2812StripShow(); } -void Ws2812Bars(uint8_t schemenr) +void Ws2812Bars(uint32_t schemenr) { /* * This routine courtesy Tony DiCola (Adafruit) @@ -259,20 +262,19 @@ void Ws2812Bars(uint8_t schemenr) #else RgbColor c; #endif - uint16_t i; ColorScheme scheme = kSchemes[schemenr]; - uint16_t maxSize = Settings.light_pixels / scheme.count; - if (kWidth[Settings.light_width] > maxSize) maxSize = 0; + uint32_t maxSize = Settings.light_pixels / scheme.count; + if (kWidth[Settings.light_width] > maxSize) { maxSize = 0; } - uint16_t speed = ((Settings.light_speed * 2) -1) * (STATES / 10); - uint8_t offset = speed > 0 ? strip_timer_counter / speed : 0; + uint32_t speed = ((Settings.light_speed * 2) -1) * (STATES / 10); + uint32_t offset = (speed > 0) ? strip_timer_counter / speed : 0; WsColor mcolor[scheme.count]; memcpy(mcolor, scheme.colors, sizeof(mcolor)); float dimmer = 100 / (float)Settings.light_dimmer; - for (i = 0; i < scheme.count; i++) { + for (uint32_t i = 0; i < scheme.count; i++) { float fmyRed = (float)mcolor[i].red / dimmer; float fmyGrn = (float)mcolor[i].green / dimmer; float fmyBlu = (float)mcolor[i].blue / dimmer; @@ -280,9 +282,9 @@ void Ws2812Bars(uint8_t schemenr) mcolor[i].green = (uint8_t)fmyGrn; mcolor[i].blue = (uint8_t)fmyBlu; } - uint8_t colorIndex = offset % scheme.count; - for (i = 0; i < Settings.light_pixels; i++) { - if (maxSize) colorIndex = ((i + offset) % (scheme.count * kWidth[Settings.light_width])) / kWidth[Settings.light_width]; + uint32_t colorIndex = offset % scheme.count; + for (uint32_t i = 0; i < Settings.light_pixels; i++) { + if (maxSize) { colorIndex = ((i + offset) % (scheme.count * kWidth[Settings.light_width])) / kWidth[Settings.light_width]; } c.R = mcolor[colorIndex].red; c.G = mcolor[colorIndex].green; c.B = mcolor[colorIndex].blue; @@ -313,7 +315,7 @@ void Ws2812Clear(void) ws_show_next = 1; } -void Ws2812SetColor(uint16_t led, uint8_t red, uint8_t green, uint8_t blue, uint8_t white) +void Ws2812SetColor(uint32_t led, uint8_t red, uint8_t green, uint8_t blue, uint8_t white) { #if (USE_WS2812_CTYPE > NEO_3LED) RgbwColor lcolor; @@ -350,7 +352,7 @@ void Ws2812ForceUpdate (void) { ws_show_next = 1; } -char* Ws2812GetColor(uint16_t led, char* scolor) +char* Ws2812GetColor(uint32_t led, char* scolor) { uint8_t sl_ledcolor[4]; @@ -374,7 +376,7 @@ char* Ws2812GetColor(uint16_t led, char* scolor) return scolor; } -void Ws2812ShowScheme(uint8_t scheme) +void Ws2812ShowScheme(uint32_t scheme) { switch (scheme) { case 0: // Clock