# SHT20 溫濕度感測器 Modbus RS485 應用說明 作者: Jack OmniXRI, 2025/11/10 ![RS485_SHT20](https://hackmd.io/_uploads/rkwan7yebe.jpg) 這裡將網路上的資料重新整理了一下,方便大家了解這個 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 ![](https://jin-hua.com.tw/upload/images/2430000014178-901.jpg =240x) ![](https://jin-hua.com.tw/upload/images/2430000014178-903.jpg =240x)