作者: Jack OmniXRI, 2025/11/10

在智慧物聯網應用中常會需要記錄溫、濕度,常見作法可將感測器的類比輸出透過類比轉數位器(Analog Digital Converter, ADC)進行讀取和記錄,但受限於連接線容易因線材長度及品質影響,進而造成信號衰減及雜訊干擾,因此通常建議在短距離使用。
如果需要一次接很多組溫、濕度計且分佈在大範圍場域時,此時就需要藉助 ModBus (RS485) 通訊形式感測器。 ModBus 採用差動放大方式來傳遞信號,因為較不容易受干擾,所以可以進行長距離傳送。
在本案例中的模組採用 MX1348 作為主要介面轉換晶片,輸入端接 Arduino 送來的 UART (串列埠) Tx / Rx 信號,輸出端則接 ModBus (RS485) A(D+) / B(D-) 差動信號。由於感測器端需要 +5V 電源,由於耗電極少,為節省獨立電源供應器,故直接從 Arduino +5V 接腳供電。
從「SHT20 溫濕度感測器 Modbus RS485 應用說明」中可看出,要存取 ModBus(RS485) 裝置需要下很多命令及解譯回傳的資訊,這對大部份的人來說都不容易。為方便大家存取這個遠端裝置,可以先至 Arduino IDE 選單 Tools / Manage Libraries… ,再輸入 ModbusMaster 找到作者為 Doc Walker 的那個函式庫,點擊 Install 進行安裝即可。
另外由於一般 Arduino 只有一組實體 UART,且通常拿來作為 USB 擬虛串列埠(Virtual COM) 除錯使用,所以這裡只能使用 Arduino 內建的軟體串列埠函式庫(SoftwareSerial)來完成實體資料傳送及接收工作。通常建議 Rx 設為 Pin 10, Tx 設為 Pin 11,但在 UNO R4 時這兩個腳位可能會遇到衝突,故將 Rx / Tx 改到 Pin 8 / 9,就能讓 UNO R3 / R4 都能使用。
關於讀取 SHT20 溫濕度值
SHT20 內部主要分為兩種暫存器,保持暫存器(Holding Register)及輸入暫存器(Input Regitster),前者主要是設定通訊格式及修正補償值,而後者則為溫度及濕度值。更完整命令及暫存器說明可參考「SHT20 溫濕度感測器 Modbus RS485 應用說明」。
溫度值在位址 0x0001,16bit 整數格式,但需除以 10,才能得到正確具一位小數點的數值。濕度值則是在位址 0x0002,同樣要除以 10,才能得到真正數值。為簡化讀取,可以直接對位址 0x0001 讀取二筆 16bit 資料,這樣就能同時獲得溫度及濕度值。
有時會遇到接線不良或其它錯誤,Modbus函式庫也會回傳對應的錯誤碼,方便處理,完整錯誤碼及對應問題如下所示。
Modbus 錯誤碼,意義,常見寫法錯誤
0xE2,逾時(無回應),波特率錯、A/B 反、未共地
0x02,非法地址,地址寫 0x0000 但實際是 0x0001
0x03,非法數值,寫入值超出範圍
0x04,從機錯誤,從機內部故障
範例程式
只需依本文首圖所示連接相關線路,再配合下列程式,即可完成 每2秒讀取一次 SHT20 溫濕度並透過 USB 虛擬串列埠回傳。
參考文獻
- 許哲豪,SHT20 溫濕度感測器 Modbus RS485 應用說明
https://hackmd.io/@OmniXRI-Jack/RS485_SHT20
沒有留言:
張貼留言