• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Не работает OLED

keyl112

New member
Всем добрый вечер!

Плата ESP8266 201
Через i2c подключен oled ssd1306, загружаю скетч, на экран выводится информация, но после перезагрузки модуля ( выкл-вкл) на экран ничего не выводится. Модуль дальше работает, в инет лезет, кнопки работают, но на экране пусто.

Тоесть экран работает только сразу после прошивки и до перезагрузки.
Весь остальной функционал работает и после перезагрузки.

Скетч не загружаю, так как даже стандартный пример из библиотеки имеет ту же проблему. Подключал на esp8266-201 14sda, 12scl

Очень прошу помочь.
 

Юрий Ботов

Moderator
Команда форума
1. У вас какой именно экранчик: 4 или 7-ногий?
2. Чем экранчик запитываете и откуда именно? Земля есть?
3. До перезагрузки разумеется питаете все от USB, а после перезагрузки?
 

keyl112

New member
1. У вас какой именно экранчик: 4 или 7-ногий?
2. Чем экранчик запитываете и откуда именно? Земля есть?
3. До перезагрузки разумеется питаете все от USB, а после перезагрузки?
4 ногий
АМС1117 3,3В. От него и ЕСП и экран.
все постоянно питается через АМС1117, при прошивке подключаю от программатора только 3 контакта, рх тх земля
 

keyl112

New member
Заметил такую вещь... если собрать все на макетке наблюдается та же картина с неработающим экраном, но если передернуть землю, то модуль перезагружается и экран работает до следующей перезагрузки кнопкой (кнопка разрывает цепь между АМС1117 и ЕСП+екран)
 

keyl112

New member
Напишу еще так:
собрал схему на макетке - если включить кнопкой -экран не работает, есп работает нормально.
Но если оставить кнопку включенной и передернуть землю или VCC то экран начинает показывать и так до следующей перезагрузки
 

Victor

Administrator
Команда форума
Можно еще попробовать притянуть к питанию оба контакта шины i2c
 

Сергей_Ф

Moderator
Команда форума
@keyl112 вообще не было с ним проблем. Попробуйте ноги поменять у ЕСП, что ли. Я даже на стандартных tx и rx его запускал на Sonoff.
 

Юрий Ботов

Moderator
Команда форума
Возвращаюсь к дурацкому вопросу: сколько напряжение питание на ноге питания дисплея после прошивки и после перезагрузки. Тестер есть?
 

gerkimuyda

New member
Нашел в их библиотеке багу, вызывающую утечку памяти при повторной инициализации дисплея (например, при "горячем" отключением-включении модуля).
В файле OLEDDisplay.h надо дополнить строку [inline]uint8_t *buffer;[/inline] до строки [inline]uint8_t *buffer = NULL;[/inline]
и строку [inline]uint8_t *buffer_back;[/inline] до строки [inline]uint8_t *buffer_back = NULL;[/inline]

А в файле OLEDDisplay.cpp найти блок
Код:
    this->buffer = (uint8_t*) malloc(sizeof(uint8_t) * DISPLAY_BUFFER_SIZE);
    if(!this->buffer) {
      DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create display\n");
      return false;
    }
и дополнить его до
Код:
  if(this->buffer==NULL) {
    this->buffer = (uint8_t*) malloc(sizeof(uint8_t) * DISPLAY_BUFFER_SIZE);
    if(!this->buffer) {
      DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create display\n");
      return false;
    }
  }
и второй блок
Код:
  #ifdef OLEDDISPLAY_DOUBLE_BUFFER
    this->buffer_back = (uint8_t*) malloc(sizeof(uint8_t) * DISPLAY_BUFFER_SIZE);
    if(!this->buffer_back) {
      DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create back buffer\n");
      free(this->buffer);
      return false;
    }
  #endif
дополнить до
Код:
  #ifdef OLEDDISPLAY_DOUBLE_BUFFER
  if(this->buffer_back==NULL) {
    this->buffer_back = (uint8_t*) malloc(sizeof(uint8_t) * DISPLAY_BUFFER_SIZE);
    if(!this->buffer_back) {
      DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create back buffer\n");
      free(this->buffer);
      return false;
    }
  }
  #endif
Теперь можем спокойно в коде делать так:

Код:
#define LCD_address    0x3c  // I2C адрес дисплея
SSD1306 display(LCD_address, D3, D4); //подключен к выводам D3 и D4

boolean find_i2c(uint8_t address) { // функция проверки устройства по указанному адресу I2C
  Wire.beginTransmission(address);
  return (Wire.endTransmission () == 0); //возвращает true если ошибок нет (устройство подключено и отвечает)
}

boolean display_enable;

void setup() {
  Serial.begin(115200);
  Wire.begin(D3, D4); delay(10); 
  if( display_enable = find_i2c(LCD_address) ) { display.init(); display.flipScreenVertically(); display.setContrast(255); } // если подключен дисплей - инициализируем его
}


void loop() {

    if( display_enable ) {
      display.clear();
      display.setFont(ArialMT_Plain_16);
      display.drawString(0, 0, "Test:");
      display.display();
     display_enable = find_i2c(LCD_address); // проверяем связь с дисплеем, чтобы отработать его отключение
    }else{
      if( display_enable = find_i2c(LCD_address) ) // если дисплей отключить, а потом снова включить - он нуждается в командах инициализации
       { display.init(); display.flipScreenVertically(); display.setContrast(255); }
     } //else

} //loop
И запускать модуль без дисплея, а потом подключать и отключать дисплей (когда надо) не перегружая ESP8266 "на гарячую".
 
Сверху Снизу