HAQuDA – это настольная лампа, которая отображает данные о параметрах окружающей среды: качестве воздуха, температуре и влажности, при помощи цвета освещения. Если параметр в норме, то он зеленый, а если завышен или занижен, то красный или синий соответственно. У лампы есть несколько режимов отображения: стандартный, мульти, ночной, режим светильника, и возможность управления с помощью собственной веб-страницы и голосовых помощников.
Всем привет!
В период пандемии большая часть нашей жизни перестала выходить за рамки четырех стен, из-за чего остро встал вопрос о состоянии окружающей нас среды, о качестве воздуха в квартире, так как он напрямую влияет на наше самочувствие и продуктивность. В этой статье я хотел бы рассказать о процессе разработки волшебного домашнего отображателя качества воздуха.
С чего все началось…
В книге "Будущее вещей" Дэвида Роуза, автор рассказывает о свойствах волшебных вещей, способных облегчить нашу повседневную жизнь: часы с цветовым отображением количества потребленной электроэнергии в квартире, волшебный шар, способный цветом показывать совершенно разные параметры: от количества аллергической пыльцы на улице, до текущей стоимости акций. Почему эти вещи волшебные? Их концепции взяты из известных фантастических произведений. Судите сами: в повести Дж.Р.Р. Толкина "Хоббит, или Туда и Обратно" есть волшебный кинжал - "Жало", который кроме своей основной задачи - убивать полчища орков и гоблинов, еще и предупреждает своего хозяина о присутствии недругов - отличный пример простого интерфейса человек-устройство. Развитие идеи волшебных устройств воплотилось в устройстве ОПЭДИ, которое отображает на календаре количество потребленной электроэнергии в квартире, в разработке которого и я принимал участие. Мне захотелось продолжить эту идею и я решил собрать станцию мониторинга качества воздуха, которая совмещала бы в себе все необходимые датчики и имела "волшебные" свойства. Так и родилась идея HAQuDA…
Для чего он нужен?
Основная идея устройства заключается в простоте передачи информации о состоянии дома человеку. Существующие модели датчиков качества воздуха передают информацию понятную специалистам, но специфичную для простых пользователей, например единица измерения CO2 – PPM, а количество летучей органики (формальдегиды, ацетон, этанол и т.д.) измеряется в микрограммах на кубический метр. ОКВоДи позволяет моментально и понятно показывать информацию о качестве воздуха, за счет ее отображения цветом: от зеленого – качество воздуха хорошее, до красного - когда уже пора проветрить помещение. В этом устройстве заложен принцип “преаттентивности” (от англ. pre-attention) - показывать тот объем информации, который необходим для принятия решения, что позволит человеку быстрее обрабатывать информации, не фокусируя на ней внимание.
Примеры преаттентивных отображений данных
Как он устроен?
ОКВоДи представляет собой лампу цилиндрической формы (90x130мм) состоящую из двух частей: матовая полупрозрачная белая верхняя часть и основание из непрозрачного пластика. Внутри верхней части к трубе, закрепленной на плате, приклеены адресные светодиоды WS2812B, в количестве 12x9 штук. На плате расположены ESP-32 mini и датчики: датчик влажности и температуры – DHT-11, датчик летучих органических соединений и датчик углекислого газа – CCS811, датчик озона - ZE25-O3, датчик взвешенных частиц - ZH03B. В верхней крышке расположена сенсорная кнопка, чтобы отслеживать касания и менять режим отображения. Также на плате располагается два USB-A выхода для зарядки устройств и один USB-Micro вход питания.
Основные функции
ОКВоДи умеет отображать следующие параметры микроклимата дома:
Летучие органические соединения (TVOC) – измеряется в частицах на миллиард [ppb]
Количество озона (O3) – измеряется в частицах на миллиард [ppm], ±0.01ppm
Твердые частицы PM1.0, PM2.5, PM10 (Dust) – измеряется в микрограммах на метр кубический [мкг/м3], ±15 мкг/м3
Углекислый газ (CO2) - измеряется в частицах на миллион [ppm]
Температура (Temp) – измеряется в градусах Цельсия [°C], ± 2℃
Влажность (Humid) – измеряется в процентах [%], ± 5%
Общее качество воздуха (TotalAirQuality) – рассчитывается на основе всех предыдущих показателей
Выбор именно этих показателей качества воздуха связан с тем, что они оказывают основное долговременное воздействие на человека.
Режимы отображения:
Основной (Standard-mode) – все светодиоды задействованы для одного конкретного параметра
Мульти-режим (Multi-mode) – светодиоды делятся на три секции и отображают три параметра, выбранные пользователем
Ночной (Night-mode) – три вертикальные линии светодиодов выделяются под отображение одного параметра, заданного пользователем, остальные выполняют роль подсветки-ночника и отображают время преаттентивно: вертикальным заполнением полосы светодиодов. Пользователь вводит временной диапазон, например от времени засыпания, до будильника, по умолчанию установлен с 21.00 до 09.00. Каждый час загорается новая линия светодиодов, таким образом яркость ночника увеличивается с наступлением утра, а в промежутках сна можно определить оставшееся время чтобы поспать. В итоге получается progress bar времени вашего сна
Примеры ночного режима с отображением CO2
Приступаем к разработке
Разработку я начал с создания общей 3D-модели устройства, чтобы примерно определить его габариты, размеры печатной платы и количество светодиодов ,которые можно разместить внутри.
За основу корпуса решил взять небольшую лампу, потому что у нее был отличный рассеиватель и по размерам он подходил. В SolidWorks сделал 3D модель всей лампы с нижней частью корпуса, и со всеми отверстиями, чтобы понимать как разместить все компоненты в столь небольшом объеме.
А под спойлером вы можете увидеть, как лампа выглядит внутри
Схему проектировал с расчетом на то, что в будущем заменю готовый модуль D1 Mini ESP32 на оригинальный ESP WROOM 32, так как порт USB-micro на D1 Mini расположен в неудобном для круглого корпуса месте (его не выведешь наружу, он утоплен в плате) и при разработке ориентировался на прошивку и отладку с помощью JTAG-программатора, ну и готовый модуль занимает меньше места. Развел печатную плату в Altium-е и заказал ее на JLC PCB.
Теперь необходимо было запустить все датчики и начать выводить первые данные на светодиоды.
Переходим к написанию кода
Основные сведения о протоколах обмена данными с датчиками я почерпнул в основном из интернета. Измерения проводятся раз в 2 секунды (так как это время измерения самого медленного датчика - DHT11) и суммируются для последующего расчета их среднего значения. Каждые 5 минут обновляются показания светодиодной ленты на основе среднего значения выбранных параметров, затем все измерения обнуляются, чтобы начать новый 5-ти минутный цикл.
Для перевода количественных показателей качества воздуха в цвет светодиодов, диапазон измерений условно разбил на 3 части (по основным цветам светодиодов, 1-я граница - минимум значения параметра, 2-я граница - оптимальное значение, 3-я граница - максимум): между первой и второй границей для отображения используются только синий и зеленый цвета; между второй и третьей - зеленый и красный соответственно. Если измерение выходит за первую или последнюю границу, то цвет светодиодов назначается синий или красный соответственно, что сигнализирует о чрезмерном уменьшении или превышении некоторого показателя.
void getRGB(int *_red, int *_green, int *_blue, float data, paramsDivideDots divideDots) {
volatile float coefficient = (pixels.getBrightness() * 2) / (divideDots.thirdDot - divideDots.firstDot); //коэффициент настройки яркости цвета в зависимости от текущей установленной яркости лампы
if ((data < divideDots.secondDot) && (data >= divideDots.firstDot)) {
/* Измерение между 1-й и 2-й границами,
используются синий и зеленый цвета, при приближении,
например, ко 2-й границе цвет становится более зеленым */
*_blue = round(-abs(data - divideDots.firstDot) * coefficient) + MAX_BRIGHTNESS;
*_green = round(-abs(data - divideDots.secondDot) * coefficient) + MAX_BRIGHTNESS;
*_red = 0;
} else if ((data >= divideDots.secondDot) && (data <= divideDots.thirdDot)) {
/* Измерение между 2-й и 3-й границами,
используются зеленый и красный цвета */
*_blue = 0;
*_green = round(-abs(data - divideDots.secondDot) * coefficient) + MAX_BRIGHTNESS;
*_red = round(-abs(data - divideDots.thirdDot) * coefficient) + MAX_BRIGHTNESS;
} else if (data < divideDots.firstDot) {
// Измерение ниже 1-й границы, поэтому цвет устанавливаем синим
*_blue = MAX_BRIGHTNESS;
*_green = 0;
*_red = 0;
} else if (data > divideDots.thirdDot) {
// Измерение выше 3-й границы, поэтому цвет устанавливаем красным
*_blue = 0;
*_green = 0;
*_red = MAX_BRIGHTNESS;
}
}
Расчет общего состояния воздуха производил следующим образом:
Если какой-то из параметров воздуха вышел за третью границу, то есть превысил максимум и качество воздуха существенно снизилось, то цвет светодиодов устанавливается только в зависимости от этого параметра;
Иначе, рассчитываем цвета светодиодов для каждого параметра по функции, представленной выше, вычисляем среднее значение каждого цвета и устанавливаем эти средние значения на светодиоды.
Выбор именно такого алгоритма обусловлен тем, что для общей оценки качества воздуха нам нужно привести все значения измерений к одной размерности, чтобы можно было вычислить среднее. Лучшей безразмерной величиной для усреднения, чем цвет светодиодов в данном случае не придумаешь.
void WS2812_showParams_standardTotal(float *data) {
// Создаем массив 5x3 (5 - кол-во отображаемых параметров, 3 - кол-во цветов)
int colorsArr[DISP_PARAMS_NUM][COLORS_NUM];
for (int i = 0; i < DISP_PARAMS_NUM; i++) {
// Рассчитываем все 3 цвета для каждого отображаемого параметра
getRGB(&(colorsArr[i][0]), &(colorsArr[i][1]), &(colorsArr[i][2]), data[i], temp_divideDots);
}
int red, green, blue;
for (int i = 0; i < DISP_PARAMS_NUM; i++) {
red += colorsArr[i][0];
green += colorsArr[i][1]; // Рассчитываем средние значения каждого цвета
blue += colorsArr[i][2];
}
red /= DISP_PARAMS_NUM;
green /= DISP_PARAMS_NUM;
blue /= DISP_PARAMS_NUM;
// Выводим получившиеся цвета
pixels.fill(pixels.Color(red, green, blue), 0, LED_NUM_PIXELS);
pixels.show();
delay(100);
}
Код проекта вы можете найти на моем гитхабе.
Итог
На данный момент прототип моей лампы умеет отображать все запланированные показатели состояния воздуха цветом, как по отдельности, так и общее качество воздуха в целом по всем параметрам. Имеется управление с помощью Blynk.
Меню устройства в Blynk
В дальнейшем я планирую
Улучшить нижнюю часть корпуса, закрепить в ней плату;
Заменить вертикальную трубу для светодиодов на прямоугольные платы, с посадочными местами под отдельные светодиоды и разместить светодиоды ближе к краю платы, чтобы они были более отчетливо видны;
Развернуть веб-сервер, для удаленного управление лампой, который позволит менять режимы отображения параметров, включать одноцветную подсветку и эффекты. На веб-сервере будут отображаться текущие показатели микроклимата дома, графики показателей за несколько дней;
Сделать интеграцию с Яндекс Алисой для голосового управления. С помощью навыка “Домовенок Кузя” Алиса будет отправлять HTTP запросы на веб-сервер ESP-32 и, например, включать ночной режим или выключать лампу. Выбор Алисы обусловлен ее популярностью, поддержкой русского языка и простотой ее навыка;
Убрать датчик озона, так как его точность недостаточна для повседневных наблюдений (+- 10 ppb и диапазон измерений 0-10000 ppb, при том, что норма концентрации в помещении до 60 ppb, а при концентрации свыше 116 ppb в помещении уже находиться нельзя), а цена даже самого популярного датчика высока;
Собрать еще несколько обновленных ламп и отправить их желающим для тестов, с последующим дарением.
Комментарии (32)
aamonster
22.01.2022 11:22+1Выглядит как девайс для профессионала, которому надо принять решение за доли секунды.
Imho маленький светодиод (можно даже один, показывающий зелёный-жёлтый-красный статус худшего из показателей) достаточен для индикации, а подробности уже можно посмотреть на экране (встроенном или в приложении на смартфоне) – и тут для неспешного изучения уже удобнее пара "число + норматив", а не цвет (посмотрите, к примеру, на результаты анализа крови: печатается именно так + показатели, не укладывающиеся в норму, выделены жирным).
IlorDash Автор
22.01.2022 13:15Но с помощью одного светодиода нельзя реализовать дополнительные функции, такие как отображение сразу нескольких параметров и прогресс-бар времени вашего сна. Подробные логи будут выведены на веб-странице устройства, вместе с графиками и панелью управления лампой
aamonster
22.01.2022 13:37Ну да.
Я, собственно, именно про это: для отображения сигнала "что-то не в порядке" здоровенная лампа избыточна, а для показа подробных результатов – недостаточна.
Ну и, как уже отметили, функция отображения мешает использованию девайса в качестве лампы или ночника.
Хотя желание замутить такой проект вполне понимаю, это прикольно :-)
GeMir
22.01.2022 12:37+2«Угарным» всегда был CO, а CCS811 измеряет СО2 и летучую органику (VOC). Или я что-то упускаю?
В рамках борьбы с пандемией у нас в классах повесили такие вот
«светофоры», измеряющие уровень CO2:
Внутри, если не ошибаюсь, SGP30.
И очень меня интересует вопрос насколько показательны измерения что нашего Luftlicht, что вашей ОКВоДи в зависимости от размера помещения и места расположения устройства.
IlorDash Автор
22.01.2022 13:07Да, конечно CO2 - углекислый газ, спасибо, что подметили.
У ZH03B есть встроенный вентилятор, поэтому датчики я разместил на вдуве и выдуве этого вентилятора, чтобы воздух не задерживался внутри лампы, и измерения не были локальными
mm3
22.01.2022 12:54+3Температура есть, влажность есть, датчик СО2 уже неплохо, даже датчики PM2.5 и иже с ними присутствуют, что уже тянет на премиум сегмент.
А вот дальше, общее качество воздуха, измеряемое в попугаях, не говорит примерно и о чём, без уточнения что конкретно измеряется и в каких пропорциях влиет на результат. Летучие органические соединения, в тех же попугаях, так же не разьясняют примерно ничего.
Удивляет что такой относительно простой параметер как давление воздуха ни один из подобных устройств не измеляет, а ведь давление оказывает значиельное влияние на организм. А измерять концентрацию кислорода напрямую догадаются наверное только лет через сто.
Форм фактор лампы и цветовой метод индикации в спальне ночью подойдёт только тем кто не обходится без ночника, а всем остальным будет только мешать засыпать.
Отсутствие экрана, отображающего конкретные цифры для отслеживания тенденций. Отсутствие записи результатов измерений на какую нибудь sd карту для просмотра истории и анализа различных ситуаций. И отправка всех данных в облака, с последующими рисками удаления, отключения, утечки, слежки и взлома домашней сети, сводят на нет всю привлекательность данного устройства.edo1h
22.01.2022 15:29+1Удивляет что такой относительно простой параметер как давление воздуха ни один из подобных устройств не измеляет, а ведь давление оказывает значиельное влияние на организм
ну так на давление и повлиять проблематично
А измерять концентрацию кислорода напрямую догадаются наверное только лет через сто
а зачем? в каких случаях O₂ изменяется отдельно от CO₂?
mm3
22.01.2022 16:19+1Действительно на давление повлиять сложно, с другой стороны его значение может обьяснить самочувствие если наблюдается зависимость.
В том то и дело что между уровнями O₂ и CO₂ может не быть однозначного соответствия и низкий уровень CO₂ не гарантирует наличие кислорода. Например в помещении кислород был вытеснен каким нибудь другим газом, допустим на вечеринке с фокусами с жидким азотом. Или наоборот концентрация кислорода может быть опасно высокой. Конечно при наличии качественной вентиляции этого случиться не должно.
edo1h
22.01.2022 18:55+1Действительно на давление повлиять сложно, с другой стороны его значение может обьяснить самочувствие если наблюдается зависимость.
давление можно узнать на любом сайте с погодой
В том то и дело что между уровнями O₂ и CO₂ может не быть однозначного соответствия и низкий уровень CO₂ не гарантирует наличие кислорода. Например в помещении кислород был вытеснен каким нибудь другим газом, допустим на вечеринке с фокусами с жидким азотом. Или наоборот концентрация кислорода может быть опасно высокой
для жилых помещений это всё представляется надуманным
tmin10
23.01.2022 11:33Обычно О2 не особо меняется и попоэтому не измеряется. А вот СО2 может сильно влиять на организм и поэтому нужно его мониторить.
VolodjaT
22.01.2022 19:01Концентрация кислорода изменяеться очень незначительно. Нет смысла ее измерять.
stereoDecor
22.01.2022 13:16+3Прогресс-бар времени сна — звучит интересно. Но синий свет, во время сна заливающий всю комнату, скорее всего хорошему сну не поспособствует, может быть лучше оранжевый или красный? Яркость «ночника» можно установить потусклее?
IlorDash Автор
22.01.2022 13:20+1Да, общая яркость регулируется, и я планирую добавить отдельную регулировку белой подсветки для ночного режима, так как иногда она светит гораздо ярче информационных светодиодов и мешает спать.
А синий цвет на последней картинке отображает кол-во CO2 и будет в зависимости от него меняться
Melias
22.01.2022 15:13Вот, кстати, ключевая фраза - "мешает спать". 8 линеек по 12 светодиодов по 0,3Вт - это реально очень много, они даже на минимальной яркости лупят будь здоров. ИМХО единственное решение для ночьного режима - или оставлять 1-4 светодиода на минимуме, или вырубать все нафиг.
Кстати, в статье не опечатка, вы действительно запитали всё это через микро-юсби?
IlorDash Автор
22.01.2022 19:58Вы правы, лампа при полной яркости светит очень сильно, поэтому максимальная яркость ограничена 60%, как показала практика, этого достаточно даже днем. Питается лампа через микро-юсби, достаточно стандартного блока питания на 5V 2A.
Melias
23.01.2022 01:45Позвольте усомниться в правильности использования блока питания на 2А. У вас 96 светодиодов, каждый мощностью по 0,3Вт. Все вместе дают около 30Вт максимальной нагрузки, что соответствует 6А. Даже если вы ограничите мощность 60%, вам все равно нужен БП не менее 3,5А.
Ну и, само собой, коммутировать всю нагрузку через esp-шку (если это сделано через нее) - так себе идея. Она на такие токи не расчитана, результат может быть небезопасен.
vasiaplaton
23.01.2022 02:38Там же не все светодиоды одновремменно белым загораются, еще и не максимум яроксти. Условно все горящие синим 96 светодиода на 50% меньше 1A. У меня настольная елка на 144 адресных светодиодах, подключенная через mini-usb в usb 2.0 компа больше 500 мА не жрет, и радостно работает уже 2 сезон(что то около 4 месяцев) Но там и яркость что-то процентов 20-30%, и светодиоды цветом горят, и не все сразу.
IlorDash Автор
23.01.2022 12:52Я точных расчетов по потреблению не проводил, но по информации из интернета один светодиод при полной яркости и белом цвете потребляет 0.036А при 5В. Стоит также учесть, что для согласования логических уровней ESP-32 и светодиодной ленты, по питанию ленты последовательно стоит диод, поэтому работает она от 4.4В. На практике, блок питания 5В 2А максимальную нагрузку (белый цвет при 60% яркости) выдерживает без проблем: он не греется, а светодиоды не мерцают и не горят красным цветом.
Может быть я вас немного не понял, но какой именно микро-юсби разъем вы имели ввиду? Вся лампа, а соответсвенно и светодиоды, питаются от микро-юсби расположенного на плате, ESP-32 запиатана от стабилизатора на 3.3В и управляет светодиодами лишь по одно-проводному интерфейсу
AllexIn
22.01.2022 16:29Парадигма изменилась. Последние исследования показывают, что цвет значения не имеет и всё упирается в яркость. Я так понял, миф про синий цвет из-за того, что он визуально кажется темнее и его выкручивают больше чем другие в итоге влияние от него сильнее, но не из-за того что синий, а из-за того что ярче.
stereoDecor
22.01.2022 18:02Да, встречал развенчание «мифа» про синий и согласен, что избыточная яркость может быть более важной, чем спектр. Но ещё важнее привычность ритуала отхода ко сну. Думаю, лучше иметь возможность выбрать и комфортный для себя цвет, и яркость «ночника».
Amor-roma
22.01.2022 13:26Продолжу мысль автора.
Датчики без экрана, на esp01 с частотой измерения 1 раз в 10 минут. Или ещё реже.
В качестве отображатора "лампа гайвера" с собственными дописками в коде если нужны параметры с датчиков. Обмен через блинк.
mentin
22.01.2022 13:31+1Интересно сравнить с похожими готовыми по цене и характеристикам. Я купил Awair, те же типы датчиков, только озона нет. Это не лампа, но похожая индикация. Детали у них передаются количеством зажженных светодиодов в пяти столбиках (влажность, температура, пыль пм2.5, VOC, CO2) и одна общая цифра от 0 до 100, тоже светодиодами.
https://www.getawair.com/products/element
Akr0n
22.01.2022 16:20Да уж, выглядит красиво, но цена для РФ запредельная какая-то для такого девайса.
DmitryOlkhovoi
22.01.2022 18:50+4В темной комнате создается мягкое рассеянное освещение, идеальный вариант для ночника
Многовато синего, скорей всего это бодрящий фонарь :)
Letum
24.01.2022 00:58Отличный проект. А можно на заказ?
Поставить более точные датчики температуры и влажности, убрать светодиоды и сделать интеграцию с HomeAssistant. Оттуда уже всё пробрасывается в Алису. Куплю 3 штуки себе.
Или может кто подскажет такой девайс до 100$ с реальным, а не расчетным показателем CO2?
vvzvlad
24.01.2022 21:12В этом устройстве заложен принцип “преаттентивности” (от англ. pre-attention) — показывать тот объем информации, который необходим для принятия решения, что позволит человеку быстрее обрабатывать информации, не фокусируя на ней внимание.
ОКВоДи умеет отображать следующие параметры микроклимата дома:
Летучие органические соединения (TVOC) – измеряется в частицах на миллиард [ppb]
Количество озона (O3) – измеряется в частицах на миллиард [ppm], ±0.01ppm
И нафига же человеку знание об уровне озона?
i7071270
Идея интересная, но не хватает пару вещей - экран и недельные логи.
gsaw
Экран же есть,интерфейс Blynk. Интересно, недельные логи зачем? Какие по ним можно делать выводы? Вешь же волшебная, для сиюминутного принятия решения. Открыть форточку, проветрить окно там или включить отопление.
i7071270
Это неудобно, например: достать смартфон и запустить приложение, чтобы включить лампочку.
Например о качестве воздуха в комнате, за определенный период (и принять решения о вентиляции дополнительной или увлажнении). Также и по другим датчикам, pm2.5, влажности...