ModBus Arduino Mega и Uno
- Войдите на сайт для отправки комментариев
Пт, 02/02/2018 - 00:31
Здравствуйте. Возник следующий вопрос. Есть Arduino Mega (slave) и Arduino Uno (master), преобразователь USB-RS485 и соответственно два модуля RS485. К Меге подключен датчик температуры и влажности DHT 11, значения с этого датчика передаются по RS-485 на Уно и выводятся на LCD 1602. Загвоздка в том, что пока на шине висят два модуля и преобразователь воткнутый в USB, все работает. Как только преобразователь вытащить из USB на LCD все значения замирают.
Код Меги:
#include "DHT.h"
#include <ModbusRtu.h>
DHT _dht1(2, DHT11);
Modbus _modbusSlave(1, 1, 3);
uint16_t _ModbusReg[2];
float _dht1t = 0.00;
float _dht1h = 0.00;
void setup()
{
_modbusSlave.begin(9600);
_dht1.begin();
}
void loop()
{_modbusSlave.poll(_ModbusReg, 2);
float tempDht2;
tempDht2 = _dht1.readTemperature();
if (!(isnan(tempDht2))){_dht1t=tempDht2; }
tempDht2 = _dht1.readHumidity();
if (!(isnan(tempDht2))){_dht1h=tempDht2; }
_ModbusReg[0] = (int(_dht1t));
_ModbusReg[1] = (int(_dht1h));
}
Код Уно:
#include <Wire.h>
#include <ModbusRtu.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C _lcd1(0x3F, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
Modbus _modbusMaster(0, 0, 2);
uint16_t _regModSlav_1[2];
modbus_t _modTelegrSend1;
modbus_t _modTelegrRead1;
unsigned long _modbusTimeVar1 = millis();
bool _isNeesdedSinhronizeSlave1 =0;
uint8_t _modState;
int _modTlgIndex = -1;
bool _isModbusRead = 0;
int _disp1oldLength = 0;
int _disp2oldLength = 0;
void setup()
{
_modbusMaster.begin(9600);
_modbusMaster.setTimeOut(1000);
_modState = 0;
_modTelegrSend1.u8id = 1;
_modTelegrSend1.u8fct = 16;
_modTelegrSend1.u16RegAdd = 0;
_modTelegrSend1.u16CoilsNo = 2;
_modTelegrSend1.au16reg = _regModSlav_1;
_modTelegrRead1.u8id = 1;
_modTelegrRead1.u8fct = 3;
_modTelegrRead1.u16RegAdd = 0;
_modTelegrRead1.u16CoilsNo = 2;
_modTelegrRead1.au16reg = _regModSlav_1;
Wire.begin();
_lcd1.init();
_lcd1.backlight();
}
void loop()
{if((_isTimer(_modbusTimeVar1, 1000 ))&&(!_isNeesdedSinhronizeSlave1)) { _isNeesdedSinhronizeSlave1= 1; _modbusTimeVar1 = millis();}
switch(_modState) {
case 0:{
if((_modTlgIndex == -1)&&(_isNeesdedSinhronizeSlave1)){_modTlgIndex = 1; _isModbusRead = 1; _modState = 1; break;}
if((_modTlgIndex == 1)&&(_isModbusRead)){
_isModbusRead = 0; _modState = 1; break;}
if((_modTlgIndex == 1)&&( !_isModbusRead)){_modTlgIndex = -1; _isNeesdedSinhronizeSlave1 = 0;}
break;}
case 1:{
if((_modTlgIndex == 1)&&(_isModbusRead)) { _modbusMaster.query(_modTelegrRead1);
_modState = 2; break; }
if((_modTlgIndex == 1)&&(! _isModbusRead)) { _modbusMaster.query(_modTelegrSend1);
_modState = 2; break; }
break;}
case 2:
_modbusMaster.poll();
if (_modbusMaster.getState() == COM_IDLE) {_modState= 0;}
break;
}
if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}
if (1) {
_dispTempLength1 = ((((String("Temp:")) + ((String((int(_regModSlav_1[0]))))) + (String(" C"))))).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(int((16 - _dispTempLength1)/2), 0);
_lcd1.print((((String("Temp:")) + ((String((int(_regModSlav_1[0]))))) + (String(" C")))));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;}
}
if (1) {
_dispTempLength1 = ((((String("Hum:")) + ((String((int(_regModSlav_1[1]))))) + (String(" %"))))).length();
if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp2oldLength = _dispTempLength1;
_lcd1.setCursor(int((16 - _dispTempLength1)/2), 1);
_lcd1.print((((String("Hum:")) + ((String((int(_regModSlav_1[1]))))) + (String(" %")))));
} else {
if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;}
}
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
Забыл добавить, что все сделано в программе FLProg.
Забыл добавить, что все сделано в программе FLProg.
С этого надо было начинать. В том "марсианском языке", которым пишет программа FLProg - пусть она и разбирается. Вряд ли кто захочет в этом копаться.
Пишите программы сами, а не пользуйтесь тупыми "помогайками"
Согласен с вами. Но мне кажется проблема да же не в коде, а в аппаратной части.