Overview #
NORVI X is a next generation modular industrial controller designed to power smart automation and IoT solutions. Built around a CPU module and a range of plug and play expansion modules, the platform scales from a handful of I/O points up to 200, giving system integrators, OEMs, and industrial engineers a flexible foundation for automation, remote monitoring, and data acquisition projects.
The NORVI X-AV4 is a 4-channel analog input expansion module built for this platform. It provides four 0–10 V analog input channels suitable for industrial monitoring and measurement applications. Inputs are conditioned using precision signal amplifiers and digitized through an ADS1115 I²C ADC (16-bit resolution), enabling accurate data acquisition with minimal MCU I/O usage.
This guide covers everything needed to confidently install, wire, and commission the module, including safety requirements, technical specifications, terminal and address configuration, wiring steps, software setup, diagnostic test code, and troubleshooting.
Key Features #
- 4 × 0–10 V analog input channels
- High-resolution 16-bit ADC (ADS1115)
- Controlled through the ADS1115 I²C ADC, so only SCL and SDA are used from the CPU
- Onboard DIP switch for I2C address selection, allowing multiple analog input modules on the same bus
- Plug and play connection to the CPU module through the expansion bus
- DIN rail mountable enclosure
- CE / EMC compliant (EN 61131-2:2007, EN 61010-1:2010+A1:2019, EN IEC 61010-2-201:2018, 2014/30/EU)
Safety Information #
Warning: Disconnect all power sources before installing, wiring, or servicing the NORVI X-AV4. Failure to do so may result in electric shock or damage to the equipment.
- Install and wire this module only if you are a qualified electrician or trained technician familiar with industrial control equipment.
- Confirm the host CPU is running from a regulated 24 V DC supply, since the module draws its power through the expansion port rather than a separate connection.
- Mount the module on a DIN rail inside a suitably rated enclosure. It carries an IP20 protection rating and is not designed for direct outdoor or wash down exposure.
- Keep the operating environment within minus 40 to plus 85 degrees C and avoid condensing humidity.
- Do not exceed the rated 0–10 V analog input range on any channel.
- Do not connect or disconnect the module from the expansion bus while the system is powered.
- Follow all local and national electrical codes applicable to industrial control panel wiring.
Technical Specifications #
Electrical #
| Rated Supply Voltage | 24V DC |
| Current Consumption | 40mA @ 24V DC |
Inputs Specifications #
| Number of Inputs | 4 Analog Input channels |
| Analog Input Measurement Range | 0–10 V |
| Analog to Digital Converter | ADS1115 |
| ADC Resolution | 16-bit |
| Gain Ranges | ±6.144V, ±4.096V, ±2.048V (default), ±1.024V, ±0.512V, ±0.256V |
| Programmable data rate | 8SPS to 860SPS |
| Low current consumption | 150μA |
| Wide supply range | 2.0V to 5.5V |
| ADC Communication | I2C |
| ADC Power Supply | 3.3 V |
| Output Diagnostics | Alert Indicator |
| Communication Bus | Internal expansion bus (I2C) |
| Connector Type | Spring terminal |
Hardware Layout & GPIO Map #
The table below lists the terminals on the X-AV4. None of the host CPU’s GPIO pins are claimed directly by the analog channels themselves – only SCL and SDA are shared across the I2C bus.
| Expansion Port Pin | Purpose | GPIO / Signal | Source |
|---|---|---|---|
| 5 | SCL | IO9 | ESP32-S3 |
| 6 | SDA | IO8 | ESP32-S3 |
The table below lists the GPIO pins reserved for the X-AV4’s four inputs.
| Terminal | Function |
|---|---|
| AIN1 | Analog Input Channel 1 |
| AIN2 | Analog Input Channel 2 |
| AIN3 | Analog Input Channel 3 |
| AIN4 | Analog Input Channel 4 |
| AGND | Analog Ground |
I2C Address Selection #
| DIP 1 | DIP 2 | DIP 3 | DIP 4 | Address |
|---|---|---|---|---|
| ON | OFF | OFF | OFF | 0x49 |
| OFF | ON | OFF | OFF | 0x4B |
| OFF | OFF | ON | OFF | 0x4A |
| OFF | OFF | OFF | ON | 0x48 |
Note: the ADS1115 that directly drives the 4 analog input channels is itself addressed at 0x49; the DIP-selectable addresses apply when the module is daisy-chained with other I2C-addressed NORVI expansion modules on the same bus.
Wiring Guide #
GPIO pin assignments for every input are listed in the Hardware Layout and GPIO Map section above; this section covers how to physically wire the module, not the pin numbers themselves.
Power Connection #
The X-AV4 requires no separate power supply. It receives 24V DC from the CPU module through the shared expansion port connector, provided the CPU is powered from a regulated 24V DC source.
Analog Input Wiring #
- Each of the four channels accepts a 0–10 V signal
- Connect the signal wire from your sensor or transmitter to the appropriate AINx terminal
- Connect the sensor’s signal return / negative lead to the GND terminal
- Keep analog signal wiring runs separated from AC/high-current wiring to minimize induced noise
- Confirm the source signal stays within the 0–10 V rated input range on every channel

