Проект 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 раза).

  1. Первый вариант плат сразу ушёл в мусорку, т.к. мы решили использовать транзистор для управления питанием внешних устройств, но ошиблись с трассировкой и сожгли 2 датчика освещённости, пока поняли в чем дело. В следующих вариантах от транзистора отказались, питаясь напрямую от батареек. 

    1 вариант платы1 вариант платы
  2. Второй вариант плат оказался работоспособен, добавили тестовые точки для замера напряжений и сопротивлений, которые очень сильно упростили отладку в поиске коротких замыкании и неправильного подключения компонентов. Но без ошибок опять не обошлось: ошиблись с размером разъёма для прошивки — вместо шага 2.54 мм установили что-то меньшего размера. Также оказалось, что Lora модуль мешает прошивки Atmega с использованием ISP программатора. Погуглив, нашли решения в виде 3 резисторов на 500 Ом по шинам MOSI, MISO, SCK. На основе этих плат было создано 3 устройства, которые сейчас продолжают работать в тестовом режиме уже более 5 месяцев. 

    2 вариант платы2 вариант платы
  3. Сейчас ждём 3 заказ плат (которые были отправлены в феврале, но, к сожалению, так и не пришли) Получили 3 вариант платы, где датчик MAX44009 был заменён на более дешевый BH1750 и добавлена вся необходимая обвязка для него, а также в качестве эксперимента добавили емкостной датчик для измерения влажности почвы. 

    3 вариант платы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 в качестве сердца устройства — это простота разработки, низкий порог вхождения на начальном этапе, наличие большого числа сторонних библиотек. За основу были взяты библиотеки:

  1. Arduino LoRa

  2. Max44009 — датчик освещенности

  3. GyverHTU21D — для работы с датчиком HTU21D

  4. ArduinoLowPower — для спящего режима

  5. BH1750 — датчик освещенности

  6. Хитрая система измерения напряжения батареи

Первый прототип прошивки собрали буквально за 1 вечер, используя готовые модули и примеры кода. Основным недостатком данного варианта стало относительное большое время работы в активном режиме — более 1,5 секунд. Дальше приступили к оптимизации кода.

  1. Скачали калькулятор для протокола Lora и начали подбирать оптимальные показатели для передачи на те расстояния, которые у нас были — около 30 метров внутри помещений и минимальное время передачи. Связь односторонняя, без подтверждения приема данных. Подобранные параметры представлены ниже.

    Скриншоты из калькулятора 
    Основные параметры передачиОсновные параметры передачиРасчет затрат энергииРасчет затрат энергии

    Также отказались от передачи контрольной суммы, а саму проверку уже организовали на стороне сервера, просто проверяя корректность данных: грубо говоря температура не может быть выше 100 градусов, влажность меньше 0 и т.д.

  2. В первом варианте данные передавались в виде строки:  
    "id устройства#температура#влажность#освещенность#заряд батарей" 
    Как потом оказалось, эта строка занимала много байт и долго передавалась. Погуглив, решили использовать структуру (Struct) для передачи пакета информации, также перевели все числа с плавающей запятой в целые числа просто умножив их на 100. В итоге id, температура, влажность, освещённость, влажность почвы и заряд батареи поместился в 11 байт.

  3. Также нашли интересную статью о том, что команды 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 месяцаПадение напряжения за 2 месяца

Полный размер

Скачок напряжения связан с изменением температуры в серверной с 20 на 16 градусов. 

Скачок напряжения батареи

Скачок напряженияСкачок напряжения

 Полный размер

Корпус устройства

Изначально решили использовать готовые корпуса для РЭА, купленные в местном магазине радиотоваров. 

Первый вариант корпусаПервый вариант корпуса

А так как в наличии был 3д-принтер, решили попробовать создать корпус самостоятельно. 

Второй вариант корпусаВторой вариант корпуса

И последний вариант, разработанный в рамках акции «ДоброВспышка». 

Третий вариант корпусаТретий вариант корпуса

Сбор данных

В качестве приемника данных используем Arduino Nano c подключенным передатчиком Lora и по UART передает данные по usb-кабелю на компьютер с простеньким python-скриптом, который парсит данные и кладет их в InfluxDB. Дальше уже в Grafana рисуем графики.

Температура по помещениямТемпература по помещениям

Полный размер

Температура и влажность по помещениямТемпература и влажность по помещениям

Полный размер

Дальность работы

На данный момент с антеннами, сделанными из проволоки дальность внутри помещении — 30 метров с 3 несущими стенами, на улице — 45 метров через 2 стены. Мощность установлена 10 мВт. С приемника мы также забираем показатель SNR (Signal-to-Noise Ratio — отношение между мощностью принятого сигнала и фонового шума) и видим, что он сильно меняется. Пока мы решили, что это сигнализации на ближайших машинах создают дополнительные помехи. 

SNRSNR

Полный размер

Датчик влажности почвы

В качества эксперимента на последний вариант платы была добавлена обвязка для емкостного датчика влажности почвы. 

Схема емкостного датчика влажности почвыСхема емкостного датчика влажности почвы

Насколько мы поняли, здесь один из выходов Atmega используется как ШИМ-генератор, а контакты датчика являются обкладками конденсатора, которые вносят изменения в сигнал. При контакте с водой или влажной почвой емкость конденсатора изменяется, эти изменения потом фиксируются с помощью аналогового входа микроконтроллера. Основная проблема возникла с подбором емкостей конденсатора и сопротивления резистора, даже попробовали создать и протестировать схему в Multisim. Сам тестовый датчик промазан лаком, установлен в корпус с экранами Стивенсона (ссылка на модель), в качестве контактов (обкладками конденсатора) является 2 провода, уходящих в землю. Он уже пережил несколько сильных ливней и пока следов попадания влаги не обнаружено. 

Уличный датчикУличный датчик

Аварийные ситуации

На данный момент работают 5 устройств и дважды уже сигнализировали о температуре. В первом случае, отключился кондиционер в серверной, как назло в праздничный день. В Grafana настроены уведомления о температуры выше 30 градусов. 

Аварийная ситуация в сервернойАварийная ситуация в серверной

Полный размер

Во втором случае была централизованная проблема с отоплением (отключилось) и тоже в праздники. Температура в помещениях опустилась ниже 15 градусов. 

Проблема с отоплениемПроблема с отоплением

Полный размер

Дальнейшие планы

  • Сейчас есть желание все таки установить датчик tvOC CO2 CSS811, проблема в том, что он является энергозатратным и от батареек продержится недолго. В тестовом режиме одновременно работают от сети датчики MH-Z19(с калибровкой раз в сутки) и CSS811. Результаты между ними очень похожи. Только CSS811 нужно 2 суток, чтобы откалиброваться.

    Сравнения показании MH-Z19 и CSS811Сравнения показании MH-Z19 и CSS811

     Полный размер

  • Научиться «высасывать» батарейки до конца используя stepup-преобразователи (хотя в них остается не так уж много, 0.2–0.3 вольта).

  • Также хочется увеличить дальность передачи данных, возможно перейти на 868МГц.

  • Создание этакой «станции приема данных», которая будет расположена повыше с выносной антенной.

  • Возможно перейти на STM32.

  • Создать интерактивную web-карту с микроклиматом.

Спасибо за внимание.

Ссылки:

  1. Снова о автономной Arduino-метеостанции на батарейках

  2. Fast DigitalRead (), DigitalWrite () for Arduino

  3. Разводим печатные платы в EasyEDA. Большой гайд — Youtube

  4. Модель уличного корпуса датчика

  5. GYVERCORE — быстрое и лёгкое ядро для arduino

© Habrahabr.ru