OLED-экран гаснет при задержке () — библиотека U8G2 + Arduino Nano

Описание

В настоящее время я пытаюсь получить этот SSD1306 0,91" OLED-экран с Arduino Nano с библиотекой U8G2 (согласно руководству продавца) и в любом коде, который я запускаю, как только delay() выполняется, экран гаснет и больше не показывает текст или изображение.

Какова возможная причина?

Проводка

Код

Чтобы сначала убедиться, что модуль OLED работает, я использую один из примеров HelloWorld из библиотеки U8G2, из которого (с удаленными комментариями) я выполняю следующий код:

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);


void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer();                   // очищаем внутреннюю память
  u8g2.setFont(u8g2_font_ncenB08_tr);   // выбираем подходящий шрифт
  u8g2.drawStr(0,10,"Hello World!");    // пишем что-то во внутреннюю память
  u8g2.sendBuffer();                    // передаем внутреннюю память на дисплей
  delay(1000);  
}

Ожидаемый результат

На OLED-экране всегда должно отображаться сообщение "Hello World!" текст, как в этом видео на YouTube с той же настройкой.

Фактический результат

При запуске отображается сообщение "Hello World" текст на долю секунды и он исчезает.

Я обнаружил, что как только функция delay() выполняется, экран навсегда становится пустым и текст не перезагружается. Я не хочу использовать этот подход, если это возможно, поскольку:

  • Я планирую использовать батарею для питания Arduino и экрана, а постоянное обновление экрана снизит автономность
  • При этом экран немного мерцает.

Устранение неполадок выполнено

  1. Я использовал другой Arduino Nano, и результат был таким же.
  2. Я использую источник питания 5 В 2 А для всей схемы.
  3. Я попробовал разные примеры скетчей U8G2 с тем же результатом (работает, только если нет задержки()).
  4. Я попытался использовать другой OLED-модуль с такими же характеристиками, и результат тот же.
  5. Я пытался использовать библиотеку Adafruit SSD1306, но на экране ничего не отображается.

, 👍2

Обсуждение

Что я могу вам сказать, так это то, что если я заменю UNO на ваш Nano (что не должно иметь значения) и дисплей x64 на ваш дисплей x32 (что может иметь значение, но я в этом сомневаюсь), ваш код будет работать дословно. Он не гасит дисплей. Я могу изменить его, чтобы отобразить счетчик, и он считается предсказанным. Включите номера версий всего, что задействовано (ide, библиотеки, ядро) и ссылки на ваш фактический дисплей и плату arduino., @timemage

Хорошо. Я обнаружил, что мой дисплей идентичен тому, что у вас есть (при условии, что у вас действительно есть то, что вы связали), и он продолжает работать. Есть небольшая разница в том, как он отображается, но он по-прежнему работает так, как ожидалось. Итак, добавляем детали., @timemage

Я вижу здесь что-то немного странное — экран перерисовывается каждую секунду, так как у вас есть этот код в loop(). Но это все равно должно снова отображать текст, даже если он обновлен. Это все еще происходит, если в цикле остается *только* задержка, а остальное перемещается в setup()?, @RDragonrydr

Большое спасибо. На прошлой неделе у меня было мало времени, но сегодня я проведу тест, вернусь с дальнейшими выводами и обновлю этот комментарий/сообщение., @Markussen

Только что провел дополнительное тестирование, и вот еще информация: + IDE: пробовал с Arduino IDE 2.0.1 и VSCode 1.73.0 с расширением Arduino v0.4.12 - Только что проверил с оригинальным Uno и тот же результат. - Если я ставлю задержку (50), экран сохраняет HelloWorld! слово, хотя мигание более заметно. - Перемещение всего, кроме delay() или delay(50), в настройку приводит к тому же поведению (на долю секунды отображается HelloWorld, а экран гаснет)., @Markussen

Наконец-то я нашел первопричину. Я использовал макетную плату для этой установки, и как только я вынул компоненты и использовал другие кабели, все заработало, как и ожидалось. **Усвоенный урок: не всегда полагайтесь на то, что макетные платы на 100% функциональны; когда ничего не помогает, уберите макетную плату из уравнения.**, @Markussen