Солнечный датчик температуры в теплице проработал у меня двое суток вместо обещанных двух недель. Я перебрал всё: утечки в коде, просадки стабилизатора, самонагрев датчика. Виновник нашёлся мультиметром за минуту — экран. OLED 128×64 горел на полную круглосуточно: девять-десять миллиампер на дашборде из пары строк, и это была половина всего бюджета узла. Радио спало, датчик спал, а стёклышко светило в пустую теплицу ночами.
Вторая история длиннее: термостат в котельной год показывал одну и ту же картинку, а потом она проступила призраком — неравномерный износ пикселей, тот самый случай из урока про сравнение с LCD. Обе истории про одно: у OLED-пикселя есть цена в миллиамперах и цена в часах жизни, и обе платятся за каждую секунду свечения.
Здесь посчитаем ток по режимам с условиями, разберём ресурс — почему его меряют часами свечения до полупотускнения и как это переводится в годы, — и соберём выключатель экрана: командами контроллера на плате и логикой гашения в симуляторе.
Ток от картинки: считаем по режимам
Потребление OLED пропорционально числу горящих пикселей — в этом его характер и его экономика. Тёмный экран: единицы миллиампер и меньше — платит только логика контроллера и обвязка модуля. Обычный дашборд с шапкой и парой цифр: порядка пяти-десяти миллиампер — мои замеры на модулях 0.96 с бортовым стабилизатором при 5 В. Кадр, залитый белым целиком: пятнадцать-двадцать пять — точное число зависит от выставленной яркости и партии матрицы. На вытянутом 128×32 та же по духу картинка стоит примерно вдвое меньше: пикселей вдвое меньше. И на сутки: дашборд на девяти миллиамперах за круглосуточную работу берёт около 216 мА·ч — восьмую часть заряда типичной банки 18650 на 2600; погашенный экран за те же сутки возьмёт в десять раз меньше.
Отсюда приём, который у экранов работает буквально: тёмный интерфейс дешевле светлого. Рамка и строки на чёрном фоне держат в свете считаные проценты матрицы. Оценки для графических панелей дают 20–40 процентов экономии при тёмной теме — у монохромного OLED механика та же, каждый негорящий пиксель бесплатен, так что и без инверсии есть чем играть: меньше заливок, больше текста на чёрном.
Второй рычаг — яркость. У SSD1306 нет ручки контраста в привычном смысле, но в Adafruit_SSD1306 есть display.dim(true): команда приглушает свечение, и ток проседает вместе с ним. Картинка остаётся читаемой, глаза ночью не слепнут, ресурс расходуется медленнее. Это промежуточная ступень между горящим на полную и погашенным экраном — и часто именно её не хватает, когда выбор кажется бинарным.
Свои цифры стоят трёх минут: мультиметр в разрыв питания модуля — или повербанк с индикатором тока — и три режима подряд: погашенный, дашборд, залитый белым кадр. У меня первый замер давал меньше миллиампера, второй — девять с половиной, третий — двадцать два; ваши числа будут другими, и это нормально: партии матриц и платы с обвязкой отличаются. Важно не само число, а вилка: она сразу показывает, во что обходится каждая зона интерфейса и стоит ли она этого.
| Режим | Ток | Условие |
|---|---|---|
| DISPLAYOFF, матрица погашена | единицы мА и меньше | логика и обвязка живы, пиксели не горят |
| dim(true), приглушённый кадр | ниже полного свечения | точное соотношение зависит от яркости и партии |
| Обычный дашборд, пара строк | ~5–10 мА | шапка, крупные цифры, чёрный фон |
| Полный белый кадр | ~15–25 мА | вся матрица горит, яркость на максимум |
Ресурс: часы свечения, а не календарь
Ресурс OLED считают не годами службы, а часами свечения до полупотускнения: индустриальная метрика T50 — время, за которое яркость падает до половины исходной. Для маленьких монохромных матриц типовые оценки — десятки тысяч часов; пятьдесят тысяч — это почти шесть лет непрерывного свечения. Переведите в режим вашего прибора: экран, горящий четыре часа в сутки, стареет примерно в шесть раз медленнее табло, светящего круглосуточно. Экран не изнашивается на полке — он изнашивается на стекле. Отсюда честная единица планирования: не сколько лет прибору, а сколько часов за сутки горит матрица — остальные часы пиксели отдыхают бесплатно.
Выгорание — вторая ипостась того же старения: пиксели деградируют неравномерно, и зона, месяцами светившая одной картинкой, тускнеет быстрее соседних. Отсюда три привычки. Первая: гасить экран, когда данные никому не нужны, — таймер бездействия или кнопка. Вторая: приглушать dim там, где прибор смотрит на человека ночные часы. Третья — для особо статичных интерфейсов — периодическая инверсия цветов раз в несколько минут: зоны износа меняются местами, и матрица стареет ровнее; приём из мира больших мониторов, но и на маленьких матрицах работает.
Переведём в график дежурств. Табло, горящее круглосуточно, набирает 8760 часов за год: при паспортных пятидесяти тысячах до полупотускнения это почти шесть лет до первого заметного угасания. Прибор, который светит два часа в сутки, расходует тот же ресурс за шестьдесят с лишним лет — по факту бесконечно: раньше устареет электроника. Между этими полюсами и живёт ваш проект; посчитайте долю горящего времени — главный множитель всей ресурсной арифметики.
Оговорка про честность: всё перечисленное продлевает только будущее. Проявившийся призрак не лечится — у пикселей нет восстановительной терапии, что мы и видели на котельном термостате.
#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h> Adafruit_SSD1306 display(128, 64, &Wire, -1);bool ekranGorit = true;bool knPred = false; // кнопка на D2, вторым контактом на GNDunsigned long poslednee = 0; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); pinMode(2, INPUT_PULLUP); display.setTextColor(SSD1306_WHITE);} void loop() { bool kn = (digitalRead(2) == LOW); if (kn && !knPred && millis() - poslednee > 250) { poslednee = millis(); ekranGorit = !ekranGorit; if (ekranGorit) { display.ssd1306_command(SSD1306_DISPLAYON); // матрица просыпается display.dim(false); // и сразу в полную яркость } else { display.ssd1306_command(SSD1306_DISPLAYOFF); // пиксели погашены целиком } // содержимое GDDRAM не стирается: после включения кадр вернётся сам } knPred = kn;}Моё правило гашения с границами. Прибор на столе, питание от розетки: экран живёт своей жизнью, я ставлю только dim по ночам. Батарейный узел: показ по событию или по кнопке — подошёл, нажал, прочитал, экран погас; дежурный цикл из сравнения с LCD — тот же принцип, собранный на millis вместо delay. Публичное табло: яркость по расписанию — днём полная, ночью dim, чтобы не слепить и не жечь ресурс впустую.
Расписания из нескольких таймингов собираются на планировщике задач на millis — там раскладка периодических дел по таймингам разобрана по косточкам. Кнопка — самый дешёвый датчик присутствия: читаем её через digitalRead, а дребезг для выключателя экрана глотаем паузой в четверть секунды — точность здесь не нужна, зато код на пять строк.
Частый вопрос: не дешевле ли спать всей плате? Зависит от проекта. Глубокий сон — отдельный мир со своей ценой пробуждения и своей поддержкой плат, а на классической Uno его нет вовсе; гашение экрана одной командой работает всегда и не трогает остальной код. Начинайте с выключателя экрана, а сон всей платы подключайте тогда, когда его бюджета перестанет хватать — это следующий уровень экономии, не первый.
И отдельный враг — заставки. Логотип проекта, нарисованный в setup и живущий на экране вечно, — статичная картинка в худшем смысле: самая яркая зона горит месяцами. Мои правила: заставка живёт секунды, после begin сразу рабочий кадр; в рабочих кадрах не бывает больших белых заливок; и никакая красота не стоит половины ресурса матрицы.
- Ток OLED пропорционален числу горящих пикселей: тёмный — единицы мА, дашборд ~5–10, полный белый кадр — 15–25
- Ресурс меряют часами свечения до полупотускнения (T50): экран, горящий 4 часа в сутки, стареет примерно в 6 раз медленнее круглосуточного
- dim(true) — промежуточная ступень: картинка читается, ток и износ ниже
- DISPLAYOFF/DISPLAYON через ssd1306_command: кадр в видеопамяти контроллера не стирается, после включения возвращается сам
- Тёмный интерфейс дешевле светлого: каждый негорящий пиксель бесплатен
- 1. Сколько примерно ест экран при обычном дашборде из пары строк?
- 2. Что означает метрика T50 в паспортах OLED?
- 3. Прибор показывает одну картинку месяцами. Что с ней станет?
- 4. display.ssd1306_command(SSD1306_DISPLAYOFF) — что будет с кадром в видеопамяти контроллера?
- 5. Батарейный узел в сарае. Какой режим экрана выберете?
Теперь у экрана есть полный бюджет: байты буфера из прошлого урока и миллиамперы с часами жизни из этого. Дальше по разделу — софтовые тонкости, на которых экран становится прибором, а не табло; а бюджет из этого урока держите при себе каждый раз, когда решаете, что печатать, как часто и с какой яркостью.
Домашнее задание на плате: мультиметр в разрыв питания экрана — или повербанк с индикатором тока — и три замера: погашенный модуль, дашборд из пары строк, кадр fillRect белым на весь экран. Запишите три числа — теперь ваши оценки будут вашими, а не моими. Потом соберите выключатель из code-блока — кнопка, dim, DISPLAYOFF — и повесьте таймер бездействия, если прибор живёт в помещении, куда заглядывают два раза в день. Последний штрих: посчитайте долю горящего времени своего прибора и умножьте паспортные часы свечения на неё — получите честный срок жизни стекла в вашем проекте, а не в паспорте.
Частые вопросы по теме урока
- Сколько примерно ест экран при обычном дашборде из пары строк?
- Ток пропорционален числу горящих пикселей. Дашборд с шапкой и цифрами на чёрном фоне — порядка пяти-десяти миллиампер у модуля 0.96 при 5 В; у вас число будет своё — посчитайте мультиметром. 5–10 мА
- Что означает метрика T50 в паспортах OLED?
- Индустриальная метрика ресурса: часы свечения, за которые яркость падает вдвое. Для монохромных матриц — десятки тысяч часов: пятьдесят тысяч — это почти шесть лет непрерывного свечения. Время до падения яркости до половины исходной
- Прибор показывает одну картинку месяцами. Что с ней станет?
- Пиксели деградируют от часов свечения, и статичная зона тускнеет быстрее соседних. Гашение по таймеру и инверсия спасают только будущее. Зона проступит призраком: пиксели износятся неравномерно
- display.ssd1306_command(SSD1306_DISPLAYOFF) — что будет с кадром в видеопамяти контроллера?
- Команда гасит матрицу, но память контроллера не трогает: включение возвращает кадр без перерисовки. Останется — после DISPLAYON картинка вернётся сама
- Батарейный узел в сарае. Какой режим экрана выберете?
- Показ по событию — минимальные часы свечения: ток и износ падают вместе с долей горящего времени. Полная яркость и белый кадр — самое дорогое, что можно выбрать, а dim и тёмный интерфейс снижают и оставшиеся миллиамперы. Показ по кнопке с гашением после прочтения