XStore

NORVI X-RTD4 – USER GUIDE

Updated on September 21, 2026

9 min read

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-RTD4 is a high-precision 4-channel RTD (Resistance Temperature Detector) expansion module for this platform. It uses a single MAX31865 RTD-to-digital converter (15-bit resolution) shared across all four RTD inputs through an analog multiplexer, with an onboard STM32 MCU handling the multiplexing and bridging results to the host CPU over the shared I2C expansion bus. This offloads RTD conversion work from the main controller. It supports both PT100 and PT1000 sensors, selectable via DIP switch. The X-RTD4 is not standalone; it must be paired with a NORVI X CPU module (e.g. CPU ESPS3 X1).

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 independent RTD input channels, sequentially scanned through a shared MAX31865 converter
  • High-precision 15-bit RTD-to-digital conversion
  • Onboard STM32 MCU acting as an internal SPI-to-I2C bridge, offloading processing from the main CPU
  • PT100 / PT1000 selectable via dedicated DIP switch
  • I2C address configurable via 4-way DIP switch (16 selectable addresses)
  • Status LED per input channel
  • DIN rail mountable enclosure with spring terminals
  • Plug and play connection to the CPU module through the expansion bus
  • 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-RTD4. 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.
  • This module reads low-level resistance signals from RTDs – keep sensor wiring running short and separated from AC power, relay, or motor wiring to avoid measurement noise and error.
  • 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 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 Voltage24V DC
Current Consumption80mA @ 24V DC

Input Specifications #

Input Channels4 independent RTD channels
Resolution15-bit
RTD TypesPT100 or PT1000 (DIP-selectable)
ConverterMAX31865 RTD-to-digital converter (shared via analog multiplexer)
CommunicationSPI
Output DiagnosticsIndividual LED indicators
Alert Indicator
Power supply24V DC, shared with CPU through the expansion port
Communication busInternal expansion bus (I2C)
Connector TypeSpring terminal

STM32F103C8T6 Specifications #

SpecificationDetails
ArchitectureARM Cortex-M3
Operating Voltage2.0 V to 3.6 V
CPU Frequency72 MHz
Flash Memory64 KB
SRAM20 KB
USBFor Debugging Only
CommunicationI²C Interface

Hardware Layout & GPIO Map #

The table below lists the terminals on the X-T4 and how they map into the ADS1115 ADC. Unlike relay or digital I/O modules, none of the host CPU’s GPIO pins are claimed by the sensor channels themselves – only SCL and SDA are shared across the I2C bus.

TerminalFunction
RTD1+Positive Input – Channel 1
RTD1-Negative Input – Channel 1
RTD2+Positive Input – Channel 2
RTD2-Negative Input – Channel 2
RTD3+Positive Input – Channel 3
RTD3-Negative Input – Channel 3
RTD4+Positive Input – Channel 4
RTD4-Negative Input – Channel 4
GNDGround

Each channel is a 2-wire RTD input. Connect each RTD’s two leads across the RTD_n+ and RTD_n- terminals for that channel; GND is the shared reference.

I2C Address Selection

DIP 1DIP 2DIP 3DIP 4Address
OFFOFFOFFOFF0x3F
ONOFFOFFOFF0x3E
OFFONOFFOFF0x3D
ONONOFFOFF0x3C
OFFOFFONOFF0x3B
ONOFFONOFF0x3A
OFFONONOFF0x39
ONONONOFF0x38
OFFOFFOFFON0x37
ONOFFOFFON0x36
OFFONOFFON0x35
ONONOFFON0x34
OFFOFFONON0x33
ONOFFONON0x32
OFFONONON0x31
ONONONON0x30

Note: default all-OFF = 0x3F – unlike the input modules, X-RTD4 has a full 16-address range; the DIP-selectable addresses apply when the module is daisy-chained with other I2C-addressed NORVI expansion modules on the same bus.

RTD Type Selection

OFFPT1000
ONPT100

RTD TYPE SELECTOR

ParameterPT100PT1000
Resistance at 0°C100 Ω1000 Ω (1 kΩ)
Resistance change per °C~0.385 Ω/°C~3.85 Ω/°C
Lead-wire effectHigherLower
Signal strengthLowerHigher
Temperature measurement principlePlatinumPlatinum

