Оглавление:

Супер простая домашняя автоматизация Raspberry Pi 433 МГц: 7 шагов
Супер простая домашняя автоматизация Raspberry Pi 433 МГц: 7 шагов

Видео: Супер простая домашняя автоматизация Raspberry Pi 433 МГц: 7 шагов

Видео: Супер простая домашняя автоматизация Raspberry Pi 433 МГц: 7 шагов
Видео: Алиса от Яндекс - Настройка Управления по MQTT 2024, Ноябрь
Anonim
Супер простая домашняя автоматизация Raspberry Pi 433 МГц
Супер простая домашняя автоматизация Raspberry Pi 433 МГц

Это руководство является одним из многих, когда речь идет об использовании Raspberry Pi для управления беспроводными устройствами в доме. Как и многие другие, он покажет вам, как использовать дешевую пару передатчик / приемник, подключенную к вашему Pi, для взаимодействия с устройствами, работающими в широко используемом радиочастотном диапазоне 433 МГц. Он специально покажет вам, как включить или выключить любое электрическое устройство с помощью вашего Pi, передав команды на набор дистанционно управляемых розеток 433 МГц.

Зачем я создал этот учебник, если их так много? В основном потому, что почти все другие учебники, с которыми я сталкивался, казались слишком сложными, особенно со стороны программного обеспечения. Я заметил, что они в значительной степени полагались на сторонние библиотеки, скрипты или фрагменты кода для выполнения всей работы. Многие даже не объяснили бы, что делает базовый код - они просто просили бы вас засунуть две или три части программного обеспечения на ваш Pi и выполнить кучу команд, не задавая вопросов. Я действительно хотел попробовать использовать свой Pi для включения и выключения электрических устройств в моем доме с помощью набора розеток с дистанционным управлением 433 МГц, но я хотел создать свою собственную версию системы, которую я мог бы понять, надеясь устранить необходимость использовать чужие библиотеки или скрипты.

Это то, о чем этот урок. Программная часть этой системы состоит из двух очень простых скриптов Python: один для приема и записи сигналов, а другой - для передачи этих сигналов обратно в розетки беспроводной сети. Фактический прием / передача сигнала зависит только от простой в использовании библиотеки RPi. GPIO, которая, по крайней мере, для меня, была предустановлена с Raspbian. Эту библиотеку также можно импортировать непосредственно в Python.

Для этого проекта вам понадобятся:

Raspberry Pi. Подойдет любая модель, я использовал стартовый комплект «все в одном», но, возможно, вам понадобится только центральный блок

Пара передатчик / приемник 433 МГц. Похоже, что в проектах этого типа чаще всего используются следующие. Покупка комплекта из пяти штук, как и связанная, гарантирует, что у вас будет несколько запасных частей

Комплект розеток с дистанционным управлением 433 МГц. Я использовал их, которые очень рекомендую, но доступно бесчисленное множество моделей. Только убедитесь, что они работают на этой частоте

Некоторые схемотехнические аксессуары. Я бы рекомендовал использовать макетную плату и несколько соединительных кабелей, чтобы максимально упростить процесс построения схемы.

[Если вы решите купить какой-либо из этих продуктов, я был бы очень признателен, если бы вы получили доступ к спискам, используя приведенные выше ссылки - таким образом, я получаю крошечную долю прибыли без каких-либо дополнительных затрат для вас!]

Шаг 1. Установка приемника

Настройка приемника
Настройка приемника

Прежде чем вы сможете использовать свой Pi для отправки команд на удаленно управляемые сокеты, вам необходимо знать, на какие конкретные сигналы они реагируют. Большинство розеток с дистанционным управлением поставляются с трубкой, которую можно использовать для включения или выключения определенных устройств. В случае с теми, которые я купил, телефон имеет четыре ряда парных кнопок ВКЛ / ВЫКЛ, каждая из которых отправляет сигнал ВКЛ или ВЫКЛ на определенный блок розеток.

Возникает вопрос - как узнать, какие кнопки соответствуют какому разъему? На самом деле это зависит от вашей модели. Одна из основных причин, по которой я выбрал свой особый стиль розетки (ссылка во введении), заключается в том, что устройства можно настроить с помощью физического переключателя, чтобы конкретная розетка реагировала на определенный набор кнопок ВКЛ / ВЫКЛ на трубке. Это также означает, что вы можете отключать и перемещать розетки по дому, зная, что каждое устройство всегда будет реагировать на одни и те же сигналы ВКЛ / ВЫКЛ.

После того, как вы выяснили, как ваши розетки взаимодействуют с телефоном, вам нужно будет использовать приемник 433 МГц (на фото выше), чтобы «нюхать» коды, отправляемые телефоном. После того, как вы записали формы сигналов этих кодов, вы можете воспроизвести их с помощью Python и отправить их с помощью передатчика.

