---
title: "IRIV IO Controller to ThingSpeak: Modbus RTU via WIZnet W5x00"
url: "https://maker.wiznet.io/irina/projects/iriv-io-controller-iot-gateway--thingspeak/"
markdown_url: "https://maker.wiznet.io/irina/projects/iriv-io-controller-iot-gateway--thingspeak/md"
type: "UCC: User Created Content"
author: "Hussien Jawhar Sathik"
author_url: "https://my.cytron.io/tutorial/iriv-io-controller-iot-gateway-thingspeak"
editor: "WIZnet"
editor_url: "https://maker.wiznet.io/"
original_author: "Hussien Jawhar Sathik"
original_url: "https://my.cytron.io/tutorial/iriv-io-controller-iot-gateway-thingspeak"
published: "2025-08-27"
language: "en"
tags: ["W5500", "CircuitPython"]
likes: 0
views: 5472
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# IRIV IO Controller to ThingSpeak: Modbus RTU via WIZnet W5x00

> Read RS-485 Modbus temperature/humidity on IRIV IO Controller and send to ThingSpeak (field1/field2) over Ethernet using WIZnet W5x00 in CircuitPython.

Original author: Hussien Jawhar Sathik (source: https://my.cytron.io/tutorial/iriv-io-controller-iot-gateway-thingspeak)

## Article

This tutorial shows how to use an **IRIV IO Controller** to read temperature and humidity from an **RS-485 (Modbus RTU)** sensor and upload both values to **ThingSpeak** over Ethernet using a **WIZnet W5x00** driver in CircuitPython. You’ll create a ThingSpeak channel, grab the **Write API Key**, and push data to `field1` and `field2` via the HTTP **update** endpoint—exactly as demonstrated in the original Cytron guide.

---

### 🔧 Project Overview

**Project Name:** IRIV IO Controller IoT Gateway : ThingSpeak
**Author (Tutorial):** Hussien Jawhar Sathik (Cytron)
**Platform:** IRIV IO Controller (CircuitPython)
**Networking:** WIZnet W5x00 (CircuitPython `adafruit_wiznet5k`)
**Field Bus:** RS-485 (Modbus RTU)
**Cloud/App:** ThingSpeak (Channel with **Write API Key**, updates to **field1/field2**)
**What You’ll See:** Console prints (temperature/humidity and server response) that match values plotted on your ThingSpeak channel.

> The tutorial walks through creating a **ThingSpeak channel**, retrieving **Write/Read API Keys**, and posting data to `api.thingspeak.com/update`.

---

## ⚡ How the Project Works

### 1) Hardware Setup

**IRIV IO ControllerRS-485 (Modbus RTU) temperature/humidity sensor** (e.g., slave address 1; registers 1 and 0 used in the example)

**Ethernet** connection (DHCP recommended)

Initialize the W5x00 via SPI with `adafruit_wiznet5k`, then create an HTTP session using `adafruit_connection_manager` + `adafruit_requests`.

### 2) Protocols & Control

**Modbus RTU:** Read holding registers—example maps **reg 1 → temperature**, **reg 0 → humidity** and scales by 10

**ThingSpeak:** Send a GET request to

`http://api.thingspeak.com/update?api_key=<WRITE_KEY>&field1=<temp>&field2=<humi>`

to update your channel fields.

### 3) Development Process

Create a **ThingSpeak channel** and copy the **Write API Key**.

Insert the key into the code and set your Modbus parameters.

Run on IRIV → confirm console output and ThingSpeak updates/graphs.

---

## 💡 Key Features & Benefits

### Features

**IRIV + W5x00 Ethernet:** Reliable wired uplink for cloud logging.

**Modbus RTU integration:** Periodically polls RS-485 registers for T/RH.

**ThingSpeak channel logging:** Simple HTTP **update** calls to **field1/field2** with your Write API Key.

**CircuitPython stack:** `adafruit_wiznet5k`, `adafruit_requests`, `uModbus`—compact, readable code.

### Applications

**Building/Facility:** Environmental monitoring (temperature/humidity)

**Industrial Edge:** RS-485 sensors bridged to cloud analytics

**Smart Home/Office:** Robust IP backhaul for sensor data

### Code Highlights (Essentials)

```python
Below is the distilled flow from the tutorial—replace the key with your ThingSpeak Write API Key.
THINGSPEAK_WRITE_API_KEY = "YOUR_WRITE_KEY"
THINGSPEAK_UPDATE_URL    = "http://api.thingspeak.com/update"

# Read Modbus holding registers (example: addr 1→temp, addr 0→humidity)
temperature = host.read_holding_registers(1, 1, 1)[0] / 10.0
humidity    = host.read_holding_registers(1, 0, 1)[0] / 10.0

# Push to ThingSpeak fields
resp = requests.get(
    f"{THINGSPEAK_UPDATE_URL}?api_key={THINGSPEAK_WRITE_API_KEY}"
    f"&field1={temperature}&field2={humidity}"
)
print("Response:", resp.text); resp.close()
```

The original page shows the same endpoint, field mapping, and the W5x00 + requests session setup.

![](https://maker.wiznet.io/upload/ckeditor5/860796700%5F1756370954%2Epng)

---

### Troubleshooting Tips

**No updates?** Check the **Write API Key**, URL spelling, and that `api.thingspeak.com` is reachable (firewall/proxy).

**Bad readings?** Verify Modbus slave address, register indices (1 and 0 in the example), baud/parity/stop bits, and any scaling factors.

**DHCP issues:** Test with a static IP on the W5x00 to rule out network conflicts.

---

Source: https://maker.wiznet.io/irina/projects/iriv-io-controller-iot-gateway--thingspeak/
