Почти все созданные датчики
Почти все созданные датчики

Введение

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 вольт, размер 50x80мм, никаких регулировок не имеет, разогревается до 230-250 градусов. Данный аппарат сделал пайку всех компонентов гораздо проще и быстрее: в нужные места накладываем паяльную пасту, расставляем компоненты, включаем подогрев, ждем когда паста расплавится, выключаем, ждем до полного остывания. Для проверки качества пайки использовали максимально дешевый и простой микроскоп AOMEKIE 20X/40X.

Для удобства прошивки использовали прищепку, на которую выведены 2x4 pogo пина с шагом 2,54 мм. На плате вывели контакты RX, TX, GND, VCC, MOSI, MISO, SCK для прошивки и отладки. Для прошивки применили UsbISP-программатор, для отладки USB-TTL конвертер.

Микроскоп, паяльный столик, пайка
Микроскоп
Микроскоп
Подогреваемый столик
Подогреваемый столик
Прищепка с pogo-пинами
Прищепка с pogo-пинами
Установка компонентов
Установка компонентов
Сразу после прогрева
Сразу после прогрева

Разработка программного обеспечение

Основная причина выбора 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 - отношение между мощностью принятого сигнала и фонового шума) и видим, что он сильно меняется. Пока мы решили, что это сигнализации на ближайших машинах создают дополнительные помехи. 

SNR
SNR

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

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

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

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

Насколько мы поняли, здесь один из выходов 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

Комментарии (4)


  1. teuchezh
    30.05.2022 09:55

    А я сейчас такую шутку собираю - https://www.airgradient.com/diy/
    Осталось заказать датчик CO2 и отпечатать корпус


  1. beho1der
    30.05.2022 15:35
    +1

    1. Попробуйте для СO2 SCD40 у него вроде потребление поменьше чем у CSS81

    2. Не думали перейти просто на аккумуляторы ?

    Удачи в дальнейшей работе над проектом!


    1. ximik666 Автор
      30.05.2022 16:10

      Спасибо за пожелания. Аккумуляторы - страшновато, если честно. А так - думали. По scd40(scd41) вроде есть вариант 1 измерение в 5 минут, но все равно там 0.4 мА. Посмотрим , что нибудь из этой серии, спасибо.


  1. connected201
    31.05.2022 11:39

    прикрутите lora, что бы девайс был совместим с helium network.