Первое, что нужно сделать здесь, это подключить контакты приемника к правильным контактам GPIO на Pi. На блоке приемника четыре пина, но нужны только три. Я думаю, что оба центральных контакта дают один и тот же выход, поэтому вам нужно подключиться только к одному из них (если вы не хотите передавать полученные сигналы на два отдельных контакта GPIO).

На изображении выше в общих чертах представлена схема подключения. Каждый вывод на приемнике можно подключить напрямую к соответствующему выводу на Pi. Я использую макетную плату и соединительные кабели, чтобы сделать процесс более элегантным. Обратите внимание, что вы можете выбрать любой вывод данных GPIO для подключения к любому из выводов центрального приемника. Я использовал штифт, помеченный как «23» на моем заголовке Pi.

ВАЖНО: если вы подключите контакт, помеченный как «3v3» на приведенном выше изображении, к контакту с более высоким напряжением на Pi (например, 5v), вы, вероятно, повредите Pi, поскольку контакты GPIO не могут выдерживать напряжения выше 3v3. В качестве альтернативы вы можете запитать его 5 В и настроить делитель напряжения для подачи безопасного напряжения на вывод DATA.

Радиус действия приемника при таком напряжении не будет очень большим, особенно если антенна не подключена. Однако вам не нужен большой радиус действия - пока приемник может принимать сигналы от трубки, когда они находятся рядом друг с другом, это все, что нам нужно.

Шаг 2: прослушивание кодов трубки

Обнюхивание кодов трубки
Обнюхивание кодов трубки

Теперь, когда ваш приемник подключен к Pi, вы можете начать первый захватывающий этап этого проекта - нюхать. Это включает использование прикрепленного скрипта Python для записи сигнала, передаваемого телефоном при нажатии каждой кнопки. Сценарий очень прост, и я настоятельно рекомендую вам взглянуть на него, прежде чем запускать его - в конце концов, смысл этого проекта в том, что вы не будете просто слепо запускать чужой код!

Перед тем как начать этот процесс, вам необходимо убедиться, что у вас есть библиотеки Python, необходимые для запуска скрипта сниффера. Они перечислены в верхней части скрипта:

from datetime import datetime

импортировать matplotlib.pyplot как pyplot импортировать RPi. GPIO как GPIO

Библиотеки RPi. GPIO и datetime были включены в мой дистрибутив Raspbian, но мне пришлось установить библиотеку matplotlib следующим образом:

sudo apt-get install python-matplotlib

Эта библиотека является широко используемой библиотекой построения графиков, которая очень полезна даже за пределами этого проекта, поэтому ее установка определенно не повредит! Как только ваши библиотеки будут обновлены, вы готовы начать запись данных. Вот как работает скрипт:

Когда он запускается (с помощью команды python ReceiveRF.py), он настраивает определенный вывод GPIO как ввод данных (вывод 23 по умолчанию). Затем он будет непрерывно производить выборку пина и регистрировать, получает ли он цифру 1 или 0. Это продолжается в течение установленного времени (по умолчанию 5 секунд). По достижении этого временного лимита скрипт прекратит запись данных и закроет вход GPIO. Затем он выполняет небольшую постобработку и отображает полученное входное значение в зависимости от времени. Опять же, если у вас есть вопросы о том, что делает сценарий, вы, вероятно, сможете сами ответить на них, посмотрев, как он работает. Я постарался сделать код максимально читаемым и простым.

Что вам нужно сделать, так это следить за тем, когда сценарий указывает, что он ** начал запись **. Когда появится это сообщение, вы должны нажать и удерживать одну из кнопок на трубке около секунды. Обязательно держите его близко к приемнику. После того, как скрипт завершит запись, он будет использовать matplotlib для построения графической формы волны сигнала, который он получил в течение интервала записи. Обратите внимание: если вы подключены к своему Pi с помощью клиента SSH, такого как PuTTY, вам также потребуется открыть приложение X11, чтобы разрешить отображение формы волны. Я использую xMing для этого (и для других вещей, таких как удаленное подключение к моему Pi). Чтобы график отображался, просто запустите xMing перед запуском скрипта и дождитесь появления результатов.

Как только появится окно matplotlib, интересующая вас область на графике должна стать довольно очевидной. Вы можете использовать элементы управления в нижней части окна, чтобы увеличивать масштаб до тех пор, пока вы не сможете выбрать максимумы и минимумы сигнала, передаваемого трубкой, пока кнопка удерживалась нажатой. См. Изображение выше для примера полного кода. Сигнал, вероятно, будет состоять из очень коротких импульсов, разделенных одинаковыми периодами времени, когда сигнал не принимается. За этим блоком коротких импульсов, вероятно, последует более длительный период, когда ничего не получено, после чего образец повторится. После того, как вы определили шаблон, принадлежащий одному экземпляру кода, сделайте снимок экрана, подобный тому, что находится в верхней части этой страницы, и перейдите к следующему шагу для его интерпретации.

