Overview
EQSP32 is a compact, powerful, and user-friendly Industrial IoT ESP32 PLC controller, featuring Wi-Fi and Bluetooth for wireless connectivity and Ethernet, ideal for a broad range of Industrial/Home IoT automation, remote monitoring and control, and instrumentation applications.
It offers the convenience of a mini Programmable Logic Controller (PLC) with its DIN-rail mount and screw-terminal design, coupled with the power and flexibility of an open-architecture embedded 32-bit computer.
At its core, the EQSP32 is powered by the ESP32-S3, a widely used System on Chip known for its high-performance dual-core processor and integrated wireless radio. This open architecture lets users leverage the extensive ecosystem of tools and software available for the ESP32, amplifying the capabilities of the EQSP32.
Furthermore, with Erqos' Generative AI Programming Technology, users can develop applications with only a fraction of the skills and time normally required in typical PLC or embedded development. By describing their needs in plain English, the Erqos AI Assistant can generate the necessary code in seconds, enabling extremely fast IoT automation project development with minimal coding expertise.
The EQSP32 is equipped with 16 configurable I/O terminals for interfacing with all common types of sensors and actuators, RS232/485 communication, and an optional CAN bus interface, making it suitable for a wide array of internet-connected automation and monitoring applications.
Erqos' comprehensive approach makes the EQSP32 a complete end-to-end solution, from interfacing with the physical environment to offering smartphone-operated user interfaces. This includes a variety of interfaces for different sensors and actuators, a powerful processing unit, and intuitive software for seamless Wi-Fi connectivity and tools to develop custom smartphone apps. Lastly, the EQSP32 features an expansion connector for easy addition of add-on modules, ensuring the system can grow alongside the evolving needs of its users.
Key Features
Processing & Memory
- Dual-core ESP32-S3 SoC running at 240 MHz with 512 kB RAM and 8 MB Flash
Power
- Integrated 7–26 V DC power input DC/DC converter
- 5 V, 1 A output for supplying user sensors and devices
- Continuous monitoring of power supply voltages
Connectivity & Communications
- Integrated Wi-Fi and Bluetooth Low Energy (BLE) connectivity
- Ethernet connection (version dependent)
- Software-selectable RS232 / RS485 serial port
- Modbus and DMX support on RS485
- CAN bus interface
- Surge protection on RS232/485 and CAN interfaces
- Front-facing USB-C connector for programming
16 EQUniversal I/O terminals with software-configurable modes
- High-speed 0–5 V logic-level digital input
- Digital inputs with debounce delay
- High-speed data, logic-level output up to 1 Mbit/s
- Open-collector on/off outputs
- Open-collector PWM outputs
- Open-collector output power-optimized for relay coils
- 0–5 V or 0–10 V absolute-voltage analog inputs (version dependent)
- 4–20 mA current-loop sensor input (version dependent)
- Analog inputs relative to the 5 V supply
- NTC temperature-sensor analog inputs
- Analog and temperature modes are available on inputs 1 to 8 only
- Protected, 24 V-tolerant inputs
- 12-bit analog input resolution
- Built-in 16-channel PWM controller
Output Drivers & Protection
- 1 A max per open-collector output
- Current-limited and thermally protected output drivers
- Flyback diodes on each output for safe and efficient switching of inductive loads
- Built-in watchdog timer disables the open-collector outputs in case of software failure
Expansion
- Expansion connector for up to 16 add-on modules for additional I/O or special-function interfaces (e.g. pH sensor, stepper driver, energy sensor)
System Supervisor & Software
Integrated System Supervisor software handles the following core functions:
- Initial Wi-Fi setup using the EQConnect smartphone app
- Connection to Wi-Fi and clock/calendar sync over the internet
- Input/output and PWM updates
- Status check and LED indicator updates
- Connection to a real-time database
- I/O state and variable synchronization with a cloud database
- Library for efficient and transparent handling of pin, peripheral, and connectivity control and configuration
- Compatible with ESPHome
- Generative AI coding assistant trained on the System Supervisor and library
- Works with the Arduino IDE and VS Code
Mechanical & Environmental
- Compact, 4SU-wide (70 mm) DIN-rail-mount enclosure with 24 screw terminals
- IP20 protection
- Ambient temperature: −20 °C min to 55 °C max
Applications
The EQSP32 fits a broad range of connected automation, monitoring, and instrumentation use cases:
- Home automation
- Industrial monitoring & control
- HVAC systems
- IoT automation
- Environmental monitoring
- Agricultural applications
- Energy management
- Healthcare monitoring
- Retail and inventory management
- Robotics and automation
- Educational projects
- Entertainment and art installations
Models & Features
The EQSP32 is available in three variants. The table below summarizes the differences between models.
| Feature | EQSP32C | EQSP32C-X | EQSP32CE |
|---|---|---|---|
| Processing Unit | |||
| MCU | ESP32-S3 Mini | ESP32-S3 Mini | ESP32-S3 Mini |
| Core | Dual Core ×240 MHz | Dual Core ×240 MHz | Dual Core ×240 MHz |
| RAM Memory | 512 kB | 512 kB | 512 kB |
| Flash Memory | 8 MB | 8 MB | 8 MB |
| I/O Capabilities | |||
| Total I/Os | 16 | 16 | 16 |
| Digital Inputs | 16 | 16 | 16 |
| Digital Outputs (Solid State) | 16 PWM (1 A each) | 16 PWM (1 A each) | 16 PWM (1 A each) |
| Analog Inputs (Voltage) | 8 (0–5 V) | 8 (0–5 V) | 8 (0–10 V) |
| Analog Inputs (Current) | No | No | 8 (4–20 mA) |
| Protected Terminals | ✓ | ✓ | ✓ |
| Wired Connectivity | |||
| Ethernet | No | No | ✓ |
| CAN Bus | ✓ | ✓ | ✓ |
| RS485 (Serial) | ✓ | ✓ | ✓ |
| RS232 (Serial) | ✓ | ✓ | ✓ |
| Wireless Connectivity | |||
| Wi-Fi (2.4 GHz) | ✓ | ✓ | ✓ |
| Bluetooth (BLE) | ✓ | ✓ | ✓ |
| Antenna | Internal | External | Internal |
| Other Features | |||
| Supply Input Monitoring | ✓ | ✓ | ✓ |
| Supply Output Monitoring | ✓ | ✓ | ✓ |
| Mounting | DIN Rail | DIN Rail | DIN Rail |
| Expandable | ✓ | ✓ | ✓ |
| Number of Expansions | 15 | 15 | 15 |
Block Diagrams
The following block diagrams show the internal architecture of the EQSP32 controller variants.
System Specifications
| Module | Features |
|---|---|
| Software | |
| Precompiled proprietary library for pin and peripheral modes and configurations | |
| Transparent connectivity handling using BLE, Wi-Fi and Ethernet | |
| Interfacing entities for easy MQTT integrations | |
| Compatibility | |
| Home Assistant integration using MQTT (automatic MQTT device discovery) | |
| Compatible with Arduino IDE and VS Code (using PlatformIO) | |
| Processor | |
| Dual-Core Xtensa LX7 MCU at 240 MHz | |
| Dedicated user-program processor | |
| 512 kB RAM / 8 MB Flash memory | |
| Power Management | |
| Integrated DC/DC, 7 V to 26 V DC power input | |
| Supply output 5 V @ 1 A for powering external peripherals | |
| Input and output supply monitoring | |
| I/O Terminals | |
| 16 × multipurpose I/Os (digital/analog input/output), TTL levels, over-voltage protection | |
| 8 × 12-bit ADCs | |
| 16 × pull-down power PWM outputs | |
| Power PWM Output | |
| 16 × 1 A power pull-down PWM outputs | |
| Externally supplied up to 26 V for more flexibility | |
| Integrated flyback diodes to VInput for inductive loads (solenoids & relay coils) | |
| Short-circuit, over-current, over-voltage and over-temperature protection | |
| Communication | |
| RS232 | |
| RS485 (half duplex), supports Modbus and DMX | |
| CAN bus | |
| Indications | |
| Green LED for power indication | |
| Red LED for device status | |
| 2 × blue LEDs for BLE and Wi-Fi connectivity status | |
| Buzzer for audio indications | |
| Mounting | |
| Standard DIN-rail push-fit mounting with spring mechanism | |
| Expandability | |
| Push-fit expansion-module mounting | |
| Specialized expansion modules for niche applications and system extension | |
| Automatic module enumeration, detection and characterization | |
Certification & Compliance
Applicable standards for CE compliance under Directive 2014/53/EU (RED):
| Area | Applicable Standard(s) |
|---|---|
| Safety (Electrical) | EN IEC 62368-1:2020 + A11:2020 |
| Outdoor Safety | EN 62368-1 Annex Y |
| RF Exposure / Health | EN IEC 62311:2020, EN 50566:2017, EN 62479:2010, EN 50663:2017, EN 50665 |
| EMC (General / IT) | EN 55032, EN 55024 (or EN 55035) |
| EMC (Wireless) | ETSI EN 301 489-1 V2.2.3, ETSI EN 301 489-17 V3.2.4 |
| Industrial EMC | ETSI EN 303 446-1 V1.2.1 (references EN 61000-6-2, EN 61000-6-4, and IT EMC standards) |
| Radio (Wi-Fi / BLE) | ETSI EN 300 328 V2.2.2 (Full + Spurious only), ETSI EN 300 440 V2.2.1 (Full + Spurious only), ETSI EN 301 893 V2.1.1 (Spurious only) |
| Environmental | Directive 2011/65/EU (RoHS) |
Electrical Specifications
Absolute Maximum Values
| Pin | Type | Min. | Typ. | Max. | Unit |
|---|---|---|---|---|---|
| Supply In + to GND | Power In | 28 | V | ||
| 5V Out + to GND | Power Out | 2 | A | ||
| Tx / A, Rx / B to GND | In/Out | −15 | 15 | V | |
| CAN H, CAN L to GND | In/Out | −21 | 21 | V | |
| ADIO to GND | In/Out | −0.5 | VIn * | V | |
| ADIO (output drive) | Out | 1.3 | A |
Warning — (*) ADIO voltage should never exceed the VIn voltage of the EQSP32 for steady states, or else the flyback diodes will conduct continuously.
Recommended Operating Conditions & Typical Values
| Pin | Type | Min. | Typ. | Max. | Unit |
|---|---|---|---|---|---|
| Supply In + | Power In | 7 | 12 to 24 | 26 | V |
| 5V Out + | Power Out | 4.98 | 5 | 5.02 | V |
| 5V Out + (current) | Power Out | 1 | A | ||
| RS232 Tx | Out | −12 | 12 | V | |
| RS232 Rx | In | −12 | 12 | V | |
| RS485 A, B | In/Out | 0 | 5 | V | |
| CAN H | Out (dominant) | 2.75 | 3.5 | 4.5 | V |
| CAN L | Out (dominant) | 0.5 | 1.5 | 2.25 | V |
| CAN L to CAN H | In (differential) | 0.5 | 0.7 | 0.9 | V |
| ADIO — High (1) | In/Out | 3.3 | 5 to VIn | VIn * | V |
| ADIO — Low (0) | In/Out | −0.5 | 0 | 1.3 | V |
| ADIO — Analog | In | 0 | 5.5 | V | |
| ADIO — Power PWM | Out | 1 | A |
Pinout
The EQSP32 uses two screw-terminal connectors, X1 and X2, plus a front-facing USB-C programming port.
X1 — Screw Terminal Connector 1
X1 accommodates the power-supply input pins, the serial communication pins, and 8 ADIO pins.
| Pin | Function | Type |
|---|---|---|
| GND | DC Power Input − (GND) * | POWER IN |
| VIn | DC Power Input + (10–24 V) | POWER IN |
| 1 … 8 | Multipurpose I/O ** | ADIO |
| Tx / A | RS232 Tx / RS485 A | SERIAL |
| Rx / B | RS232 Rx / RS485 B | SERIAL |
(*) DC Power Input GND is common with DC Power Output GND.
(**) X1 ADIO pins also support analog input (AIN) functionality.
X2 — Screw Terminal Connector 2
X2 accommodates the power-supply output pins, the CAN bus communication (or optional analog output), and 8 ADIO pins.
| Pin | Function | Type |
|---|---|---|
| GND | DC Power Output − (GND) * | POWER OUT |
| 5V | DC Power Output + (5 V) | POWER OUT |
| 9 … 16 | Multipurpose I/O | DIO |
| H | CAN H | CAN bus |
| L | CAN L | CAN bus |
(*) DC Power Output GND is common with DC Power Input GND.
Powering EQSP32
To power the EQSP32 from the grid, an AC/DC converter is needed. It is recommended that a minimum 5 W AC/DC power supply is used to power the EQSP32 main module.
For driving additional devices and loads, either directly from the AC/DC supply or from the EQSP32's 5 V DC output, the power supply's rating must be calculated to meet or exceed the total power demand of the application.
For safety and ease of use, it is strongly recommended that a main circuit breaker is used to completely isolate the AC/DC supply from the grid.
When programming the EQSP32, cut the VIn power so the device runs only on the USB-C 5 V supply.
Warning — Make sure the appropriate ground-fault circuit breaker, fuses or circuit breakers, and any other necessary protective components are used if there is any risk of user electrocution.
Power Management
Power Distribution & Monitoring
The EQSP32 continuously monitors both the power-supply input voltage and the internally generated 5 V output. The 5 V output is also used as a voltage reference — for example when connecting a thermistor — so internal monitoring results in more accurate measurements.
The EQSP32 is also powered from the USB 5 V, but this voltage is only used internally. When programming the EQSP32, it is recommended that the external VIn is shut down and only the USB 5 V is used.
| Usage | |
eqsp32.readInputVoltage() | Returns the measured voltage on VIn (7–26 V) in mV. |
eqsp32.readOutputVoltage() | Returns the measured voltage on VOut (5 V) in mV. |
Integrated 5 V Power Supply
Any number of external devices, loads, and sensors may be powered directly from the integrated 5 V power supply, as long as the combined continuous consumption is up to 1 A.
The integrated 5 V supply is heavily filtered and monitored. The user has access to the internal 5 V analog readings, and for best accuracy it is recommended that this supply is used as the reference.
Visual & Audio Indications
While the proprietary library is downloaded and running, the EQ System Supervisor monitors the EQSP32's status and its Bluetooth/Wi-Fi status. The visual indicators (LEDs) are automatically updated to reflect the device's state.
The internal buzzer sounds once at the beginning of the power cycle, indicating that the library is running. The user may also drive the audio indicator from their program using the library API.
Power LED (green)
| On | Powered on |
| Off | No power |
Status LED (red)
| Off | No errors |
| Blink | Supply under-voltage |
| Flashing | Supply over-voltage |
| Blink | Internal fault |
| On | Default timezone configuration |
Bluetooth LED (blue)
| Off | Bluetooth disconnected |
| Flashing | Bluetooth advertising |
| On | Bluetooth connected |
Wi-Fi LED (blue)
| Off | Wi-Fi disconnected |
| Flashing | Wi-Fi scanning / trying to connect |
| On | Wi-Fi connected |
Mechanical Dimensions
All dimensions are in millimetres with a ±0.1 mm tolerance.
Multipurpose I/O (ADIO)
All ADIO pins support DIN, DOUT, and POUT modes. On connector X1, pins 1–8 also support AIN mode. In addition to the core modes, there are special modes that extend a pin's functionality. For a pin to support a special mode, it must support the corresponding core mode.
| Mode | Type | Function |
|---|---|---|
| Digital Input (DIN) | Input | Digital |
| Switch Input (SWT) — special DIN | Input | Digital |
| Pulse Capture Counter (PCC) — DIO 9…16 | Input | Digital |
| Analog Input (AIN) — ADIO 1…8 | Input | Analog |
| Current Input (CIN) — ADIO 1…8 | Input | Analog |
| Relative Analog Input (RAIN) — special AIN | Input | Analog |
| Temperature Input (TIN) — special AIN | Input | Analog |
| Power PWM Output (POUT) | Output | PWM |
| Relay (RELAY) — special POUT | Output | PWM |
Digital Input (DIN)
In digital input mode (DIN), the pin reads 1 (HIGH) if a voltage between 2.5 V and 24 V is applied, or 0 (LOW) if the voltage is between 0 V and 1.3 V. When a trigger mode other than STATE is used, the read value is latched and automatically cleared after being read.
ON_RISING— latches true when at least one rising edge is detected since the last read; resets after being read.ON_FALLING— latches true when at least one falling edge is detected since the last read; resets after being read.ON_TOGGLE— latches true when any edge (rising or falling) is detected since the last read; resets after being read.
| Configuration | |
eqsp32.pinMode(nn, DIN) |
|
| Usage | |
eqsp32.readPin(nn, mm) | Returns HIGH/LOW based on the trigger mode.
|
Switch Input (SWT) special DIN mode
Since all pins support digital input, any pin may operate in SWT mode. In this mode the input is debounced using the specified debounce time (default 100 ms). For a change in state to be registered, the pin must remain stable for at least the debounce time. If the input bounces faster than the debounce time, the last stable logic level is returned by readPin(). The configured trigger mode also applies:
STATE— returns the current debounced logic level.ON_RISING— latches true when the debounced input goes low → high; resets after being read.ON_FALLING— latches true when the debounced input goes high → low; resets after being read.ON_TOGGLE— latches true whenever the debounced input changes state; resets after being read.
| Configuration | |
eqsp32.pinMode(nn, SWT) |
|
eqsp32.configSWT(nn, tt) |
|
| Usage | |
eqsp32.readPin(nn, mm) | Returns HIGH/LOW based on the trigger mode.
|
If configSWT() is not called, the debounce time defaults to 100 ms. nn is in the range [1, 16].
Pulse Capture Counter (PCC)
Pulse capture count mode (PCC) measures the number of digital pulses on supported terminal pins (9–16) using hardware pulse counters. readPin(pinIndex) returns the number of pulses detected since the last read, after which the counter automatically resets to zero. PCC is supported on up to four of pins 9–16 simultaneously; if a fifth pin is configured, the configuration function returns false and the setup is ignored.
ON_RISING— counts rising edges (default).ON_FALLING— counts falling edges.ON_TOGGLE— counts both rising and falling edges.
| Configuration | |
eqsp32.pinMode(nn, PCC) |
|
eqsp32.configPCC(nn, mm) |
|
| Usage | |
eqsp32.readPin(nn) | Returns the accumulated pulse count since the last read. |
Analog Input (AIN)
Analog input mode (AIN) measures the pin's analog value from 0 V to 5 V and returns it in mV.
| Configuration | |
eqsp32.pinMode(nn, AIN) |
|
| Usage | |
eqsp32.readPin(nn) | Returns the analog value in mV. |
Current Input (CIN)
Current input mode (CIN) measures 4–20 mA current-loop signals and returns the value in units of mA×100 (e.g. 1234 = 12.34 mA). CIN is supported on pins 1–8 of compatible hardware. If the input current exceeds 21 mA, automatic overcurrent protection is enabled and the function returns -1; the shunt resistor is disabled to prevent damage and periodically reconnected to check whether the current has returned to a safe range.
| Configuration | |
eqsp32.pinMode(nn, CIN) |
|
| Usage | |
eqsp32.readPin(nn) | Returns the value in mA×100. |
| Macros | |
CONVERT_CIN(mA100) | Converts the integer current value |
Relative Analog Input (RAIN) special AIN mode
Only pins 1–8 may operate as RAIN. In this mode the analog value is automatically converted to a 0–1000 range, where 0 is GND and 1000 is 100% of the 5 V reference output. This is a convenient way to convert an analog input directly into a usable value — for example, three potentiometers in RAIN mode can be passed directly as the PWM control values for three POUT pins driving an RGB LED strip.
| Configuration | |
eqsp32.pinMode(nn, RAIN) |
|
| Usage | |
eqsp32.readPin(nn) | Returns a 0–1000 value representing 0%–100% of the 5 V supply reference. |
Temperature Input (TIN) special AIN mode
Only pins 1–8 may operate as TIN. In this mode the analog value is automatically converted into temperature in degrees Celsius. Although configTIN() is optional, the measurement will not be accurate unless the NTC thermistor parameters are configured. It is strongly recommended to call configTIN() with the NTC beta and reference-resistance values when setting up a TIN pin.
| Configuration | |
eqsp32.pinMode(nn, TIN) |
|
eqsp32.configTIN(nn, bb, rr) |
|
| Usage | |
eqsp32.readPin(nn) | Returns the temperature in °C. |
| Macros & Constants | |
IS_TIN_VALID(t) | Returns true if the read temperature is valid and no sensor error was detected. |
CONVERT_TIN(t) | Converts the integer temperature from °C×10 to a float in °C. |
TIN_OPEN_CIRCUIT | Returned as the temperature value when an open-circuit sensor error is detected. |
TIN_SHORT_CIRCUIT | Returned as the temperature value when a shorted-sensor error is detected. |
Power PWM Output (POUT)
Power PWM output mode (POUT) is meant to drive loads up to 1 A per terminal. In this mode the pin operates as a pull-down (open-collector) PWM output. The EQSP32 incorporates protective diodes that protect the MOSFETs from the over-voltage spikes induced by switching relays or solenoids, so inductive and non-inductive loads may be connected to the power PWM outputs in the same way.
Driving LED strips
Because LEDs light up even with a very small current, an optional external pull-up resistor between the anode and cathode of the LED strip is recommended. The value depends on the efficiency of the LEDs, their number, and other factors; generally a 1 kΩ, 0.5 W resistor is appropriate for most cases. In the example below a 4.7 kΩ resistor is used: assuming the system runs on 24 V but the LED strip is rated for 12 V, a separate power supply is used for the LEDs.
| Configuration | |
eqsp32.pinMode(nn, POUT) |
|
eqsp32.configPOUTFreq(ff) |
|
| Usage | |
eqsp32.pinValue(nn, pp) |
|
Configuring the POUT frequency affects all POUT and special-POUT channels — all pins in POUT mode share the same PWM frequency.
Relay (RELAY) special POUT mode
All pins may operate as RELAY, since all pins support POUT mode. The unique feature of this mode is automatic power derating to a specified value after a specified time. This drastically reduces heat and power consumption on the relays, allowing more relays to be driven from a smaller power supply.
If the minimum holding voltage (MHV) of the relay is not provided and only the nominal or trigger voltage is, the holding voltage may be found experimentally: connect the relay coil to an adjustable supply, apply the nominal voltage, then slowly reduce the voltage until the relay disengages. Calculate the minimum holding PWM value from the disengage voltage:
Minimum holding PWM value = (Vdisengage / Vsupply) * 1000
Example: for a 24 V relay tested on a 24 V supply that disengages at 6 V:
Minimum holding PWM value = (6 / 24) * 1000 = 250
To stay off the limit, set the holding value 50% above the disengage value:
Desired holding PWM value = 250 + (250 * 50%) = 375
| Configuration | |
eqsp32.pinMode(nn, RELAY) |
|
eqsp32.configRELAY(nn, hh, tt) |
|
| Usage | |
eqsp32.pinValue(nn, pp) |
|
Industrial Communications
Serial — RS232
For standard RS232 communication, connect the EQSP32's RS232 Tx pin to the receiver's RS232 Rx pin, and vice versa.
RS232 to TTL
To communicate with a TTL-level device such as an Arduino using the EQSP32's RS232 port, the RS232 Tx signal must be clipped between GND and 5 V. Use external clipping diodes from the RS232 Tx signal to the TTL device's 5 V and GND, and an in-series resistor to limit the current flowing from the RS232 driver into the clipping diodes.
RS232 signals are inverted by the RS232 driver. For communication to work, in addition to clipping the signals to TTL levels, set the communication on either the EQSP32 or the TTL device as inverted. On the EQSP32, use RS232_INV as the serial mode to invert the signal polarity.
| Configuration | |
eqsp32.configSerial(mm, bb) |
|
| Usage | |
eqsp32.Serial.{function} | Call |
Serial — RS485
For standard half-duplex RS485 communication, wire as shown below. A termination resistor may be needed depending on the cable length.
Differential termination
To ensure signal integrity, terminate the bus at both physical ends with a 120 Ω resistor across the A and B differential lines. This matches the characteristic impedance of the twisted-pair cable (typically 120 Ω) and prevents reflections that can corrupt data at higher baud rates. Only the two devices at the ends of the bus should include termination; intermediate nodes remain unterminated. Use differential termination when:
- Operating at baud rates above 9600 bps (especially 19200 bps and higher).
- Cable lengths are greater than 10 m.
- Three or more nodes are connected over the twisted pair.
Fail-safe biasing
Fail-safe biasing keeps the bus in a known logic state when no transmitter is active (idle). Bias resistors slightly drive the differential lines to a defined level. Typical configuration:
- Pull-up resistor (680 Ω – 1 kΩ) from A → VCC.
- Pull-down resistor (680 Ω – 1 kΩ) from B → GND.
Use fail-safe biasing when operating above 9600 bps, when the bus is long (over 50 m) or in electrically noisy environments, or when the network includes many passive (listen-only) nodes.
| Configuration | |
eqsp32.configSerial(mm, bb) |
|
| Usage | |
eqsp32.Serial.{function} | Call |
CAN bus
For reliable CAN bus communication, use two 120 Ω termination resistors — one at each physical end of the bus — connected across the CAN_H and CAN_L lines to match the characteristic impedance of the twisted-pair cable (typically 120 Ω). Proper termination prevents reflections, ensures correct voltage levels on the differential lines, and allows stable communication between all nodes.
When setting up a CAN network, verify whether any device already has an internal termination resistor before adding external termination.
| Configuration | |
eqsp32.configCAN(bb, id, lb) | Configures the CAN interface to accept all messages or filter for a single message ID.
|
eqsp32.configCANNode(bb, nid) | Configures CAN to filter by Node ID only (CANopen-style). Accepts all function codes for the specified Node ID but filters out broadcast messages like NMT (0x000) and SYNC (0x080).
|
| Usage | |
eqsp32.transmitCANFrame(mm) | Transmits a standard 11-bit CAN message using the built-in TWAI controller. |
eqsp32.receiveCANFrame(mm) | Attempts to retrieve a standard 11-bit CAN frame from the TWAI receive queue. Non-blocking; returns false immediately if no message is available. |
Third-party libraries — native pin control
Some applications need a custom or external library — for example, to control an addressable LED panel, run a DMX master/slave protocol, Modbus, CANopen, or other protocols. To take direct control of an ADIO pin or communication peripheral (CAN bus, RS232, RS485), the system must be notified to release the pin from internal control and configure the corresponding hardware. The eqsp32.getPin() function disassociates the pin from the EQ System Supervisor, prepares the peripheral, and returns the native pin mapping.
| Usage | |
eqsp32.getPin(pp) | Returns the native MCU pin number for the requested ADIO or peripheral pin. |
Peripheral identifiers for use with external/custom libraries:
EQ_RS232_TX/EQ_RS232_RX— prepares the RS232 peripheral and returns the native TX/RX pin.EQ_RS485_TX/EQ_RS485_RX— prepares the RS485 peripheral (receive mode) and returns the native TX/RX pin.EQ_RS485_EN— returns the RS485 enable pin (HIGH = transmit, LOW = receive).EQ_CAN_TX/EQ_CAN_RX— prepares the CAN peripheral and returns the native TX/RX pin.
int rs232Tx = eqsp32.getPin(EQ_RS232_TX); // ESP32 pin for RS232 TX
int rs232Rx = eqsp32.getPin(EQ_RS232_RX); // ESP32 pin for RS232 RX
// Put your custom RS232 setup and usage here, using rs232Tx and rs232Rx directly
Software Architecture
The EQSP32 uses its proprietary library to automatically handle all wireless connectivity and database tasks. The library provides a user API for easy, straightforward configuration and usage of all ADIOs and communications.
The block diagram below shows the software architecture of the library. The first section corresponds to the application programming interface (API); the second to the invisible background tasks handled by the EQ Task Manager.
Programming & Configuration
The EQSP32 comes with a precompiled proprietary library that provides an API to access all ADIO modes, communications, internal monitoring, and database functionality. When the program is deployed and the library is running, the EQ System Supervisor takes care of all background tasks related to pin and peripheral updates, Bluetooth and Wi-Fi connectivity, and database connection and synchronization.
To program the EQSP32, connect it with a USB-C cable and open VS Code, the Arduino IDE, or any other ESP32-compatible IDE. After installing the EQSP32 library, describe your wiring and intended functionality to EQ-AI, write the code yourself, or use a combination of both. Then download the program and power the EQSP32 from the external supply.
The .begin() function must be called in the setup() section of your program before any other EQSP32 operation is used.
| Configuration | |
eqsp32.begin(vv) | Starts EQSP32 tasks with the default library configuration. |
eqsp32.begin(cc, vv) | Starts EQSP32 tasks with developer-defined configuration. |
eqsp32.begin() | Starts EQSP32 tasks with the default configuration and verbose disabled. |
Differences between begin() variations
begin()— the easiest way to get started. Runs the EQSP32 system processes without custom defaults. Verbose is disabled, making it easier to monitor your own messages.begin(cc)orbegin(cc, false)— suitable for production builds. Verbose is disabled, so no EQSP32 system messages are printed.begin(cc, true)— enables verbose. A helpful tool to monitor the EQSP32's internal processes and verify connectivity, peripheral status, and network parameters.
Initial system configuration: EQSP32Configs
#include "EQSP32.h"
EQSP32 eqsp32;
void setup() {
EQSP32Configs myEQSP32Configs;
myEQSP32Configs.devSystemID = "SystemID"; // Developer's system code, versioning, etc.
eqsp32.begin(myEQSP32Configs, true); // Verbose enabled
// EQSP32 pin-mode initializations and other initialization code
}
The EQSP32Configs structure defines all initialization and runtime configuration parameters for the controller — networking, MQTT, device identity, and system behaviour. These are applied when begin() is called and may not be changed during runtime. When no configuration is provided, all fields default to safe baseline values, enabling the EQSP32 to start in standalone mode and handle provisioning through the EQConnect app. By defining custom settings, developers can integrate the EQSP32 into existing networks, MQTT brokers, or third-party IoT systems.
| Field | Type | Default | Description |
|---|---|---|---|
mqttBrokerIp | std::string | "homeassistant.local" | IP address or hostname of the MQTT broker. |
mqttBrokerPort | int | 1883 | MQTT broker port. Use 8883 for SSL/TLS. |
mqtt_broker_ca | std::string | "" | Optional MQTT CA certificate (leave empty for unencrypted). |
mqttDiscovery | bool | false | Enables MQTT operations (pub/sub on interfacing topics and device discovery for Home Assistant). |
devSystemID | std::string | "" | Developer-assigned system ID and/or versioning (read-only for external apps). |
userDevName | std::string | "" | Default device name. Editable by the user from EQConnect. |
wifiSSID | std::string | "" | Optional default Wi-Fi SSID. Reset to this value if credentials are erased via the boot button. |
wifiPassword | std::string | "" | Optional default Wi-Fi password. Reset to this value if credentials are erased via the boot button. |
staticIP | std::string | "0.0.0.0" | Default static IP. Use 0.0.0.0 for DHCP. |
gateway | std::string | "0.0.0.0" | Default gateway IP (used with static IP). |
subnet | std::string | "0.0.0.0" | Default subnet mask (used with static IP). |
DNS | std::string | "0.0.0.0" | Default DNS server (used with static IP). |
relaySequencer | bool | false | When multiple relays are commanded ON at once, activates them sequentially in ascending pin order to prevent inrush current and power surges. |
disableErqosIoT | bool | false | Disables built-in IoT provisioning and cloud management. Use only if Wi-Fi and BLE are handled by user code or third-party solutions. |
disableNetSwitching | bool | false | Prevents automatic switching between Ethernet and Wi-Fi when both are connected. Static IP then applies only to Ethernet; Wi-Fi always uses DHCP. |
Network Connectivity
The EQSP32 supports both Wi-Fi and Ethernet connectivity (on the respective versions), providing flexible communication options for a wide range of industrial and IoT environments. Depending on the model, the EQSP32 may feature Wi-Fi only or both Wi-Fi and Ethernet. By default, both interfaces are managed by the internal network task, which automatically handles provisioning, active-connection maintenance, and interface switching without any user code.
Automatic network management
During startup, the EQSP32 initializes all available network interfaces. The internal network manager continuously monitors connection status and selects the most stable and available interface, with priority on Ethernet.
Interface switching & priority behaviour
By default, disableNetSwitching is false, meaning only one interface is active at a time. When both Ethernet and Wi-Fi are available, Ethernet takes priority and Wi-Fi is automatically disconnected. If the Ethernet link is lost, the EQSP32 seamlessly switches to Wi-Fi to maintain connectivity. If a fixed configuration is required, set disableNetSwitching = true; the device may then be connected to both interfaces simultaneously — useful, for example, when Ethernet is used for Modbus TCP integration while Wi-Fi provides the internet connection.
Wi-Fi connectivity
All EQSP32 versions include integrated 2.4 GHz Wi-Fi (802.11 b/g/n). Wi-Fi can be configured in code or provisioned via the EQConnect app over BLE.
- Provisioning: custom default credentials can be set in
EQSP32Configs(wifiSSID,wifiPassword); the end user may adjust them via EQConnect. - Automatic reconnection: the EQSP32 retries the connection when Wi-Fi becomes temporarily unavailable.
- Status monitoring:
getWiFiStatus()returnsEQ_WF_DISCONNECTED,EQ_WF_CONNECTED,EQ_WF_RECONNECTING, orEQ_WF_SCANNING.
Ethernet connectivity model-dependent
On models equipped with Ethernet hardware, the controller provides a wired interface over a standard RJ45 connector. Ethernet is initialized automatically when a cable is detected and works seamlessly alongside Wi-Fi.
- Plug-and-play: DHCP is enabled by default. To assign a fixed IP, configure
staticIP,gateway,subnet, andDNS. - Priority handling: when both interfaces are active, Ethernet takes priority unless
disableNetSwitchingis set to true. - Status monitoring:
getEthernetStatus()returnsEQ_ETH_DISCONNECTED,EQ_ETH_PLUGGED_IN,EQ_ETH_CONNECTED, orEQ_ETH_STOPPED.
| Usage | |
eqsp32.isDeviceOnline() | Returns true if Wi-Fi or Ethernet is connected; false if both are disconnected. |
eqsp32.getWiFiStatus() | Returns the current Wi-Fi status ( |
eqsp32.getEthernetStatus() | Returns the current Ethernet status ( |
eqsp32.localIP() | Returns the active IP (Ethernet if connected, otherwise Wi-Fi), or '0.0.0.0' when offline. |
eqsp32.ethernetIP() | Returns the Ethernet IP, or '0.0.0.0' if Ethernet is not connected. |
eqsp32.wifiIP() | Returns the Wi-Fi IP, or '0.0.0.0' if Wi-Fi is not connected. |
Device Provisioning
Once the EQSP32 library is running, use the EQConnect phone app to connect to the controller via Bluetooth. From EQConnect you can configure the Wi-Fi network credentials, set up the local timezone with daylight saving, and wirelessly monitor the EQSP32's I/O modes, states, and all connected expansion modules.
The "IoT Configuration" section offers additional options for defining a static IP or DHCP, updating the OTA (over-the-air) update password, and setting the MQTT user name and password.
For the EQSP32 to be discoverable via Bluetooth, the Bluetooth LED must be flashing. If it is off, a short press of the boot button enables BLE advertising for 3 minutes.
The Wi-Fi credentials are stored in internal flash. Each time the EQSP32 starts or restarts, it automatically tries to reconnect to the saved network. Even if a new program is uploaded, the Wi-Fi credentials are retained unless a full flash erase is selected during programming.
To force the EQSP32 to disconnect and erase the Wi-Fi credentials from flash, press and hold the boot button for 3 seconds. This resets the user networking parameters to defaults. If the developer initialized the system with custom default network parameters (credentials, static IP, etc.), those are applied instead after the 3-second press.
Boot & Reset
Reset
Press and release the "Reset" button to restart the device.
Boot
A short tap of the "Boot" button enables BLE advertising, making the EQSP32 discoverable from the EQConnect app.
Press and hold the "Boot" button for at least 3 seconds to force the device back to its default network configuration. If no custom defaults are set by the developer, the EQSP32 disconnects and forgets the configured Wi-Fi network and any static IP/DHCP parameters. Otherwise, the EQSP32 overwrites the user configuration with the developer's default parameters (default credentials and static IP/DHCP option).
Expansion Modules
The EQSP32 has an expansion connector for adding functionality for niche and tailor-made applications.
Warning — Before connecting any expansion module, make sure the EQSP32 is powered off.
To add an expansion module, mount it on the DIN rail next to the EQSP32 and gently slide it until the module's connector is fully inserted into the main EQSP32 controller. After power-up, the proprietary library runs expansion-module detection automatically on boot. Once boot completes, all additional values are available locally and in the database.