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
#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 {
private:
@ -34,7 +29,7 @@ class UsermodTemperature : public Usermod {
bool degC = true;
unsigned long readingInterval = USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL;
// 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
// used to determine when we can read the sensors temperature
// 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
// indicates requestTemperatures has been called but the sensor measurement is not complete
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
// temperature if flashed to a board without a sensor attached
bool disabled = false;
@ -67,7 +58,7 @@ class UsermodTemperature : public Usermod {
for (i=2; i < 8; i++) oneWire->read(); // read unused bytes
result = (data[1]<<8) | data[0];
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;
oneWire->reset();
oneWire->write(0xCC); // skip ROM
@ -86,7 +77,6 @@ class UsermodTemperature : public Usermod {
temperature = readDallas();
lastMeasurement = millis();
waitingForConversion = false;
readTemperatureComplete = true;
DEBUG_PRINTF("Read temperature %2.1f.\n", temperature);
}
@ -197,14 +187,6 @@ class UsermodTemperature : public Usermod {
JsonArray temp = user.createNestedArray(FPSTR(_name));
//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) {
temp.add(0);
temp.add(F(" Sensor Error!"));

View File

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

View File

@ -41,7 +41,6 @@ bool isButtonPressed(uint8_t i)
return false;
}
void handleSwitch(uint8_t b)
{
if (buttonPressedBefore[b] != isButtonPressed(b)) {
@ -67,52 +66,63 @@ void handleSwitch(uint8_t b)
}
}
void handleAnalog(uint8_t b)
{
static uint8_t oldRead[WLED_MAX_BUTTONS];
#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
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
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 (!macroButton[b] && !macroLongPress[b]) {
// 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 (aRead == 0)
toggleOnOff();
else
bri = aRead;
if (aRead == 0) {
briLast = bri;
bri = 0;
} else{
bri = aRead << 3;
}
} else {
// otherwise use "double press" for segment selection
//uint8_t mainSeg = strip.getMainSegmentId();
WS2812FX::Segment& seg = strip.getSegment(macroDoublePress[b]);
if (aRead == 0) {
seg.setOption(SEG_OPTION_ON, 0, macroDoublePress[b]); // off
seg.setOption(SEG_OPTION_ON, 0); // off
} else {
seg.setOpacity(aRead, macroDoublePress[b]);
seg.setOption(SEG_OPTION_ON, 1, macroDoublePress[b]);
seg.setOpacity(aRead << 3, 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 {
//TODO:
// we can either trigger a preset depending on the level (between short and long entries)
// 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);
}
void handleButton()
{
static unsigned long lastRead = 0UL;
for (uint8_t b=0; b<WLED_MAX_BUTTONS; b++) {
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;
}

View File

@ -75,7 +75,7 @@ void sendHuePoll();
void onHueData(void* arg, AsyncClient* client, void *data, size_t len);
//ir.cpp
bool decodeIRCustom(uint32_t code);
//bool decodeIRCustom(uint32_t code);
void applyRepeatActions();
void relativeChange(byte* property, int8_t amount, byte lowerBoundary = 0, byte higherBoundary = 0xFF);
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
//IR codes themselves can be defined directly after "case" or in "ir_codes.h"
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
return true;
}
*/
void relativeChange(byte* property, int8_t amount, byte lowerBoundary, byte higherBoundary)
{
@ -160,10 +164,8 @@ void decodeIR(uint32_t code)
return;
}
lastValidCode = 0; irTimesRepeated = 0;
if (decodeIRCustom(code)) return;
// if (decodeIRCustom(code)) return;
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) {
case 1:
if (code > 0xF80000) {
@ -183,7 +185,6 @@ void decodeIR(uint32_t code)
case 8: decodeIRJson(code); break; // any remote configurable with ir.json file
default: return;
}
//}
if (nightlightActive && bri == 0) nightlightActive = false;
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 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;
fdo = irDoc.as<JsonObject>();
@ -642,9 +643,7 @@ void handleIR()
{
if (results.value != 0) // only print results if anything is received ( != 0 )
{
Serial.print("IR recv\r\n0x");
Serial.println((uint32_t)results.value, HEX);
Serial.println();
DEBUG_PRINTF("IR recv: 0x%lX\n", (uint32_t)results.value);
}
decodeIR(results.value);
irrecv->resume();

View File

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

View File

@ -8,7 +8,7 @@
*/
// 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
//#define WLED_USE_MY_CONFIG