Съдържание:

Супер проста Raspberry Pi 433MHz Домашна автоматизация: 7 стъпки
Супер проста Raspberry Pi 433MHz Домашна автоматизация: 7 стъпки

Видео: Супер проста Raspberry Pi 433MHz Домашна автоматизация: 7 стъпки

Видео: Супер проста Raspberry Pi 433MHz Домашна автоматизация: 7 стъпки
Видео: Мини ПК на Intel N100 - AC8-N, мощная безвентиляторная платформа, установка Home Assistant OS 2024, Ноември
Anonim
Супер проста Raspberry Pi 433MHz домашна автоматизация
Супер проста Raspberry Pi 433MHz домашна автоматизация

Този урок е един от многото, когато става въпрос за използване на Raspberry Pi за управление на безжични устройства в дома. Подобно на много други, той ще ви покаже как да използвате евтина двойка предавател/приемник, свързана към вашия Pi, за да взаимодействате с устройства, работещи в често използваната 433MHz радиочестотна лента. Той конкретно ще ви покаже как да включите или изключите всяко електрическо устройство с помощта на вашия Pi чрез предаване на команди към набор от 433MHz дистанционно управлявани контакти.

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

Именно за това става въпрос в този урок. Софтуерната страна на тази система се състои от два много прости скрипта на Python - един за приемане и запис на сигнали и един за предаване на тези сигнали обратно към безжичните контакти. Действителното приемане/предаване на сигнала разчита само на лесната за използване библиотека RPi. GPIO, която поне за мен беше предварително инсталирана с Raspbian. Тази библиотека също може да бъде импортирана директно в Python.

За този проект ще ви трябва:

Малина Пи. Всеки модел трябва да работи, използвах начален комплект "всичко в едно", но може би имате нужда само от централното устройство

Двойка предавател/приемник от 433MHz. Най -често използваните в този тип проекти са тези. Купуването на пакет от пет, като този, свързан, гарантира, че имате няколко резервни части

Комплект от 433MHz дистанционно управляеми контакти. Използвах тези, които силно препоръчвам, но има безброй налични модели. Просто се уверете, че работят на тази честота

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

[Ако решите да закупите някой от тези продукти, ще съм ви много благодарен, ако получите достъп до списъците, използвайки горните връзки - по този начин получавам малка част от печалбата без допълнителни разходи за вас!]

Стъпка 1: Настройка на приемника

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

Преди да можете да използвате своя Pi за изпращане на команди до дистанционно управляемите гнезда, трябва да знаете на какви конкретни сигнали реагират. Повечето контакти с дистанционно управление се доставят със слушалка, която може да се използва за включване или изключване на определени устройства. В случай на тези, които купих, слушалката има четири реда сдвоени бутони за включване/изключване, всеки от които изпраща сигнал за включване или изключване към конкретно гнездо.

Това поражда въпрос - как да разберем кои бутони съответстват на кой гнездо? Това всъщност зависи от модела, който имате. Една от основните причини, поради които избрах моя специфичен стил на гнездо (свързано във въведението), е, че устройствата могат да бъдат конфигурирани с физически превключвател, за да накарат определен гнездо да реагира на определен набор от бутони за включване/изключване на слушалката. Това също означава, че можете да изключите и преместите контактите из къщата, знаейки, че всяко устройство винаги ще реагира на едни и същи сигнали за включване/изключване.

След като разберете как вашите контакти взаимодействат със слушалката, ще трябва да използвате 433MHz приемника си (на снимката по -горе), за да „подушите“кодовете, изпращани от слушалката. След като сте записали вълновите форми на тези кодове, можете да ги копирате с помощта на Python и да ги изпратите с помощта на предавателния модул.

Първото нещо, което трябва да направите тук, е да свържете проводниците на вашия приемник към правилните GPIO щифтове на Pi. Приемното устройство има четири пина, но са необходими само три от тях. Мисля, че и двата централни пина дават един и същ изход, така че трябва само да се свържете с един от тях (освен ако не искате да предавате поточно получените сигнали към два отделни GPIO пина).

Горното изображение почти обобщава окабеляването. Всеки щифт на приемника може да бъде свързан директно към съответния щифт на Pi. Използвам макет и кабели за джъмпер, за да направя процеса малко по -елегантен. Имайте предвид, че можете да изберете всеки щифт за данни GPIO, за да се свържете към някой от централните приемници. Използвах щифта, обозначен като "23" в заглавката ми Pi.

