---
title: "NORVI X-TC4 – USER GUIDE"
description: "## 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…"
url: "https://norvi.io/docs/norvi-x-tc4-user-guide/"
updated: "2026-10-28"
category: "NORVI X / NORVI X-TC4"
---

# NORVI X-TC4 – USER GUIDE

## 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-TC4 is a 4 channel thermocouple input expansion module built for this platform. It provides four dedicated inputs for K-type thermocouples, covering a measurement range of 0°C to +1024°C, which makes it suitable for furnaces, ovens, exhaust systems, and other high-temperature processes. Each channel is converted by a MAX6675 thermocouple-to-digital converter, and an onboard co-processor collects the readings and presents them to the CPU as a fixed I2C slave. Only the shared I2C bus (SCL and SDA) is used on the CPU module, so no extra MCU pins are consumed.

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 K-type thermocouple inputs
- 12-bit MAX6675 thermocouple-to-digital conversion on every channel
- I2C communication interface, so only two GPIOs (SCL and SDA) are used from the CPU
- Fault status reported per channel, with CRC8-protected replies
- Onboard DIP switch for I2C address selection, allowing multiple TC4 modules on the same bus
- 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-TC4. 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 very small thermocouple voltages. Keep sensor wiring as short as practical and separated from AC power, motor, and relay 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.
- Hot surfaces: thermocouples are often installed on furnaces, ovens, and exhaust systems. Allow the process to cool before handling sensors or their leads.
- Keep the operating environment within minus 40 to plus 85 degrees Celsius 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 Voltage | 24V DC |
| --- | --- |
| Current Consumption | 40mA @ 24V DC |

### Input Specifications

| Number of Thermocouple Inputs | 4 |
| --- | --- |
| Analog to Digital Converter (ADC) | MAX6675 |
| Thermocouple Type | K-type thermocouple |
| ADC Resolution | 12 bit |
| Temperature Range | -200°C to +1024°C |
| Thermocouple Accuracy | ±8 LSB, 0°C to +700°C at 3.3 V |
| Thermocouple Input Impedance | 60 kΩ |
| Input Low Voltage | 0.3 VCC |
| Input High Voltage | 0.7 VCC |
| Supply Current | 0.7 mA to 1.5 mA |
| Input Leakage Current | ±5 µA |
| Supply Voltage | 3.0V to 5.0V |
| Power supply | 24V DC, shared with CPU through the expansion port |
| Communication bus | Internal expansion bus (I2C) |
| Connector Type | Spring terminal |

## Hardware Layout & GPIO Map

The table below lists the terminals on the front face of the X-TC4. 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.

| Terminal | Function |
| --- | --- |
| TC1+ | Thermocouple Positive (+) Input - Channel 1 |
| TC1- | Thermocouple Negative (-) Input - Channel 1 |
| TC2+ | Thermocouple Positive (+) Input - Channel 2 |
| TC2- | Thermocouple Negative (-) Input - Channel 2 |
| TC3+ | Thermocouple Positive (+) Input - Channel 3 |
| TC3- | Thermocouple Negative (-) Input - Channel 3 |
| TC4+ | Thermocouple Positive (+) Input - Channel 4 |
| TC4- | Thermocouple Negative (-) Input - Channel 4 |
| GND | Ground |

### GPIO Utilization

| Utilization | Connection to CPU |
| --- | --- |
| SCL | IO9 |
| SDA | IO8 |

### I2C Address Selection

The module is shipped with all DIP switches OFF, which sets the address to 0x18. Set a unique address on each X-TC4 when more than one is connected to the same I2C bus.

| Address Selection |  |  |  |  |
| --- | --- | --- | --- | --- |
| DIP 1 | DIP 2 | DIP 3 | DIP 4 | Address |
| OFF | OFF | OFF | OFF | 0x18 |
| ON | OFF | OFF | OFF | 0x17 |
| OFF | ON | OFF | OFF | 0x16 |
| ON | ON | OFF | OFF | 0x14 |
| OFF | OFF | ON | OFF | 0x13 |
| ON | OFF | ON | OFF | 0x12 |
| OFF | ON | ON | OFF | 0x11 |
| ON | ON | ON | OFF | 0x10 |
| OFF | OFF | OFF | ON | 0x0F |
| ON | OFF | OFF | ON | 0x0E |
| OFF | ON | OFF | ON | 0x0D |
| ON | ON | OFF | ON | 0x0C |
| OFF | OFF | ON | ON | 0x0B |
| ON | OFF | ON | ON | 0x0A |
| OFF | ON | ON | ON | 0x09 |
| ON | ON | ON | ON | 0x08 |

## 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

The X-TC4 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 with adequate current headroom.

