Привет, Хабр!
Однажды в детстве, когда я был у в гостях бабушки в деревне, я увидел в старенькой радиоле индикатор «зеленый глаз», который меня очень впечатлил. Его свечение было настолько красивым и магическим, что я даже подумал о каком-то внеземном происхождении данной штуки. Шли годы, я уже давно не ребенок, но до сих пор испытываю то чувство магии, когда вижу ламповый индикатор. И вот, в преддверии Нового Года, мне захотелось реализовать что-то ламповое и магическое в своем новом проекте, а что из этого получилось — читайте далее.
❯ Всё с чего-то начинается
Лет пять назад, на прошлой работе, после инвентаризации склада было принято решение об утилизации советского «наследия», куда входили различные устройства работающие на лампах. Одним из устройств был калькулятор в котором стояла индикаторная лампа ИВ 26. Мне было жалко выбрасывать это «сокровище», я её демонтировал и отложил до лучших времен, успешно забыв о её существовании. Занимаясь очередным своим проектом, я случайно наткнулся на эту лампу и подумал, что наконец-то настало её время, чтобы «возродиться» в новом устройстве и поработать на благо уже в новом «цифровом мире».
❯ Технические характеристики
Данную индикаторную лампу можно назвать электронным «артефактом» из конца прошлого тысячелетия, что добавляет трепета при работе сданным устройством. И чтобы не потерять данный артефакт, будем придерживаться технической документации при работе с данным устройством. Ниже приведена цоколевка нашей лампы.
Для работы нашей индикаторной лампы, как и в других радиолампах, используется как минимум два напряжения: для работы накала и анодных цепей. Ниже приведены технические характеристики данного индикатора.
Как можно видеть из характеристик, нам нужны два уровня питающих напряжений 3,15 и 25 В. Напряжение накала, по удачному совпадению, входит в диапазон питания современных микроконтроллеров, например esp8266 3,3 В, а вот для анодного напряжения нам потребуется повышающий преобразователь. Так как суммарный ток анодных цепей составляет 22 мА, то для питания лампы нам будет достаточно маломощного преобразователя с входным напряжением 5 В. Ниже приведено фото нашей подопытной лампы.
Как вы можете заметить, данный «артефакт» был произведен в 1981 году прошлого тысячелетия.
❯ Цепи питания и тест работоспособности
Прежде чем развивать проект дальше, нам необходимо убедиться в работоспособности лампы, оценить износ сегментов, так как они имеют свойство выгорать при длительной эксплуатации. Для формирования анодного напряжения, будем использовать миниатюрный DC-DC преобразователь с алиэкспресса стоимостью около $1 за пять штук.
Подаем питание на вход данного преобразователя, в нашем случае это 5 В, и с помощью подстроенного резистора добиваемся необходимого уровня напряжения на выходе в 25 В.
В качестве напряжения накала мы будем использовать 3,3 В, которые возьмем с отладочной платы для esp8266/esp32. Небольшой ток накала позволяет нам это сделать. Подключив необходимые цепи питания к лампе проверяем её работоспособность.
Ура! Лампа в удовлетворительном состоянии! Идем дальше.
❯ Концепт устройства
Теперь пора определиться с тем, что мы хотим сделать с данной радиолампой. На ум приходить только одно решение — это индикатор уровня в процентном соотношении от параметра, в нашем случае, 14% на один сегмент. То есть мы разработаем устройство, на базе данной лампы, которое будет отображать уровень заданного параметра в процентном соотношении от определенного диапазона значений. «Мозгом» данного устройства будем применять микроконтроллер esp8266, так как он хорош и дешев для наших задач. Остается решить задачу управления анодными цепями, так как напряжение в 25 В, мягко говоря, не дружественно к выходам микроконтроллера. Мне не хотелось заморачиваться с транзисторным управлением, поэтому я просто решил использовать дешевые оптроны типа PC817 для коммутации анодных цепей.
❯ Э - электроника
После обдумывания функционала, о котором я расскажу позже, набросал небольшую схему управления. Ниже приведена принципиальная схема блока электроники нашего устройства.
Изначально схема не предусматривала датчик освещения на базе фоторезистор, но в конце реализации я решил попробовать применить данный элемент в схеме и был очень доволен его работой. Динамическое изменение яркости по обратной связи с датчика — это Must Have для подобных систем, тем более, это немного снижает износ сегментов из-за пониженного напряжения анодных цепей. Проект платы разрабатывался в свободной САПР KiCad , ниже приведены габаритные размеры печатной платы и рендер для визуализации.
Плату старался проектировать с минимальными габаритами, поэтому было принято решение о двухстороннем размещении компонентов.
❯ Изготовление печатной платы. Делаем жесткий Hand Made.
Начальные прототипы плат я предпочитаю делать в «домашних» условиях и в этом мне помогает мой маленький лазерный помощник. С помощью моего небольшого лазерного гравера я изготавливаю плату методом, о котором я писал ранее. Ниже на фото показан процесс облучения фоторезиста лазером.
После активации фотополимера на плате, выполняется проявка фоторезиста в растворе гидроксида натрия. Ниже фото платы после процесса проявки.
После травления платы был выполнен монтаж компонентов. К сожалению, указанные в схеме оптроны TLV 817S у меня закончились, поэтому я использовал P627, которые я применяю для высоковольтных цепей. Ниже представлены фото смонтированной платы.
Я немного передержал плату при травлении, поэтому некоторые дорожки по питанию усилил проволокой. Покрывать плату маской не стал, ради экономии времени реализации. После проверочных тестов платы, мы можем с уверенностью подключать нашу лампу, и постараемся не забыть компактно разместить повышающий преобразователь, заботливо прикрепив его на двухсторонний скотч. Ниже фото после установки лампы.
Загрузив тестовую прошивку в микроконтроллер, мы можем наконец-то проверить работу платы совместно с лампой.
К стати, забыл добавить что цепь накала также подключена через оптрон и управляется с микроконтроллера для возможности регулировки тока накала с помощью ШИМ.
При регулировке тока накала с помощью ШИМ, я обнаружил странные странности: некоторые сегменты лампы стали похожи на Око Саурона.
❯ Обретаем формы
После всех манипуляций, я до сих пор не сжег лампу, а значит нам пора задуматься о корпусе, чтобы устройство обрело законченный вид. Для проектирования моделей корпусов я использую открытую САПР FreeCad. Ниже представлена визуализация разработанного корпуса.
Возможно не «фонтан», но что вы хотели? Под конец года моя творческая жилка изрядно износилась. Так что, будем использовать то, что «сотворилось». Далее, как обычно, модель корпуса была распечатана на моем 3D принтере с последующей обработкой или подгонкой при необходимости.
❯ Микро — микро Пэ Пэ О
После всех наших «железных» дел, на необходимо заставить делать устройство то, что мы хотим. А поможет нам в этом прошивка. Прошивка устройства разрабатывалась в среде Arduino IDE — всё по заветам DIY. В качестве базы используется моя прошивка для моего «зоопарка» умных устройств с поддержкой разных интересных штучек. Управление и настройка устройства выполняется через веб интерфейс, ниже приведены скриншоты интерфейса.
Для первоначальной конфигурации устройство переходит в режим точки доступа Wi-Fi с именем CYBEREX-IV26IND. После подключения к данной точке, с помощью технологии Captive Portal, пользователю будет автоматически открыта страница для входа в устройство для последующей конфигурации. При активном режиме точки доступа, устройство сигнализирует об этом режиме методом плавного изменения яркости трех центральных сегментов, остальные сегменты не активны.
При удачном подключении устройства к сети Wi-Fi, оно работает режиме отображения уровня Wi-Fi сигнала. Очень забавно смотрится со стороны, кода ты ходишь по квартире со своей «волшебной» палочкой, как Гарри Поттер, замеряя уровень сигнала. В коде данная функция реализована следующим способом:
int level = abs(WiFi.RSSI());
indicator_light(map(level, 80, 30, 0, 100));
Ниже приведена функция обработки уровней отображения:
void indicator_light(int percent){
int brl = 255;
if (settings.auto_on){
brl = BRReadData(); // Автоматическая яркость
}else if(settings.led_level > 0){
brl = map(settings.led_level, 0, 100, 0, 255); // Ручная яркость
}
switch (percent) {
case 0 ... 14:
analogWrite(A, brl);
analogWrite(B, 0);
analogWrite(V, 0);
analogWrite(G, 0);
analogWrite(D, 0);
analogWrite(E, 0);
analogWrite(J, 0);
break;
case 15 ... 28:
analogWrite(A, brl);
analogWrite(B, brl);
analogWrite(V, 0);
analogWrite(G, 0);
analogWrite(D, 0);
analogWrite(E, 0);
analogWrite(J, 0);
break;
case 29 ... 42:
analogWrite(A, brl);
analogWrite(B, brl);
analogWrite(V, brl);
analogWrite(G, 0);
analogWrite(D, 0);
analogWrite(E, 0);
analogWrite(J, 0);
break;
case 43 ... 56:
analogWrite(A, brl);
analogWrite(B, brl);
analogWrite(V, brl);
analogWrite(G, brl);
analogWrite(D, 0);
analogWrite(E, 0);
analogWrite(J, 0);
break;
case 57 ... 70:
analogWrite(A, brl);
analogWrite(B, brl);
analogWrite(V, brl);
analogWrite(G, brl);
analogWrite(D, brl);
analogWrite(E, 0);
analogWrite(J, 0);
break;
case 71 ... 84:
analogWrite(A, brl);
analogWrite(B, brl);
analogWrite(V, brl);
analogWrite(G, brl);
analogWrite(D, brl);
analogWrite(E, brl);
analogWrite(J, 0);
break;
case 85 ... 100:
analogWrite(A, brl);
analogWrite(B, brl);
analogWrite(V, brl);
analogWrite(G, brl);
analogWrite(D, brl);
analogWrite(E, brl);
analogWrite(J, brl);
break;
}
}
Данное устройство, прежде всего, предназначено для отображения уровня параметра в процентном соотношении, которые поступают в устройство с помощью MQTT протокола. Для определения диапазона, в форме конфигурации MQTT необходимо указать границы расчета. Ниже приведен код для отображения в пределах границы, с использованием функции map:
int min = int(settings.data_min);
int max = int(settings.data_max);
int data = temp_j.toInt();
indicator_light(map(data, min, max, 0, 100));
Для снижения износа индикатора, в прошивке реализована функция работы по расписанию, которая использует данные стороннего NTP сервера для синхронизации точного времени. Период работы устройства указывается в форме ввода. При отключении синхронизации с NTP сервером, функция работы по расписанию деактивируется. Ниже показана часть кода данной функции:
void shedule_time(unsigned long epochs){
// Преобразуем Unix timestamp в структуру времени
tmElements_t timeInfo;
breakTime(epochs+(millis()/1000), timeInfo);
String time_cur = String(twoDigits(timeInfo.Hour)) + ":" + String(twoDigits(timeInfo.Minute));
String time_on = settings.time_on;
String time_off = settings.time_off;
String year = String(timeInfo.Year + 1970);
if(time_on != time_off && year != "1970" && settings.ntp_en){
if(time_cur == time_on){
if(!heat_st){
analogWrite(heat, 255);
}
heat_st = true;
}
if(time_cur == time_off){
if(heat_st){
analogWrite(heat, 0);
}
heat_st = false;
}
}
}
Как можно видеть, данная функция в определенный промежуток времени отключает накал лампы, тем самым отключая её свечение. Ниже вы можете видеть демонстрацию данного процесса.
Для тех, кто испытывает трудности с доступом в YouTube, разместил видео на своей страничке в Boosty,
❯ Итоги
Подведем итоги. В результате наших манипуляций у нас получилось интересное устройство с раритетным ламповым индикатором, который не только радует глаз «магическим» светом, но и несет полезный функционал в составе современных систем «Умного дома». Данное устройство особенно хорошо смотрится в качестве индикатора уровня заряда батарей систем хранения энергии, уровня воды или уровня качества воздуха в комнате.
Кстати, забыл сказать, что в данном устройстве также используется раритетный фоторезистор марки RPP — 131 1985 г.в., который в хорошем состоянии «дожил» до наших дней и удачно вписался в данный проект. Ниже представлено фото данного датчика.
Ну и наконец, давайте насладимся результатом! Ниже вы можете видеть фото законченного устройства.
Надеюсь статья вам понравилась и вы оцените её стрелочной вверх. Спасибо, что уделили ваше время! Всем добра и хороших проектов! А если у вас остались вопросы, замечания, предложения или хотите поделиться своим опытом, то добро пожаловать в комментарии!
❯ Ссылки к статье
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩
CitizenOfDreams
Развязка каждого анода оптроном - это, конечно, лютый брутфорс. А если бы у индикатора было не 7 анодов, а 27?
Вообще такие вещи традиционно делались так: на катод индикатора подается "минус" высокого напряжения, а аноды/сетки коммутируются ключами с открытым коллектором. Например, в ULN2003, по счастливому совпадению, как раз 7 ключей...