ВАЖНО: Ако свържете щифта с маркировка „3v3“в горното изображение към щифт с по -високо напрежение на Pi (например 5v), вероятно ще повредите Pi, тъй като щифтовете GPIO не могат да понасят напрежения над 3v3. Като алтернатива можете да го захранвате с 5v и да настроите делител на напрежение, за да изпратите безопасно напрежение към щифта DATA.

Обхватът на приемника няма да бъде много голям при това напрежение, особено ако не е свързана антена. Тук обаче не се нуждаете от дълъг обхват - стига приемникът да може да улавя сигналите от слушалката, когато се държат един до друг, това е всичко, от което се нуждаем.

Стъпка 2: Вдушване на кодовете на слушалката

Подушване на кодовете на слушалката
Подушване на кодовете на слушалката

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

Преди да започнете този процес, ще трябва да се уверите, че имате библиотеките на Python, необходими за стартиране на скрипта за sniffer. Те са изброени в горната част на скрипта:

от datetime импортиране 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 = кратък_на + дълъг_изкл0 = дълъг_на + кратък_изход

Погледнете отново етикетираната форма на вълната и ще видите какво имам предвид. След като идентифицирате еквивалентните модели във вашия сигнал, всичко, което трябва да направите, е да преброите 1 и 0, за да изградите последователността. Когато се транскрибира, горният сигнал може да бъде записан, както следва:

1111111111111010101011101

Сега просто трябва да повторите този процес, за да запишете и транскрибирате сигналите, съответстващи на другите бутони на слушалката, и сте завършили първата част от процеса!

Преди да можете да изпращате отново сигналите с помощта на предавателя, трябва да направите още малко работа. Времето между върховете и спадовете, съответстващи на 1 или 0, е много важно и трябва да сте сигурни, че знаете колко дълго трае „short_on“или „long_off“. За моите кодове имаше три информация за времето, които трябваше да извлека, за да възпроизведа сигналите:

  • Продължителността на „кратък“интервал, т.е. началото на 1 или края на 0.
  • Продължителността на „дълъг“интервал, т.е. края на 1 или началото на 0.
  • Продължителността на „удължен“интервал. Забелязах, че когато държах бутон натиснат на слушалката, между всеки повтарящ се екземпляр на сигналния блок имаше период на „удължен_изключване“. Това забавяне се използва за синхронизация и има фиксирана продължителност.

За да определите тези времеви стойности, можете да използвате функцията за увеличение в прозореца на matplotlib, за да увеличите докрай и да поставите курсора върху съответните части на сигнала. Отчитането на местоположението на курсора в долната част на прозореца трябва да ви позволи да определите колко широка е всяка част от сигнала, която съответства на дълъг, кратък или удължен интервал. Обърнете внимание, че оста х на графиката представлява време, а компонентата х на показанието на курсора е в единици секунди. За мен ширините бяха следните (в секунди):

  • кратко_закъснение = 0,00045
  • long_delay = 0,00090 (два пъти по -дълго от "кратко")
  • удължено_закъснение = 0,0096

Стъпка 4: Настройка на предавателния модул

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

След като сте събрали вашите кодове и данни за времето, можете да изключите приемника си, тъй като вече няма да имате нужда от него. След това можете да свържете предавателя директно към съответните Pi GPIO щифтове, както е показано на горното изображение. Открих, че щифтовете на предавателните устройства са етикетирани, което улеснява процеса.

В този случай е добре да захранвате устройството, използвайки 5v захранване от Pi, тъй като DATA щифтът няма да изпраща сигнали към Pi, а само да ги приема. Също така, 5v захранване ще осигури по -голям обхват на предаване, отколкото използването на 3v3 захранване. Отново можете да свържете DATA щифта към всеки подходящ щифт на Pi. Използвах пин 23 (същият като за приемника).

Друго нещо, което бих препоръчал да направите, е да добавите антена към малкия отвор в горния десен ъгъл на предавателя. Използвах парче права тел с дължина 17 см. Някои източници препоръчват навита жица с подобна дължина. Не съм сигурен кое е по -добро, но правият проводник осигурява достатъчен обхват за включване/изключване на контактите от всяко място в моя малък апартамент. Най -добре е да запоите антената, но просто извадих част от пластмасата от проводника и увих медта през отвора.

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

Стъпка 5: Предаване на сигнали с помощта на Pi