### Thermocouple Input Wiring

- Each of the four channels is a K-type thermocouple input.
- Connect each thermocouple’s positive lead to TC+ and its negative lead to TC- for that channel. Polarity matters: a reversed thermocouple reads incorrectly.
- GND is the module ground reference.
- Use K-type thermocouple wire or K-type extension/compensating cable when extending the leads. Ordinary copper wire adds measurement error.
- If extending sensor leads over long distances, use shielded twisted-pair thermocouple cable and ground the shield at one end only.
- Unused channels can be left unconnected; a channel with no sensor reports a fault status.

![Figure 1: NORVI X-TC4 Thermocouple Input Terminal Wiring](https://norvi.io/wp-content/uploads/2026/10/TC4-Wiring.png)
Figure 1: NORVI X-T4 Thermistor Input Terminal Wiring
Figure 1: NORVI X-TC4 Thermocouple Input Terminal Wiring

### Mounting and Connecting the Module

- Power off the entire system before touching any wiring or seating the module.
- Mount the X-TC4 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. Leave at the default (0x18) for a single X-TC4; if adding more than one X-TC4 to the same bus, set a unique address on each. See the I2C Address Selection table in Section 5.
- Wire your thermocouples to the TC1 through TC4 terminal pairs, observing polarity.
- Power the system back on.
- Upload the module's test sketch from the [NORVI GitHub repository](https://github.com/NORVIControllers/NORVI-X-Version-02/blob/main/expansion%20modules/NORVI-X-TC4/examples/arduino/NORVI_X-TC4_Test_Code/NORVI_X-TC4_Test_Code.ino) to confirm each channel reads correctly before wiring it into your final control logic.

![Figure 2: NORVI CPU Controller with NORVI X-TC4 Expansion Module](https://norvi.io/wp-content/uploads/2026/10/TC4-WIith-CPU.jpg)
Figure 2: NORVI CPU Controller with NORVI X-TC4 Expansion Module

### Expansion Port (50 pin)

Utilized GPIO Connections are highlighted in Green.They cannot be used for any other purpose with this module connected.

| PIN INDEX | Purpose | GPIO | SOURCE |
| --- | --- | --- | --- |
| 1 | MOSI | IO11 | ESP32-S3 |
| 2 | MISO | IO13 |  |
| 3 | SCLK | IO12 |  |
| 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 | IO41 |  |
| 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 | IO36 | IO36 |  |
| 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-TC4 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**
2. Connect the Controller
   Connect the **NORVI X CPU** to your computer using the USB interface.
3. 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](https://norvi.io/wp-content/uploads/2026/08/Arduino-IDE-Board-and-Tools-Menu-Configuration.png)
Figure 3: Arduino IDE Board and Tools Menu Configuration

![Figure 4: Upload Settings under the Tools Menu](https://norvi.io/wp-content/uploads/2026/10/tc4-tools.png)
Figure 4: Upload Settings under the Tools Menu

1. Configure Board Settings

Under the **Tools** menu, configure the following settings:

| Setting | Selection |
| --- | --- |
| USB CDC On Boot | Enabled |
| Flash Size | 16MB (128Mb) |
| Partition Scheme | Huge APP (3MB No OTA/1MB SPIFFS) |
| 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
- SPI
- LovyanGFX

### 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](https://norvi.io/wp-content/uploads/2026/10/librires.png)
Figure 5: Opening the Arduino IDE Library Manager

The Libraries are available in the [NORVI-X-Version-02 GitHub repository](https://github.com/NORVIControllers/NORVI-X-Version-02/tree/main/libraries).

### Open and Upload the Test Sketch

1. Open the **X-TC4 test sketch** from the [NORVI GitHub repository.](https://github.com/NORVIControllers/NORVI-X-Version-02/blob/main/expansion%20modules/NORVI-X-TC4/examples/arduino/NORVI_X-TC4_Test_Code/NORVI_X-TC4_Test_Code.ino)
2. Verify the **board** and **port** selections.
3. Click **Upload** to upload the test sketch to the NORVI X CPU.

### I2C Communication and Channel Reading

The readTC() function handles I²C communication between the NORVI X controller (Master) and the X-TC4 module (Slave). It sends the command and selected channel numbers to the slave module and requests the corresponding temperature and fault data.

```cpp

                Wire.beginTransmission(TC_SLAVE_ADDR);
Wire.write(0x01);        // command

for (int i = 0; i < chunkCount; i++)
{
    Wire.write(channelsToRead[chunkStart + i]);
}

if (Wire.endTransmission() != 0)
{
    Serial.println("I2C TX FAIL");
    if (++i2cFailCount >= 5) { i2cBusRecover(); i2cFailCount = 0; }
    continue;
}

i2cFailCount = 0;

delay(15);

uint8_t totalBytes = chunkCount * 8;
Wire.requestFrom(TC_SLAVE_ADDR, totalBytes);
```

### CRC Data Validation

The crc8() function checks the integrity of the data received from the TC4 module. The calculated CRC value is compared with the CRC value received from the slave module.

```cpp

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

### Temperature and Fault Data Processing

The received data is processed to extract the channel number, temperature, and fault status. The temperature is converted into a floating-point value and stored in the corresponding channel array.

```cpp

                float temp;
memcpy(&temp, &buf[2], 4);
uint8_t ch = buf[1];
if (ch < 1 || ch > 4) continue;     // ignore a reply for a channel that does not exist
anyValid = true;

tcTemp[ch-1] = temp;
tcFault[ch-1] = buf[6];

Serial.print("Ch ");
Serial.print(ch);
Serial.print(" Temp: "); Serial.print(temp);
Serial.print(" Fault: "); Serial.println(buf[6]);
```

### Channel Selection Through Serial Monitor

The handleSerial() function checks for user input through the Serial Monitor. Sending C or c enters configuration mode, allowing users to select the thermocouple channels to read.

```cpp

                void handleSerial()
{
    if (Serial.available())
    {
        char c = Serial.read();
        if (c == 'C' || c == 'c') enterConfig();
    }
}
```

**The following code processes channel selections entered by the user.**

```cpp

                int dashIndex = input.indexOf('-');
if (dashIndex != -1)
{
    int startCh = input.substring(0, dashIndex).toInt();
    int endCh   = input.substring(dashIndex + 1).toInt();
    if (startCh >= 1 && endCh <= 4 && startCh <= endCh)          // channels 1-4 only
    {
        for (int i = startCh; i <= endCh; i++)
            newCh[newCount++] = i;
    }
}
else
{
    int start = 0;
    while (start < input.length() && newCount < 4)
    {
        int commaPos = input.indexOf(',', start);
        String chPart = (commaPos == -1) ? input.substring(start) : input.substring(start, commaPos);
        int ch = chPart.toInt();
        if (ch >= 1 && ch <= 4) newCh[newCount++] = ch;
        if (commaPos == -1) break;
        start = commaPos + 1;
    }
}
```

### Validating the Full Test Sketch

When the sketch runs successfully with the X-TC4 attached, you should see:

- A temperature line every second for each selected channel, close to room temperature at idle and rising when the thermocouple tip is warmed.
- Fault: 0 on every connected thermocouple.
- No I2C TX FAIL or CRC ERROR messages.

If a channel shows a non-zero fault, or NO RESPONSE appears, check the thermocouple wiring and the DIP switch address (it must match TC_SLAVE_ADDR) before relying on any readings.

## Troubleshooting

| Symptom | Suggested Action |
| --- | --- |
| I2C TX FAIL / RX FAIL on every read, and the TFT shows NO RESPONSE | Reseat the module on the expansion bus, confirm TC_SLAVE_ADDR in the sketch matches the DIP switch address, and check the CPU is powered with sufficient current headroom. |
| CRC ERROR Channel n appears repeatedly | Check I2C wiring quality and length, and confirm the thermocouple on that channel is connected properly. |
| Non-zero fault value on a channel | Check the thermocouple for an open circuit or short, and confirm its polarity at the TC_n+ / TC_n- terminals. An unconnected channel also reports a fault. |
| Temperature reads implausible or changes in the wrong direction | Check polarity, confirm the sensor is a K-type thermocouple, and check the connection at the terminal. |
| Readings noisy or unstable | Separate thermocouple wiring from AC power, relay, or motor wiring; use shielded thermocouple cable for longer runs and ground the shield at one end only. |
| Upload fails or board is not detected | Match the Arduino IDE settings in Section 7.1: ESP32S3 Dev Module, USB CDC On Boot enabled, 16MB flash, QSPI PSRAM, Huge APP partition. |

## Support & Resources

 **Product documentation & datasheets:** [https://norvi.io/docs/norvi-x-tc4-datasheet/](https://norvi.io/docs/norvi-x-tc4-datasheet/) **Product page:** [https://norvi.io/](https://norvi.io/) **Firmware examples & libraries:** [https://github.com/NORVIControllers/NORVI-X-Version-02/tree/main](https://github.com/NORVIControllers/NORVI-X-Version-02/tree/main) **Technical support:** [support@norvi.io](mailto:support@norvi.io)

## REVISION HISTORY

| Rev. | Date | Change Description | Board Revision |
| --- | --- | --- | --- |
| 1.0 | 27/10/2026 | Initial release | V1 |
