Съдържание:

Raspberry Pi-Arduino-SignalR център за домашна автоматизация: 11 стъпки (със снимки)
Raspberry Pi-Arduino-SignalR център за домашна автоматизация: 11 стъпки (със снимки)

Видео: Raspberry Pi-Arduino-SignalR център за домашна автоматизация: 11 стъпки (със снимки)

Видео: Raspberry Pi-Arduino-SignalR център за домашна автоматизация: 11 стъпки (със снимки)
Видео: Выставка документации .NET: домашняя автоматизация с помощью Azure Percept 2024, Юли
Anonim
Центърът за домашна автоматизация на Raspberry Pi-Arduino-SignalR
Центърът за домашна автоматизация на Raspberry Pi-Arduino-SignalR

След няколко мои прелюдии IBLE, публикувани тук и тук, този проект прави първата стъпка към изграждането на основна версия на функционален център за домашна автоматизация.

Използвах няколко различни технологии в опит да осмисля как мога да използвам всички неща, които съм научил в миналото, и новите неща, които продължавам да уча с напредването на дните.

Следователно този център за автоматизация се състои от следните компоненти:

База данни на SQL Server 2012, която:

  • съхранява списък с предварително определени инфрачервени (IR) кодове в таблица заедно с уникален "код ключ"
  • кодовите ключове са интуитивно наименувани (от потребителя), така че да идентифицират целта на свързаните с тях IR кодове

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

  • очаква и получава „кодови ключове“като команди от потребител, изправен пред HTML клиент
  • при получаване се свързва с базата данни на SQL и извлича IR код с помощта на предоставения код код
  • предава извлечения IR код на клиент на Python SignalR

Потребител, изправен пред HTML SignalR Dashboard клиент, който:

  • комуникира уникален код код на концентратора чрез jQuery SignalR Client API
  • всеки бутон на таблото за управление ще представлява уникален код код, записан в таблицата на базата данни на SQL

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

  • получава IR кодове като команди от концентратора
  • търси разделители в IR кода и разбива много дългия код на сегменти
  • комуникира през сериен порт с Arduino и изписва всеки сегмент последователно

Скица на IR предавател Arduino, която:

  • изчаква и получава всеки от сегментите на IR кода през серийния порт
  • сглобява кодовите сегменти в буферен масив от IR код
  • пакетира буфера в команда за IR предаване, използвайки библиотеката IRLib Arduino

Ако целевият уред е в близост до инфрачервения предавател, уредът (може) да реагира на инфрачервения сигнал, предаван от Arduino

ЗАБЕЛЕЖКА

Въпреки че целевият уред, който използвам в тази демонстрация, реагира на IR сигнали, може да искате да прочетете този раздел на другия ми IBLE по причини, поради които казвам, че уредът (може) да реагира на IR сигнала.

Време е да се търкаля.

Стъпка 1: Какво ви трябва, преди какво ви трябва

Това, от което се нуждаете, преди това, от което се нуждаете
Това, от което се нуждаете, преди това, от което се нуждаете
Това, от което се нуждаете, преди това, от което се нуждаете
Това, от което се нуждаете, преди това, от което се нуждаете
Това, от което се нуждаете, преди това, от което се нуждаете
Това, от което се нуждаете, преди това, от което се нуждаете

Тази инструкция излита с част от работата, извършена по -рано, която също доведе до последния ми IBLE.

Така че, преди да пристъпим към това, от което се нуждаем за този IBLE, се препоръчва да прочетете тази инструкция за някаква информация за това как:

  1. Инфрачервената библиотека Arduino IRLib е създадена
  2. Как IR кодовете, използвани в този IBLE, са заснети с помощта на IR приемник
  3. Как заснетите IR кодове са използвани за управление на целевия уред чрез IR предавател

След завършването на този IBLE разгърнах уеб приложение на ASP. NET IR Code Recorder, което би:

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

Тази SQL база данни формира един от компонентите на центъра за домашна автоматизация, разработен в този 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 или клон
  • Инфрачервен предавател LED - Използвах марка, наречена Three Legs от Amazon.com
  • 330 или 220 ома резистори-използвах 220 (цветен код червено-червено-кафяво), защото имах няколко удобни
  • Обичайната дъска за хляб, конектори и компютър с инсталирана среда Arduino
  • Кандидат за тест - като вездесъщия Samsung LED монитор с дистанционно

