Arduino RS485 и I2C одновременно

У меня есть Arduino NANO, подключенная к ПЛК Domat MarkMMX через RS485 (TX1, RX0). Для чтения данных/регистров в ПЛК используется протокол Modbus RTU. Работает нормально. Но когда я подключаю датчик освещенности (со связью I2C) и меняю код на считываемое значение, связь Modbus RS485 в это время зависает.

Кто-нибудь может мне помочь? Спасибо.

Датчик освещенности BH1750 подключен к A4 и A5. Преобразователь TTL в RS485 подключен как TX1 - DI, RX0 - RO, DE,RE - D4.

Сокращенный код:

#include <BH1750.h>
#include<ModbusRtu.h>
#include <Wire.h>

BH1750 lightMeter;

float lux;

Modbus bus;  

uint16_t modbus_array[] = {180,20,40};

void setup()
{
  Wire.begin();
  bus = Modbus(10,1,4);
  bus.begin(19200);
}

void loop()
{
   lux = lightMeter.readLightLevel();

   bus.poll(modbus_array,sizeof(modbus_array)/sizeof(modbus_array[0]));
   modbus_array[2] = lux;

  if (modbus_array[0] == 300)   
  {
    digitalWrite(led1,LOW);
  }
  else   
  {
    digitalWrite(led1,HIGH);
  }
}

, 👍0

Обсуждение

как узнать, что зависает модусная связь?, @jsotola

На этом ПЛК показано, что данные Arduino недоступны, а на Arduino светодиод TX все еще горит, просто мигает RX. Когда я стираю эту команду для чтения значения освещенности, светодиоды мигают., @miluk

что произойдет, если вы удалите только modbus_array[2] = lux;?, @jsotola

Ничего такого. Ардуино ведет себя так же. Я просто добавил один цикл, чтобы мигать светодиодом. Когда в коде есть функция чтения света, светодиод не мигает. Так что я думаю, что вся программа остановилась????, @miluk

а датчик I2C без модбуса работает?, @Juraj

Да, без Modbus работает нормально., @miluk

это может быть вызвано помехами... нашел это... https://forum.arduino.cc/t/i2c-interference-by-serial-communication/279424/3, @jsotola

Хорошо, я проверю это. Спасибо, пока., @miluk

О каком "Нано" вы говорите и о какой библиотеке? Потому что [это] (https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino/blob/d98f14f/ModbusRtu.h#L272-L283), которое вы, похоже, используете с bus = Modbus( 10,1,4); вообще не может работать с оригинальным Nano (который, кажется, помечен). У обычного Nano нет Serial1. Если вам удалось при прочих равных работать без датчика освещенности, то либо это не та библиотека, которую вы используете, либо упомянутая плата не та, которую вы используете., @timemage

Привет. Честно говоря, я не могу сказать, что понимаю это ясно, но теперь все работает нормально. У меня есть NANO, и я использую эту процедуру для связи по Modbus. Когда я контролировал последовательный порт, иногда появлялось сообщение: **Устройство не настроено**. Когда я проверил форум, я нашел информацию и использовал lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x5C, &Wire); вместо lightMeter.begin();, и я подключаю вывод ADD к 5V для выбора адреса. Спасибо всем., @miluk