# SHT20 溫濕度感測器 Modbus RS485 應用說明
作者: Jack OmniXRI, 2025/11/10

這裡將網路上的資料重新整理了一下,方便大家了解這個 SHT20 感測器,更完整的資料可參考文末相關連結。
## 產品說明
產品採用工業級芯片,高精度進口 SHT20 溫濕度傳感器,確保產品的優異可靠性、高精度、互換性。採用 RS485 硬體接口(具有防雷設計),協議層兼容標準的工業 Modbus-Rtu 協議。本產品集 MODBUS 協議與普通協議於一體,用戶可以自行選擇通信協議,普通協議帶有自動上傳功能(連接RS485通過串口調式工具即會自動輸出溫濕度)。
## 產品亮點
* 工業級產品,高精度 SHT20 溫濕度感測器,RS485 通信。
* 標準 MODBUS 協議與普通協議於一體,用戶可以自行選擇通信協議。
* 鮑率可以自行設定。
* 普通協議帶有自動上傳功能,上傳速率可以自行設定。
## 產品參數
* 工作電壓:DC4-30V(不要超過33V)
* 大功率:0.2W
* 工作溫度:溫度-20℃+60℃,濕度0%RH-RH
* 控制精度:溫度±0.3℃(25℃),濕度±3%RH(25℃)
* 輸出接口:RS485通信(標準 MODBUS 協議和自定義普通協議),詳見協議說明。
* 設備地址:可設置1-247,默認為1。
* 鮑率:默認9600bps(用戶可自行設定),8位數據,1位停止,無校驗
* 尺寸:60*30*18 mm
## MODBUS 協議
產品所用功能碼:
* 0x03 : 讀取保持寄存器
* 0x04 : 讀取輸入寄存器
* 0x06 : 寫入單個保持寄存器
* 0x10 : 寫入多個保持寄存器
| 暫存器類型 | 暫存器位址 | 資料內容 | 位元組數 |
| :------: | :------: | :------: | :------: |
| 輸入暫存器 | 0x0001 | 溫度值 | 2 |
| | 0x0002 | 濕度值 | 2 |
| 保持暫存器 | 0x0101 | 設備位址<br>(1~247) | 2 |
| | 0x0102 | 鮑率<br> 0:9600<br> 1:14400<br> 2:19200 | 2 |
| | 0x0103 | 溫度修正值(/10)<br> -10.0 ~ +10.0 | 2 |
| | 0x0104 | 濕度修正值(/10)<br> -10.0 ~ +10.0 | 2 |
## Modbus 通訊格式
* **主機(Host)發送資料格式**
| 從機位址 | 功能碼 | 暫存器位址<br> 高位元組 | 暫存器位址<br> 低位元組 | 暫存器數量<br> 高位元組 | 暫存器數量<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
* **從機(Slave)回應資料格式**
| 從機位址 | 功能碼 | 資料數量 | 回應資料1<br> 高位元組 | 回應資料1<br> 低位元組 | 回應資料N<br> 高位元組 | 回應資料N<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
## MODBUS 命令範例
### 範例一:讀取溫度值
主機讀取從機編號 0x01 的溫度,功能碼為 0x04,即從設備編號 0x01 暫存器位址 0x0001 讀取 1 組暫存器數值(2個位元組)。
| 從機位址 | 功能碼 | 暫存器位址<br> 高位元組 | 暫存器位址<br> 低位元組 | 暫存器數量<br> 高位元組 | 暫存器數量<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x04 | 0x00 | 0x01 | 0x00 | 0x01 | 0x60 | 0x0A |
從機回應溫度內容:
| 從機位址 | 功能碼 | 資料數量 | 回應資料1<br> 高位元組 | 回應資料1<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x04 | 0x02 | 0x01 | 0x31 | 0x79 | 0x74 |
溫度值 = 0x131,轉換成十進制305,實際溫度值 = 305 / 10 = 30.5℃
註:溫度是有符號16進制數,溫度值 = 0xFF33,轉換成十進制 -205,實際溫度 = -205 / 10 = -20.5℃;
### 範例二:讀取濕度值
主機讀取從機編號 0x01 的濕度,功能碼為 0x04,即從設備編號 0x01 暫存器位址 0x0002 讀取 1 組暫存器數值(2個位元組)。
| 從機位址 | 功能碼 | 暫存器位址<br> 高位元組 | 暫存器位址<br> 低位元組 | 暫存器數量<br> 高位元組 | 暫存器數量<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x04 | 0x00 | 0x02 | 0x00 | 0x01 | 0xC1 | 0xCA |
從機回應濕度內容:
| 從機位址 | 功能碼 | 資料數量 | 回應資料1<br> 高位元組 | 回應資料1<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x04 | 0x02 | 0x02 | 0x22 | 0xD1 | 0xBA |
濕度值 = 0x222,轉換成十進制546,實際濕度值 = 546 / 10 = 54.6%;
### 範例三:連續讀取溫濕度值
主機讀取從機編號 0x01 的濕度,功能碼為 0x04,即從設備編號 0x01 暫存器位址 0x0001 連續讀取 2 組暫存器數值(4個位元組),表示溫度和濕度。
| 從機位址 | 功能碼 | 暫存器位址<br> 高位元組 | 暫存器位址<br> 低位元組 | 暫存器數量<br> 高位元組 | 暫存器數量<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x04 | 0x00 | 0x01 | 0x00 | 0x02 | 0x20 | 0x0B |
從機回應溫度內容:
| 從機位址 | 功能碼 | 資料數量 | 回應資料1<br> 高位元組 | 回應資料1<br> 低位元組 | 回應資料2<br> 高位元組 | 回應資料2<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x04 | 0x04 | 0x01 | 0x31 | 0x02 | 0x22 | 0x2A | 0xCE |
回應資料1(暫存器位址 0x0001)為溫度,回應資料2(暫存器位址 0x0002)為濕度。
### 範例四:從保持暫存器讀取內容
主機讀取從機編號 0x01 的設備編號,功能碼為 0x03,即從設備編號 0x01 暫存器位址 0x0101 讀取 1 組暫存器數值(2個位元組)。
| 從機位址 | 功能碼 | 暫存器位址<br> 高位元組 | 暫存器位址<br> 低位元組 | 暫存器數量<br> 高位元組 | 暫存器數量<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x03 | 0x01 | 0x01 | 0x00 | 0x01 | 0xD4 | 0x0F |
從機回應內容:
| 從機位址 | 功能碼 | 資料數量 | 回應資料1<br> 高位元組 | 回應資料1<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x03 | 0x02 | 0x00 | 0x01 | 0x30 | 0x18 |
0x01 號從機回應設備號為 0x0001。
### 範例五:寫入資料到保持暫存器
主機改變從機編號將 0x01 變為 0x08,功能碼為 0x06,即對設備編號 0x01 暫存器位址 0x0101 寫入 1 組暫存器數值(2個位元組)。
| 從機位址 | 功能碼 | 暫存器位址<br> 高位元組 | 暫存器位址<br> 低位元組 | 暫存器內容<br> 高位元組 | 暫存器內容<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x06 | 0x01 | 0x01 | 0x00 | 0x08 | 0xD4 | 0x0F |
從機回應內容與發送相同:
| 從機位址 | 功能碼 | 暫存器位址<br> 高位元組 | 暫存器位址<br> 低位元組 | 暫存器內容<br> 高位元組 | 暫存器內容<br> 低位元組 | CRC<br> 高位元組 | CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x06 | 0x01 | 0x01 | 0x00 | 0x08 | 0xD4 | 0x0F |
### 範例六:連續修改保持暫存器
主機改變從機編號將 0x01 變為 0x20(即十進制32)且鮑率變為 0x2580(即十進制 9600),功能碼為 0x10,即對設備編號 0x01 暫存器位址 0x0101 連續寫入 2 組暫存器數值(4個位元組)。
| 從機位址 | 功能碼 | 暫存器位址<br> 高位元組 | 暫存器位址<br> 低位元組 | 暫存器數量<br> 高位元組 | 暫存器數量<br> 低位元組 | 位元組數 | 暫存器1<br> 高位元組 |暫暫存器1<br> 低位元組 | 暫存器1<br> 高位元組 |暫暫存器1<br> 低位元組 | CRC<br> 高位元組 |CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x10 | 0x01 | 0x01 | 0x00 | 0x02 | 0x04 | 0x00 | 0x20 | 0x25 | 0x80 | 0x25 | 0x09 |
從機回應內容與發送相同:
| 從機位址 | 功能碼 | 暫存器位址<br> 高位元組 | 暫存器位址<br> 低位元組 | 暫存器數量<br> 高位元組 | 暫存器數量<br> 低位元組 | 位元組數 | 暫存器1<br> 高位元組 |暫暫存器1<br> 低位元組 | 暫存器1<br> 高位元組 |暫暫存器1<br> 低位元組 | CRC<br> 高位元組 |CRC<br> 低位元組 |
| :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: |
| 0x01 | 0x10 | 0x01 | 0x01 | 0x00 | 0x02 | 0x04 | 0x00 | 0x20 | 0x25 | 0x80 | 0x25 | 0x09 |
## 普通版本協議
鮑率默認為 9600bps(用戶可自行設定),8位元資料,1位停止位元,無校驗。
* RS485通訊格式:
| 序列命令 | 說明 |
| :------: | :------: |
| READ | 觸發一次溫濕度上報 |
| AUTO | 啟動溫濕度自動上報 |
| STOP | 停止溫濕度自動上報 |
| BR:XXXX | 設置鮑率 9600~19200 |
| TC:XX.X | 設定溫度校準 -10.0 ~ +10.0 |
| HC:XX.X | 設定濕度校準 -10.0 ~ +10.0 |
| HZ:XX.X | 設定溫濕度上報速度 0.5, 1,2,5,10 HZ |
| PARAM | 讀取系統目前設定值 |
* PARAM 指令
**TC:0.0,HC:0.0,BR:9600,HZ:1** 表示溫度修正值 0.0, 濕度修正值 0.0, 鮑率 9600bps, 上報速率 1 HZ。
**SLAVE_ADD:1** 表示 MODBUS 從機位址(設備編號)為 0x01
SLAVE_ADD:1->MODBUSthe slave address0x01
## 參考文獻
* 溫濕度變送器 SHT20傳感器 工業級高精度溫濕度監測 Modbus RS485
https://www.ruten.com.tw/item/show?22025708278575
* SHT20 เซ็นเซอร์วัดอุณหภูมิและความชื้น Temperature and Humidity Transmitter SHT20 RS485 Sensor Module
https://www.cybertice.com/product/4802/sht20-%E0%B9%80%E0%B8%8B%E0%B9%87%E0%B8%99%E0%B9%80%E0%B8%8B%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%A7%E0%B8%B1%E0%B8%94%E0%B8%AD%E0%B8%B8%E0%B8%93%E0%B8%AB%E0%B8%A0%E0%B8%B9%E0%B8%A1%E0%B8%B4%E0%B9%81%E0%B8%A5%E0%B8%B0%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%8A%E0%B8%B7%E0%B9%89%E0%B8%99-temperature-and-humidity-transmitter-sht20-rs485-sensor-module
* TTL轉RS485工業用轉換模組(MAX1348)
https://jin-hua.com.tw/page/product/show.aspx?num=35141&lang=TW

