Коллеги, приветствую.
Давно пытаюсь запустить ардуинку в режиме сервера ModBusRTU и RS485. Все вроде как ОК работает, но есть проблема даже outp[4] = 1;
приводит к миганию светодиода. Светодиоды подключены через сдвиговый регистр 74hc595. Если выкинуть функцию modbus_update();
то все ок. Подключение с ПК ModBusPool работает нормально. Железо работает получается норм, проблема видимо в коде, библиотеки ModBus пробовал разные, но результат одинаковый. В чем причина мигания светодиода?
#include <GyverShift.h>
#include <SimpleModbusSlave.h>
#define CLK_595 9
#define CS_595 11
#define DAT_595 12
GyverShift<OUTPUT, 1> outp(CS_595, DAT_595, CLK_595);
enum
{
// The first register starts at address 0
bt_1,
bt_2,
bt_3,
bt_4,
bt_5,
bt_6,
bt_7,
bt_8,
bt_9,
bt_10,
bt_11,
bt_12,
bt_13,
led_1,
led_2,
led_3,
led_4,
led_5,
HOLDING_REGS_SIZE // leave this one
// total number of registers for function 3 and 16 share the same register array
};
unsigned int holdingRegs[HOLDING_REGS_SIZE]; // function 3 and 16 register array
void setup() {
modbus_configure(&Serial, 19200, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs);
// modbus_update_comms(baud, byteFormat, id) is not needed but allows for easy update of the
// port variables and slave id dynamically in any function.
modbus_update_comms(19200, SERIAL_8N2, 1);
//Serial.begin(19200);
}
void loop() {
int sensorValue = analogRead(A0);
// 1014 отключение
// 923 отключить звук
// 846 сброс
// 780 тест
// 724 остановка пуска
modbus_update();
if (sensorValue > 1000 && sensorValue < 1020) holdingRegs[bt_1] = 1;
else holdingRegs[bt_1] = 2;
if (sensorValue > 920 && sensorValue < 930) holdingRegs[bt_2] = 1;
else holdingRegs[bt_2] = 2;
if (sensorValue > 840 && sensorValue < 850) holdingRegs[bt_3] = 1;
else holdingRegs[bt_3] = 2;
if (sensorValue > 775 && sensorValue < 785) holdingRegs[bt_4] = 1;
else holdingRegs[bt_4] = 2;
if (sensorValue > 720 && sensorValue < 730) holdingRegs[bt_5] = 1;
else holdingRegs[bt_5] = 2;
if (holdingRegs[led_1] == 1) outp[1] = 1;
else outp[1] = 0;
if (holdingRegs[led_2] == 1) outp[2] = 1;
else outp[2] = 0;
if (holdingRegs[led_3] == 1) outp[3] = 1;
else outp[3] = 0;
outp[4] = 1;
outp.update();
delay(500);
}