• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 "на гарячую".
 
Сверху Снизу