ModBus Arduino Mega и Uno

vovikon
Offline
Зарегистрирован: 15.02.2017

Здравствуйте. Возник следующий вопрос. Есть 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));}
  }

 

vovikon
Offline
Зарегистрирован: 15.02.2017

Забыл добавить, что все сделано в программе FLProg.

b707
Offline
Зарегистрирован: 26.05.2017

vovikon пишет:

Забыл добавить, что все сделано в программе FLProg.

С этого надо было начинать. В том "марсианском языке", которым пишет программа FLProg - пусть она и разбирается. Вряд ли кто захочет в этом копаться.

Пишите программы сами, а не пользуйтесь тупыми "помогайками"

vovikon
Offline
Зарегистрирован: 15.02.2017

Согласен с вами. Но мне кажется проблема да же не в коде, а в аппаратной части.