Wiring Guide #

GPIO pin assignments for the I2C bus are listed in the Expansion Port table below (Section 6.4); this section covers how to physically wire the module, not the pin numbers themselves.

Power Connection #

No separate supply needed. Receives 24V DC from the CPU through the shared expansion port, provided the CPU has a regulated 24V DC source with adequate current headroom.

RTD Input Wiring #

  • Each of the four channels is a 2-wire RTD input.
  • Connect each RTD’s two leads across the RTD_n+ and RTD_n- terminals for that channel.
  • GND provides the shared reference for all four channels.
  • Keep RTD wiring runs short, and route them separately from AC power, relay, or motor wiring to minimize induced noise on the signal.
  • Because this is a 2-wire (not 3- or 4-wire) RTD connection, the resistance of the lead wires themselves adds to the measured resistance – keep lead lengths short and roughly equal if using multiple channels, since long 2-wire runs can introduce measurable temperature error that 3-/4-wire wiring would cancel out
  • Confirm each thermistor’s resistance at a known temperature (e.g. room temperature) with a multimeter before wiring, to catch a faulty sensor early.
Figure 1: NORVI X-RTD4 Input Terminal Wiring
Figure 1: NORVI X-RTD4 Input Terminal Wiring

Mounting and Connecting the Module #

  • Power off the entire system before touching any wiring or seating the module.
  • Mount the X-RTD4 on the DIN rail next to the CPU module (or next to another expansion module already in the chain) and seat it firmly onto the expansion bus connector.
  • Set the I2C address using the onboard DIP switches, and set the RTD type switch to match your sensors.
  • Wire your RTDs to the RTD1 through RTD4 terminal pairs, with GND as the shared reference.
  • 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.
Figure 2: NORVI CPU Controller with NORVI X-RTD4 Expansion Module
Figure 2: NORVI CPU Controller with NORVI X-RTD4 Expansion Module

Expansion Port (50 pin) #

The X-RTD4 connects to the CPU through the shared 50-pin expansion bus. The pins actually used by this module are SCL, SDA, GND, 5V, and 24V. The rest pass through for other modules on the same bus.

PIN INDEXPurposeGPIOSOURCE
1MOSIIO11ESP32-S3
2MISOIO13
3SCLKIO12
4GND—-
5SCLIO9
6SDAIO8
7GND—-
8RX1IO18
9TX1IO17
10GND—-
11D+—-
12D-—-
13GND—-
14CS1P1_0PCA9539
I2C Address 0x75
15CS2P0_7
16CS3P0_6
17CS4P0_5
18IO1IO1ESP32-S3
19IO2IO2
20IO4IO4
21IO5IO5
22IO6IO6
23IO7IO7
24IO10IO10
25IO11IO35
26IO12IO36
27IO13IO37
28IO14IO14
29RS485_TXIO15
30GND—-
31GND—-
32RS485_RXIO16
33P1_1P1_1PCA9539
I2C Address 0x75
34P1_2P1_2
35IO21IO21ESP32-S3
36GND—-
37GND—-
38P1_3P1_3PCA9539
I2C Address 0x75
39P1_4P1_4
40P1_5P1_5
41IO39IO39ESP32-S3
42IO40IO40
43NC—-
44NC—-
45NC—-
46GND—-
475V5V
48GNDGND
4924V24V
5024V24V

Software Setup (Arduino IDE) #

The NORVI X-T4 is read 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 #

  1. Install Arduino IDE

Install the Arduino IDE and add ESP32 board support:

Tools → Board → Boards Manager → ESP32

  1. Connect the Controller

Connect the NORVI X CPU to your computer using the USB interface.

  1. 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
Figure 3: Arduino IDE Board and Tools Menu Configuration
Figure 3: Arduino IDE Board and Tools Menu Configuration
Figure 4: Upload Settings under the Tools Menu
Figure 4: Upload Settings under the Tools Menu
  1. Configure Board Settings

Under the Tools menu, configure the following settings:

SettingSelection
USB CDC On BootEnabled
Flash Size16MB (128Mb)
PSRAMQSPI PSRAM

Test Code Examples #

Required Libraries #