Стъпка 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 Hub и уеб клиентът бъдат изградени и тествани, той ще трябва да бъде разгърнат на локален IIS сървър
  • В моя случай планирам да използвам стар лаптоп с Windows 7 с IIS в домашната си мрежа

ЗАБЕЛЕЖКА

Всички инструкции са приложими за версията на Python 2.7.x. Версия 3.0 може да изисква пренаписване

Стъпка 4: Базата данни на SQL Server

Базата данни на SQL Server
Базата данни на SQL Server

Приложената схема показва структурата на основна база данни на SQL Server, използвана в това приложение, и съдържа само две таблици.

Таблица AutoHubCode

Двете важни колони в тази таблица са:

AutoCodeKey - съхранява удобното за потребителя име на кодовия ключ

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

AutoCodeVal - съхранява необработената последователност на IR код

Това е действителният IR код, който се предава обратно на клиента в отговор от SignalR Hub

В този случай клиент на Python при постоянна комуникация с концентратора получава последователността на IR кода и я предава през сериен порт към Arduino UNO

Таблица AutoHubLog

  • Регистрира кода, поискан от клиента за автоматизация.
  • Това е мярка за проследяване кой и кога е използвал системата и какъв код е поискан

Както бе споменато, използвах SQL Server 2012 като моя платформа за бази данни по избор. Можете да пресъздадете този прост дизайн на различна платформа за бази данни, като MySQL, Oracle и др.

Независимо от това, SQL скриптът за създаване на тази база данни е прикачен тук

ЗАБЕЛЕЖКА

  1. Кодът за концентратора SignalR е предназначен за свързване към база данни на 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 клиента за комуникация с Automation Hub

Раздел 5 - концентратор SignalR не комуникира директно с базата данни. Това става чрез междинни класове, генерирани с помощта на 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 Client е лицев потребителски интерфейс, Python Client е приложение за обслужване отзад, чиято основна функция е да получава IR кода, предаван от концентратора и да го насочва към Arduino UNO по серийна комуникация.

Приложеният код е обясним сам по себе си и е достатъчно документиран, за да опише неговата функционалност

Както е показано на композитната снимка на екрана, HTML клиентът и клиентът на услугата Python комуникират чрез SignalR Hub, както следва:

  1. Потребителят на системата за автоматизация издава команда на концентратора чрез натискане на бутон
  2. Всеки бутон е свързан с кода на IR ключа и при натискане този код се предава на концентратора
  3. Хъбът получава този код, свързва се с базата данни и извлича необработения код за IR сигнал и го предава обратно на всички свързани клиенти

    В същото време концентраторът регистрира запис в таблицата на базата данни на AutoHubLog, записвайки кода и датата и часа, когато е бил поискан от отдалечени клиенти

  4. Клиентът на услугата Python получава IR кода и го предава на Arduino UNO за по -нататъшна обработка

Стъпка 7: Скица и код за IR предаване на Arduino UNO

Скица и код за IR предаване на Arduino UNO
Скица и код за IR предаване на Arduino UNO
Скица и код за IR предаване на Arduino UNO
Скица и код за IR предаване на Arduino UNO
Скица и код за IR предаване на Arduino UNO
Скица и код за IR предаване на Arduino UNO

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

  • Безцветният IR LED трябва да бъде свързан към цифров PIN 3 на UNO - това е изискване на библиотеката IRLib Arduino
  • Причините са описани в по -ранния ми IBLE за клониране на дистанционно в раздела, свързан с библиотеката IRLib
  • Зеленият светодиод, свързан с цифровия PIN 4, е визуален индикатор, който светва, когато UNO получи всички раздели на IR кода от клиента Python, работещ на Raspberry Pi.
  • Светването на този светодиод ще потвърди, че серийната комуникация между Raspberry Pi и UNO работи
  • За да се даде възможност за серийна комуникация, UNO е свързан към Raspberry Pi през USB порта
  • Приложената скица на Arduino е коментирана достатъчно, за да опише нейната функция
  • Коментарите в горната част на кода също описват как веригата трябва да бъде свързана

ЗАБЕЛЕЖКА

На практика Arduino и Pi могат да бъдат свързани заедно към захранван USB хъб, достатъчно силен, за да управлява Pi, Arduino и също така да предава силен сигнал чрез IR LED