Connecting the Module to the CPU #
- Power off the system.
- Mount the X-AV4 on the DIN rail next to the CPU module or an adjacent expansion module.
- Seat it firmly onto the expansion bus connector until it locks into place.
- If daisy-chaining multiple I2C-addressable modules, set the DIP switches first (see Section 5) so each has a unique address.
- Wire the analog signal sources to AIN1 through AIN4, using the AGND terminal as the common return.
- Power the system back on.
- Upload the module’s test sketch from the NORVI GitHub repository to confirm each channel reads correctly before wiring it into your final control logic.

Expansion Port (50 pin) #
The X-AV4 connects to the CPU through the shared 50 pin expansion bus. The pins used by this module are SCL, SDA, GND, 24V, and 5V. The remaining pins pass through for other expansion modules.
| PIN INDEX | Purpose | GPIO | SOURCE |
|---|---|---|---|
| 1 | MOSI | IO11 | ESP32-S3 |
| 2 | MISO | IO13 | ESP32-S3 |
| 3 | SCLK | IO12 | ESP32-S3 |
| 4 | GND | —- | |
| 5 | SCL | IO9 | |
| 6 | SDA | IO8 | |
| 7 | GND | —- | |
| 8 | RX1 | IO18 | |
| 9 | TX1 | IO17 | |
| 10 | GND | —- | |
| 11 | D+ | —- | |
| 12 | D- | —- | |
| 13 | GND | —- | |
| 14 | CS1 | P1_0 | PCA9539 I2C Address 0x75 |
| 15 | CS2 | P0_7 | |
| 16 | CS3 | P0_6 | |
| 17 | CS4 | P0_5 | |
| 18 | IO1 | IO1 | ESP32-S3 |
| 19 | IO2 | IO2 | |
| 20 | IO4 | IO4 | |
| 21 | IO5 | IO5 | |
| 22 | IO6 | IO6 | |
| 23 | IO7 | IO7 | |
| 24 | IO10 | IO10 | |
| 25 | IO11 | IO35 | |
| 26 | IO12 | IO36 | |
| 27 | IO13 | IO37 | |
| 28 | IO14 | IO14 | |
| 29 | RS485_TX | IO15 | |
| 30 | GND | —- | |
| 31 | GND | —- | |
| 32 | RS485_RX | IO16 | |
| 33 | P1_1 | P1_1 | PCA9539 I2C Address 0x75 |
| 34 | P1_2 | P1_2 | |
| 35 | IO21 | IO21 | ESP32-S3 |
| 36 | GND | —- | |
| 37 | GND | —- | |
| 38 | P1_3 | P1_3 | PCA9539 I2C Address 0x75 |
| 39 | P1_4 | P1_4 | |
| 40 | P1_5 | P1_5 | |
| 41 | IO39 | IO39 | ESP32-S3 |
| 42 | IO40 | IO40 | |
| 43 | NC | —- | |
| 44 | NC | —- | |
| 45 | NC | —- | |
| 46 | GND | —- | |
| 47 | 5V | 5V | |
| 48 | GND | GND | |
| 49 | 24V | 24V | |
| 50 | 24V | 24V |
Software Setup (Arduino IDE) #
The NORVI X-AV4 is driven through the host CPU using the Arduino IDE with the ESP32 board package. Firmware examples and required libraries are maintained in the NORVI GitHub repository.
Board Configuration #
- Install Arduino IDE
Install the Arduino IDE and add ESP32 board support:
Tools → Board → Boards Manager → ESP32 - Connect the Controller
Connect the NORVI X CPU to your computer using the USB interface. - Select Board and Port
Configure the board and communication port:- Tools → Board → ESP32 Arduino → ESP32S3 Dev Module
- Tools → Port → Select the corresponding COM/serial port

