Может поможет следующая информация: Прошивка падает в модуле softi2c.hpp, в методе beginTransmission при обращении к переменной _transmitting.
Код: Выделить всё
void SoftI2C::beginTransmission(uint8_t address)
{
if(_transmitting)
{
_error = (_i2c_rep_start((address << 1) | 0) ? 0 : 2);
}
else
{
_error = (_i2c_start((address << 1) | 0) ? 0 : 2);
}
_transmitting = 1;
}Код: Выделить всё
/*
* Turn display off
*/
void PCF8575_S::displayOff() {
_power = false;
_sendToDisplay();
}Код: Выделить всё
if(itsNightOffTime)
{
if(nextion.isDisplayOn()) nextion.displayOff();
if(ili9341.isDisplayOn()) ili9341.displayOff();
if(ws2812b_1.isDisplayOn()) ws2812b_1.displayOff();
if(tm1637_1.isDisplayOn()) tm1637_1.displayOff();
if(max7219_1.isDisplayOn()) max7219_1.displayOff();
//if(pcf8575_1.isDisplayOn()) pcf8575_1.displayOff();
}
else
{
if(!nextion.isDisplayOn()) nextion.displayOn(false);
if(!ili9341.isDisplayOn()) ili9341.displayOn();
if(!ws2812b_1.isDisplayOn()) ws2812b_1.displayOn();
if(!tm1637_1.isDisplayOn()) tm1637_1.displayOn();
if(!max7219_1.isDisplayOn()) max7219_1.displayOn();
//if(!pcf8575_1.isDisplayOn()) pcf8575_1.displayOn();
}Вывод в лог адреса переменной _transmitting - Serial.print(&_transmitting) выдает нулевой адрес. Почему так, я разбираться не стал. Закомментировал указанные строчки выше и скомпилировал прошивку. Все работает.
Добавлено after 2 hours 18 minutes 54 seconds:
И обнаружилась еще одна проблема. На работоспособность устройства она не влияет, но выглядит визуально не очень приятно.
Если в конфигурации задействована функция выключение дисплея на ночь и время выключения стоит до полуночи, например 23 часа, то при подаче питания на устройство его часы начинают отсчет с 00:00. Прошивка считает, что сейчас полночь, дисплей должен быть выключен и выключает его. Столкнувшись с этим сначала думал, что испортил что-то в коде. Перезагружаю, на дисплее появляется изображение и все гаснет. Хорошо по логу было видно, что это не перезагрузка. Дисплей был выключен пока время не синхронизировалось с сервером NTP, а это не быстрый процесс (RTC с батарейкой у меня нет).
Пришлось поставить "костыль" - самой первой строчкой в коде вызывать функцию
Код: Выделить всё
setTime(43200); // Установка системного времени на 12 часов.Таким образом после подачи питания устройство начинает отсчет времени с 12:00 и дисплей не выключается. Наверно решить эту проблему можно более правильно, например выключать дисплей только если системное время корректное.


