56 lines
2.0 KiB
Markdown
56 lines
2.0 KiB
Markdown
# Analog Level Switch
|
|
|
|
**Revision History**: initial documentation
|
|
|
|
A component that reads an analog input and interprets it as a multi-position switch. It converts various ADC readings into discrete slot positions based on configured thresholds.
|
|
|
|
## REQUIREMENTS
|
|
|
|
- An analog IO pin on the ESP-32 platform
|
|
- A voltage divider circuit for generating multiple discrete voltage levels: typically a pull-down resistor to ground and multiple value resistors to VCC
|
|
- Modbus register and configuration parameters for number of levels, ADC step size, and offset
|
|
|
|
## FEATURES
|
|
|
|
- Supports multiple level detection in a single analog input (default maximum of 32 slots)
|
|
- Built-in signal smoothing with configurable moving-average filter
|
|
- Debounce mechanism to ensure stable position detection
|
|
- Hysteresis for preventing flickering between adjacent levels
|
|
- Modbus integration for reading slot states and raw ADC values
|
|
- Configurable ADC thresholds: offset and step size per slot
|
|
|
|
## TODOS
|
|
|
|
- Add support for calibration routine
|
|
- Implement configurable smoothing parameters through Modbus
|
|
- Add feature to expose the detection thresholds through Modbus
|
|
- Improve documentation for resistor value calculation in the divider circuit
|
|
|
|
## EXAMPLE
|
|
|
|
```cpp
|
|
#hifdef PIN_ANALOG_LEVEL_SWITCH_0
|
|
analogLevelSwitch_0 = new AnalogLevelSwitch(
|
|
this, // owner
|
|
PIN_ANALOG_LEVEL_SWITCH_0, // analogPin
|
|
ALS_0_NUM_LEVELS, // numLevels
|
|
ALS_0_ADC_STEP, // levelStep
|
|
ALS_0_ADC_OFFSET, // adcValueOffset
|
|
ID_ANALOG_LEVEL_SWITCH_0, // id
|
|
ALS_0_MB_ADDR // modbusAddress
|
|
);
|
|
if (analogLevelSwitch_0)
|
|
{
|
|
components.push_back(analogLevelSwitch_0);
|
|
Log.infoln(F("AnalogLevelSwitch_0 initialized. Pin:%d, Levels:%d, Step:%d, Offset:%d, ID:%d, MB:%d"),
|
|
PIN_ANALOG_LEVEL_SWITCH_0, ALS_0_NUM_LEVELS,
|
|
ALS_0_ADC_STEP, ALS_0_ADC_OFFSET,
|
|
ID_ANALOG_LEVEL_SWITCH_0, ALS_0_MB_ADDR);
|
|
}
|
|
else
|
|
{
|
|
Log.errorln(F("AnalogLevelSwitch_0 initialization failed."));
|
|
}
|
|
#endif
|
|
```
|