Тук идва вторият скрипт на Python. Той е проектиран да бъде също толкова прост, колкото първият, ако не и повече. Отново, моля, изтеглете го и прегледайте кода. Ще трябва да редактирате скрипта, за да предавате правилните сигнали според данните, които сте записали в стъпка 3, така че сега е подходящият момент да го разгледате бързо.

Всички библиотеки, необходими за изпълнение на този скрипт, са предварително инсталирани на моя Pi, така че не е необходима допълнителна инсталация. Те са изброени в горната част на скрипта:

време за импортиране

импортирайте sys импортирайте RPi. GPIO като GPIO

Под импортирането на библиотеката е информацията, която ще трябва да редактирате. Ето как изглежда по подразбиране (това е информацията, съответстваща на моите гнезда, определена с помощта на стъпка 3):

a_on = '1111111111111010101011111'

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 long_delay = 0.00090 extended_delay = 0,0096

Тук имаме осем кодови низове (два за всяка двойка бутони за включване/изключване на моя телефон - може да имате повече или по -малко кодове), последвани от трите части от информацията за времето, също определени в стъпка 3. Отделете време, за да се уверите, че имате въведете правилно тази информация.

След като сте доволни от кодовете/забавянията, които сте въвели в скрипта (можете да преименувате променливите на кодовия низ, ако желаете), вие сте почти готови да изпробвате системата! Преди да направите това, разгледайте функцията transmit_code () в скрипта. Тук възниква действителното взаимодействие с предавателя. Тази функция очаква един от кодовите низове да бъде изпратен като аргумент. След това той отваря дефинирания щифт като GPIO изход и циклично преминава през всеки знак в кодовия низ. След това той включва или изключва предавателя според информацията за времето, която сте въвели, за да изградите форма на вълна, съответстваща на кодовия низ. Той изпраща всеки код няколко пъти (10 по подразбиране), за да намали вероятността той да бъде пропуснат и оставя удължено_закъснение между всеки кодов блок, точно като слушалката.

За да стартирате скрипта, можете да използвате следния команден синтаксис:

python TransmitRF.py код_1 код_2 …

Можете да предавате множество кодови низове с едно изпълнение на скрипта. Например, за да включите гнездата (а) и (б) и сокета (с), стартирайте скрипта със следната команда:

python TransmitRF.py a_on b_on c_off

Стъпка 6: Бележка относно точността на времето

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

Аз лично никога не съм имал проблеми с time.sleep (), когато става въпрос за изпращане на кодовете. Знам обаче, че моят time.sleep () има тенденция да има грешка от около 0.1ms. Определих това с помощта на приложения скрипт SleepTest.py, който може да се използва за оценка на това колко точна е функцията ви time.sleep () на Pi. За моите конкретни дистанционно управляеми гнезда най-краткото забавяне, което ми трябваше за изпълнение, беше 0,45 мс. Както казах, не съм имал проблеми с гнездата, които не реагират, така че изглежда, че 0,45 ± 0,1 мс е достатъчно добро.

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

Стъпка 7: Заключение

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

Този проект представя метод за управление на всеки електрически уред, използващ Raspberry Pi и набор от 433MHz дистанционно управляеми контакти, с акцент върху простотата и прозрачността. Това е най -вълнуващият и гъвкав проект, за който съм използвал моя Pi и има неограничени приложения за него. Ето някои неща, които сега мога да правя благодарение на моя Pi:

  • Включете електрически нагревател до леглото ми половин час преди алармата ми да се включи.
  • Изключете нагревателя един час след като заспя.
  • Включете нощното ми осветление, когато алармата ми се изключи, за да не заспивам отново.
  • и много други…

За повечето от тези задачи използвам функцията crontab в Linux. Това ви позволява да настроите автоматични планирани задачи за изпълнение на скрипта TransmitRF.py в определено време. Можете също да използвате командата Linux at за изпълнение на еднократни задачи (които за мен трябваше да бъдат инсталирани отделно с помощта на „sudo apt-get install at“). Например, за да включа нагревателя си половин час преди алармата ми да се изключи на следващата сутрин, всичко, което трябва да направя, е да напиша:

в 05:30 ч

python TransmitRF.py c_on

Можете също да използвате този проект заедно с моята система за домашно наблюдение на Dropbox за управление на уреди по интернет! Благодаря за четенето и ако искате да изясните нещо или да споделите вашето мнение, моля, публикувайте коментар!

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