Стъпка 8: Свързване и тестване на системата

Свързване и тестване на системата
Свързване и тестване на системата
Свързване и тестване на системата
Свързване и тестване на системата
Свързване и тестване на системата
Свързване и тестване на системата
  1. Изградете и внедрете ASP. NET SignalR Hub, HTML клиента заедно с базата данни на SQL Server 2012 към Интернет информационен сървър (IIS) във вашата локална домашна мрежа
  2. Достъп до уеб приложението, като отворите HTML SignalR клиента по

    URL адресът на тази страница обикновено ще бъде https:// yourComputer: port_number/

  3. Щракнете върху бутон на контролния панел и ако приложението е разгърнато правилно, концентраторът ще отговори, като върне IR кода и ще го покаже в сивия панел в съседство с контролния панел

    Помня! Ще трябва да заредите кодовете във вашата база данни, като настроите библиотеката на IR приемника и заснемете кодовете, както е описано в предишния ми 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. Поставете дъската за хляб, която държи веригата в непосредствена близост до уреда, който трябва да се контролира - инфрачервеният светодиод трябва да има ясна линия на видимост към порта на IR приемника на уреда
  8. Стартирайте програмата Python на Raspberry Pi, като натиснете бутона F5 на лентата с инструменти на Python IDLE
  9. Върнете се в контролния панел на HTML клиентската програма (Стъпка 2) и щракнете върху бутон (като включване на захранването или увеличаване на звука)

Ако системата е настроена правилно, тогава трябва да можете да изведете HTML клиентската страница на телефона или таблета си и да контролирате уреда си с бутоните на вашата HTML клиентска страница.

Стъпка 9: Системата в действие

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

Визуалните изображения по -горе показват системата за домашна автоматизация в действие, след като е настроена.

След публикуването на този IBLE, разширих интерфейса, като заснех няколко IR кода от моя LED телевизор VIZIO

Както е показано рамо до рамо с фабричното дистанционно управление на телевизора в първата визуализация, няколко основни функции на това дистанционно са вградени в уеб потребителския интерфейс, достъпен чрез моя таблет

Следващите визуални изображения показват таблета на преден план, а телевизорът отзад отговаря на команди, издадени от уеб интерфейса:

  1. Команда за изключване на захранването - телевизорът се изключва
  2. Команда за включване - телевизорът се включва и логото "V" се появява, когато екранът се включи
  3. Команда Mute ON - Хоризонтална лента се появява със заглушен високоговорител

Във всички тестове сивата област до таблото за управление на екрана на таблета показва командата, издадена от клиента, и отговора, изпратен обратно от отдалечения концентратор SignalR

Стъпка 10: Подобряване на системата за автоматизация и свързаните с нея корекции

Тази система може да бъде разширена чрез добавяне на повече кодове, уловени от различни системи. Въпреки че тази част е лесна, трябва да вземете предвид още два фактора.

Подобрение 1 (Бързо): Работа с IR сигнали с различна дължина

  1. IR кодовете на различни системи идват с различна дължина, дори между два продукта от един и същ производител.

    Например в този случай дължината на масив от IR код за LED телевизора е 67, докато тази на Samsung Sound Bar е около 87

  2. Което означава, че ако първо включих Sound Bar, масивът IR Buffer в скицата на Arduino ще бъде изпълнен с последователност от IR код, която съдържа 87 кода
  3. След това, ако включа LED телевизора, той ще запълни масива на IR буфера само с 67 кода, но останалите 20 кода от предишната операция все още ще бъдат около

Резултатът? LED телевизорът не се включва, защото буферът на IR кода е повреден от допълнителните 20 кода, които не са почистени от предишната операция!

Fix 1 (лесният изход, не се препоръчва)

Променете скицата на Arduino, както следва:

Променете следните извиквания на функции във функцията loop () {}

transmitIRCode ();

за предаване на IRCode (c);

Направете промени в подписа на горната функция:

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

Макар че това е лесно, масивът никога не се изчиства напълно и следователно това не е много чисто решение

Fix 2 (Не е трудно, препоръчително)

Декларирайте допълнителна променлива в самия връх на Arduino Sketch, след секцията за коментари:

без знак int EMPTY_INT_VALUE;

Добавете това в горната част на функцията setup ():

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

Превъртете надолу и добавете нова функция към скицата веднага след функцията transmitIRCode ():

