Привет! В недавней статье я рассматривал микросхему К155ИД3 - было весело, но не особенно применимо в современных реалиях. Но что если подключить к ней ESP32?
И да, в названии написано, что выходит в интернет - на самом деле выходит, но не в этот раз. В следующей части действительно подключим термометр ...термурметр, котопогодник, котометр... к интернету.
Есть, правда, одна загвоздка. ESP32 питается от напряжения 3,3В, а К155ИД3 от пяти вольт. Но так ли это важно? - на самом деле нет! Микроконтроллер просто будет запитан от своего LDO, а дешифратору для уровня логической единицы достаточно напряжения в 2,4В. Обойдемся без преобразователей уровня!
Ещё немаловажный момент - ТТЛ микросхемы на входах потребляют значительный ток. В нашем случае 16 миллиампер. Хватит ли ESP32? Спецификация утверждает, что так же да. Каждый GPIO способен отдать 40 миллиампер.
Что я придумал?
Сделать забавный линейный термометр, использовав дешифратор для 16 пунктов температурных, повесить на шину I2C датчик температуры и влажности GXHT30, а оставшимися выводами расширить шкалу. Засунуть это всё в небольшой корпус, питающийся от USB и напечатать на пленке черно белого кота с градусником в лапках. Возможно в дальнейшем использовать две микросхемы К155ИД3 для того, чтобы "градусов" побольше влезло. Так, может быть, и на уличную версию наскребется. Разброс там значительно больше, чем дома и пары десятков светодиодов не хватит. А там и солнечную батарею приделать можно будет и на народный мониторинг показания выкладывать.
Что по выводам ESP32?
Без ограничений и не особо задумываясь на микроконтроллере можно использовать 12 GPIO выводов. Можно и больше, но нужно учитывать некоторые нюансы. Так что обойдемся этими GPIO:
16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33
UART для прошивки
GPIO1 TXD0
GPIO3 RXD0
Сервис
GPIO0 переход в режим загрузки
EN перезагрузка
Датчик GXHT30
GPIO21 SDA
GPIO22 SCL
К155ИД3
ЗЕМЛЯ Е1 - согласно таблице истинности для отображения оба контакта должны быть подтянуты к земле. Управлять можно только одним!
GPIO33 E0 - этим
GPIO32 A3
GPIO27 A2
GPIO26 A1
GPIO25 A0
Светодиоды
GPIO23
GPIO19
GPIO18
GPIO17
Статус отображения Температура/влажность
GPIO16 - два светодиода на каждое из активных состояний порта
Ну и сделаем переключатель отображения температура/влажность
GPIO34 - возможно использовать только как вход. В основном списке не значится.
Схема принципиальная
Итого у нас 20 светодиодов в шкале! Хватит для отображения температуры дома. От 12 до 32 градусов. И влажности с шагом в 5 процентов. И указатель на нужную шкалу. Там два светодиода на одном пине. Светится либо один, либо другой. Отлично!
Самое время нагенерировать кота с термометром!
Попросил я нейроночку нарисовать кота с градусником в полный рост.
Вроде бы как я хотел, но что-то не то...
Кот получился подходящий. Рисуем, печатаем, паяем.
Дальше я добавил рамку для того, чтобы точнее измерить, распечатал в нужном масштабе, измерил штангенциркулем, вставил картинку в САПР, смасштабировал и начал рисовать посадочные места для светодиодов и сам корпус.
Пока корпус печатался спаял всё на макетке.
Запихал всё это дело в корпус.
Самое время программировать!
Интересного на самом деле не много. Разве что функция включения нужного светодиода. Вводим номер - светик светит.
void SHOW_LED(int LED) {
Те, что просто к esp32 просто сравниваем без премудростей.
if(LED == 17) digitalWrite(PIN_LED17, LOW); else digitalWrite(PIN_LED17, HIGH);
if(LED == 18) digitalWrite(PIN_LED18, LOW); else digitalWrite(PIN_LED18, HIGH);
if(LED == 19) digitalWrite(PIN_LED19, LOW); else digitalWrite(PIN_LED19, HIGH);
if(LED == 20) digitalWrite(PIN_LED20, LOW); else digitalWrite(PIN_LED20, HIGH);
Потом смотрим нужно ли включать дешифратор
if(LED == 0 || LED > 16) {
digitalWrite(PIN_E0, HIGH); // Тушим всё
return;
}
Если нужно - включаем.
digitalWrite(PIN_E0, LOW); // Включаем дешифратор
Вот тут я припаял светодиоды не в ту сторону и пришлось сделать костыль, но макет же.
int value = 16 - LED; // Инвертируем
И теперь преобразуем десятичное число в двоичное для четырех разрядов. Выглядит пугающе для ардуинщика. Ловко можно было бы, конечно, обойтись шеснадцатью условиями =), но эта запись значительно короче и позволяет потренироваль побитовые операции. Например для первого бита, если десятичное число, например, 5(0101):* 0101 & 0001 = 0001. Результат = 1 (истина, HIGH). Для старших битов, соответственно, используем сдвиг. Если кому-то нужно более подробно, можно посвятить статью битовым операциям. Но их очень много в этих ваших интернетах и без меня.
digitalWrite(PIN_A0, value & 1);
digitalWrite(PIN_A1, (value >> 1) & 1);
digitalWrite(PIN_A2, (value >> 2) & 1);
digitalWrite(PIN_A3, (value >> 3) & 1);
}
Тесты!
Смотрим на температуру. И бардак на столе немного творческого беспорядка.
Жмем кнопку и переключаемся на отображение влажности.
Тепло и сухо. Замечательно!
Заключение.
На этом первая часть заканчивается. Концепт оказался рабочим и выглядит довольно мило. Но впереди ещё много работы! Нужно сделать две шкалы, чтобы и температура и влажность показывались всегда, а не переключались кнопкой - при помощи динамической индикации, естественно. Нужно добавить светодиодов и сделать шкалу более равномерной. Собрать всё более компактно и на печатной плате, а то надежность конструкции оставляет желать лучшего. Выйти, наконец-то в интернет и получать данные о микроклимате дома в сообщения вконтакте телефон по запросу. Ну и поделиться исходниками с вами, если вдруг, кому-то понравилась идея.
На этом пока всё. Всем спасибо за просмотр! Если есть предложения по конструкции - обязательно пишите. Хорошие идеи реализуем! До свидания!
П.С. Если вдруг кому-то уже нужны исходники - могу поделиться в телеграм чате канала.