Свой второй дисплей я почти списал в утиль. Первый экземпляр работал без вопросов, а со вторым вышло иначе: подключил по проверенной схеме, залил тот же скетч — подсветка горит ровным синим, и ни единой буквы. Я переинициализировал, перепрошил, переткнул шлейф, полез читать форумы про битые модули. Через час случайно тронул отверткой торчащую рядом ручку потенциометра — и текст проступил, как фотография в проявителе. Никакой поломки не было: на этой плате стоял другой подстроечник, и его заводское положение для моего экземпляра оказалось мимо рабочей точки.
С тех пор я начинаю любую отладку LCD не с кода, а с электрики контраста. Это честнее: пустой экран при горящей подсветке в девяти случаях из десяти означает, что на пине V0 не то напряжение, а скетч тут ни при чём — он мог быть даже пустым, картина не изменилась бы. В этом уроке разберём, что такое V0, почему контраст — аналоговая величина, которую кодом не задать (почти — один трюк покажу), и соберём таблицу диагнозов: по тому, что вы видите на экране, можно почти точно назвать причину.
V0: третья ножка, которая решает всё
У голого HD44780-дисплея шестнадцать ножек, и третья сверху — V0 (иногда её маркируют VE или CONTR). На неё контроллер ждёт опорное напряжение: чем оно ниже, тем жирнее рисуются пиксели, чем выше — тем бледнее. Крайние положения говорят сами за себя: прижмите V0 к земле — и все знакоместа зальются чёрными квадратами, задерите к 5 В — экран станет полностью пустым. Между этими полюсами лежит рабочая зона, и у большинства пятовольных модулей буквы читаются при 0,4–1 В, то есть ручка должна стоять совсем близко к «земляному» краю, а не в середине, как подсказывает интуиция.
Получают это напряжение делителем: потенциометр на 10 кОм между 5V и GND, движок — на V0. Крутите ручку — плавно меняете напряжение на третьей ножке. На модулях с переходником I2C тот же подстроечник уже распаян на плате синим кубиком — электрически всё то же самое, как в уроке про первый текст по I2C, просто крутить надо маленькой отвёрткой, а не пальцами. И разграничьте два независимых узла: подсветка — это светодиоды на ножках A и K, она питается отдельно и горит всегда, когда подано напряжение; контраст — это V0, и на подсветку он не влияет никак. Синий экран с невидимым текстом — это как раз случай, когда подсветка жива, а контраст стоит мимо.
| Что видите на экране | Что это значит | Что делать |
|---|---|---|
| Подсветка горит, текста нет вообще | V0 задран к 5 В — пиксели бледнее фона | Крутить потенциометр к земле, целиться в 0,4–1 В |
| Верхняя строка залита квадратами, нижняя пустая | Дисплей не инициализирован: адрес 0x27/0x3F, SDA/SCL или отсутствие init | Проверить адрес и линии I2C, убедиться, что lcd.init() вызван |
| Оба ряда ровных квадратов | Питание есть, контраст прижат к 0 В или инициализация не прошла | Сначала ручка контраста, потом адрес и проводка |
| Текст есть, но тусклый и призрачный | V0 чуть выше рабочей зоны — на грани видимости | Докрутить чуть-чуть к земле |
| Мусор из кракозябр вместо букв | Контраст в норме, но данные искажены | Проверить порядок пинов RS, E, D4–D7 и паузу после подачи питания |
#include <LiquidCrystal.h> // RS, E, D4, D5, D6, D7 — как в классической схемеLiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Контраст кодом не задаётся: вывод V0 (третья ножка дисплея)// идёт на движок потенциометра 10 кОм, крайние ноги — на 5V и GND.// Поэтому в скетче про V0 нет ни одной специальной строки. void setup() { lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("V0 - ne kod"); // видно эту фразу - контраст настроен lcd.setCursor(0, 1); lcd.print("zavodite ruchku");} void loop() {}Теперь числа, чтобы вы крутили ручку не вслепую. Середина хода потенциометра даёт на V0 около 2,5 В — для большинства пятовольных панелей это уже зона невидимости, поэтому типичная ошибка новичка выглядит так: ручка стоит «логично», посерединке, а экран пуст. Рабочая точка лежит в первом десятке градусов хода, где-то в 0,4–1 В. И эта точка плавает с температурой: жидкие кристаллы вязко реагируют на холод, зимой мне приходилось подкручивать контраст на уличном термометре в сторону земли, летом — обратно. Отсюда моё правило: подстроечник оставляю на плате и вывожу отверстие под отвёртку, а не запаиваю фиксированный резисторный делитель — потом скажете спасибо.
Трюк, который я обещал в начале: контрастом всё-таки можно управлять из скетча. Подайте на V0 ШИМ с любого свободного пина через сглаживающую цепь — резистор 10 кОм плюс конденсатор 10 мкФ на землю превращают меандр в среднее напряжение, и analogWrite(пин, 40) даст примерно те же 0,8 В. Без фильтра, в лоб, тоже работает: на частоте около 490 Гц мерцание глазом почти не ловится, но панель начинает фонить помехами на длинных проводах. Я применял PWM-контраст в двух проектах — ночном термометре, где экран ночью гас до еле видимого, и в устройстве с кнопкой «подсветка на 10 секунд». Если такой задачи нет, ручка честнее и надёжнее.
Минутная диагностика и проверка ручкой в симуляторе
Соберём алгоритм в одну дорожку. Экран включился? Если подсветка не горит — ищите обрыв в цепи A/K, до контраста дело не дойдёт. Подсветка есть, но на верхней строке сплошной ряд квадратов, а нижняя пустая — это фирменный признак неинициализированного HD44780, крутите в сторону адреса 0x3F и линий SDA/SCL, мы это разбирали в уроке про первый текст по I2C. Квадраты везде — сначала ручка, потом уже код. Экран чистый при живой подсветке — ручка в противоположную сторону. Если есть мультиметр, режим вольтметра на V0 расставит всё по местам: увидели 0,4–1 В, а текста нет — тогда да, пора сверять порядок пинов с классической параллельной схемой и смотреть скетч.
В симуляторе движок рисует дисплей без полутонов, контраст он не воспроизводит — зато честно подключает потенциометр к A0 и отдаёт его положение через analogRead. Поэтому проверим логику иначе: соберём индикатор контраста, который сам себе показывает диагноз. Ручка на экране симулятора крутится от 0 до 1023, скетч переводит значение в проценты и печатает вердикт — в точности как вы делали бы с реальным потенциометром и мультиметром. Заодно повторим, как analogRead читает ручку и как работает пересчёт диапазонов из урока про диммер на map.
Обратите внимание на границы в if: я поставил их не посередине диапазона, а по краям — ниже 100 и выше 700. Так и на реальной панели: рабочая зона контраста узкая и смещена к земле, а «мёртвые» половины хода ручки широкие. Точный порог у вашего экземпляра будет свой, поэтому и ручка, а не делитель на двух резисторах, хотя грубую подстройку делителем никто не запрещает.
Контраст — последний из «электрических» капризов дисплея, дальше всё делается кодом. Следующий кандидат на практику — меню с курсором, где знание позиций setCursor превращается в интерфейс. А если захочется экрана, у которого контраста вообще нет как категории, гляньте в сторону OLED в уроке про первый SSD1306: там пиксели рисуются независимо от напряжения, и ни одна ручка не нужна.
Итого: дисплей молчит — начните с ручки, и половина «поломок» закончится, не начавшись. Мы вытащили V0 из тени и поставили на первое место в диагностике, а заодно придумали индикатор, который сам рассказывает, в какой зоне сидит ручка. Дальше по плану — дисплей побольше: возьмём 20x4, посмотрим, что меняется в коде, и поймаем неочевидную ловушку адресации строк, из-за которой текст с первой строки умеет уползать на третью.
- Выставьте ручку симулятора на 512 (середина) и убедитесь, что скетч честно называет это состояние «читается» — а потом вспомните, что реальная панель при 2,5 В на V0 чаще всего пустая. Разница между логикой и электрикой — в этом и урок.
- Перепишите пороги в if так, чтобы «читаемо» занимало только пятую часть хода ручки, и оцените, насколько узкой получается рабочая зона.
- На реальном дисплее измерьте мультиметром напряжение на V0 в трёх положениях ручки: крайнем левом, среднем и там, где текст читается лучше всего. Запишите цифры — это ваш паспорт модуля.
- Если есть второй пин со свободным ШИМ, соберите на плате вариант с PWM-контрастом: analogWrite через RC-фильтр 10 кОм и 10 мкФ, и найдите код, при котором буквы читаются так же, как с ручки.
- Контраст LCD — аналоговое напряжение на пине V0 (третья ножка); кодом оно не задаётся, только потенциометром или PWM через RC-фильтр
- Рабочая зона у 5-вольтовых панелей — 0,4–1 В, то есть ручка стоит у земляного края, а не в середине хода
- V0 прижат к земле — все знакоместа залиты квадратами; задран к 5 В — экран пуст при горящей подсветке
- Подсветка (ножки A и K) и контраст (V0) — независимые узлы: синий экран без букв означает контраст, а не питание
- Верхняя строка квадратов при пустой нижней — признак неинициализированного дисплея: адрес 0x27/0x3F, SDA/SCL, lcd.init()
- Рабочая точка плавает с температурой — оставляйте подстроечник доступным под отвёртку
- 1. Куда подключают движок потенциометра при настройке контраста голого LCD?
- 2. На экране два ряда ровных чёрных квадратов. Что проверяете в первую очередь?
- 3. Какое напряжение на V0 у большинства пятовольных панелей даёт читаемый текст?
- 4. Подсветка горит, но на экране ни букв, ни квадратов. Первый подозреваемый?
- 5. Как кодом меняют контраст, когда ручки на панели нет?
Частые вопросы по теме урока
- Куда подключают движок потенциометра при настройке контраста голого LCD?
- V0 — вывод опорного напряжения контраста, третья ножка. Подсветка питается отдельно через A и K, а RS и E — управляющие линии. На пин V0 — третью ножку дисплея
- На экране два ряда ровных чёрных квадратов. Что проверяете в первую очередь?
- Сплошные квадраты почти всегда означают прижатый к земле V0. Дисплей получает питание и ждёт настроенного контраста. Потенциометр контраста — ручку на V0
- Какое напряжение на V0 у большинства пятовольных панелей даёт читаемый текст?
- Чем ниже напряжение на V0, тем жирнее пиксели. Рабочая зона узкая и смещена к земле, поэтому середина ручки чаще всего даёт пустой экран. 0,4–1 В, близко к земле
- Подсветка горит, но на экране ни букв, ни квадратов. Первый подозреваемый?
- Полная пустота при живой подсветке — признак завышенного V0. Крутите ручку к земле; кварц и кириллица тут ни при чём. V0 задран к 5 В — пиксели невидимы
- Как кодом меняют контраст, когда ручки на панели нет?
- analogWrite через сглаживающую цепь превращает меандр в среднее напряжение — тот же принцип, что у ручки. Метода lcd.contrast() у стандартной библиотеки нет. Подачей ШИМ на V0 через RC-фильтр из резистора и конденсатора