- Configure Board Settings
Under the Tools menu, configure the following settings:
| Setting | Selection |
|---|---|
| USB CDC On Boot | Enabled |
| Flash Size | 16MB (128Mb) |
| PSRAM | QSPI PSRAM |

Test Code Examples #
Required Libraries #
Install these via Arduino IDE → Sketch → Include Library → Manage Libraries before compiling any of the examples below:
- Wire
- WiFi
- Adafruit_ADS1X15 (or the ADS1115 library used in the NORVI reference sketch)
- TFT_eSPI
- CST816S
- Free_Fonts
Install the Required Library #
Install the Wire library through:
Sketch → Include Library → Manage Libraries
Search for Wire and install it if required.

The Libraries are available in the NORVI-X-Version-02 GitHub repository.
Open and Upload the Test Sketch #
- Open the X-AV4 test sketch from the NORVI GitHub repository.
- Verify the board and port selections.
- Click Upload to upload the test sketch to the NORVI X CPU.
I2C Bus Scan #
Run this first after wiring and setting the DIP switch address to confirm that the ADS1115 on the X-AV4 is being detected before reading analog channels.
void I2C_SCAN() {
byte error, address;
int deviceCount = 0;
Serial.println("Scanning...");
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16) {
Serial.print("0");
}
Serial.print(address, HEX);
Serial.println(" !");
deviceCount++;
delay(1); // Wait for a moment to avoid overloading the I2C bus
}
else if (error == 4) {
Serial.print("Unknown error at address 0x");
if (address < 16) {
Serial.print("0");
}
Serial.println(address, HEX);
}
}
if (deviceCount == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("Scanning complete\n");
}
}Depending on the DIP switch setting, the expected device address is 0x48, 0x49, 0x4A, or 0x4B.
Analog Input Read Test #
This sequence reads all four analog channels through the ADS1115 and prints the converted voltage. It can be used to verify wiring and channel mapping before connecting real sensors.
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1115 ads;
#define ADS1115_ADDR 0x48 // Set to match your DIP switch address
void setupAnalogInputs() {
if (!ads.begin(ADS1115_ADDR)) {
Serial.println("Failed to initialize ADS1115. Check wiring/address.");
while (1);
}
ads.setGain(GAIN_TWOTHIRDS); // +/-6.144V range, suited to 0-10V divided input
}
void readAnalogInputs() {
for (int channel = 0; channel < 4; channel++) {
int16_t raw = ads.readADC_SingleEnded(channel);
float voltage = ads.computeVolts(raw);
Serial.print("AIN");
Serial.print(channel + 1);
Serial.print(": ");
Serial.print(voltage, 3);
Serial.println(" V");
}
Serial.println();
delay(1000);
}Confirm the exact gain setting and input scaling against the current sketch in the NORVI GitHub repository before relying on this for production firmware, since the module’s front-end conditioning circuit determines the correct gain and scaling factor for the 0–10 V range.
Validating the Full Test Sketch #
When the complete test sketch runs successfully with the X-AV4 attached, you should see:
- I2C scan: The ADS1115 appears at the configured address (0x48–0x4B depending on DIP setting).
- Analog readings: Each of the four channels reports a voltage that tracks the connected signal source.
- Display and touch: If the CPU display libraries are included, the TFT initializes and touch input responds.
- No I2C errors: The Serial Monitor shows no failed transmissions or address conflicts.
If a channel reads incorrectly, or the ADS1115 does not appear during the I2C scan, check the expansion connection and DIP switch address before connecting field sensors.
Troubleshooting #
| Symptom | Suggested Action |
|---|---|
| Output stays off | Check wiring polarity and confirm GND is properly connected to the load’s return path. |
| Module not detected on I2C scan | Reseat the module on the expansion bus, confirm the DIP switch address does not conflict with another module, and check that the CPU has sufficient power supply current headroom. |
| Analog reading is zero or flat | Confirm the signal source is connected between the AINx and GND terminals, and verify the source is actually outputting 0–10 V. |
| Reading does not match expected value | Confirm the ADC gain setting in firmware matches the module’s front-end scaling, and calibrate against a known reference voltage. |
| Module not detected by the CPU | Power down, reseat the module on the expansion bus, and confirm no address conflict with other daisy-chained modules.. |
| Inconsistent switching on multiple modules | Confirm each daisy-chained module has a unique I2C address per the DIP switch table. |
| TFT display blank or not working | Check three settings under Tools: USB CDC On Boot set to Enabled, Flash Size set to 16MB (128Mb), and PSRAM set to QSPI PSRAM. |