void clearIRCodeBuffer (int codeLen) {// Изчистване на всички кодове от масива // ЗАБЕЛЕЖКА: задаването на елементите на масива на 0 не е решението! for (int i = 1; i <= codeLen; i ++) {IRCodeBuffer [i-1] = EMPTY_INT_VALUE;}}

И накрая, извикайте нова функция по -горе на следното място във функцията loop ():

// Нулиране - възобновяване на четенето Serial PortclearIRCodeBuffer (c);…

Това е по -чист подход, тъй като всъщност нулира всички места в масива на IR буфера, които са били попълнени от най -новия сигнал на IR код, без да оставя нищо на случайност.

Подобрение 2 (Повече участие): Повтарящо се предаване на ИК сигнал за определени устройства

Някои устройства изискват един и същ сигнал да се предава многократно, за да отговори Пример: В този случай Samsung Sound Bar изисква един и същ код да бъде изпратен два пъти с интервал от 1 секунда

Тук се обсъжда Fix in Concept, тъй като е малко по -ангажиран и ще се нуждае от тестване

Добавянето на функцията за повторение към Ardunio Sketch ще означава, че ще трябва да мигате Sketch всеки път, когато добавите ново устройство към вашата система за домашна автоматизация

Вместо това, добавянето на тази корекция към клиента HTML SignalR и приложението Python SignalR Service прави решението много по -гъвкаво. По принцип това може да се постигне по следния начин:

Променете HTML клиента на SignalR за предаване на повтаряща се информация към концентратора

Отворете index.html и вградете стойността на повторение в бутона HTML така:

стойност = "SMSNG-SB-PWR-ON" ще стане стойност = "SMSNG-SB-PWR-ON_2_1000"

Където 2 е стойността на повторение и 1000 е стойността на закъснението в милисекунди между двата повторни сигнала

Когато щракнете върху този бутон, концентраторът SignalR ще получи Key Code+Repeat_Spec

Променете методите на SignalR Server, за да анализирате само кода на ключа:

  • Използвайте кода на ключа, за да извлечете IR кода от базата данни, както обикновено
  • Предайте кода на ключа+Repeat_Spec и IRCode на клиентите на SingalR както обикновено

Променете приложението за обслужване на Python SignalR за предаване на сигнали, използвайки стойностите за повторение:

Отворете клиента на Python и променете следните две функции:

def print_command_from_hub (buttonId, cmdSrc):

# анализирайте кода за повторение от стойността на buttonId

def transferToArduino (IRSignalCode, delim, endPrefix):

# настройте цикъл за време или за предаване на сигнала на желаната честота

  • По този начин Arduino не трябва да се мига многократно
  • В тази система може да бъде вграден произволен брой честоти на повторение
  • Освен това, ако използвате UNO, има ограничение за размера на вашата Sketch!

Стъпка 11: Известни проблеми и опасения за сигурността

Както е при системите, изградени за първи път, и тази има няколко проблема, които възникнаха по време на тестването.

Проблем 1: Командите за бързо задействане със закъснения по -малко от секунда между щракванията на бутоните доведоха до прекъсване на системата, след като отговори няколко пъти.

  • Рестартирането на клиента на Python SignalR възстановява системата до нормални операции
  • Непосредствените решения могат да бъдат да премахнете нежеланите изходи за отстраняване на грешки в двата, клиента на Python SignalR и също Arduino Sketch и да повторите тези тестове
  • Друго място за разглеждане би било самата серийна комуникация - би ли било възможно да се добави код за бързо изчистване на буфера?

Въпреки това забелязах, че телевизорът ми не реагира добре на фабричното му дистанционно - следователно самата природа на инфрачервената комуникация на моя телевизор може също да допринесе за това.

Проблем 2: Екранът HTML престава да реагира на щраквания на бутони след дълъг период на бездействие

Обикновено опресняването на страницата разрешава това поведение - причината за това поведение обаче все още е неясна

ОТНОСНО СИГУРНОСТТА

Тази система е проектирана само за използване в локална (домашна) мрежа и няма необходимите предпазни мерки за сигурност, които да се използват по интернет

Затова се препоръчва SignalR Hub да бъде разгърнат на локална машина във вашата локална/домашна мрежа

Благодаря, че прочетохте моя IBLE и се надявам да се забавлявате!

Препоръчано: