Bugfixes.

- multi-relay brightness check
- temperature no reading delay
- analog button fix & noise reduction
- IR removed custom
This commit is contained in:
Blaz Kristan 2021-05-25 23:00:21 +02:00
parent 6760744249
commit 1ba70706c2
7 changed files with 48 additions and 58 deletions

View File

@ -17,11 +17,6 @@
#define USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL 60000 #define USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL 60000
#endif #endif
// how many seconds after boot to take first measurement, 20 seconds
#ifndef USERMOD_DALLASTEMPERATURE_FIRST_MEASUREMENT_AT
#define USERMOD_DALLASTEMPERATURE_FIRST_MEASUREMENT_AT 20000
#endif
class UsermodTemperature : public Usermod { class UsermodTemperature : public Usermod {
private: private:
@ -34,7 +29,7 @@ class UsermodTemperature : public Usermod {
bool degC = true; bool degC = true;
unsigned long readingInterval = USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL; unsigned long readingInterval = USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL;
// set last reading as "40 sec before boot", so first reading is taken after 20 sec // set last reading as "40 sec before boot", so first reading is taken after 20 sec
unsigned long lastMeasurement = UINT32_MAX - (USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL - USERMOD_DALLASTEMPERATURE_FIRST_MEASUREMENT_AT); unsigned long lastMeasurement = UINT32_MAX - USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL;
// last time requestTemperatures was called // last time requestTemperatures was called
// used to determine when we can read the sensors temperature // used to determine when we can read the sensors temperature
// we have to wait at least 93.75 ms after requestTemperatures() is called // we have to wait at least 93.75 ms after requestTemperatures() is called
@ -42,10 +37,6 @@ class UsermodTemperature : public Usermod {
float temperature = -100; // default to -100, DS18B20 only goes down to -50C float temperature = -100; // default to -100, DS18B20 only goes down to -50C
// indicates requestTemperatures has been called but the sensor measurement is not complete // indicates requestTemperatures has been called but the sensor measurement is not complete
bool waitingForConversion = false; bool waitingForConversion = false;
// flag to indicate we have finished the first readTemperature call
// allows this library to report to the user how long until the first
// measurement
bool readTemperatureComplete = false;
// flag set at startup if DS18B20 sensor not found, avoids trying to keep getting // flag set at startup if DS18B20 sensor not found, avoids trying to keep getting
// temperature if flashed to a board without a sensor attached // temperature if flashed to a board without a sensor attached
bool disabled = false; bool disabled = false;
@ -67,7 +58,7 @@ class UsermodTemperature : public Usermod {
for (i=2; i < 8; i++) oneWire->read(); // read unused bytes for (i=2; i < 8; i++) oneWire->read(); // read unused bytes
result = (data[1]<<8) | data[0]; result = (data[1]<<8) | data[0];
result >>= 4; // 9-bit precision accurate to 1°C (/16) result >>= 4; // 9-bit precision accurate to 1°C (/16)
if (data[1]&0x80) result |= 0xF000; // fix negative value if (data[1]&0x80) result |= 0x8000; // fix negative value
//if (data[0]&0x08) ++result; //if (data[0]&0x08) ++result;
oneWire->reset(); oneWire->reset();
oneWire->write(0xCC); // skip ROM oneWire->write(0xCC); // skip ROM
@ -86,7 +77,6 @@ class UsermodTemperature : public Usermod {
temperature = readDallas(); temperature = readDallas();
lastMeasurement = millis(); lastMeasurement = millis();
waitingForConversion = false; waitingForConversion = false;
readTemperatureComplete = true;
DEBUG_PRINTF("Read temperature %2.1f.\n", temperature); DEBUG_PRINTF("Read temperature %2.1f.\n", temperature);
} }
@ -197,14 +187,6 @@ class UsermodTemperature : public Usermod {
JsonArray temp = user.createNestedArray(FPSTR(_name)); JsonArray temp = user.createNestedArray(FPSTR(_name));
//temp.add(F("Loaded.")); //temp.add(F("Loaded."));
if (!readTemperatureComplete) {
// if we haven't read the sensor yet, let the user know
// that we are still waiting for the first measurement
temp.add((USERMOD_DALLASTEMPERATURE_FIRST_MEASUREMENT_AT - millis()) / 1000);
temp.add(F(" sec until read"));
return;
}
if (temperature <= -100) { if (temperature <= -100) {
temp.add(0); temp.add(0);
temp.add(F(" Sensor Error!")); temp.add(F(" Sensor Error!"));

View File

@ -35,7 +35,7 @@ class MultiRelay : public Usermod {
// switch timer start time // switch timer start time
uint32_t _switchTimerStart = 0; uint32_t _switchTimerStart = 0;
// old brightness // old brightness
uint8_t _oldBrightness = 0; bool _oldBrightness = 0;
// usermod enabled // usermod enabled
bool enabled = false; // needs to be configured (no default config) bool enabled = false; // needs to be configured (no default config)
@ -265,7 +265,7 @@ class MultiRelay : public Usermod {
_relay[i].active = false; _relay[i].active = false;
} }
} }
_oldBrightness = bri; _oldBrightness = (bool)bri;
initDone = true; initDone = true;
} }
@ -288,8 +288,8 @@ class MultiRelay : public Usermod {
lastUpdate = millis(); lastUpdate = millis();
//set relay when LEDs turn on //set relay when LEDs turn on
if (_oldBrightness != bri) { if (_oldBrightness != (bool)bri) {
_oldBrightness = bri; _oldBrightness = (bool)bri;
_switchTimerStart = millis(); _switchTimerStart = millis();
for (uint8_t i=0; i<MULTI_RELAY_MAX_RELAYS; i++) { for (uint8_t i=0; i<MULTI_RELAY_MAX_RELAYS; i++) {
if (_relay[i].pin>=0) _relay[i].active = true; if (_relay[i].pin>=0) _relay[i].active = true;

View File

@ -41,7 +41,6 @@ bool isButtonPressed(uint8_t i)
return false; return false;
} }
void handleSwitch(uint8_t b) void handleSwitch(uint8_t b)
{ {
if (buttonPressedBefore[b] != isButtonPressed(b)) { if (buttonPressedBefore[b] != isButtonPressed(b)) {
@ -67,52 +66,63 @@ void handleSwitch(uint8_t b)
} }
} }
void handleAnalog(uint8_t b) void handleAnalog(uint8_t b)
{ {
static uint8_t oldRead[WLED_MAX_BUTTONS]; static uint8_t oldRead[WLED_MAX_BUTTONS];
#ifdef ESP8266 #ifdef ESP8266
uint8_t aRead = analogRead(A0) >> 2; // convert 10bit read to 8bit uint16_t aRead = analogRead(A0) >> 5; // convert 10bit read to 5bit (remove noise)
#else #else
uint8_t aRead = analogRead(btnPin[b]) >> 4; // convert 12bit read to 8bit uint16_t aRead = analogRead(btnPin[b]) >> 7; // convert 12bit read to 5bit (remove noise)
#endif #endif
if (oldRead[b] == aRead) return; // no change in reading if (oldRead[b] == aRead) return; // no change in reading
oldRead[b] = aRead;
// if no macro for "short press" and "long press" is defined use brightness control // if no macro for "short press" and "long press" is defined use brightness control
if (!macroButton[b] && !macroLongPress[b]) { if (!macroButton[b] && !macroLongPress[b]) {
// if "double press" macro is 250 or greater use global brightness // if "double press" macro is 250 or greater use global brightness
if (macroDoublePress[b]>=250) { if (macroDoublePress[b] >= 250) {
// if change in analog read was detected change global brightness // if change in analog read was detected change global brightness
if (aRead == 0) if (aRead == 0) {
toggleOnOff(); briLast = bri;
else bri = 0;
bri = aRead; } else{
bri = aRead << 3;
}
} else { } else {
// otherwise use "double press" for segment selection // otherwise use "double press" for segment selection
//uint8_t mainSeg = strip.getMainSegmentId(); //uint8_t mainSeg = strip.getMainSegmentId();
WS2812FX::Segment& seg = strip.getSegment(macroDoublePress[b]); WS2812FX::Segment& seg = strip.getSegment(macroDoublePress[b]);
if (aRead == 0) { if (aRead == 0) {
seg.setOption(SEG_OPTION_ON, 0, macroDoublePress[b]); // off seg.setOption(SEG_OPTION_ON, 0); // off
} else { } else {
seg.setOpacity(aRead, macroDoublePress[b]); seg.setOpacity(aRead << 3, macroDoublePress[b]);
seg.setOption(SEG_OPTION_ON, 1, macroDoublePress[b]); seg.setOption(SEG_OPTION_ON, 1);
} }
// this will notify clients of update (websockets,mqtt,etc)
//call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (No notification)
// 6: fx changed 7: hue 8: preset cycle 9: blynk 10: alexa
updateInterfaces(NOTIFIER_CALL_MODE_BUTTON);
} }
} else { } else {
//TODO: //TODO:
// we can either trigger a preset depending on the level (between short and long entries) // we can either trigger a preset depending on the level (between short and long entries)
// or use it for RGBW direct control // or use it for RGBW direct control
} }
//call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (No notification)
// 6: fx changed 7: hue 8: preset cycle 9: blynk 10: alexa
colorUpdated(NOTIFIER_CALL_MODE_BUTTON); colorUpdated(NOTIFIER_CALL_MODE_BUTTON);
} }
void handleButton() void handleButton()
{ {
static unsigned long lastRead = 0UL;
for (uint8_t b=0; b<WLED_MAX_BUTTONS; b++) { for (uint8_t b=0; b<WLED_MAX_BUTTONS; b++) {
if (btnPin[b]<0 || buttonType[b] == BTN_TYPE_NONE) continue; if (btnPin[b]<0 || buttonType[b] == BTN_TYPE_NONE) continue;
if (buttonType[b] == BTN_TYPE_ANALOG) { // button is not a button but a potentiometer if (buttonType[b] == BTN_TYPE_ANALOG && millis() - lastRead > 250) { // button is not a button but a potentiometer
if (b+1 == WLED_MAX_BUTTONS) lastRead = millis();
handleAnalog(b); continue; handleAnalog(b); continue;
} }

View File

@ -75,7 +75,7 @@ void sendHuePoll();
void onHueData(void* arg, AsyncClient* client, void *data, size_t len); void onHueData(void* arg, AsyncClient* client, void *data, size_t len);
//ir.cpp //ir.cpp
bool decodeIRCustom(uint32_t code); //bool decodeIRCustom(uint32_t code);
void applyRepeatActions(); void applyRepeatActions();
void relativeChange(byte* property, int8_t amount, byte lowerBoundary = 0, byte higherBoundary = 0xFF); void relativeChange(byte* property, int8_t amount, byte lowerBoundary = 0, byte higherBoundary = 0xFF);
void changeEffectSpeed(int8_t amount); void changeEffectSpeed(int8_t amount);

View File

@ -77,6 +77,9 @@ void presetFallback(int8_t presetID, int8_t effectID, int8_t paletteID)
} }
} }
/*
* This is no longer needed due to JSON IR mod
*
//Add what your custom IR codes should trigger here. Guide: https://github.com/Aircoookie/WLED/wiki/Infrared-Control //Add what your custom IR codes should trigger here. Guide: https://github.com/Aircoookie/WLED/wiki/Infrared-Control
//IR codes themselves can be defined directly after "case" or in "ir_codes.h" //IR codes themselves can be defined directly after "case" or in "ir_codes.h"
bool decodeIRCustom(uint32_t code) bool decodeIRCustom(uint32_t code)
@ -92,6 +95,7 @@ bool decodeIRCustom(uint32_t code)
if (code != IRCUSTOM_MACRO1) colorUpdated(NOTIFIER_CALL_MODE_BUTTON); //don't update color again if we apply macro, it already does it if (code != IRCUSTOM_MACRO1) colorUpdated(NOTIFIER_CALL_MODE_BUTTON); //don't update color again if we apply macro, it already does it
return true; return true;
} }
*/
void relativeChange(byte* property, int8_t amount, byte lowerBoundary, byte higherBoundary) void relativeChange(byte* property, int8_t amount, byte lowerBoundary, byte higherBoundary)
{ {
@ -160,30 +164,27 @@ void decodeIR(uint32_t code)
return; return;
} }
lastValidCode = 0; irTimesRepeated = 0; lastValidCode = 0; irTimesRepeated = 0;
if (decodeIRCustom(code)) return; // if (decodeIRCustom(code)) return;
if (code > 0xFFFFFF) return; //invalid code if (code > 0xFFFFFF) return; //invalid code
//else if (code > 0xF70000 && code < 0xF80000) decodeIR24(code); //is in 24-key remote range
//else if (code > 0xFF0000) {
switch (irEnabled) { switch (irEnabled) {
case 1: case 1:
if (code > 0xF80000) { if (code > 0xF80000) {
decodeIR24OLD(code); // white 24-key remote (old) - it sends 0xFF0000 values decodeIR24OLD(code); // white 24-key remote (old) - it sends 0xFF0000 values
} else { } else {
decodeIR24(code); //is in 24-key remote range decodeIR24(code); //is in 24-key remote range
} }
break; break;
case 2: decodeIR24CT(code); break; // white 24-key remote with CW, WW, CT+ and CT- keys case 2: decodeIR24CT(code); break; // white 24-key remote with CW, WW, CT+ and CT- keys
case 3: decodeIR40(code); break; // blue 40-key remote with 25%, 50%, 75% and 100% keys case 3: decodeIR40(code); break; // blue 40-key remote with 25%, 50%, 75% and 100% keys
case 4: decodeIR44(code); break; // white 44-key remote with color-up/down keys and DIY1 to 6 keys case 4: decodeIR44(code); break; // white 44-key remote with color-up/down keys and DIY1 to 6 keys
case 5: decodeIR21(code); break; // white 21-key remote case 5: decodeIR21(code); break; // white 21-key remote
case 6: decodeIR6(code); break; // black 6-key learning remote defaults: "CH" controls brightness, case 6: decodeIR6(code); break; // black 6-key learning remote defaults: "CH" controls brightness,
// "VOL +" controls effect, "VOL -" controls colour/palette, "MUTE" // "VOL +" controls effect, "VOL -" controls colour/palette, "MUTE"
// sets bright plain white // sets bright plain white
case 7: decodeIR9(code); break; case 7: decodeIR9(code); break;
case 8: decodeIRJson(code); break; // any remote configurable with ir.json file case 8: decodeIRJson(code); break; // any remote configurable with ir.json file
default: return; default: return;
} }
//}
if (nightlightActive && bri == 0) nightlightActive = false; if (nightlightActive && bri == 0) nightlightActive = false;
colorUpdated(NOTIFIER_CALL_MODE_BUTTON); //for notifier, IR is considered a button input colorUpdated(NOTIFIER_CALL_MODE_BUTTON); //for notifier, IR is considered a button input
@ -569,7 +570,7 @@ void decodeIRJson(uint32_t code)
JsonObject fdo; JsonObject fdo;
JsonObject jsonCmdObj; JsonObject jsonCmdObj;
sprintf_P(objKey, PSTR("\"0x%X\":"), code); sprintf_P(objKey, PSTR("\"0x%lX\":"), code);
errorFlag = readObjectFromFile("/ir.json", objKey, &irDoc) ? ERR_NONE : ERR_FS_PLOAD; errorFlag = readObjectFromFile("/ir.json", objKey, &irDoc) ? ERR_NONE : ERR_FS_PLOAD;
fdo = irDoc.as<JsonObject>(); fdo = irDoc.as<JsonObject>();
@ -642,9 +643,7 @@ void handleIR()
{ {
if (results.value != 0) // only print results if anything is received ( != 0 ) if (results.value != 0) // only print results if anything is received ( != 0 )
{ {
Serial.print("IR recv\r\n0x"); DEBUG_PRINTF("IR recv: 0x%lX\n", (uint32_t)results.value);
Serial.println((uint32_t)results.value, HEX);
Serial.println();
} }
decodeIR(results.value); decodeIR(results.value);
irrecv->resume(); irrecv->resume();

View File

@ -648,7 +648,6 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
nightlightActive = false; //always disable nightlight when toggling nightlightActive = false; //always disable nightlight when toggling
} }
} }
#endif #endif
//set hue //set hue

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2105231 #define VERSION 2105251
//uncomment this if you have a "my_config.h" file you'd like to use //uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG //#define WLED_USE_MY_CONFIG