- Как сделать дешевые WiFi датчики температуры/влажности
- О чем этот текст
- История
- Покупка устройств
- Схема подключения
- Первая версия софта
- Сборка устройств
- Отправка данных по WiFi на сервер
- Серверная часть
- Запуск в работу
- Резюме
- Создаем беспроводной термометр на Arduino
- Что нам потребуется
- Введение
- Аппаратная часть
- Передатчик
- Приемник
- Принципиальные схемы
- Передатчик
- Приемник
- Перечень элементов
- Передатчик
- Приемник
- Программа
- Программа передатчика
- Программа приемника
- Заключение
- Загрузки
- Фото и видео
- Передатчик
- Приемник
- Видео
Как сделать дешевые WiFi датчики температуры/влажности
О чем этот текст
Тут я рассказываю как я собрал датчик температуры и влажности с WiFi. Вставляешь это устройство в розетку, оно подключается к WiFi сети и два раза в минуту отправляет данные на сервер.
Если все делать самому, то стоимость устройства получается меньше 400 рублей (без учета usb провода и блока питания).
В этом тексте я описываю как аппаратную часть устройства, так и программную.
В итоге у меня получилось работающее решение. Данные собираются и можно посмотреть на график с историей, но все можно сильно улучшить.
История
У меня есть несколько YouTube каналов которые я иногда смотрю. Один из них — это Chillichump. Человек живет недалеко от Лондона и у себя в садике в парнике выращивает острые перцы, а потом из них делает соусы. Канал отличный, автор явно фанатеет от всего этого, рассказывает он интересно, видео хорошего качества.
В основном автор рассказывает о перцах, какие бывают, как их выращивать, как собирать, как ферментировать и как готовить, но иногда он рассказывает про какие-то технические самоделки, которые он делает для того чтобы упростить или улучшить процесс создания острых соусов.
В начале 2019 года он выпустил видео о том как просто собрать датчик температуры и влажности который может отправлять данные на сервер. У него достаточно технологическая теплица: есть датчики, камеры, система автоматического полива. Всем этим он может управлять удаленно.
Вот его видео как собрать датчик температуры/влажности — https://www.youtube.com/watch?v=yqmOp7m4szA («Easy web-enabled Temperature and Humidity monitoring for your greenhouse»).
Судя по видео — все очень просто. Берется несколько деталей, все они спаиваются и получается работающая конструкция которая умеет отправлять данные на сервер по WiFi.
И у меня как раз есть задача зачем мне это нужно. На даче есть проблема — влажность. Там очень сыро. То что там есть проблема это ясно и без датчиков, но мне бы хотелось получить числа и графики влажности, чтобы понять насколько помогают различные решения.
Так что я решил повторить то что описано в видео, спаять датчики и собирать с них данные.
Покупка устройств
Автор Chillichump в своем видео использует датчик AM2302 и Arduino совместимое устройство Wemos D1 Mini.
Я заказал на AliExpress штуки которые очень похожи на то что использовал автор:
- Датчик — https://s.click.aliexpress.com/e/_d8Cfw2F (покупал за $2.44 за штуку)
- Компьютер на базе ESP8266 со встроенным WiFi — https://s.click.aliexpress.com/e/_dVV7rc5 (покупал за $2.35 за штуку)
Заказал и оплатил на сайте 13 августа, а 2 сентября я забрал посылку с почты (вообще пришло чуть раньше). Буду считать что пришло за 20 дней.
Я не заказывал, но вообще для сборки датчика нужны еще компоненты:
- Резистор на 10 кОм
- Провод Micro USB
- USB блок питания
И еще нужны расходники — монтажные провода, припой. Из инструментов нужен как минимум паяльник и кусачки.
Схема подключения
У датчики AM2302 4 ноги, из которых нужно 3:
У D1 Mini куча разъемов , в это проекте используются 3:
Все подключается очень просто — питание к питанию, земля к земле, данные к GPIO5, но еще дополнительно между pin1 и pin2 датчика нужно подключить резистор на 10 кОм.
Для начала я все это быстро подключил на макетной плате:
Первая версия софта
На устройстве Wemos D1 Mini есть разъем Micro USB. Через него он получает питание.
Если этот USB подключить к ноутбуку, то можно заливать код на устройство, а устройство, в свою очередь, сможет отправлять данные на ноутбук.
Для написания кода и его заливки на устройство используется бесплатная программа. Arduino IDE.
В Arduino IDE нужно выбрать плату «LOLIN(WEMOS) D1 R2 & mini».
Tools -> Board»/>
А чтобы эта плата там появилась нужно в настройках указать «Additional Boards Manager URLs»:
А еще нужно добавить в Arduino IDE библиотеку для работы с датчиком «DHT sensor library». Вот ссылка на гитхаб https://github.com/adafruit/DHT-sensor-library.
После того как в Arduino IDE добавлена плата и подключена библиотека — можно написать код который будет читать данные с датчика и отображать его. Тут еще нет никакого взаимодействия по WiFi, данные отправляются на компьютер по USB.
Компилируем и загружаем код на устройство, включаем Serial Monitor в Arduino IDE и видим что каждые 1.5 секунды на экране появляется числа с температурой и влажностью.
Сборка устройств
Сборка на монтажной плате и первая версия софта показываю что все работает. Следующий этап — нужно спаять устройства.
Для пайки я использовал многожильный провод 0.75 мм, но для этих целий он оказался слишком толстым. Пришлось убирать некоторые жилы из-за этого сборка проходила дольше чем могла бы. Я использовал термоусадочные трубки чтобы закрыть контакты на датчике AM2302, но из-за того что к ногам AM2302 еще и припаивается резистор использовать трубки было неудобно.
Я снимал видео как я паял, потом ускорил это видео и выложил на YouTube. Час пайки за одну минуту — https://www.youtube.com/watch?v=w4MWFH6uB1g
Когда я все спаял и стал проверять я понял что я забыл заказать usb провода и блоки питания. Но мне повезло, в своем ящике со всяким компьютерным барахлом я нашел все что мне нужно. Правда, все USB провода и все блоки питания разные.
Отправка данных по WiFi на сервер
Итак, есть спаянные устройства. Есть код который умеет читать данные с датчика и выводить его на компьютере через USB.
Но идея заключается в том чтобы датчик был автономным. Чтобы не нужно было его подключать к компьютеру по USB. Нужно чтобы USB провод от датчика вставляется в USB блок питания, блок питания — в розетку. А датчик подключался к WiFi и отправлял данные на сервер.
Через некоторое время чтения разной документации и примеров с кодом я написал программу в Arduino IDE чтобы этот датчик подключался к WiFi и отправлял данные на сервер с помощью метода POST протокола HTTP.
B теле запроса отправляется json вида
В теле запроса отправляются не только данные о температуре и влажности, но еще и MAC адрес устройства. Этот адрес должен быть разным для разных устройств и по нему можно понять с какого датчика пришли показания.
Код работает, но в этом коде мне не нравится что я собираю json руками с помощью конкатенации строк, а не используют какую-нибудь хорошо отлаженную библиотеку.
В коде нужно заменить строки «my_wifi_name», «my_wifi_password», «http://example.com/endpoint», нужно указать реальные данные.
Я проверил работу этого кода в трех ситуациях:
- Если устройство выключится а потом включится, (например, выключали электричество), то после включения данные опять пойдут.
- Если сервер стал недоступен, а потом все починилось, то устройство продолжит отправлять данные
- Если WiFi стал недоступен, а потом вернулся, то устройство само переподключится
Все эти 3 нештатные ситуации устройство отрабатывает нормально. Как только проблема пропадает, то все само начинает дальше работать. Устройство не нужно перегружать или еще что-то с ним делать.
Серверная часть
Итак, есть датчики которые умеют отправлять данные с помощью метода POST протокола HTTP.
Нужен сервер который умеет принимать такие данные, сохранять их и визуализировать.
Для этих целей я написал маленький сервер, и завернул его в docker.
Вот пример отправки данных на сервер с помощью «curl»:
Датчик отправляет только MAC адрес, значение температуры и значение влажности. Сервер принимает эти значения, дописывает к ним текущую дату и время и сохраняет эти данные в файл, а еще записывает все это в sqlite базу данных.
Так же в этом репозитории есть еще и микросервис который визуализирует данные с помощью библиотеки Cubism.js.
Вот небольшое видео как меняются данные если нагревать датчик зажигалкой. Для этого видео я поправил код на датчике чтобы он отправлял данные не каждые 30 секунд, а каждые 2 секунды. https://twitter.com/bessarabov/status/1177932537601183752.
Если включить и положить все датчики рядом то видно что данные с них различаются:
Запуск в работу
Итого. У меня есть железки — датчики. На них залита программа которая читает значения и отправляет их на сервер. И есть сервер который получает данные и сохраняет их.
Осталось только установить эти датчики:
Сервер сохраняет данные в файлы. Я взял Jupyter и написал код чтобы нарисовать графики температуры влажности:
Сначала этот датчик собирал данные в квартире, а потом я его отвез на дачу. Видно насколько эти два помещения отличаются.
В качестве эксперимента я поднял у себя Home Assistant и настроил его чтобы он получал данные с этих сенсоров. Это оказалось очень несложно сделать. Вот пример настроек для файла configuration.yaml:
Резюме
Получилось отлично. Сенсор очень просто сделать. Компоненты дешевые, работает отлично. Код программы доступен. Сенсор можно заинтегрировать куда угодно.
Но мое решение больше похоже на прототип чем на настоящий продукт. Вот несколько вещей что хотелось бы сделать иначе:
- Устройство — это микросхема из которой торчат провода. Нужно все это облагородить. Запихнуть все это в красивый корпус.
- Для того чтобы настроить подключение к WiFi нужно подключить устройство по USB к ноутбуку, в код программы вставить название точки доступа и пароль, скомпилировать и залить программу на устройство. Хотелось бы иметь возможность настраивать устройство без необходимости подключать к ноутбуку со специальным софтом. Например, устройство могло бы работать так. Дополнительно на устройстве есть кнопка. Зажимаешь ее на 5 секунд, устройство переходит в режим настройки. Оно становится WiFi точкой доступа к которой можно подключиться. Имя точки доступа — это ее MAC адрес (написан на устройстве). Пароль — серийный номер (тоже написан на устройстве). Подключился к этой точке, заходишь на адрес 192.168.1.1 — там простой веб интерфейс, где выставляешь настройки. Сохраняешь — устройство переходит в рабочий режим, подключается к указанной точке и два раза в минуту отправляет данные. Возможно еще было бы неплохо иметь на устройстве светодиод, разные цвета и разные паттерны моргания означают разные ошибки/состояния.
- Работа устройства зависит от доступности сервера на которое устройство отправляет данные. Если к этому серверу нельзя подключиться (например, нет интернета), то замеры теряются. Возможно если нет доступа до сервера, то имеет смысл сохранять замеры в специальный буфер, а когда доступ к серверу возобновляется, то отправятся все сохраненные замеры.
- Протокол взаимодействия с сервером — HTTP и все работает без необходимости указывать логин/пароль или токен. Возможно что стоит использовать специальный протокол MQTT, но если продолжать использовать HTTP, то нужно переходить на https с авторизацией по токену. Так что тут очень актуальна шутка что в слове IoT буква S означает Security.
Источник
Создаем беспроводной термометр на Arduino
Узнайте, как использовать RF модуль 433 МГц совместно с ATMega328P-PU. В данной статье мы соберем схему из датчика DHT11 и радиочастотного передатчика. А также соберем приемное устройство с радиоприемником 433 МГц и LCD дисплеем.
Что нам потребуется
- компьютер с установленной Arduino IDE (я использую версию 1.6.5);
- библиотека VirtualWire (ссылка ниже);
- Arduino Mega;
- ATMega328P;
- программатор AVR MKII ISP;
- LCD дисплей;
- датчик температуры и относительной влажности воздуха DHT11;
- радиочастотные модули 433 МГц;
- перемычки;
- макетная плата;
- компоненты из перечня элементов, приведенного ниже.
Введение
В данной статье я покажу вам, как собрать устройство, которое измеряет температуру и относительную влажность воздуха и посылает измеренные значения с помощью стандартного радиочастотного модуля 433 МГц. Датчик температуры и влажности, используемый в устройстве, – это DHT11.
Существует множество способов передачи небольшого объема данных с помощью Arduino или контроллеров ATMega. Один из них использует уже готовую библиотеку, подобную RCSwitch, Radiohead или VirtualWire. Кроме того, можно отправить необработанные данные с помощью встроенного в микроконтроллер модуля UART. Но использовать встроенный модуль UART не рекомендуется, так как приемник будет собирать и все помехи, и микроконтроллер будет работать не так, как предполагалось. В данной статье для передачи и приема данных я использую библиотеку VirtualWire. Эта библиотека работает с Arduino IDE 1.6.2 и 1.6.5.
Модуль передатчика 433 МГц, когда не передает данные, всё равно излучает радиочастотные колебания и передает шум. Он также может создавать помехи другим радиочастотным устройствам. Чтобы не допустить этого, я включаю его, когда необходимо передать данные, и выключаю его, когда передача закончена.
Аппаратная часть
Нам необходимы две структурные схемы. Одна для передающего устройства, вторая для приемного.
Передатчик
- способ прошивки микроконтроллера → ISP;
- датчик для измерения температуры и влажности → DHT11;
- микроконтроллер для обработки данных → ATMega32p;
- способ беспроводной передачи данных → радиочастотный модуль 433 МГц.
Приемник
- способ приема радиосигнала → радиочастотный модуль 433 МГц;
- способ обработки принятых данных → Arduino Mega;
- способ отображения температуры и влажности → 16×2 LCD.
Принципиальные схемы
Передатчик
В данном примере я не буду выводить неиспользуемые выводы микроконтроллера на внешние контакты термометра, после чего их можно было бы использовать для дальнейшего усовершенствования устройства. Здесь мы рассматриваем лишь идею для устройства и соберем его только на макетной плате.
Приемник
Пожалуйста, обратите внимание, что приемник построен на базе платы Arduino Mega, которая не изображена на схеме. Для подключения платы Arduino Mega соедините с ней радиочастотный модуль и LCD дисплей согласно метка на схеме.
Перечень элементов
Передатчик
Приемник
Программа
Программа передатчика
Сперва рассмотрим программу передающей части:
Для передачи влажности и температуры в одном сообщении я соединяю их вместе. Сначала данные считываются в переменную как целые числа, потом целые числа преобразовываются в массив символов, а затем они соединяются друг с другом. На приемной стороне данные будут разделены на отдельные символы. Делая это, я ограничиваю себя двумя цифрами градусов. Если датчик находится в среде с температурой менее 10°C, я буду получать на дисплее символы мусора. Например, если температура составляет 20°C, а влажность – 45%, то будет передаваться сообщение 2045, и всё хорошо. Если температура равна 9°C, а влажность – 78%, то передастся сообщение 978x, где «x» – случайный символ. Поэтому, если вы будете собирать данный беспроводной термометр, я советую вам изменить программу для передачи правильных данных, когда температура будет меньше 10°C.
Программа приемника
Интересный способ использования библиотеки LiquidCrystal – это создание пользовательских символов. С помощью createChar я создал символ градусов. Таким же способом вы можете создать и свои собственные символы. Чтобы создать пользовательский символ или значок, вам необходимо объявить его, как массив из восьми байт, и «нарисовать», какие пиксели будут включены (1 – включен, 0 – выключен).
В функции setup() вы создаете его с помощью createChar . createChar принимает два аргумента: номер позиции для хранения символа и массив байт, в котором определено, какие пиксели будут отображаться. В нашем случае это lcd.createChar(1, degreesymbol) . Затем символ выводится на LCD с помощью функции lcd.write .
Заключение
В данной статье я использовал датчик температуры и влажности DHT11. Температура и влажность были преобразованы в массив символов, а затем переданы с помощью передатчика 433 МГц. На приемной стороне массив символов был разделен на пары и выведен на LCD. Для получения символа градусов я использовал функцию createChar библиотеки LiquidCrystal.
Загрузки
- Библиотека VirtualWire версия 1.6 (библиотека для Arduino для организации связи через радиомодули с использованием амплитудной манипуляции).
- Описание библиотеки VirtualWire.
Фото и видео
Передатчик
Приемник
Видео
Источник