Оглавление:

Хаб домашней автоматизации Raspberry Pi-Arduino-SignalR: 11 шагов (с изображениями)
Хаб домашней автоматизации Raspberry Pi-Arduino-SignalR: 11 шагов (с изображениями)

Видео: Хаб домашней автоматизации Raspberry Pi-Arduino-SignalR: 11 шагов (с изображениями)

Видео: Хаб домашней автоматизации Raspberry Pi-Arduino-SignalR: 11 шагов (с изображениями)
Видео: Начало работы с Интернетом вещей на Raspberry Pi 2024, Июль
Anonim
Хаб домашней автоматизации Raspberry Pi-Arduino-SignalR
Хаб домашней автоматизации Raspberry Pi-Arduino-SignalR

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

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

Таким образом, этот центр автоматизации состоит из следующих компонентов:

База данных SQL Server 2012, которая:

  • хранит список заранее определенных инфракрасных (ИК) кодов в таблице вместе с уникальным «кодовым ключом»
  • кодовые ключи интуитивно названы (пользователем), чтобы идентифицировать назначение связанных с ними ИК-кодов

Веб-приложение ASP. NET SignalR Hub в реальном времени, которое:

  • ожидает и получает «кодовые ключи» в виде команд от пользователя, обращающегося к HTML-клиенту.
  • при получении подключается к базе данных SQL и извлекает ИК-код, используя предоставленный кодовый ключ
  • передает полученный ИК-код клиенту Python SignalR

Пользователь, работающий с клиентом панели инструментов HTML SignalR, который:

  • передает уникальный кодовый ключ в Hub через клиентские API-интерфейсы jQuery SignalR
  • каждая кнопка на панели инструментов будет представлять уникальный кодовый ключ, записанный в таблице базы данных SQL.

Приложение фоновой службы Python SignalR, работающее на Raspberry Pi 2.0, которое:

  • получает ИК-коды в виде команд от хаба
  • ищет разделители в IR-коде и разбивает очень длинный код на сегменты
  • обменивается данными через последовательный порт с Arduino и последовательно записывает каждый сегмент

Эскиз ИК-передатчика Arduino, который:

  • ожидает и принимает каждый из сегментов ИК-кода через последовательный порт
  • собирает сегменты кода в буферный массив ИК-кода
  • упаковывает буфер в команду ИК-передачи с использованием библиотеки IRLib Arduino

Если целевое устройство находится в непосредственной близости от ИК-передатчика, то устройство (может) реагировать на ИК-сигнал, передаваемый Arduino.

ПРИМЕЧАНИЕ

Хотя целевое устройство, которое я использую в этой демонстрации, действительно реагирует на ИК-сигналы, вы можете прочитать этот раздел моего другого IBLE по причинам, по которым я говорю, что устройство (может) реагировать на ИК-сигнал.

Время катиться.

Шаг 1. Что вам нужно, прежде чем то, что вам нужно

Что вам нужно, прежде чем то, что вам нужно
Что вам нужно, прежде чем то, что вам нужно
Что вам нужно, прежде чем то, что вам нужно
Что вам нужно, прежде чем то, что вам нужно
Что вам нужно, прежде чем то, что вам нужно
Что вам нужно, прежде чем то, что вам нужно

Это руководство берет начало с некоторой ранее проделанной работы, которая также привела к моему последнему IBLE.

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

  1. Создана инфракрасная библиотека Arduino IRLib.
  2. Как ИК-коды, используемые в этом IBLE, были захвачены с помощью ИК-приемника
  3. Как захваченные ИК-коды использовались для управления целевым устройством через ИК-передатчик

После завершения этого IBLE я развернул веб-приложение ASP. NET IR Code Recorder, которое:

  • Примите захваченный ИК-код вместе с интуитивно понятным кодовым ключом в качестве входных данных через веб-форму.
  • Разбейте ИК-код самой длины на сегменты длиной менее 64 символов, чтобы они не превышали лимит последовательного буфера Arduino Uno.
  • Последний сегмент кода будет предварительно зафиксирован буквой "E", которая указывает Arduino, что он получил последний сегмент кода.
  • Каждый сегмент будет разделен вертикальной чертой, прежде чем будет собран обратно в длинную строку.
  • Наконец, сегментированный IR-код вместе с его кодовым ключом был сохранен в базе данных SQL Server 2012.

Именно эта база данных SQL составляет один из компонентов Home Automation Hub, описанных в этом IBLE.

ПРИМЕЧАНИЕ