Шаг 3: Расшифровка результирующего сигнала

Расшифровка результирующего сигнала
Расшифровка результирующего сигнала

Теперь, когда вы определили блок периодических максимумов и минимумов, соответствующий сигналу определенной кнопки, вам понадобится способ его сохранения и интерпретации. В приведенном выше примере сигнала вы заметите, что есть только два уникальных шаблона, которые составляют весь блок сигнала. Иногда вы видите короткий максимум, за которым следует длинный минимум, а иногда наоборот - длинный максимум, за которым следует короткий минимум. Когда я записывал свои сигналы, я решил использовать следующее соглашение об именах:

1 = short_on + long_off0 = long_on + short_off

Посмотрите еще раз на помеченную форму волны, и вы поймете, что я имею в виду. После того, как вы определили эквивалентные шаблоны в своем сигнале, все, что вам нужно сделать, это сосчитать единицы и нули, чтобы построить последовательность. При расшифровке вышеуказанный сигнал можно записать следующим образом:

1111111111111010101011101

Теперь вам просто нужно повторить этот процесс, чтобы записать и расшифровать сигналы, соответствующие другим кнопкам на вашем телефоне, и вы завершили первую часть процесса!

Прежде чем вы сможете повторно послать сигналы с помощью передатчика, нужно проделать еще немного работы. Время между максимумами и минимумами, соответствующими 1 или 0, очень важно, и вам нужно убедиться, что вы знаете, как долго на самом деле длится 'short_on' или 'long_off'. Для моих кодов было три части временной информации, которую мне нужно было извлечь, чтобы воспроизвести сигналы:

  • Продолжительность «короткого» интервала, то есть начала 1 или конца 0.
  • Длительность «длинного» интервала, то есть конца 1 или начала 0.
  • Продолжительность «расширенного» интервала. Я заметил, что когда я удерживал кнопку на телефоне, между каждым повторением блока сигнала был период «extended_off». Эта задержка используется для синхронизации и имеет фиксированную продолжительность.

Чтобы определить эти временные значения, вы можете использовать функцию масштабирования в окне matplotlib, чтобы полностью увеличить масштаб и навести курсор на соответствующие части сигнала. Индикация местоположения курсора в нижней части окна должна позволить вам определить ширину каждой части сигнала, которая соответствует длинному, короткому или расширенному интервалу. Обратите внимание, что ось x графика представляет время, а компонент x показаний курсора выражается в секундах. Для меня ширина была следующей (в секундах):

  • short_delay = 0,00045
  • long_delay = 0,00090 (вдвое длиннее короткого)
  • extended_delay = 0,0096

Шаг 4: Настройка модуля трансмиттера

Настройка модуля трансмиттера
Настройка модуля трансмиттера

После того, как вы соберете свои коды и временные данные, вы можете отключить приемник, так как он вам больше не понадобится. Затем вы можете подключить передатчик напрямую к соответствующим контактам Pi GPIO, как показано на изображении выше. Я обнаружил, что контакты на модулях передатчика помечены, что упрощает процесс.

В этом случае можно запитать устройство, используя источник питания 5 В от Pi, поскольку вывод DATA не будет посылать сигналы на Pi, а только получать их. Кроме того, источник питания 5 В обеспечит больший диапазон передачи, чем источник питания 3 В 3. Опять же, вы можете подключить вывод DATA к любому соответствующему выводу на Pi. Я использовал пин 23 (такой же, как у приемника).

Еще я рекомендую добавить антенну в небольшое отверстие в правом верхнем углу передатчика. Я использовал кусок прямой проволоки длиной 17 см. Некоторые источники рекомендуют спиральную проволоку аналогичной длины. Я не уверен, что лучше, но прямой провод обеспечивает мне достаточный диапазон, чтобы включать / выключать розетки из любого места в моей маленькой квартире. Лучше всего припаять антенну, но я просто снял с провода часть пластика и намотал медь через отверстие.

После того, как передатчик подключен, это все, что нужно для настройки оборудования! Теперь осталось только установить розетки по всему дому и взглянуть на программу передатчика.

Шаг 5: передача сигналов с помощью Pi

Здесь на помощь приходит второй сценарий Python. Он разработан так, чтобы быть таким же простым, как и первый, если не более того. Опять же, загрузите его и просмотрите код. Вам нужно будет отредактировать сценарий, чтобы передавать правильные сигналы в соответствии с данными, записанными на шаге 3, так что сейчас хорошее время, чтобы быстро взглянуть на него.

Все библиотеки, необходимые для запуска этого сценария, были предустановлены на моем Pi, поэтому дальнейшая установка не требовалась. Они перечислены в верхней части скрипта:

время импорта

import sys import RPi. GPIO as GPIO

Под импортом библиотеки находится информация, которую вам нужно будет отредактировать. Вот как это выглядит по умолчанию (это информация, соответствующая моим сокетам, как определено на шаге 3):

a_on = '1111111111111010101011101'

a_off = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1111111111101010111011101' d_off = '1111111111101010111010111' short_delay = 0,00045 = 0,00090 long_delay extended_delay = 0,0096

Здесь у нас есть восемь строк кодов (по две для каждой пары кнопок включения / выключения на моем телефоне - у вас может быть больше или меньше кодов), за которыми следуют три части информации о времени, также определенной на шаге 3. Найдите время, чтобы убедиться, что у вас есть ввел эту информацию правильно.

Как только вы будете довольны кодами / задержками, которые вы ввели в скрипт (вы можете переименовать переменные строки кода, если хотите), вы почти готовы опробовать систему! Прежде чем вы это сделаете, взгляните на функцию Transmit_code () в скрипте. Здесь происходит фактическое взаимодействие с передатчиком. Эта функция ожидает, что одна из строк кода будет отправлена в качестве аргумента. Затем он открывает определенный вывод как выход GPIO и перебирает каждый символ в строке кода. Затем он включает или выключает передатчик в соответствии с введенной вами временной информацией, чтобы сформировать сигнал, соответствующий строке кода. Он отправляет каждый код несколько раз (по умолчанию 10), чтобы уменьшить вероятность его пропуска, и оставляет расширенный_delay между каждым блоком кода, как и телефон.

Чтобы запустить сценарий, вы можете использовать следующий синтаксис команды:

python TransmitRF.py code_1 code_2…

Вы можете передать несколько строк кода за один запуск скрипта. Например, чтобы включить сокеты (a) и (b) и выключить сокет (c), запустите сценарий со следующей командой:

Python TransmitRF.py a_on b_on c_off

Шаг 6: Примечание о точности времени

Как уже упоминалось, время между передаваемыми импульсами включения / выключения очень важно. Скрипт TransmitRF.py использует функцию python time.sleep () для построения сигналов с правильными интервалами между импульсами, но следует отметить, что эта функция не совсем точна. Продолжительность ожидания сценария перед выполнением следующей операции может зависеть от загрузки процессора в данный момент. Это еще одна причина, по которой TransmitRF.py отправляет каждый код несколько раз - на тот случай, если функция time.sleep () не может правильно построить данный экземпляр кода.

У меня лично никогда не было проблем с time.sleep (), когда дело доходит до отправки кодов. Однако я знаю, что мой time.sleep () имеет тенденцию иметь ошибку около 0,1 мс. Я определил это с помощью прилагаемого скрипта SleepTest.py, который можно использовать для оценки точности вашей функции Pi time.sleep (). Для моих конкретных сокетов с дистанционным управлением самая короткая задержка, которую мне нужно было реализовать, составила 0,45 мс. Как я уже сказал, у меня не было проблем с неотзывчивыми сокетами, поэтому кажется, что 0,45 ± 0,1 мс вполне достаточно.

Существуют и другие методы обеспечения более точной задержки; например, вы можете использовать специальный PIC-чип для генерации кодов, но подобные вещи выходят за рамки этого руководства.

Шаг 7: Заключение

Заключение
Заключение

В этом проекте был представлен метод управления любым электроприбором с помощью Raspberry Pi и набора розеток с дистанционным управлением 433 МГц с упором на простоту и прозрачность. Это самый захватывающий и гибкий проект, для которого я использовал свой Pi, и для него существует безграничное количество приложений. Вот некоторые вещи, которые я теперь могу делать благодаря своему Pi:

  • Включи электрический обогреватель рядом с моей кроватью за полчаса до срабатывания будильника.
  • Выключите обогреватель через час после того, как я засну.
  • Включаю прикроватный свет, когда срабатывает будильник, чтобы я не заснул.
  • и многое другое…

Для большинства этих задач я использую функцию crontab в Linux. Это позволяет вам настроить автоматические запланированные задачи для запуска скрипта TransmitRF.py в определенное время. Вы также можете использовать команду Linux at для выполнения разовых задач (которые, как мне кажется, нужно было устанавливать отдельно с помощью sudo apt-get install at). Например, чтобы включить обогреватель за полчаса до того, как будильник сработает на следующее утро, все, что мне нужно сделать, это ввести:

в 05:30

python TransmitRF.py c_on

Вы также можете использовать этот проект вместе с моей системой домашнего мониторинга Dropbox для управления техникой через Интернет! Спасибо за чтение, и если вы хотите что-то уточнить или поделиться своим мнением, оставьте комментарий!

Рекомендуемые: