醬是創客的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