Arduion Modbus通讯示例

实现了Arduion和Qt上位机利用Modbus协议采集DHT11数据,以及开关LED灯
软件界面:
在这里插入图片描述
实物界面:
在这里插入图片描述
arduion下位机代码:

#include <ModbusRtu.h>
#include <DHT.h>

 #define DHTPIN 2          // DHT11连接到Arduino的数字引脚2
 #define DHTTYPE DHT11     // DHT11型号传感器

// Modbus从站对象和共享数据数组
Modbus slave(12, Serial,0);
uint16_t au16data[3];      

// DHT11传感器对象
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(19200);
  dht.begin();             // 启动DHT11传感器
  slave.start();           // 启动Modbus从站
  pinMode(6, OUTPUT);  // 将引脚6设置为输出模式
}

uint16_t reg3Value;

void loop() {
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
  if (!isnan(humidity)) {
    au16data[0] = (uint16_t)(humidity * 10); 
  }
  if (!isnan(temperature)) {
    au16data[1] = (uint16_t)(temperature * 10); 
  }

  if (au16data[2] == 1) {
    digitalWrite(6, HIGH); 
  } else {
    digitalWrite(6, LOW);  
  }
  slave.poll(au16data, 3);
}

遇到的问题:
用modbus-poll当上位机的时候总是读不到数据

在这里插入图片描述

一定记得串口参数必须设置对,然后从站地址,以及起始读几个从哪里开始要设置对,比如我只操作3个寄存器那就从0-3,不然一直读不到数据。

在这里插入图片描述
然后上位机这边就是用2个按钮修改寄存器的值,两个lcd-number和一个label显示寄存器 的值
在这里插入图片描述
虽然简单,但是很有意义

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Arduino Modbus示例,用于通过Modbus协议通信。 ```cpp #include <ModbusMaster.h> // 创建一个ModbusMaster对象 ModbusMaster node; // 设置Modbus从机地址 const int slaveId = 1; // 定义保持寄存器的地址 const int holdingRegisterAddress = 0; void setup() { // 初始化串口通信 Serial.begin(9600); // 设置Modbus从机地址 node.begin(slaveId, Serial); // 设置串口通信超时时间(默认为1000ms) node.setTimeOut(500); // 设置保持寄存器的初始值 node.addHreg(holdingRegisterAddress, 0); } void loop() { // 读取保持寄存器的值 uint16_t holdingRegisterValue; uint8_t result = node.readHoldingRegisters(holdingRegisterAddress, 1); if (result == node.ku8MBSuccess) { holdingRegisterValue = node.getResponseBuffer(0); Serial.print("Holding Register Value: "); Serial.println(holdingRegisterValue); } else { Serial.println("Failed to read Holding Register!"); } // 增加保持寄存器的值 holdingRegisterValue++; result = node.writeSingleRegister(holdingRegisterAddress, holdingRegisterValue); if (result == node.ku8MBSuccess) { Serial.println("Successfully updated Holding Register!"); } else { Serial.println("Failed to update Holding Register!"); } delay(1000); } ``` 这个示例使用了ModbusMaster库。在setup()函数,我们初始化了串口通信,设置了Modbus从机地址,并添加了一个保持寄存器。在loop()函数,我们先读取保持寄存器的值,然后将其增加1,并写回到保持寄存器。最后,通过延迟1秒的时间进行循环。 请注意,这只是一个简单的示例,实际应用可能需要根据具体的需求进行适当的修改和扩展。同时,需要根据您使用的Modbus设备和通信方式(如串口、RS485等)进行相应的配置。详细的用法和函数说明,请参考ModbusMaster库的文档或示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值