firmware-base/docs/3PosAnalog.md

4.1 KiB

title description keywords
3-Position Analog Switch A component for handling 3-position analog switches with UP/MIDDLE/DOWN positions
analog
switch
3-position
input
modbus
ESP32

3-Position Analog Switch

Path: src/components/3PosAnalog.h

Revision History: Initial documentation

The 3-Position Analog Switch (Pos3Analog) component provides an interface to hardware switches with three positions (UP, MIDDLE, DOWN). It reads from two analog input pins and determines the current position. The component supports both local (physical) and remote (Modbus) control modes, making it suitable for industrial automation applications that require flexible control mechanisms.

Requirements

Hardware

  • ESP32 microcontroller
  • Two analog input pins for position detection (upPin and downPin)

Software

  • Arduino framework
  • ArduinoLog library
  • Modbus TCP support

Features

  • Three-position state detection (UP, MIDDLE, DOWN)
  • Dual control modes:
    • LOCAL: Position determined by physical input readings
    • REMOTE: Position controlled via Modbus
  • Modbus integration with read/write capabilities
  • Configurable sampling interval
  • State change notifications
  • Comprehensive error handling and validation

Dependencies

  • Component: Base component class providing core functionality
  • ModbusTCP: Modbus TCP protocol implementation
  • Bridge: Serial command bridge for component communication
  • App: Application framework integration
graph TD
    Pos3Analog --> Component
    Pos3Analog --> ModbusTCP
    Pos3Analog --> Bridge
    Component --> App

Behaviour

The component operates in one of two modes (LOCAL or REMOTE) and has three possible positions (UP, MIDDLE, DOWN).

stateDiagram-v2
    [*] --> LOCAL
    LOCAL --> REMOTE: Modbus Write
    REMOTE --> LOCAL: Modbus Write
    
    state LOCAL {
        [*] --> MIDDLE
        MIDDLE --> UP: upPin Active
        MIDDLE --> DOWN: downPin Active
        UP --> MIDDLE: No pins Active
        DOWN --> MIDDLE: No pins Active
    }
    
    state REMOTE {
        [*] --> REMOTE_MIDDLE
        REMOTE_MIDDLE --> REMOTE_UP: Modbus Write
        REMOTE_MIDDLE --> REMOTE_DOWN: Modbus Write
        REMOTE_UP --> REMOTE_MIDDLE: Modbus Write
        REMOTE_DOWN --> REMOTE_MIDDLE: Modbus Write
    }

TODOs

Performance

  • Consider implementing debounce functionality for more stable readings
  • Optimize analog reading frequency based on application requirements

Security

  • Implement authentication for remote control mode changes
  • Add permission levels for Modbus write operations

Compliance

  • Ensure compliance with industrial control systems standards
  • Verify compatibility with Modbus specification

Recommendations

  • Use pull-up or pull-down resistors on the analog inputs for more reliable readings
  • Implement filtering for noisy environments
  • Consider adding hysteresis to prevent rapid state changes near thresholds

Example

Below is an example of how to initialize and use the 3-Position Analog Switch component:

#ifdef AUX_ANALOG_3POS_SWITCH_0
  analog3PosSwitch_0 = new Pos3Analog(
      this,                            // owner
      AUX_ANALOG_3POS_SWITCH_0,        // upPin
      AUX_ANALOG_3POS_SWITCH_0 + 1,    // downPin (assuming sequential pins)
      COMPONENT_KEY_ANALOG_3POS_SWITCH_0, // id
      MB_ANALOG_3POS_SWITCH_0_ADDR     // modbusAddress
  );
  if (analog3PosSwitch_0)
  {
    components.push_back(analog3PosSwitch_0);
    Log.infoln(F("3-Position Analog Switch 0 initialized. UpPin:%d, DownPin:%d, ID:%d, MB:%d"),
               AUX_ANALOG_3POS_SWITCH_0, AUX_ANALOG_3POS_SWITCH_0 + 1,
               COMPONENT_KEY_ANALOG_3POS_SWITCH_0, MB_ANALOG_3POS_SWITCH_0_ADDR);
  }
  else
  {
    Log.errorln(F("3-Position Analog Switch 0 initialization failed."));
  }
#endif

References