This document describes how analog inputs (ADC) work in cm::IOManager.
IOManager analog inputs are settings-driven and provide:
- ADC pin configuration via Settings (GPIO)
- Optional mapping (raw ADC -> scaled value)
- Deadband + minimum event interval support
- Optional alarm thresholds (min/max) with callbacks
- Runtime UI display (scaled value and optional raw view)
Example (ESP32 ADC1 pin recommended when WiFi is used):
ioManager.addAnalogInput(cm::IOManager::AnalogInputBinding{
.id = "ldr_s",
.name = "LDR South",
.defaultPin = 35,
.defaultRawMin = 0,
.defaultRawMax = 4095,
.defaultOutMin = 0.0f,
.defaultOutMax = 100.0f,
.defaultUnit = "%",
.defaultPrecision = 1,
});Analog inputs use short, slot-based keys (ESP32 Preferences safe).
To keep keys short (ESP32 Preferences limit), IOManager uses slot-based keys:
- Analog inputs:
AI%02uX(e.g.AI00P)
Suffix meanings for analog inputs:
P= pinR= raw minS= raw maxM= out minN= out maxU= unitD= deadbandE= min event (ms)A= alarm minB= alarm max
Important: slot-based keys depend on the order of addAnalogInput(...) calls.
The settings exposed in the UI include:
GPIO: ADC pinRaw Min/Raw Max: input range for mappingOut Min/Out Max: output range (scaled)Unit: display onlyDeadband: minimum delta to trigger an event/updateMin Event (ms): emits an update at least every N ms (even if unchanged)
Place persisted inputs in the Settings UI:
ioManager.addAnalogInputToSettingsGroup(
"ldr_s",
"Analog - I/O",
"Analog Inputs",
"LDR South",
10
);Analog channels can be registered for the runtime UI as:
- scaled value (mapped float)
- raw ADC value
These can be shown in different runtime cards/groups.
Scaled value:
ioManager.addAnalogInputToLive(
"ldr_s",
10,
"AI",
"Analog Inputs",
"analog",
"LDR South",
false
);Raw value:
ioManager.addAnalogInputToLive(
"ldr_s",
11,
"AI",
"Analog Inputs",
"analog_raw",
"LDR South (raw)",
true
);You can configure optional alarm thresholds for the scaled value.
- min-only: set only
alarmMin - max-only: set only
alarmMax - both: set
alarmMinandalarmMax
When enabled, IOManager exposes two additional runtime bool fields:
<id>_alarm_min<id>_alarm_max
The WebUI uses these flags for alarm highlighting when present.
Alarm thresholds are also exposed as Settings only when configured:
Alarm MinAlarm Max
Use AnalogAlarmCallbacks to distinguish which boundary triggered:
onMinEnter/onMinExitonMaxEnter/onMaxExit
You can also use combined callbacks (onEnter/onExit or onStateChanged) if you only care whether any alarm is active.
Typical sketch order:
addAnalogInput(...)/addAnalogInputToSettingsGroup(...)/ optionaladdAnalogInputToLive(...)/ optionaladdAnalogInputToLiveWithAlarm(...)ConfigManager.loadAll()(loads persisted pins/mapping)ioManager.begin()- In
loop():ioManager.update()continuously reads inputs, updates runtime values, and evaluates alarms
| Method | Overloads / Variants | Description | Notes |
|---|---|---|---|
cm::IOManager::addAnalogInputToSettingsGroup |
addAnalogInputToSettingsGroup(..., const char* pageName, ..., const char* groupName, int order) |
Places analog input settings into Settings UI layout. | Supports page/card/group variants. |
cm::IOManager::addAnalogInputToLive |
addAnalogInputToLive(const char* id, int order, const char* pageName, const char* cardName, const char* groupName, const char* labelOverride = nullptr, bool showRaw = false) |
Adds analog input value to Live UI. | showRaw=true exposes raw ADC values. |
cm::IOManager::addAnalogInputToLiveWithAlarm |
addAnalogInputToLiveWithAlarm(..., const AnalogAlarmThreshold* alarmMin, const AnalogAlarmThreshold* alarmMax, ...) |
Adds analog input value with runtime alarm indicators. | Emits <id>_alarm_min / <id>_alarm_max fields. |
cm::IOManager::configureAnalogInputAlarm |
configureAnalogInputAlarm(const char* id, const AnalogAlarmThreshold* alarmMin, const AnalogAlarmThreshold* alarmMax, const AnalogAlarmCallbacks& callbacks) |
Configures analog alarm thresholds/callbacks independently of layout. | Use to update alarm behavior post-registration. |