Веб-приложение IR Code Recorder не является частью обсуждения здесь по следующим причинам:

  • Вы можете вручную записывать коды с помощью Arduino Sketch, разбивать их на разделы, разделенные вертикальной чертой, и сохранять их в базе данных без необходимости создания сложного веб-приложения.
  • В отличие от этого IBLE, IR Recorder фокусируется на обратной связи от Arduino к Raspberry Pi.

Поэтому подробности этого проекта станут темой для другого IBLE.

Шаг 2. Что вам нужно - оборудование

Что вам нужно - оборудование
Что вам нужно - оборудование
Что вам нужно - оборудование
Что вам нужно - оборудование

Функционирующий Raspberry Pi 2.0 - я рекомендую установить Ubuntu Mate, поскольку он имеет более богатый набор функций, включая OpenLibre Office, который, кстати, был незаменим при документировании этого руководства прямо здесь, на Raspberry Pi.

Кроме того, для Pi вам понадобятся следующие внешние элементы:

  • Платформа прототипирования Arduino Uno или ее клон
  • Светодиод ИК-передатчика - я использовал бренд под названием Three Legs от Amazon.com.
  • Резисторы 330 или 220 Ом - я использовал 220 (цветовой код красный-красный-коричневый), потому что у меня было несколько под рукой
  • Обычная макетная плата, разъемы и ПК с установленной Arduino Environment.
  • Тестовый кандидат - такой как вездесущий светодиодный монитор Samsung с дистанционным управлением.

Шаг 3. Что вам нужно - программное обеспечение

Чтобы собрать все части вместе, необходимо установить и запустить следующее программное обеспечение:

На Raspberry Pi вам нужно будет установить следующее:

  • IDE Arduino - используется для создания Sketch и прошивки в UNO.
  • Модуль Python для Arduino - для последовательной связи между UNO и Pi
  • Клиентская библиотека Python SignalR - вы можете обратиться к прилагаемым здесь инструкциям.

Компьютер под управлением Windows со следующей установленной средой разработки:

  • Бесплатная версия Microsoft Visual Studio Express 2013 для создания SignalR Hub и веб-клиентского приложения.
  • Бесплатная версия SQL Server 2012 Express для проектирования и создания серверной базы данных

Среда размещения Windows Internet Information Server (IIS):

  • После создания и тестирования концентратора SignalR и веб-клиента их необходимо развернуть на локальном сервере IIS.
  • В моем случае я планирую использовать старый ноутбук под управлением Windows 7 с IIS в своей домашней сети.

ПРИМЕЧАНИЕ

Все инструкции применимы к версии Python 2.7.x. Версия 3.0 может потребовать перезаписи

Шаг 4: База данных SQL Server

База данных SQL Server
База данных SQL Server

Прилагаемая схема показывает структуру базовой базы данных SQL Server, используемой в этом приложении, и содержит всего две таблицы.

Таблица AutoHubCode

В этой таблице есть два важных столбца:

AutoCodeKey - хранит понятное имя ключа кода

Каждый из кодовых ключей передается клиентом автоматизации - в нашем случае это кнопка HTML с веб-страницы

AutoCodeVal - сохраняет исходную последовательность ИК-кода.

Это фактический ИК-код, который возвращается клиенту в ответ от концентратора SignalR

В этом случае клиент Python, который постоянно обменивается данными с концентратором, получает последовательность кода IR и передает ее через последовательный порт в Arduino UNO.

Таблица AutoHubLog

  • Регистрирует код, запрошенный клиентом автоматизации.
  • Это мера для отслеживания того, кто и когда использовал систему и какой код был запрошен.

Как уже упоминалось, я использовал SQL Server 2012 в качестве предпочтительной платформы баз данных. Вы можете воссоздать этот простой дизайн на другой платформе базы данных, такой как MySQL, Oracle и т. Д.

Тем не менее, здесь был прикреплен сценарий SQL для создания этой базы данных

ПРИМЕЧАНИЕ

  1. Код для SignalR Hub предназначен для подключения к базе данных SQL Server 2012.
  2. Работа с другой базой данных будет означать изменение концентратора для использования другого драйвера базы данных.

Шаг 5. Веб-приложение ASP. NET SignalR Hub

Веб-приложение ASP. NET SignalR Hub
Веб-приложение ASP. NET SignalR Hub
Веб-приложение ASP. NET SignalR Hub
Веб-приложение ASP. NET SignalR Hub

Веб-приложение ASP. NET SignalR Hub совместно состоит из следующих компонентов, как показано на прилагаемой схеме:

Раздел 1. Центр SignalR, который получает запросы от клиента и отвечает на него.

Разделы 2, 4 - Веб-страница клиента HTML и ее таблица стилей, которые в совокупности образуют интерфейсную часть системы автоматизации и выдают команды в центр автоматизации.

Раздел 3. API-интерфейсы jQuery SignalR, используемые клиентом HTML для связи с центром автоматизации.

Раздел 5. SignalR Hub не взаимодействует напрямую с базой данных. Это делается через промежуточные классы, созданные с помощью Entity Framework.

Эти классы абстрагируют детали базы данных от внешнего приложения.

Раздел 6. Класс службы базы данных, который помогает выполнять операции чтения-записи в базе данных SQL (описанные ранее) с помощью классов Entity Framework.

ASP. NET и SignalR - это технологии Microsoft, и в этом руководстве вы узнаете, как создать и развернуть простое приложение SignalR.

То, что я построил здесь, основано на основах, полученных из этого урока. При развертывании приложение должно выглядеть как веб-страница, показанная на втором рисунке.

ПРИМЕЧАНИЕ ПО КОДУ

ZIP-файл, содержащий урезанную версию кода, был прикреплен

Структура папок показана на рисунке, однако все классы фреймворка и скрипты jQuery были удалены, чтобы уменьшить размер вложения.

Рекомендуется использовать этот код в качестве руководства, потому что, когда вы создаете новое веб-приложение SignalR, следуя приведенной выше ссылке на руководство, последние библиотеки jQuery и классы платформы ASP. NET будут добавлены автоматически.

Кроме того, необходимо будет изменить ссылки на сценарии jQuery на странице index.html, чтобы отразить последнюю версию клиентских библиотек jQuery SignalR, которые будут автоматически добавлены при создании веб-приложения.

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

Шаг 6. Клиент службы Python SignalR

Клиент службы Python SignalR
Клиент службы Python SignalR

В то время как HTML-клиент SignalR является фронтальным пользовательским интерфейсом, клиент Python - это приложение серверной службы, основная функция которого заключается в получении ИК-кода, передаваемого концентратором, и его маршрутизации в Arduino UNO по последовательной связи.

Прилагаемый код не требует пояснений и достаточно документирован, чтобы описать его функциональность

Как показано на составном снимке экрана, клиент HTML и клиент службы Python обмениваются данными через концентратор SignalR следующим образом:

  1. Пользователь системы автоматизации выдает команду хабу нажатием кнопки.
  2. Каждая кнопка связана с кодом ИК-ключа, и при нажатии этот код передается на концентратор.
  3. Концентратор получает этот код, подключается к базе данных, извлекает необработанный код ИК-сигнала и передает его обратно всем подключенным клиентам.

    В то же время Hub регистрирует запись в таблице базы данных AutoHubLog, записывая код, дату и время, когда он был запрошен удаленными клиентами

  4. Клиент службы Python получает IR-код и передает его Arduino UNO для дальнейшей обработки.

Шаг 7: Эскиз и код ИК-передачи Arduino UNO

Эскиз и код ИК-передачи Arduino UNO
Эскиз и код ИК-передачи Arduino UNO
Эскиз и код ИК-передачи Arduino UNO
Эскиз и код ИК-передачи Arduino UNO
Эскиз и код ИК-передачи Arduino UNO
Эскиз и код ИК-передачи Arduino UNO

Схема Arduino, показанная на изображениях, довольно проста для этой системы и поэтому кратко описана:

  • Бесцветный ИК-светодиод должен быть подключен к цифровому контакту 3 на UNO - это требование библиотеки IRLib Arduino.
  • Причины описаны в моем предыдущем IBLE о клонировании пульта дистанционного управления в разделе, относящемся к библиотеке IRLib.
  • Зеленый светодиод, подключенный к цифровому PIN-коду 4, представляет собой визуальный индикатор, который загорается, когда UNO получает все разделы ИК-кода от клиента Python, работающего на Raspberry Pi.
  • Загорание этого светодиода подтвердит, что последовательное соединение между Raspberry Pi и UNO работает.
  • Чтобы включить последовательную связь, UNO подключается к Raspberry Pi через порт USB.
  • Прилагаемый эскиз Arduino достаточно прокомментирован, чтобы описать его функцию.
  • Комментарии в верхней части кода также описывают, как схема должна быть подключена.

ПРИМЕЧАНИЕ

