Построение доступной беспроводной сети датчиков для дома
Это руководство научит вас создавать сеть экономичных беспроводных сенсорных модулей. Многие готовые беспроводные модули могут быть слишком дорогими для использования в множестве сенсорных узлов. Хотя Wi-Fi и Zigbee модули популярны и просты в использовании, их стоимость может сделать их применение в массиве датчиков непрактичным. Однако существуют дешевые RF-модули без дорогих функций, которые отлично подойдут для этих целей. Платформа Arduino может использовать низкоуровневые радиомодули для легкой и надежной связи.
После сборки оборудования вы используете платформу Raspberry Pi для отправки данных в сервис Интернета вещей Xively, где можно отслеживать значения во времени и запускать действия при достижении пороговых условий.
Сбор компонентов и инструментов
Проект включает три части: два передающих узла и один принимающий. Передатчики состоят из платы Arduino, датчика и RF-передатчика. Приемный узел состоит из платы Arduino, RF-приемника, преобразователя логических уровней и Raspberry Pi.
Существует широкий выбор Arduino-совместимых плат для этого проекта. Минимальное требование к плате — два цифровых GPIO-вывода и один аналоговый. Выберите плату, соответствующую требованиям по стоимости и простоте.
В этом туториале я использовал набор плат Arduino Nano, которые хорошо помещаются в макетную плату и просты в программировании. Однако 5-вольтовые версии Arduino Pro Mini или Trinket также хорошо работают и по гораздо более низкой цене. Они требуют немного больше опыта для программирования и использования. Выбирайте мудро.
Приемник
- Raspberry Pi — Model B с блоком питания, корпусом и SD-картой — убедитесь, что GPIO-пины доступны с выбранным корпусом
- Wi-Fi адаптер, совместимый с Pi
- Arduino
- Перемыточные провода для макетной платы
- Перемыточные провода «мама-папа»
- Преобразователь логических уровней
- RF-приемник 434 МГц
- Половинка макетной платы
Передатчики (два узла)
- 2 x Arduino
- 2 x Датчики температуры/влажности
- 2 x RF-передатчик 434 МГц
- 2 x Половинка макетной платы
- 2 x Удобные для макетной платы DC-разъемы питания 2,1 мм
- 2 x Блок питания 9В с разъемом 2,1 мм x 5
- Перемыточные провода для макетной платы
Инструменты
- PC/Mac с установленной Arduino IDE
- USB-кабель для программирования плат Arduino
- USB-клавиатура и мышь. Либо комбинированные, либо с хабом, чтобы оба можно было использовать с одним USB-портом.
- Исходный пакет, связанный с этим туториалом, на вашей рабочей станции программирования
Сборка передатчиков
Передатчики представляют относительно простые схемы. Только один пин используется для получения информации от датчика температуры и влажности, и один пин — для отправки этих данных в RF-передатчик. Схема на макетной плате показана ниже.
Блок питания 9В подключается к разъему питания, делая нижние шины 9В. Стабилизатор напряжения в Arduino выдает 5В, безопасные для радио и датчиков — верхняя шина питания на схеме.
Датчик поставляется с резистором 10 кОм, соединяющим пин данных с питанием как подтягивающий резистор, а другой провод подключает его к GPIO D3.
Будьте внимательны, следуя приведенной ниже настройке, и дважды проверяйте даташит датчика и RF-модуля, чтобы убедиться, что компоненты размещены на макетной плате правильно и пины питания, земли и сигнала подключены к правильным пинам. Диаграмма Fritzing включена в исходный пакет для большей детализации.
Антенна — важная часть платы, так как RF-модуль не имеет встроенной антенны. Я использовал 6-дюймовый женский-папский перемыточный провод, вставленный в макетную плату, и он достаточно хорошо работал для приема во всех частях моего дома и немного снаружи. Как отмечено в схеме, 6,5 дюйма — оптимально для этой антенны, если нужна дополнительная дальность.
Примечание об использовании RF. В разных странах существуют разные законы и правила об использовании частот. Пожалуйста, убедитесь, что вы соблюдаете эти правила перед вещанием. Тем не менее, сигналы этих модулей едва ли достаточно мощны, чтобы выйти за пределы вашего дома. В идеальных условиях они могут вещать до 500 футов.
Загрузка библиотек для компонентов
Передатчик использует две библиотеки, не входящие в состав Arduino IDE. Скачайте библиотеки, как описано ниже, и распакуйте их в директорию вашего скетча в поддиректорию Libraries.
- Скачайте исходный пакет VirtualWire для этого туториала и распакуйте папку wirelesstransmitter в папку скетчей Arduino
- В папке wirelesstransmitter создайте папку Libraries
- Скачайте последнюю версию кода VirtualWire, 1.23 на момент написания, со страницы проекта
- Распакуйте папку VirtualWire в wirelesstransmitter/Libraries/ так, чтобы появилась еще одна подпапка VirtualWire
- Скачайте библиотеку датчика DHT со страницы проекта на GitHub
- Распакуйте папку DHT в папку Libraries. Теперь у вас должны быть две необходимые папки библиотек DHT и VirtualWire в wirelesstransmitter/Libraries.
Программирование платы Arduino
Это руководство предполагает, что у вас есть опыт работы с Arduino и программирования их через Arduino IDE. Если нет, на официальном сайте Arduino есть очень хорошие инструкции.
- Откройте скетч wirelesstransmitter из исходного архива в Arduino IDE и сохраните копию локально
- Убедитесь, что Arduino НЕ подключен к питанию через разъем питания
- Подключите плату к вашей программной рабочей станции соответствующим USB-кабелем
- Установите тип платы под вашу выбранную Arduino в меню Tools > Board
- Установите последовательный порт на порт, определенный при подключении платы Arduino в меню Tools > Port
- Убедитесь, что define MYID установлен в 1, а TRANSPIN и DHTPIN правильно установлены на пины, подключенные к RF-передатчику и датчику DHT соответственно. Если вы собрали плату по схеме выше, это уже должно быть настроено. См. пример кода ниже.
- Убедитесь, что UNIT установлен правильно для ваших предпочтений: Фаренгейт или Цельсий.
| 12345 |
#define MYID 1 //ID номер этой платы. Измените для каждой платы, которую прошиваете.
//ID будет передан с данными, чтобы вы могли узнать, какое устройство передает
#define TRANSPIN 3 //на каком пине передавать
#define DHTPIN 4 // на каком пине подключен DHT
#define UNIT 0 // 0 для Фаренгейта и 1 для Цельсия
|
Define MYID — числовой ID, который передатчик использует для уникальной идентификации себя. Поскольку у вас будет несколько передатчиков в разных местах, важно иметь уникальный ID для каждого. Этот номер будет использован снова при настройке скрипта приемника.
- Проверьте код, нажав Control-R, чтобы убедиться, что библиотеки включены и скомпилированы правильно.
- Загрузите код на плату, нажав кнопку Upload на панели инструментов.
- Откройте окно Serial Monitor, нажав Control-Shift-M
Окно Serial Monitor сбрасывает Arduino, поэтому вы должны увидеть строку кода на экране, выглядящую примерно так:
| 12 |
Humidity: 44.00 % Temperature: 60.80 *F
Sending Message: ID:1:TS:23143:TF:60.79:RH:44.00
|
Сообщение состоит из пар Имя:Значение, которые обработает приемник. Передатчик будет считывать и вещать свой сигнал на длинном случайном интервале. Датчики не меняются сильно или часто, поэтому вещание чаще раза в минуту не добавляет ценности. Случайное время ожидания позволяет нескольким датчикам сосуществовать.
Даже если есть коллизия и сигнал от обоих передатчиков потерян, случайный интервал обеспечит, что их следующие вещания не перекроются. Случайное зерно для этого интервала устанавливается из analogRead на неиспользуемом аналоговом порту, который вернет случайные значения, гарантируя, что никакие два передатчика не будут на одном паттерне.
Пример кода, генерирующего вывод выше, настроен на использование Фаренгейта. Вы можете видеть идентификатор TF:60.79 в строке сообщения, указывающий, что моя лаборатория действительно чуть ниже 61 градуса. Однако относительная влажность RH:44.00 — комфортные 44%. Можно предположить из прохладной влажной среды, что моя лаборатория в подвале. Можно быть правым.
Передатчики настроены на ожидание 2–5 минут между вещаниями по умолчанию. Если вы хотите ускорить это для отладки, измените значение delay() в конце скетча на что-то вроде 5000 (мс). Настоятельно рекомендуется вернуть это обратно и перезагрузить код на передатчиках, когда вы будете готовы к полноценному использованию.
- Соберите вторую плату передатчика
- Измените скетч передатчика так, чтобы define MYID был установлен в 2
- Загрузите код на вторую плату
- Откройте окно Serial Monitor (Control-Shift-M) и проверьте, что вывод выглядит как у первого передатчика, за исключением того, что передаваемое сообщение начинается с ID:2
Сборка приемной платы
Приемная плата будет отвечать за прием вещаемого сообщения на своем RF-приемнике и отправку этого сообщения по последовательным проводам к Raspberry Pi. Плата Arduino используется для приема сигнала по двум очень важным причинам. Код VirtualWire использует реальное время Arduino для управления модуляцией и демодуляцией сигнала.
Это означает, что принимающий блок должен работать на той же частоте. Кроме того, на принимающем процессоре мало места для джиттера, к которому Raspberry Pi склонен из-за его вытесняющей, не-реально-временной ОС. Сравнение стоимости Arduino Pro Mini плюс RF-приемник с ценой Zigbee-модуля, который мог бы общаться напрямую с Raspberry Pi, показало, что использование внешнего Arduino все равно довольно экономично.
В этот момент НЕ подключайте 5В и заземляющие провода от Pi к макетной плате. Держите перемыточные провода под рукой, но вы не хотите питать Arduino и от USB-порта, и от Raspberry Pi.
Обратите внимание, что преобразователь логических уровней в списке материалов выше не в точности тот же, что в библиотеке Fritzing, но пины хорошо подписаны, просто в других местах. Пожалуйста, убедитесь, что правильные провода подключены к правильным пинам на самом преобразователе логических уровней.
Этот компонент необходим для преобразования 5В последовательного сигнала Arduino в 3,3В последовательный сигнал Raspberry Pi и не повредить Pi. См. изображение ниже для дополнительной помощи.
Для более подробной информации: Building a Wireless Sensor Network in Your Home
Производственный процесс
- Переключение беспроводных сенсорных сетей: 6 ключевых соображений для миграции технологий
- Понимание низкоэнергетических беспроводных сенсорных сетей: движущие эффективные IoT-решения
- Надежный беспроводной датчик подъездной дороги для длинных подъездов — простое подключение к Raspberry Pi
- Развертывание беспроводной сети датчиков на мельнице XVIII века
- Развертывание и управление беспроводными сенсорными сетями в 엔терпрайзе
- Беспроводная передача данных по магнитному полю на Arduino с 3D-сенсором Infineon
- Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
- Цифровой стадиометр на Arduino: отслеживание роста лазерным датчиком VL53L0X
- Интеграция ёмкостного сканера отпечатков DFRobot с Arduino или ESP8266
- Надежные дальнодействующие беспроводные сенсорные сети для удаленного мониторинга данных