Install these via Arduino IDE → Sketch → Include Library → Manage Libraries before compiling any of the examples below:

  • Wire
  • SPI
  • 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.

Figure 5: Opening the Arduino IDE Library Manager
Figure 5: Opening the Arduino IDE Library Manager

The Libraries are available in the NORVI-X-Version-02 GitHub repository.

Open and Upload the Test Sketch #

  1. Open the X-RTD4 test sketch from the NORVI GitHub repository.
  2. Verify the board and port selections.
  3. 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.

Copy
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);
    } 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");
}

RTD Channel Read – templated skeleton (unconfirmed protocol) #

Copy
#define RTD_SLAVE_ADDR 0x3F   // update to match your DIP setting

uint8_t rtdType = 1;          // 0 = PT100, 1 = PT1000
uint8_t channelsToRead[2] = {1, 2};  // up to 2 channels per request

uint8_t crc8(uint8_t *data, int len) {
  uint8_t crc = 0x00;
  while (len--) {
    uint8_t extract = *data++;
    for (uint8_t i = 8; i; i--) {
      uint8_t sum = (crc ^ extract) & 0x01;
      crc >>= 1;
      if (sum) crc ^= 0x8C;
      extract >>= 1;
    }
  }
  return crc;
}

void readRTD() {
  Wire.beginTransmission(RTD_SLAVE_ADDR);
  Wire.write(0x01);           // command byte
  Wire.write(rtdType);
  Wire.write(channelsToRead[0]);
  Wire.write(channelsToRead[1]);
  if (Wire.endTransmission() != 0) {
    Serial.println("I2C TX FAIL");
    return;
  }
  delay(15);

  uint8_t totalBytes = 2 * 12;  // 12 bytes per channel
  Wire.requestFrom(RTD_SLAVE_ADDR, totalBytes);
  if (Wire.available() != totalBytes) {
    Serial.println("I2C RX FAIL");
    return;
  }

  for (int idx = 0; idx < 2; idx++) {
    uint8_t buf[12];
    for (int i = 0; i < 12; i++) buf[i] = Wire.read();

    if (crc8(buf, 11) != buf[11]) {
      Serial.print("CRC ERROR Channel "); Serial.println(buf[1]);
      continue;
    }

    float temp, res;
    memcpy(&temp, &buf[2], 4);
    memcpy(&res, &buf[6], 4);
    uint8_t ch = buf[1];
    uint8_t fault = buf[10];

    Serial.print("Ch "); Serial.print(ch);
    Serial.print(" Temp: "); Serial.print(temp);
    Serial.print(" Res: "); Serial.print(res);
    Serial.print(" Fault: "); Serial.println(fault);
  }
}

Validating the Full Test Sketch #

When the complete test sketch runs successfully with the X-T4 attached, you should see:

  • I2C scans on the X-RTD4 appear at its configured address (0x3F–0x30 depending on DIP setting) alongside any other I2C devices on the bus.
  • All four channels return stable, non-zero readings that change when a sensor is warmed/cooled/disconnected.
  • Non-zero readings that change when a sensor is warmed/cooled/disconnected; temperature values track ambient sensibly.
  • No I2C errors – the Serial Monitor shows no failed transmissions or address conflicts while the test runs.

Troubleshooting #

SymptomSuggested Action
Module not detected on I2C scanReseat module, confirm DIP address doesn’t conflict, check CPU power headroom
Reads incorrect/erratic temperatureConfirm RTD type DIP switch (PT100 vs PT1000) matches the sensor actually wired
One or more channels stuck/no readingCheck RTD wiring at RTD_n+/RTD_n-/GND; automatic fault detection may indicate an open sensor
Address conflict with another I2C moduleChange DIP setting so each module on the bus is unique
Readings offset from actual by a consistent amountCheck 2-wire lead resistance – long runs add measurable error; consider shorter leads
Device not responding at allCheck micro-USB debug port for STM32-side diagnostic output before assuming a wiring fault
System resets unexpectedly under loadCheck CPU power supply current rating, especially with multiple expansion modules attached

Support & Resources #

Product documentation & datasheets: https://norvi.io/docs/norvi-x-rtd4-datasheet/
Product page: https://norvi.io/
Technical support: support@norvi.io