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 - пусть она и разбирается. Вряд ли кто захочет в этом копаться.
Пишите программы сами, а не пользуйтесь тупыми "помогайками"
Согласен с вами. Но мне кажется проблема да же не в коде, а в аппаратной части.