На практике Arduino и Pi могут быть совместно подключены к USB-концентратору с питанием, достаточно сильному, чтобы управлять Pi, Arduino, а также передавать сильный сигнал через ИК-светодиод.

Шаг 8: Подключение и тестирование системы

Подключение и тестирование системы
Подключение и тестирование системы
Подключение и тестирование системы
Подключение и тестирование системы
Подключение и тестирование системы
Подключение и тестирование системы
  1. Создайте и разверните ASP. NET SignalR Hub, клиент HTML вместе с базой данных SQL Server 2012 на информационном сервере Интернета (IIS) в вашей локальной домашней сети.
  2. Получите доступ к веб-приложению, открыв клиент HTML SignalR через

    URL-адрес этой страницы обычно выглядит следующим образом: https:// yourComputer: port_number /

  3. Нажмите кнопку на панели управления, и, если приложение было развернуто правильно, концентратор ответит, вернув ИК-код и отобразив его на серой панели рядом с панелью управления.

    Помнить! Вам нужно будет загрузить коды в свою базу данных, настроив библиотеку ИК-приемника и захватив коды, как описано в моем предыдущем IBLE

  4. Подключите Arduino к Raspberry Pi через USB - откройте Arduino IDE на Pi и убедитесь, что UNO может установить соединение с Pi.

    эти учебные статьи по Arduino должны помочь вам довольно быстро разобраться в этом

  5. Откройте код Python и внесите следующие изменения, применимые к вашей среде.

    • адрес последовательного порта вашего UNO, полученный на шаге 4
    • URL-адрес концентратора SignalR, соответствующий вашему локальному URL-адресу из шага 2 - в этом примере это будет https:// yourComputer: port_number / signalr
  6. Наконец, откройте Arduino Sketch в Arduino IDE на Raspberry Pi и прошейте его в UNO.
  7. Расположите макетную плату, удерживающую схему, в непосредственной близости от управляемого устройства - ИК-светодиод должен находиться на прямой линии обзора с портом ИК-приемника устройства.
  8. Запустите программу Python на Raspberry Pi, нажав кнопку F5 на панели инструментов Python IDLE.
  9. Вернитесь на панель управления клиентской программы HTML (шаг 2) и нажмите кнопку (например, «Включение» или «Увеличение громкости»).

Если система была настроена правильно, вы сможете открыть страницу клиента HTML на своем телефоне или планшете и управлять устройством с помощью кнопок на странице клиента HTML.

Шаг 9: система в действии

Система в действии
Система в действии
Система в действии
Система в действии
Система в действии
Система в действии
Система в действии
Система в действии

На изображениях выше показана система домашней автоматизации в действии после ее настройки.

После публикации этого IBLE я расширил интерфейс, записав несколько ИК-кодов со своего LED-телевизора VIZIO.

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

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

  1. Команда выключения питания - телевизор выключается
  2. Команда включения питания - телевизор включается, и при включении экрана появляется логотип "V".
  3. Команда Mute ON - появляется горизонтальная полоса, когда динамик отключен.

Во всех тестах серая область рядом с приборной панелью на экране планшета отображает команду, выданную клиентом, и ответ, отправленный удаленным центром SignalR.

Шаг 10: Улучшение системы автоматизации и связанные с ней исправления

Эту систему можно расширить, добавив больше кодов, захваченных из разных систем. Хотя эта часть проста, вам нужно принять во внимание еще два фактора.

Улучшение 1 (быстрое): работа с ИК-сигналами разной длины

  1. ИК-коды разных систем имеют разную длину, даже для двух продуктов одного производителя.

    Например, в этом случае длина массива ИК-кода для светодиодного телевизора составляет 67, а для саундбара Samsung - около 87

  2. Это означает, что если я сначала включу звуковую панель, массив ИК-буфера в эскизе Arduino будет заполнен последовательностью ИК-кодов, содержащей 87 кодов.
  3. После этого, если бы я включил светодиодный телевизор, он заполнил бы массив ИК-буфера всего 67 кодами, но оставшиеся 20 кодов от предыдущей операции все еще были бы рядом.

Результат? Светодиодный телевизор не включается, потому что буфер ИК-кода был поврежден дополнительными 20 кодами, которые не были удалены после предыдущей операции!

Исправление 1 (выход простой, не рекомендуется)

Измените эскиз Arduino следующим образом:

Измените следующие вызовы функций в функции loop () {}

transferIRCode ();

передатьIRCode (c);

Внесите изменения в подпись вышеуказанной функции:

