Проект Smart_U: ещё одна метеостанция на Arduino
Почти все созданные датчики
Введение
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 датчика освещённости, пока поняли в чем дело. В следующих вариантах от транзистора отказались, питаясь напрямую от батареек.
1 вариант платыВторой вариант плат оказался работоспособен, добавили тестовые точки для замера напряжений и сопротивлений, которые очень сильно упростили отладку в поиске коротких замыкании и неправильного подключения компонентов. Но без ошибок опять не обошлось: ошиблись с размером разъёма для прошивки — вместо шага 2.54 мм установили что-то меньшего размера. Также оказалось, что Lora модуль мешает прошивки Atmega с использованием ISP программатора. Погуглив, нашли решения в виде 3 резисторов на 500 Ом по шинам MOSI, MISO, SCK. На основе этих плат было создано 3 устройства, которые сейчас продолжают работать в тестовом режиме уже более 5 месяцев.
2 вариант платыСейчас ждём 3 заказ плат (которые были отправлены в феврале, но, к сожалению, так и не пришли) Получили 3 вариант платы, где датчик MAX44009 был заменён на более дешевый BH1750 и добавлена вся необходимая обвязка для него, а также в качестве эксперимента добавили емкостной датчик для измерения влажности почвы.
3 вариант платы
Пайка компонентов
Паяльная маска датчика освещенности и зубочистка
Все конденсаторы и резисторы в форм-факторе SMD0805, ATmega328P-AU в корпусе TQFP-32, датчик температуры в DFN, а датчик влажности BH1750 WSOF6I и мы посчитали, что наших «прямых» рук будет недостаточно. Для уверенной пайки этих компонентов приобрели подогреваемый столик: питается от 220 вольт, размер 50×80 мм, никаких регулировок не имеет, разогревается до 230–250 градусов. Данный аппарат сделал пайку всех компонентов гораздо проще и быстрее: в нужные места накладываем паяльную пасту, расставляем компоненты, включаем подогрев, ждем когда паста расплавится, выключаем, ждем до полного остывания. Для проверки качества пайки использовали максимально дешевый и простой микроскоп AOMEKIE 20X/40X.
Для удобства прошивки использовали прищепку, на которую выведены 2×4 pogo пина с шагом 2,54 мм. На плате вывели контакты RX, TX, GND, VCC, MOSI, MISO, SCK для прошивки и отладки. Для прошивки применили UsbISP-программатор, для отладки USB-TTL конвертер.
Микроскоп, паяльный столик, пайка
Разработка программного обеспечение
Основная причина выбора Arduino в качестве сердца устройства — это простота разработки, низкий порог вхождения на начальном этапе, наличие большого числа сторонних библиотек. За основу были взяты библиотеки:
Arduino LoRa
Max44009 — датчик освещенности
GyverHTU21D — для работы с датчиком HTU21D
ArduinoLowPower — для спящего режима
BH1750 — датчик освещенности
Хитрая система измерения напряжения батареи
Первый прототип прошивки собрали буквально за 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 — количество секунд в часе.
Падение напряжения за 2 месяца
Полный размер
Скачок напряжения связан с изменением температуры в серверной с 20 на 16 градусов.
Скачок напряжения батареи
Полный размер
Корпус устройства
Изначально решили использовать готовые корпуса для РЭА, купленные в местном магазине радиотоваров.
Первый вариант корпуса
А так как в наличии был 3д-принтер, решили попробовать создать корпус самостоятельно.
Второй вариант корпуса
И последний вариант, разработанный в рамках акции «ДоброВспышка».
Третий вариант корпуса
Сбор данных
В качестве приемника данных используем Arduino Nano c подключенным передатчиком Lora и по UART передает данные по usb-кабелю на компьютер с простеньким python-скриптом, который парсит данные и кладет их в InfluxDB. Дальше уже в Grafana рисуем графики.
Температура по помещениям
Полный размер
Температура и влажность по помещениям
Полный размер
Дальность работы
На данный момент с антеннами, сделанными из проволоки дальность внутри помещении — 30 метров с 3 несущими стенами, на улице — 45 метров через 2 стены. Мощность установлена 10 мВт. С приемника мы также забираем показатель SNR (Signal-to-Noise Ratio — отношение между мощностью принятого сигнала и фонового шума) и видим, что он сильно меняется. Пока мы решили, что это сигнализации на ближайших машинах создают дополнительные помехи.
SNR
Полный размер
Датчик влажности почвы
В качества эксперимента на последний вариант платы была добавлена обвязка для емкостного датчика влажности почвы.
Схема емкостного датчика влажности почвы
Насколько мы поняли, здесь один из выходов Atmega используется как ШИМ-генератор, а контакты датчика являются обкладками конденсатора, которые вносят изменения в сигнал. При контакте с водой или влажной почвой емкость конденсатора изменяется, эти изменения потом фиксируются с помощью аналогового входа микроконтроллера. Основная проблема возникла с подбором емкостей конденсатора и сопротивления резистора, даже попробовали создать и протестировать схему в Multisim. Сам тестовый датчик промазан лаком, установлен в корпус с экранами Стивенсона (ссылка на модель), в качестве контактов (обкладками конденсатора) является 2 провода, уходящих в землю. Он уже пережил несколько сильных ливней и пока следов попадания влаги не обнаружено.
Уличный датчик
Аварийные ситуации
На данный момент работают 5 устройств и дважды уже сигнализировали о температуре. В первом случае, отключился кондиционер в серверной, как назло в праздничный день. В Grafana настроены уведомления о температуры выше 30 градусов.
Аварийная ситуация в серверной
Полный размер
Во втором случае была централизованная проблема с отоплением (отключилось) и тоже в праздники. Температура в помещениях опустилась ниже 15 градусов.
Проблема с отоплением
Полный размер
Дальнейшие планы
Сейчас есть желание все таки установить датчик tvOC CO2 CSS811, проблема в том, что он является энергозатратным и от батареек продержится недолго. В тестовом режиме одновременно работают от сети датчики MH-Z19(с калибровкой раз в сутки) и CSS811. Результаты между ними очень похожи. Только CSS811 нужно 2 суток, чтобы откалиброваться.
Сравнения показании MH-Z19 и CSS811Полный размер
Научиться «высасывать» батарейки до конца используя stepup-преобразователи (хотя в них остается не так уж много, 0.2–0.3 вольта).
Также хочется увеличить дальность передачи данных, возможно перейти на 868МГц.
Создание этакой «станции приема данных», которая будет расположена повыше с выносной антенной.
Возможно перейти на STM32.
Создать интерактивную web-карту с микроклиматом.
Спасибо за внимание.
Ссылки:
Снова о автономной Arduino-метеостанции на батарейках
Fast DigitalRead (), DigitalWrite () for Arduino
Разводим печатные платы в EasyEDA. Большой гайд — Youtube
Модель уличного корпуса датчика
GYVERCORE — быстрое и лёгкое ядро для arduino