Введение
Smart_U - студенческий проект по созданию метеодатчиков для контроля микроклимата в различных помещениях. В статье рассказывается о разработке проекта, используемых технологиях, возникших ошибках и т.д. Сразу скажу, что набор компонентов довольно банален: микроконтроллеры Atmegа328(168), датчик температуры и влажности HTU21D, датчик интенсивности света MAX44009/BH1750, LoRa для передачи данных и в качестве эксперимента - ёмкостной датчик влажности почвы.
Идея создания метеодатчиков возникла по причине отсутствие в одном из производственных зданий каких-либо систем контроля температуры в помещениях: батареи отопления - чугунные, без возможности их регулировки, а существующий контроль сводился только к контролю температуры теплоносителя на входе и выходе из здания. Из-за этого создавался существенный перекос температуры по помещениям здания: 30 градусов тепла в ближайших помещениях к теплоузлу, а в удаленных 18. Понятно, что с помощью датчиков температуры эту проблему не решить, но сбор статистики и аналитики вполне возможен. С небольшой группой студентов под чутким руководством преподавателя приступили к поиску решения.
Схема устройства
Заранее определили показатели, которые хотелось фиксировать:
температура;
влажность;
освещённость;
в тестом варианте был также добавлен датчик качества воздуха (tvOC);
далее в качестве эксперимента был добавлен ёмкостной датчик влажности почвы.
Для беспроводной передачи данных протокол выбрали LoRa на 433 МГц, на максимально разрешённой мощности в России 10 мВт, позволяющий передавать данные на относительно большие расстояния внутри зданий. Сами метеодатчики должны быть компактными и энергоэффективными. В качестве источника питания остановились на 2АА батарейках с теоретической емкостью 1500мАч до напряжения 2 вольта (минимальное напряжение при котором микроконтроллер и передатчик стабильно работали).
За основу на этапе разработки метеостанции выбрали стандартный набор компонентов:
Arduino mini (в разработанной плате перешли на ATmega328P-AU/ATmega168P-AU серии picoPower);
Датчик температуры и влажности HTU21D в виде модуля (на готовой плате использовали только сам чип HTU21D);
Датчик освещённости MAX44009 (который в дальнейшем был заменён на датчик BH1750);
Lora Ra-01 на 443 МГц;
Датчик качества воздуха CSS811 - только в первой версии.
Создание и проектирование платы
Тестовый вариант собрали навесным монтажом с использованием макетной платы, провода МГТФ и готовых модулей. Все работало, но судя по показаниям мультиметра потребляло около 50 мА, что давало нам 40 часов работы.
Устройство хотелось сделать миниатюрным, дешевым и энергоэффективным, поэтому решили создавать свою плату с минимальным числом элементов и использовать "голые" компоненты. Среди участников проекта не было специалистов по разработке платы, поэтому насмотревшись видеороликов начали «творить» в Easyeda. Для начала просто соединили все устройства между собой и добавили необходимую обвязку согласно даташитам, подключили к нужным ногам микроконтроллера. Использовать решили внутренний тактовый генератор Atmega на частоте 8 МГц(использовали модифицированное ядро от AlexGyver). Дальше добавили конденсаторы по питанию, увидев такие рекомендации в интернете. Вывели дополнительные контакты для прошивки и питания микроконтроллера. Изготовление плат заказали в JLCPCB, обошлось в 2$ + 8$ доставка (3 раза).
Первый вариант плат сразу ушёл в мусорку, т.к. мы решили использовать транзистор для управления питанием внешних устройств, но ошиблись с трассировкой и сожгли 2 датчика освещённости, пока поняли в чем дело. В следующих вариантах от транзистора отказались, питаясь напрямую от батареек.
Второй вариант плат оказался работоспособен, добавили тестовые точки для замера напряжений и сопротивлений, которые очень сильно упростили отладку в поиске коротких замыкании и неправильного подключения компонентов. Но без ошибок опять не обошлось: ошиблись с размером разъёма для прошивки - вместо шага 2.54мм установили что-то меньшего размера. Также оказалось, что Lora модуль мешает прошивки Atmega с использованием ISP программатора. Погуглив, нашли решения в виде 3 резисторов на 500 Ом по шинам MOSI, MISO, SCK. На основе этих плат было создано 3 устройства, которые сейчас продолжают работать в тестовом режиме уже более 5 месяцев.
Сейчас ждём 3 заказ плат (которые были отправлены в феврале, но, к сожалению, так и не пришли)Получили 3 вариант платы, где датчик MAX44009 был заменён на более дешевый BH1750 и добавлена вся необходимая обвязка для него, а также в качестве эксперимента добавили емкостной датчик для измерения влажности почвы.
Пайка компонентов
Все конденсаторы и резисторы в форм-факторе SMD0805, ATmega328P-AU в корпусе TQFP-32, датчик температуры в DFN, а датчик влажности BH1750 WSOF6I и мы посчитали, что наших "прямых" рук будет недостаточно. Для уверенной пайки этих компонентов приобрели подогреваемый столик: питается от 220 вольт, размер 50x80мм, никаких регулировок не имеет, разогревается до 230-250 градусов. Данный аппарат сделал пайку всех компонентов гораздо проще и быстрее: в нужные места накладываем паяльную пасту, расставляем компоненты, включаем подогрев, ждем когда паста расплавится, выключаем, ждем до полного остывания. Для проверки качества пайки использовали максимально дешевый и простой микроскоп AOMEKIE 20X/40X.
Для удобства прошивки использовали прищепку, на которую выведены 2x4 pogo пина с шагом 2,54 мм. На плате вывели контакты RX, TX, GND, VCC, MOSI, MISO, SCK для прошивки и отладки. Для прошивки применили UsbISP-программатор, для отладки USB-TTL конвертер.
Микроскоп, паяльный столик, пайка
Разработка программного обеспечения
Основная причина выбора Arduino в качестве сердца устройства - это простота разработки, низкий порог вхождения на начальном этапе, наличие большого числа сторонних библиотек. За основу были взяты библиотеки:
Первый прототип прошивки собрали буквально за 1 вечер, используя готовые модули и примеры кода. Основным недостатком данного варианта стало относительное большое время работы в активном режиме - более 1,5 секунд. Дальше приступили к оптимизации кода.
Скачали калькулятор для протокола Lora и начали подбирать оптимальные показатели для передачи на те расстояния, которые у нас были - около 30 метров внутри помещений и минимальное время передачи. Связь односторонняя, без подтверждения приема данных. Подобранные параметры представлены ниже.
Скриншоты из калькулятора
Также отказались от передачи контрольной суммы, а саму проверку уже организовали на стороне сервера, просто проверяя корректность данных: грубо говоря температура не может быть выше 100 градусов, влажность меньше 0 и т.д.
В первом варианте данные передавались в виде строки:
"id устройства#температура#влажность#освещенность#заряд батарей"
Как потом оказалось, эта строка занимала много байт и долго передавалась. Погуглив, решили использовать структуру (Struct) для передачи пакета информации, также перевели все числа с плавающей запятой в целые числа просто умножив их на 100. В итоге id, температура, влажность, освещённость, влажность почвы и заряд батареи поместился в 11 байт.Также нашли интересную статью о том, что команды DigitalRead, DigitalWrite выполняются продолжительное время и заменили их на управление через регистры.
Данный вариант пока остался окончательным и используется в существующих устройствах. Раз в 3-4 дня приходят некорректные данные, но они успешно отсеиваются на стороне сервера. Ниже представлены осциллограммы до и после оптимизации кода и настроек Lora.
Энергопотребление
После допиливания прошивки, перешли к измерению энергопотребления с использованием мультиметра и осциллографа. Устройства просыпаются 1 раз в 3 минуты. К сожалению, мультиметр не умеет снимать показания в микроамперах и в момент передачи показывает около 30 миллиампер, в спящем режиме показывает нули. По уровню напряжения все устройства калибровались от лабораторного источника питания, а полученные поправочные коэффициенты вносились в Grafana. На осциллограмме видим, что основная часть энергии тратится именно на передачу данных в момент работы Lora и время работы около 500мс.
Расчет показывает, что продолжительность работы на 2AA-батарейках емкостью 1500мАч составит:
0.85*1500/(24*(30мА*0.5сек + 0.01мА*180сек)*20/3600) = 569 дней
,
где:
0.85 - коэффициент саморазряда;
1500 - емкость батареек (мАч);
24 - количество часов в сутках;
30 - потребление энергии в режиме передачи (мА);
0.5 - время работы в режиме передачи (сек.);
0.01 - потребление в спящем режим (мА) (очень оптимистичный вариант);
180 - время нахождения в спящем режиме (сек.);
20 - количество циклов пробуждения в 1 часе;
3600 - количество секунд в часе.
Скачок напряжения связан с изменением температуры в серверной с 20 на 16 градусов.
Скачок напряжения батареи
Корпус устройства
Изначально решили использовать готовые корпуса для РЭА, купленные в местном магазине радиотоваров.
А так как в наличии был 3D-принтер, решили попробовать создать корпус самостоятельно.
И последний вариант, разработанный в рамках акции "ДоброВспышка".
Сбор данных
В качестве приемника данных используем Arduino Nano c подключенным передатчиком Lora и по UART передаем данные по USB-кабелю на компьютер с простеньким Python-скриптом, который парсит данные и кладет их в InfluxDB. Дальше уже в Grafana рисуем графики.
Дальность работы
На данный момент с антеннами, сделанными из проволоки, дальность внутри помещений – 30 метров с тремя несущими стенами, дальность на улице – 45 метров через две стены. Мощность установлена 10 мВт. С приемника мы также забираем показатель SNR (Signal-to-Noise Ratio - отношение между мощностью принятого сигнала и фонового шума) и видим, что он сильно меняется. Пока мы решили, что это сигнализации на ближайших машинах создают дополнительные помехи.
Датчик влажности почвы
В качества эксперимента на последний вариант платы была добавлена обвязка для емкостного датчика влажности почвы.
Насколько мы поняли, здесь один из выходов Atmega используется как ШИМ-генератор, а контакты датчика являются обкладками конденсатора, которые вносят изменения в сигнал. При контакте с водой или влажной почвой емкость конденсатора изменяется, эти изменения потом фиксируются с помощью аналогового входа микроконтроллера. Основная проблема возникла с подбором емкостей конденсатора и сопротивления резистора, даже попробовали создать и протестировать схему в Multisim. Сам тестовый датчик промазан лаком, установлен в корпус с экранами Стивенсона (ссылка на модель), в качестве контактов (обкладками конденсатора) является 2 провода, уходящих в землю. Он уже пережил несколько сильных ливней и пока следов попадания влаги не обнаружено.
Аварийные ситуации
На данный момент работают 5 устройств и дважды уже сигнализировали о температуре. В первом случае, отключился кондиционер в серверной, как назло в праздничный день. В Grafana настроены уведомления о температуре выше 30 градусов.
Во втором случае была централизованная проблема с отоплением (отключилось) и тоже в праздники. Температура в помещениях опустилась ниже 15 градусов.
Дальнейшие планы
Сейчас есть желание все таки установить датчик TVOC CO2 CSS811. Проблема в том, что он является энергозатратным и от батареек продержится недолго. В тестовом режиме одновременно работают от сети датчики MH-Z19 (с калибровкой раз в сутки) и CSS811. Результаты между ними очень похожи. Только CSS811 нужно двое суток, чтобы откалиброваться.
Научиться "высасывать" батарейки до конца используя stepup-преобразователи (хотя в них остается не так уж много, 0,2-0,3 В).
Также хочется увеличить дальность передачи данных, возможно перейти на 868МГц.
Создание этакой "станции приема данных", которая будет расположена повыше с выносной антенной.
Возможно перейти на STM32.
Создать интерактивную web-карту с микроклиматом.
Спасибо за внимание.
Ссылки: