iT邦幫忙

1

修改 以解決

  • 分享至 

  • xImage

以解決

Kevin iT邦新手 1 級 ‧ 2018-08-23 19:58:22 檢舉
看起來你LCD沒用到只是接2個PIN讀取數值, 如果是這樣只需要看其他兩個你PIN接哪裡多新增就好。
建議用線上模擬器的做一次比較清楚問題。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
marlin12
iT邦研究生 5 級 ‧ 2018-08-23 21:20:00
最佳解答

全部的電表都是經過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);
}

[備註]
ModbusMaster - GitHub
ModBus protocol

我要發表回答

立即登入回答