醬是創客的ESP32教學主題第14篇,以Ai-Thinker安信可NodeMCU-32S(使用Arduino語言)來實作教學,本篇教學將著重使用Modbus RTU由Master抓取特定Slave ID的Register資料實作,我們以機房溫溼度管理的Modbus RTU設備(TH485)來抓取實際的溫度與濕度做為讀取InputRegisters的範例
以下是我們今天的學習目標
- 使用ModbusMaster.h
- 要讀取HoldingRegisters,請使用readHoldingRegisters(位置,數量)
- 要讀取InputRegisters請使用readInputRegisters(位置,數量)
- 要讀取Coils請使用readCoils(位置,數量)
- 要讀取DiscreteInputs請使用readDiscreteInputs(位置,數量)
- 需先宣告ModbusMaster node,然後node.begin(1, Serial2),1代表Slave ID,Serial2則是我們選用TX/RX2
如何安裝ModbusMaster套件? 至”工具”>>”管理程式庫”,搜尋ModbusMaster,作者為Doc Walker,並安裝它。
設備:
安信可NodeMCU-32S #露天拍賣 #蝦皮購物
TTL485轉換板 #露天拍賣 #蝦皮購物
TH485溫溼度板 #露天拍賣 #蝦皮購物
接線方式:
NodeMCU-32S(3.3V或5V)—-TTL485轉換板(VCC)
NodeMCU-32S(GND)—-TTL485轉換板(GND)
NodeMCU-32S(GPIO17設為TX2)–TTL訊號–TTL485轉換板(RXD)
NodeMCU-32S(GPIO16設為RX2)–TTL訊號–TTL485轉換板(TXD)
TTL485轉換板(A/D+)–線–TH485(A)
TTL485轉換板(B/D-)–線–TH485(B)
DC 12V(+)–TH485(+)
DC 0V(-)–TH485(-)
TH485溫溼度設備Modbus RTU規格:
溫度: InputRegisters,0x0001,0.1C
濕度: InputRegisters,0x0002,0.1H
Buad Rate: 9600,N,8,1
Slave ID: 1
Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)
Arduino 範例程式碼如下
//醬是創客 開發實作的好夥伴 #include <WiFi.h> #include <ModbusMaster.h> #define RXD2 16 #define TXD2 17 // instantiate ModbusMaster object ModbusMaster node; uint8_t result; uint16_t data[2]; void setup() { Serial.begin(115200); Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2); // Modbus slave ID 1 使用 Serial2 node.begin(1, Serial2); } void loop() { //InputRegister 0x0001~0x0002 result = node.readInputRegisters(0x0001, 2); if (result == node.ku8MBSuccess) { //InputRegister 0x0001 data[0] = node.getResponseBuffer(0); Serial.println("Temperature"); Serial.println(data[0] * 0.1); //InputRegister 0x0002 data[1] = node.getResponseBuffer(1); Serial.println("Humidity"); Serial.println(data[1] * 0.1); } delay(10000); }
Arduino 序列埠監控視窗 輸出如下
Temperature 28.90 Humidity 65.10