Задать вопрос
@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.
  • Вопрос задан
  • 294 просмотра
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
@kalapanga
Лучше приводить законченный (компилируемый) код, а не огрызок. Так возможно кто-то даже сможет его запустить и проверить у себя.
При двух устройствах на шине надо как минимум убедиться, что устройства имеют разные адреса. Скорее всего так и есть, но, чтоб не думалось, проверьте (гуглите I2C Scanner). И эти ли адреса используют Ваши библиотеки по умолчанию?
Что-то у Вас сильно много манипуляций с Wire.begin() Wire.end(). Это вообще не всегда явно требуется, если библиотеки сами всё что нужно инициализируют. Но если нужно, то оставьте только один вызов Wire.begin() в начале Setup() и всё, Wire.end() вообще не нужен.
Ответ написан
Я именно эти два модуля заводил вместе без проблем с использованием библиотек Adafruit BME280 Library и RTClib также от Adafruit на ESP32.
Попробуйте другие библиотеки, похоже, выбранные Вами конфликтуют.
Ответ написан
@IronMesh Автор вопроса
Тестирование дает неоднозначные результаты
Устройство работает со следующими библиотеками
  • BME280 (Tyler Glenn)
  • RTC (Manjunath CV )


Работа стабильна при условии, что датчик инициализируется первым, шина работает на частоте 10кГц. Если питать устройство через usb порт от ПК, который подключен к плате ардуино, то устройство работает стабильно. Но, после того, как устройство подключается через блок питания устройство виснет при запуске (при наличии батарейки в модуле часов, без нее все безупречно)
Все исходники на странице проекта
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы