Merge branch 'master' of https://github.com/Aircoookie/WLED
This commit is contained in:
commit
0e99c948d6
@ -93,8 +93,8 @@ or remove them and put everything on one line.
|
|||||||
| segment-delay-ms | Delay (milliseconds) between switching on/off each step | 150 |
|
| segment-delay-ms | Delay (milliseconds) between switching on/off each step | 150 |
|
||||||
| on-time-s | Time (seconds) the stairs stay lit after last detection | 5 |
|
| on-time-s | Time (seconds) the stairs stay lit after last detection | 5 |
|
||||||
| bottom-echo-us | Detection range of ultrasonic sensor | 1749 |
|
| bottom-echo-us | Detection range of ultrasonic sensor | 1749 |
|
||||||
| bottomsensor | Manually trigger a down to up animation via API | false |
|
| bottom-sensor | Manually trigger a down to up animation via API | false |
|
||||||
| topsensor | Manually trigger an up to down animation via API | false |
|
| top-sensor | Manually trigger an up to down animation via API | false |
|
||||||
|
|
||||||
|
|
||||||
To read the current settings, open a browser to `http://xxx.xxx.xxx.xxx/json/state` (use your WLED
|
To read the current settings, open a browser to `http://xxx.xxx.xxx.xxx/json/state` (use your WLED
|
||||||
@ -108,8 +108,8 @@ The staircase settings and sensor states are inside the WLED status element:
|
|||||||
"enabled": true,
|
"enabled": true,
|
||||||
"segment-delay-ms": 150,
|
"segment-delay-ms": 150,
|
||||||
"on-time-s": 5,
|
"on-time-s": 5,
|
||||||
"bottomsensor": false,
|
"bottom-sensor": false,
|
||||||
"topsensor": false
|
"tops-ensor": false
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -187,7 +187,7 @@ the API. To simulate triggering the bottom sensor, use:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -X POST -H "Content-Type: application/json" \
|
curl -X POST -H "Content-Type: application/json" \
|
||||||
-d '{"staircase":{"bottomsensor":true}}' \
|
-d '{"staircase":{"bottom-sensor":true}}' \
|
||||||
xxx.xxx.xxx.xxx/json/state
|
xxx.xxx.xxx.xxx/json/state
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -195,7 +195,7 @@ Likewise, to trigger the top sensor, use:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -X POST -H "Content-Type: application/json" \
|
curl -X POST -H "Content-Type: application/json" \
|
||||||
-d '{"staircase":{"topsensor":true}}' \
|
-d '{"staircase":{"top-sensor":true}}' \
|
||||||
xxx.xxx.xxx.xxx/json/state
|
xxx.xxx.xxx.xxx/json/state
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ class UsermodTemperature : public Usermod {
|
|||||||
getTemperature();
|
getTemperature();
|
||||||
|
|
||||||
if (WLED_MQTT_CONNECTED) {
|
if (WLED_MQTT_CONNECTED) {
|
||||||
char subuf[38];
|
char subuf[45];
|
||||||
strcpy(subuf, mqttDeviceTopic);
|
strcpy(subuf, mqttDeviceTopic);
|
||||||
if (-100 <= temperature) {
|
if (-100 <= temperature) {
|
||||||
// dont publish super low temperature as the graph will get messed up
|
// dont publish super low temperature as the graph will get messed up
|
||||||
|
35
usermods/VL53L0X_gestures/readme.md
Normal file
35
usermods/VL53L0X_gestures/readme.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Description
|
||||||
|
|
||||||
|
That usermod implements support of simple hand gestures with VL53L0X sensor: on/off and brightness correction.
|
||||||
|
It can be useful for kitchen strips to avoid any touches.
|
||||||
|
- on/off - just swipe a hand below your sensor ("shortPressAction" is called and can be customized through WLED macros)
|
||||||
|
- brightness correction - keep your hand below sensor for 1 second to switch to "brightness" mode.
|
||||||
|
Configure brightness by changing distance to the sensor (see parameters below for customization).
|
||||||
|
"macroLongPress" is also called here.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Attach VL53L0X sensor to i2c pins according to default pins for your board.
|
||||||
|
2. Add `-D USERMOD_VL53L0X_GESTURES` to your build flags at platformio.ini (plaformio_override.ini) for needed environment.
|
||||||
|
In my case, for example: `build_flags = ${common.build_flags_esp8266} -D RLYPIN=12 -D USERMOD_VL53L0X_GESTURES`
|
||||||
|
3. Add "pololu/VL53L0X" dependency below to `lib_deps` like this:
|
||||||
|
```ini
|
||||||
|
lib_deps = ${env.lib_deps}
|
||||||
|
pololu/VL53L0X @ ^1.3.0
|
||||||
|
```
|
||||||
|
|
||||||
|
My entire `platformio_override.ini` for example (for nodemcu board):
|
||||||
|
```ini
|
||||||
|
[platformio]
|
||||||
|
default_envs = nodemcu
|
||||||
|
|
||||||
|
[env:nodemcu]
|
||||||
|
board = nodemcu
|
||||||
|
platform = ${common.platform_wled_default}
|
||||||
|
platform_packages = ${common.platform_packages}
|
||||||
|
board_build.ldscript = ${common.ldscript_4m1m}
|
||||||
|
build_unflags = ${common.build_unflags}
|
||||||
|
build_flags = ${common.build_flags_esp8266} -D RLYPIN=12 -D USERMOD_VL53L0X_GESTURES
|
||||||
|
lib_deps = ${env.lib_deps}
|
||||||
|
pololu/VL53L0X @ ^1.3.0
|
||||||
|
```
|
121
usermods/VL53L0X_gestures/usermod_vl53l0x_gestures.h
Normal file
121
usermods/VL53L0X_gestures/usermod_vl53l0x_gestures.h
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* That usermod implements support of simple hand gestures with VL53L0X sensor: on/off and brightness correction.
|
||||||
|
* It can be useful for kitchen strips to avoid any touches.
|
||||||
|
* - on/off - just swipe a hand below your sensor ("shortPressAction" is called and can be customized through WLED macros)
|
||||||
|
* - brightness correction - keep your hand below sensor for 1 second to switch to "brightness" mode.
|
||||||
|
* Configure brightness by changing distance to the sensor (see parameters below for customization).
|
||||||
|
* "macroLongPress" is also called here.
|
||||||
|
*
|
||||||
|
* Enabling this mod usermod:
|
||||||
|
* 1. Attach VL53L0X sensor to i2c pins according to default pins for your board.
|
||||||
|
* 2. Add "-D USERMOD_VL53L0X_GESTURES" to your build flags at platformio.ini (plaformio_override.ini) for needed environment.
|
||||||
|
* In my case, for example: build_flags = ${common.build_flags_esp8266} -D RLYPIN=12 -D USERMOD_VL53L0X_GESTURES
|
||||||
|
* 3. Add "pololu/VL53L0X" dependency to lib_deps like this:
|
||||||
|
* lib_deps = ${env.lib_deps}
|
||||||
|
* pololu/VL53L0X @ ^1.3.0
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "wled.h"
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <VL53L0X.h>
|
||||||
|
|
||||||
|
#ifndef VL53L0X_MAX_RANGE_MM
|
||||||
|
#define VL53L0X_MAX_RANGE_MM 230 // max height in millimiters to react for motions
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L0X_MIN_RANGE_OFFSET
|
||||||
|
#define VL53L0X_MIN_RANGE_OFFSET 60 // minimal range in millimiters that sensor can detect. Used in long motions to correct brightnes calculation.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L0X_DELAY_MS
|
||||||
|
#define VL53L0X_DELAY_MS 100 // how often to get data from sensor
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L0X_LONG_MOTION_DELAY_MS
|
||||||
|
#define VL53L0X_LONG_MOTION_DELAY_MS 1000 // how often to get data from sensor
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class UsermodVL53L0XGestures : public Usermod {
|
||||||
|
private:
|
||||||
|
//Private class members. You can declare variables and functions only accessible to your usermod here
|
||||||
|
unsigned long lastTime = 0;
|
||||||
|
VL53L0X sensor;
|
||||||
|
|
||||||
|
bool wasMotionBefore = false;
|
||||||
|
bool isLongMotion = false;
|
||||||
|
unsigned long motionStartTime = 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
sensor.setTimeout(150);
|
||||||
|
if (!sensor.init())
|
||||||
|
{
|
||||||
|
DEBUG_PRINTLN(F("Failed to detect and initialize VL53L0X sensor!"));
|
||||||
|
} else {
|
||||||
|
sensor.setMeasurementTimingBudget(20000); // set high speed mode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (millis() - lastTime > VL53L0X_DELAY_MS)
|
||||||
|
{
|
||||||
|
lastTime = millis();
|
||||||
|
|
||||||
|
int range = sensor.readRangeSingleMillimeters();
|
||||||
|
DEBUG_PRINTF(F("range: %d, brightness: %d"), range, bri);
|
||||||
|
|
||||||
|
if (range < VL53L0X_MAX_RANGE_MM)
|
||||||
|
{
|
||||||
|
if (!wasMotionBefore)
|
||||||
|
{
|
||||||
|
motionStartTime = millis();
|
||||||
|
DEBUG_PRINTF(F("motionStartTime: %d"), motionStartTime);
|
||||||
|
}
|
||||||
|
wasMotionBefore = true;
|
||||||
|
|
||||||
|
if (millis() - motionStartTime > VL53L0X_LONG_MOTION_DELAY_MS) //long motion
|
||||||
|
{
|
||||||
|
DEBUG_PRINTF(F("long motion: %d"), motionStartTime);
|
||||||
|
if (!isLongMotion)
|
||||||
|
{
|
||||||
|
if (macroLongPress)
|
||||||
|
{
|
||||||
|
applyMacro(macroLongPress);
|
||||||
|
}
|
||||||
|
isLongMotion = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set brightness according to range
|
||||||
|
bri = (VL53L0X_MAX_RANGE_MM - max(range, VL53L0X_MIN_RANGE_OFFSET)) * 255 / (VL53L0X_MAX_RANGE_MM - VL53L0X_MIN_RANGE_OFFSET);
|
||||||
|
DEBUG_PRINTF(F("new brightness: %d"), bri);
|
||||||
|
colorUpdated(1);
|
||||||
|
}
|
||||||
|
} else if (wasMotionBefore) { //released
|
||||||
|
long dur = millis() - motionStartTime;
|
||||||
|
|
||||||
|
if (!isLongMotion)
|
||||||
|
{ //short press
|
||||||
|
DEBUG_PRINTF(F("shortPressAction..."));
|
||||||
|
shortPressAction();
|
||||||
|
}
|
||||||
|
wasMotionBefore = false;
|
||||||
|
isLongMotion = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* getId() allows you to optionally give your V2 usermod an unique ID (please define it in const.h!).
|
||||||
|
* This could be used in the future for the system to determine whether your usermod is installed.
|
||||||
|
*/
|
||||||
|
uint16_t getId()
|
||||||
|
{
|
||||||
|
return USERMOD_ID_VL53L0X;
|
||||||
|
}
|
||||||
|
};
|
@ -3108,7 +3108,7 @@ uint16_t WS2812FX::mode_drip(void)
|
|||||||
drops[j].vel += gravity;
|
drops[j].vel += gravity;
|
||||||
|
|
||||||
for (uint16_t i=1;i<7-drops[j].colIndex;i++) { // some minor math so we don't expand bouncing droplets
|
for (uint16_t i=1;i<7-drops[j].colIndex;i++) { // some minor math so we don't expand bouncing droplets
|
||||||
uint16_t pos = uint16_t(drops[j].pos) +i; //this is BAD, returns a pos >= SEGLEN occasionally
|
uint16_t pos = constrain(uint16_t(drops[j].pos) +i, 0, SEGLEN-1); //this is BAD, returns a pos >= SEGLEN occasionally
|
||||||
setPixelColor(pos,color_blend(BLACK,SEGCOLOR(0),drops[j].col/i)); //spread pixel with fade while falling
|
setPixelColor(pos,color_blend(BLACK,SEGCOLOR(0),drops[j].col/i)); //spread pixel with fade while falling
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,14 +192,14 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
|
|||||||
|
|
||||||
for (uint16_t j = 0; j < SEGMENT.grouping; j++) {
|
for (uint16_t j = 0; j < SEGMENT.grouping; j++) {
|
||||||
int indexSet = realIndex + (reversed ? -j : j);
|
int indexSet = realIndex + (reversed ? -j : j);
|
||||||
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
|
|
||||||
if (indexSet >= SEGMENT.start && indexSet < SEGMENT.stop) {
|
if (indexSet >= SEGMENT.start && indexSet < SEGMENT.stop) {
|
||||||
busses.setPixelColor(indexSet + skip, col);
|
|
||||||
if (IS_MIRROR) { //set the corresponding mirrored pixel
|
if (IS_MIRROR) { //set the corresponding mirrored pixel
|
||||||
uint16_t indexMir = SEGMENT.stop - indexSet + SEGMENT.start - 1;
|
uint16_t indexMir = SEGMENT.stop - indexSet + SEGMENT.start - 1;
|
||||||
if (indexMir < customMappingSize) indexMir = customMappingTable[indexMir];
|
if (indexMir < customMappingSize) indexMir = customMappingTable[indexMir];
|
||||||
busses.setPixelColor(indexMir + skip, col);
|
busses.setPixelColor(indexMir + skip, col);
|
||||||
}
|
}
|
||||||
|
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
|
||||||
|
busses.setPixelColor(indexSet + skip, col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { //live data, etc.
|
} else { //live data, etc.
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#define USERMOD_ID_AUTO_SAVE 9 //Usermod "usermod_v2_auto_save.h"
|
#define USERMOD_ID_AUTO_SAVE 9 //Usermod "usermod_v2_auto_save.h"
|
||||||
#define USERMOD_ID_DHT 10 //Usermod "usermod_dht.h"
|
#define USERMOD_ID_DHT 10 //Usermod "usermod_dht.h"
|
||||||
#define USERMOD_ID_MODE_SORT 11 //Usermod "usermod_v2_mode_sort.h"
|
#define USERMOD_ID_MODE_SORT 11 //Usermod "usermod_v2_mode_sort.h"
|
||||||
|
#define USERMOD_ID_VL53L0X 12 //Usermod "usermod_vl53l0x_gestures.h"
|
||||||
|
|
||||||
//Access point behavior
|
//Access point behavior
|
||||||
#define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot
|
#define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot
|
||||||
|
@ -45,6 +45,11 @@
|
|||||||
#include "../usermods/DHT/usermod_dht.h"
|
#include "../usermods/DHT/usermod_dht.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USERMOD_VL53L0X_GESTURES
|
||||||
|
#include <Wire.h> //it's needed here to correctly resolve dependencies
|
||||||
|
#include "../usermods/VL53L0X_gestures/usermod_vl53l0x_gestures.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
void registerUsermods()
|
void registerUsermods()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -87,4 +92,8 @@ void registerUsermods()
|
|||||||
#ifdef USERMOD_DHT
|
#ifdef USERMOD_DHT
|
||||||
usermods.add(new UsermodDHT());
|
usermods.add(new UsermodDHT());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USERMOD_VL53L0X_GESTURES
|
||||||
|
usermods.add(new UsermodVL53L0XGestures());
|
||||||
|
#endif
|
||||||
}
|
}
|
@ -568,7 +568,7 @@ WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager());
|
|||||||
#else
|
#else
|
||||||
#define DEBUG_PRINT(x)
|
#define DEBUG_PRINT(x)
|
||||||
#define DEBUG_PRINTLN(x)
|
#define DEBUG_PRINTLN(x)
|
||||||
#define DEBUG_PRINTF(x)
|
#define DEBUG_PRINTF(x...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WLED_DEBUG_FS
|
#ifdef WLED_DEBUG_FS
|
||||||
|
Loading…
Reference in New Issue
Block a user