Задать вопрос
@IronMesh

Почему скетч Arduino зависает при одновременном использовании двух устройств на шине i2c?

Привет, Земляне. Короче разрабатываю относительно простое устройство на платформе Arduino и столкнулся с одним немонятным и неприятным моментов: при использовании двух устройств на шине i2c скетч зависает напрочь. Программа крутится на Arduino Nano к пинам шины i2c (A4 и А5) подключены модуль реального времени DS3231 и датчик температуры, влажности, атмосферного давления BME280. Используются следующие библиотеки
66ec40861356b712914135.png
https://github.com/finitespace/BME280
66ec40e8218a7749548085.png
https://github.com/cvmanjoo/RTC

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

#include <BME280I2C.h>
#include <Wire.h>
#include <I2C_RTC.h>

BME280I2C bme;
DS3231 rtc;
bool is_rtc_available = false;

//фрагмент кода из функции setup() (начало)
  Wire.begin();
  is_rtc_available = rtc.begin(); // инициализация модуля RTC
  if (is_rtc_available){  
    if(rtc.isRunning()){ // если осциллятора запущен
      DEBUG_PRINTLN(F("RTS is running"));
      clock_time.h = (uint8_t)rtc.getHours();  // извлекаем время из модуля
      clock_time.m = (uint8_t)rtc.getMinutes();
      clock_time.s = (uint8_t)rtc.getSeconds();
    } else { // если осциллятора НЕ запущен
      DEBUG_PRINTLN(F("RTS is NOT running"));
      rtc.setHours((unsigned int) clock_time.h); // записываем в модуль новые значения времени
      rtc.setMinutes((unsigned int) clock_time.m);
      rtc.setSeconds((unsigned int) clock_time.s);
      rtc.startClock(); // запуск осциллятора
    }
  }
  Wire.end();

  DEBUG_PRINTLN(F("Sensor init"));   // инициализация модуля BME280
  Wire.begin();
  if (bme.begin()){
    switch(bme.chipModel()) {
      case BME280::ChipModel_BME280:
        connected_sensor = SENSOR_BME280;
      break;
      case BME280::ChipModel_BMP280:
        connected_sensor = SENSOR_BMP280;
      break;
    }
  } 
  Wire.end();
//фрагмент кода из функции setup() (конец)


В итоге реакция оказывается следующей: скетч зависает после или во время инициализации модуля часов. Причем, если осциллятор не был запущено (в модуле нет батареи, питание к устройству не было подключено), то есть при включении питания все запускается. Если в модуле есть батарея или устройство перезагружается кнопкой RESET, то программа на середине зависает, иногда даже отладочные сообщения отправляемые в последовательный порт макросом DEBUG_PRINTLN обрываются на середине. Если убрать код инициализации BME280, то в любом случае все работает исправно. Конфликт происходит при совместном использовании модулей, других экземпляров модулей нет, чтобы проверить исключить их неисправность, хотя при одиночном их использовании все в порядке, поэтому вероятно проблема в части софта. В чем может быть причина данного бага? Может есть тонкие моменты при работе с данной шиной? Это у меня первый опыт работы более чем с одним устройством i2c.
  • Вопрос задан
  • 379 просмотров
Подписаться 2 Средний Комментировать
Ответ пользователя Константин Зайцев К ответам на вопрос (3)
Я именно эти два модуля заводил вместе без проблем с использованием библиотек Adafruit BME280 Library и RTClib также от Adafruit на ESP32.
Попробуйте другие библиотеки, похоже, выбранные Вами конфликтуют.
Ответ написан