全部的電表都是經過RS485驅動晶片,連接到Arduino的串口上。Arduino軟件是用ModBus protocol(via RTU)去讀取電表的。Arduino是master,全部的電表都是slave,每個電表都被設定唯一的id,如下:
ID = 0 Arduino
ID = 2 PV直流電表
ID = 3 溫度表
ID = 4 日照表
ID = 5 PV交流電表
如果你要另加3個電表,你就要先把它們設定跟以上電表不同的id,然後連接到RS485總綫上。例如:
ID = 11 (新加)PV直流電表
ID = 12 (新加)PV交流電表
ID = 13 (新加)溫度表
你的程式是用Arduino的ModBusMaster程式庫,去讀取不同的電表的資料的。其方法如下:
// 使用ModbusMaster程式庫
#include <ModbusMaster.h>
// RS485驅動控制接腳
#define MAX485_DE 3
#define MAX485_RE_NEG 2
// instantiate ModbusMaster object
ModbusMaster node;
// RS485驅動器(輸出模式)
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
// RS485驅動器(輸入模式)
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup()
{
// 初始化 ModBus
Serial.begin(9600);
pinMode (4, OUTPUT);
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// RS485驅動器(輸入模式)
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
// Callbacks (讓ModbusMaster控制RS485驅動器)
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
uint8_t result;
// 讀取PV直流電表數值 (slave ID = 2)
node.begin(2, Serial);
result = node.readHoldingRegisters(0x009D, 1);
float Vpv = node.getResponseBuffer(0x00); // 讀取 電壓
result = node.readHoldingRegisters(0x00A5, 1);
float Apv = node.getResponseBuffer(0x00); // 讀取 電流
result = node.readHoldingRegisters(0x00B5, 1);
int Ppv = node.getResponseBuffer(0x00); // 讀取 功率
delay (1000);
// 讀取溫度表頭數值 (slave ID = 3)
node.begin(3, Serial);
result = node.readHoldingRegisters(0x0007, 1);
float TS = node.getResponseBuffer(0x0000); // 讀取 温度
delay (1000);
// 讀取日照表頭數值 (slave ID = 4)
node.begin(4, Serial);
result = node.readHoldingRegisters(0x0007, 1);
int SI = node.getResponseBuffer(0x00); // 讀取 光度
delay (1000);
// 讀取PV交流電表數值 (slave ID = 5)
node.begin(5, Serial);
result = node.readHoldingRegisters(0x009D, 1);
float Vac = node.getResponseBuffer(0x00); // 讀取 電壓
result = node.readHoldingRegisters(0x00A5, 1);
float Aac = node.getResponseBuffer(0x00); // 讀取 電流
result = node.readHoldingRegisters(0x00B5, 1);
int Pac = node.getResponseBuffer(0x00); // 讀取 功率
delay (1000);
// - - - - - - - - - - - - - - - - - - - - - - - -
// 讀取[新加]PV直流電表數值 (slave ID = 11)
node.begin(11, Serial);
result = node.readHoldingRegisters(0x009D, 1);
float V2pv = node.getResponseBuffer(0x00); // 讀取 電壓
result = node.readHoldingRegisters(0x00A5, 1);
float A2pv = node.getResponseBuffer(0x00); // 讀取 電流
result = node.readHoldingRegisters(0x00B5, 1);
int P2pv = node.getResponseBuffer(0x00); // 讀取 功率
delay (1000);
}