Added analog button/potentiometer support (partial)

This commit is contained in:
Blaž Kristan 2021-05-21 12:08:47 +02:00
parent 651b4d2461
commit 0ada09891c
6 changed files with 52 additions and 13 deletions

View File

@ -35,8 +35,6 @@ bool isButtonPressed(uint8_t i)
case BTN_TYPE_TOUCH: case BTN_TYPE_TOUCH:
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
if (touchRead(btnPin[i]) <= touchThreshold) return true; if (touchRead(btnPin[i]) <= touchThreshold) return true;
DEBUG_PRINT(F("Touch value: "));
DEBUG_PRINTLN(touchRead(btnPin[i]));
#endif #endif
break; break;
} }
@ -70,13 +68,53 @@ void handleSwitch(uint8_t b)
} }
void handleAnalog(uint8_t b)
{
static uint8_t oldRead[WLED_MAX_BUTTONS];
#ifdef ESP8266
#define ANALOGPIN A0
#else
#define ANALOGPIN btnPin[b]
#endif
uint8_t aRead = analogRead(ANALOGPIN) >> 4; // convert 12bit read to 8bit
if (oldRead[b] == aRead) return; // no change in reading
// 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 change in analog read was detected change global brightness
bri = aRead;
} 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
} else {
seg.setOpacity(aRead, macroDoublePress[b]);
seg.setOption(SEG_OPTION_ON, 1, macroDoublePress[b]);
}
}
} else {
//TODO:
// we can either trigger a preset depending on the level (between short and long entries)
// or use it for RGBW direct control
}
colorUpdated(NOTIFIER_CALL_MODE_DIRECT_CHANGE);
}
void handleButton() void handleButton()
{ {
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
handleAnalog(b); continue;
}
if (buttonType[b] == BTN_TYPE_SWITCH) { //button is not momentary, but switch. This is only suitable on pins whose on-boot state does not matter (NOT gpio0) if (buttonType[b] == BTN_TYPE_SWITCH || buttonType[b] == BTN_TYPE_SWITCH_ACT_HIGH) { //button is not momentary, but switch. This is only suitable on pins whose on-boot state does not matter (NOT gpio0)
handleSwitch(b); continue; handleSwitch(b); continue;
} }

View File

@ -156,10 +156,11 @@
#define BTN_TYPE_NONE 0 #define BTN_TYPE_NONE 0
#define BTN_TYPE_RESERVED 1 #define BTN_TYPE_RESERVED 1
#define BTN_TYPE_PUSH 2 #define BTN_TYPE_PUSH 2
#define BTN_TYPE_PUSH_ACT_HIGH 3 //not implemented #define BTN_TYPE_PUSH_ACT_HIGH 3
#define BTN_TYPE_SWITCH 4 #define BTN_TYPE_SWITCH 4
#define BTN_TYPE_SWITCH_ACT_HIGH 5 //not implemented #define BTN_TYPE_SWITCH_ACT_HIGH 5
#define BTN_TYPE_TOUCH 6 #define BTN_TYPE_TOUCH 6
#define BTN_TYPE_ANALOG 7
//Ethernet board types //Ethernet board types
#define WLED_NUM_ETH_TYPES 5 #define WLED_NUM_ETH_TYPES 5

View File

@ -295,6 +295,7 @@ Reverse (rotated 180°): <input type="checkbox" name="CV${i}">
c += `<option value="4" ${t==4?"selected":""}>Switch</option>`; c += `<option value="4" ${t==4?"selected":""}>Switch</option>`;
c += `<option value="5" ${t==4?"selected":""}>Switch inverted</option>`; c += `<option value="5" ${t==4?"selected":""}>Switch inverted</option>`;
c += `<option value="6" ${t==6?"selected":""}>Touch</option>`; c += `<option value="6" ${t==6?"selected":""}>Touch</option>`;
c += `<option value="7" ${t==7?"selected":""}>Analog</option>`;
c += `</select>`; c += `</select>`;
c += `<span style="cursor: pointer;" onclick="off('${bt}')">&nbsp;&#215;</span><br>`; c += `<span style="cursor: pointer;" onclick="off('${bt}')">&nbsp;&#215;</span><br>`;
gId("btns").innerHTML = c; gId("btns").innerHTML = c;

View File

@ -76,11 +76,11 @@
} }
} }
function addRow(i,p,l,d) { function addRow(i,p,l,d) {
var t = gId("macros"); // table var t = gId("macros");
var rCnt = t.rows.length; // get the number of rows. var rCnt = t.rows.length;
var tr = t.insertRow(rCnt); // table row. var tr = t.insertRow(rCnt);
var td = document.createElement('td'); // TABLE DEFINITION. var td = document.createElement('td');
td = tr.insertCell(0); td = tr.insertCell(0);
td.innerHTML = `Button ${i}:`; td.innerHTML = `Button ${i}:`;
td = tr.insertCell(1); td = tr.insertCell(1);
@ -93,7 +93,6 @@
function GetV() function GetV()
{ {
//values injected by server while sending HTML //values injected by server while sending HTML
addRow(0,23,4,0);
} }
</script> </script>
<style> <style>
@ -176,7 +175,7 @@
<td>short<br>on-&gt;off</td> <td>short<br>on-&gt;off</td>
<td>long<br>off-&gt;on</td> <td>long<br>off-&gt;on</td>
<td>double<br>N/A</td> <td>double<br>N/A</td>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
</tbody> </tbody>

File diff suppressed because one or more lines are too long

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2105201 #define VERSION 2105211
//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