Привет, Земляне. Короче разрабатываю относительно
простое устройство на платформе Arduino и столкнулся с одним немонятным и неприятным моментов: при использовании двух устройств на шине i2c скетч зависает напрочь. Программа крутится на Arduino Nano к пинам шины i2c (A4 и А5) подключены модуль реального времени DS3231 и датчик температуры, влажности, атмосферного давления BME280. Используются следующие библиотеки
https://github.com/finitespace/BME280
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.