void transferIRCode (int codeLen) {// Константа RAWBUF заменена на codeLen IRTransmitter. IRSendRaw:: send (IRCodeBuffer, codeLen, 38); }

Хотя это легко, массив никогда не очищается полностью, и поэтому это не очень чистое решение.

Исправление 2 (не сложно, рекомендуется)

Объявите дополнительную переменную в самом верху Arduino Sketch, после раздела комментариев:

беззнаковое int EMPTY_INT_VALUE;

Добавьте это в начало функции setup ():

// Захватить естественное состояние пустой целочисленной переменной без знакаEMPTY_INT_VALUE = IRCodeBuffer [0];

Прокрутите вниз и добавьте новую функцию к скетчу сразу после функции transferIRCode ():

void clearIRCodeBuffer (int codeLen) {// Удаляем все коды из массива // ПРИМЕЧАНИЕ: установка элементов массива в 0 не является решением! for (int i = 1; i <= codeLen; i ++) {IRCodeBuffer [i-1] = EMPTY_INT_VALUE;}}

Наконец, вызовите новую функцию, указанную выше, в следующем месте функции loop ():

// Сброс - возобновление чтения последовательного портаclearIRCodeBuffer (c);…

Это более чистый подход, поскольку он фактически сбрасывает все места в массиве ИК-буфера, которые были заполнены самым последним сигналом ИК-кода, не оставляя ничего на волю случая.

Усовершенствование 2 (более активное): повторяющаяся передача ИК-сигнала для определенных устройств

Некоторым устройствам требуется, чтобы один и тот же сигнал передавался несколько раз, чтобы ответить. Пример: в этом случае звуковая панель Samsung требует, чтобы один и тот же код отправлялся дважды с интервалом в 1 секунду

Исправление в концепции обсуждалось здесь, поскольку оно требует более сложных действий и требует тестирования

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

Вместо этого добавление этого исправления в клиент HTML SignalR и приложение Python SignalR Service делает решение намного более гибким. А этого в принципе можно добиться следующим образом:

Измените HTML-клиент SignalR для передачи повторяющейся информации в концентратор

Откройте index.html и вставьте значение повтора в кнопку HTML следующим образом:

value = "SMSNG-SB-PWR-ON" станет value = "SMSNG-SB-PWR-ON_2_1000"

Где 2 - значение повторения, а 1000 - значение задержки в миллисекундах между двумя сигналами повторения.

Когда вы нажмете эту кнопку, концентратор SignalR получит Key Code + Repeat_Spec.

Измените методы на стороне сервера SignalR, чтобы анализировать только ключевой код:

  • Используйте ключевой код, чтобы получить ИК-код из базы данных, как обычно.
  • Передайте Key Code + Repeat_Spec и IRCode клиентам SingalR как обычно

Измените приложение службы Python SignalR для передачи сигналов с использованием значений Repeat:

Откройте клиент Python и измените следующие две функции:

def print_command_from_hub (buttonId, cmdSrc):

# анализируем повторяющийся код из значения buttonId

def TransmitToArduino (IRSignalCode, delim, endPrefix):

# настроить цикл while или for для передачи сигнала на желаемой частоте

  • Таким образом, Arduino не нужно повторно прошивать.
  • В эту систему можно встроить любое количество повторяющихся частот.
  • Кроме того, если вы используете UNO, размер вашего Sketch ограничен!

Шаг 11. Известные проблемы и проблемы с безопасностью

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

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

  • Перезапуск клиента Python SignalR возвращает систему к нормальной работе.
  • Непосредственным решением может быть удаление нежелательных выходных данных отладки как в Python SignalR Client, так и в Arduino Sketch, и повторение этих тестов.
  • Еще одно место для изучения - это сама последовательная связь - можно ли добавить код для быстрой очистки буфера?

Тем не менее, я заметил, что мой телевизор плохо реагирует на свой заводской пульт, поэтому сама природа ИК-связи моего телевизора также может быть фактором.

Проблема 2: экран HTML перестает реагировать на нажатия кнопок после длительного периода бездействия

Обычно это поведение решается при обновлении страницы, однако причина такого поведения до сих пор неясна

ПРОБЛЕМЫ БЕЗОПАСНОСТИ

Эта система была разработана только для использования в локальной (домашней) сети и не имеет необходимых мер безопасности для использования через Интернет

Поэтому рекомендуется развернуть концентратор SignalR Hub на локальном компьютере в вашей локальной / домашней сети

Спасибо, что прочитали мой IBLE, и я надеюсь, что вам понравится!

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