В этом уроке разберем средства управления умным домом.
1. Создание собственного пульта управления черз ИК-пульт и ИК-датчик
В прошлый раз в первом уроке я рассказывал о том, как с помощью Arduino UNO включить обычную лампу накаливания, когда в комнате мало света, но иногда в комнате не темно, но нужно включить лампу, а подходить к ней не хочется, хочется лежать на диване и ничего не делать, может даже включить отопление или открыть шторы, когда вы заняты и не можете подойти.
В любом случае, нужна система управления и один из самых простых и надежных вариантов — это пульт управления. Мне лично не особо хочется создавать пульт с помощью гор проводов, и еще когда-нибудь об них споткнуться. Поэтому предлагаю несколько вариантов создания беспроводного пульта управления умным домом.
Самый простой способ создания пульта, если у вас, конечно, есть пульт и датчик, если нет, то придется их где-то взять. Можно взять приемник и ик - светодиод, сделать с помощью ардуино и его модулей пульт, отправлять команды с помощью ик - светодиода и принимать уже другой arduino с помощью датчика. Легко ли это... думаю нет, придется заморочиться с двумя ардуино и командами, но весьма интересный способ управления, быть может позже мы его рассмотрим. Я буду использовать уже готовый пульт и датчик от компании Амперка. Можно использовать модули и от других производителей.
Нам не нужно использовать все кнопки (пока), можно воспользоваться одной единственной, для включения и для выключения нашей лампы.
Для простой работы с ик - пультом требуется скачать нужную библиотеку - https://github.com/z3t0/Arduino-IRremote.
Далее мы должны подключить ИК - датчик к Arduino.
Теперь мы должны написать код, который скажет нам, на каких кнопках идет какой сигнал, чтобы знать, что мы получаем при нажатии кнопки и что выполнить в последующем, если эта кнопка нажата.
#include <IRremote.h> IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; void setup() { Serial.begin(9600); // выставляем скорость COM порта irrecv.enableIRIn(); // запускаем прием } void loop() { if ( irrecv.decode( &results )) { // если данные пришли Serial.println( results.value, HEX ); // печатаем данные irrecv.resume(); // принимаем следующую команду } }
Наводим пульт на датчик и нажимаем пару кнопок на пульте, видим такую картину:
Я возьму значение своей первой кнопки - 1689D02F.
Теперь поговорим о том, что мы хотим сделать с помощью нашей кнопки.
Как только я ее нажму, должна включиться лампа, нажму второй раз, она должна выключиться. Вроде ничего трудного, осталось только написать код.
#include "IRremote.h" IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; boolean Net = 0; // указываем переменную, в которой будем зпоминать нажатие кнопки void setup() { irrecv.enableIRIn(); // запускаем прием pinMode(13,OUTPUT);// пин, к кторому подключена реле } void loop() { if ( irrecv.decode(&results))// если данные пришли { if (results.value == 0x1689D02F)// если пришли данные от нужной кнопкм { Net = !Net;// запоминаем нажатие digitalWrite(13,Net);// вкл\выкл реле delay(50);// ждем, чтобы кнопка вернудась в изначальное положение } irrecv.resume();// принимаем следующую команду } }
Теперь моя лампа включается по одному нажатию пульта, и я могу ей управлять на расстоянии. Попробуйте подключить к разным кнопкам другие функции: включить или выключить чайник, автополив или потренироваться и просто включать различные светодиоды, все зависит от вашей фантазии.
Но такой пульт сильно ограничен, если вы выйдете из комнаты, то скорее всего можете уже забыть про управление лампой и умным домом, поэтому предлагаю еще один вариант - Bluetooth.
2. Создание собственного пульта управления через смартфон и Bluetooth-модуль
Bluetooth модули HC–05 и HC–06:
Сделать его будет не сложно, нужен лишь модуль Bluetooth (HC – 05; HC – 06) и любой смартфон, на котором стоит Bluetooth Terminal.
Есть много приложений такого типа, я поступил оригинально и скачал "Bluetooth Terminal" 🙂
Надо понять, что наши Bluetooth модули в начале находятся в режиме "Slave", а значит они будят принимать сигнал и, после принятия сигнала, отправлять его с помощью UART интерфейса через пины Rx и Tx на нашу Arduino сразу же после подключения.
С помощью терминала мы сможем отправить с телефона по bluetooth символ "1", значит, что в serial порту у нас появится символ "1". Мы сможем считать его и если он удовлетворяет нашим требованием, то пусть Ардуино подаст ток на нашу реле и включит лампу, если же мы отправили "0", то Ардуино перестанет подавать ток на реле и выключит лампу.
Обычный модуль подключается через 3,3 вольта. Rx в Tx, а Tx в Rx, землю в Gnd. Ничего сложного. Как только мы подключим его, то увидим в сети Bluetooth еще одно устройство, осталось только написать программу для ардуино и подключится к модулю, через терминал.
Я думаю, что вам понятно, как я буду управлять своей лампой через телефон, но так как у меня нет необходимости задействовать все цифры (от 0 до 9), то пусть 0 будет выключать лампу, а все остальные цифры ее включать. Буквы я трогать в этой программе не буду. Но я оставлю возможность также управлять лампой через ик – пульт.
#include "IRremote.h" int val; IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; boolean Net = 0; // указываем переменную, в которой будем зпоминать нажатие кнопки void setup() { Serial.begin(9600); irrecv.enableIRIn(); // запускаем прием pinMode(13,OUTPUT);// пин, к кторому подключена реле } void loop() { if (Serial.available()) // если данные со смартфона пришли { val = Serial.read(); // считываем данные if (val>='0') // если пришел 0 { Net =0; digitalWrite(13,Net); // выключаем лампу } else // если пришел не 0 { Net =1; digitalWrite(13,Net); // включаем лампу } } if ( irrecv.decode(&results))// если данные пришли { if (results.value == 0x1689D02F)// если пришли данные от нужной кнопкм { Net = !Net;// запоминаем нажатие digitalWrite(13,Net);// вкл\выкл реле delay(50);// ждем, чтобы кнопка вернудась в изначальное положение } irrecv.resume();// принимаем следующую команду } }
Данное приложения имеет такой интерфейс, оно достаточно простое, но для того, чтобы научится пользоваться созданием связи между Arduino и телефон в самый раз.
Открываем меню и нажимаем "Сonnect a device - Secu.." 🙂
Выбираем нужное вам устройство, оно может иногда идти с паролем "1234" или "0000", и все, можно отсылать данные.
Поздравляю, вы сделали еще один шаг навстречу умному дому и созданию iot проектов, есть приложения под смартфон, с помощью которых вы сможете управлять роботами и управляемыми механизмами, но это уже в других статьях. А теперь попробуем устроить что-то еще сложнее.
3. Создание собственного пульта управления через два Bluetooth-модуля и два Arduino UNO
С помощью модуля Bluetooth мы можем не только принимать, но и отправлять данные на другие устройства. Если модуль можно перевести в режим «Master», то он сможет связывается с другими устройствами самостоятельно и отправлять данный, полученный по UART интерфейсу.
Если у вас два модуля HC – 06, то не получится сделать так, ведь не могут работать в режиме «Master», но если у вас два или хотя бы один из двух Bluetooth модулей HC – 05, то вы можете попробовать.
Сделать его будет сложно, но зато именно он сможет быть модифицирован в сотни других пультов и проектов. Для начала нам потребуется два Bluetooth модуля. Я взял два модуля HC – 05, они могут как принимать сигнал, так и отправлять его, что нам и нужно.
Для начала нужно перевести один из модулей в режим Slave и узнать его адрес, чтобы второй модуль мог найти сеть и подключится к первому модулю.
Для этого нужно перевести модуль в режим AT команд. Один из способов это сделать — отключить модуль от платы (если она была подключена к модулю) и подать на пин K +3.3 вольта (в моем случае 5). Далее подключаем питание к модулю и пин Tx модуля подключаем в Tx платы, а пин Rx модуля подключаем в Rx платы.
Открываем сериал порт. В настройках к нему выбираем скорость в "38400 бод", символ перевода строки меняем на "NL+CR". и набираем команду "AT". Если все сделать правильно, то на вашу команду модуль должен дать "OK" (также возможен ответ "ERROR: (0)", но после последующей команды "AT" он должен ответить "OK").
А теперь для модуля Slave нужно вести такие команды:
Сброс предыдущих настроек: AT+ORGL
Сброс спаренных устройств: AT+RMAAD
Установка пароля: AT+PSWD=1234
Включение режима ведомого: AT+ROLE=0
Дополнительно можно узнать адрес устройства (понадобится для настройки спаренного модуля): AT+ADDR?
В ответ получим сам адрес: ADDR=12:6:143117
(или такого вида: 98d3:34:911ec5)
А теперь подготовим устройство Master
Сброс предыдущих настроек: AT+ORGL
Сброс спаренных устройств: AT+RMAAD
Включение режима ведущего: AT+ROLE=1
Рестарт после смены роли: AT+RESET
Если мы хотим связать ведомого и ведущего, пишем такие команды:
Установка пароля ведомого: AT+PSWD=1234
Указываем парное устройство: AT+PAIR=<адрес>,<таймаут> (пример: AT+PAIR=12,6,143117, 5)
Связываем с конкретным адресом: AT+BIND=<адрес> (пример: AT+BIND=12,6,143117)
Запрещаем соединяться с другими адресами: AT+CMODE=0
Когда вы захотите запрограммировать Arduino вам надо вытащить провода из пинов Rx и Tx, ведь по ним идет передача по UART от компьютера к плате, а связь Bluetooth модуля и компьютера помешает передаче данных.
3.1 Собираем сам пульт
А теперь давайте соберем пульт управления для нашей лампы. Идея в том, чтобы на пульте была одна кнопка, которая при нажатии выключит и включит лампу, а также, я хочу знать, что если я не смогу увидеть результат своих действие, то на моем пульте будет гореть светодиод, который будет мне говорить, что лампа включена или выключена, то - есть модуль, который будет возле лампы, будет отправлять данные мне, что данные получил и выполнил указание.
Для данного пульта нам пригодится:
1) Два Bluetoth модуля (как минимум один, который может быть в режиме Master)
2) Кнопка
3) Резистор 10кОМ
4) Светодиод (он уже на плате на 13 пине)
5) Две платы Arduino UNO
6) Лампа и реле (смотрите 1 статью про подключение лампы, если нет возможности, возьмите светодиод и подключите как на схеме)
Соберем электрическую схему для платы Master:
Соберем электрическую схему для платы Slave:
Напишем код для модуля Master:
int q = 0; // присылаемые данные int reading = 8; // пин, который считывает значение с кнопки int LedPin = 13; // пин к светодиоду boolean n = 0; // значение кнопки при нажатии boolean currentButton = 0; // значение кнопки после нажатия boolean led0n = 0; // отсылаемые данные boolean led = 0; // значение светодиода на плате void setup() { Serial.begin(38400); Serial.setTimeout(40); // При вызове parseInt() задержка ожидания последующего символа по умолчанию 1 секунда. // Функцией setTimeout() можно уменьшить эту задержку. Например на 40 миллисекунд, setTimeout(40);. pinMode(reading,INPUT); pinMode(LedPin, OUTPUT); } boolean Button( boolean got ) // функция, которая принимает предыдущее значение нажатия кнопки и отправляет текущие значение { boolean current = digitalRead(reading); if( !got == current) { delay(10); current = digitalRead(reading); } return(current); } void loop() { currentButton = Button(n); if (currentButton == 1 && n ==0) // если кнопка была нажата и отжата { led0n = !led0n; // Serial.println(led0n+1); // отправляем показание кнопки } n = currentButton; if (Serial.available()> 0) // если в Serial пришли данные { q=Serial.parseInt(); // записываем данные в q if (q==3) // если пришла 3 { led = 1; // меняем значение нажатой кнопки digitalWrite(LedPin, led); // включаем лампу } if (q==2) // если пришла 2 { led = 0; // меняем значение нажатой кнопки digitalWrite(LedPin, led); // выключаем лампу } } }
Напишем код для модуля Slave:
int led = 13; int q; boolean n = 0; void setup() { Serial.begin(38400); // При вызове parseInt() задержка ожидания последующего символа по умолчанию 1 секунда. // Функцией setTimeout() можно уменьшить эту задержку. Например на 40 миллисекунд, setTimeout(40);. // Чем выше скорость Serial.begin, тем меньше потребуется значение setTimeout. Serial.setTimeout(40); pinMode(led, OUTPUT); } void loop() { if (Serial.available()> 0) // если в Serial пришли данные, через Bluetooth модуль HC-05. { // Вместо "Serial.read" будем использовать "Serial.parseInt" чтоб можно было работать с числами больше 9. q=Serial.parseInt(); if (q==2) // если пришла 1 { n =1; // меняем значение нажатой кнопки digitalWrite(led, n); // включаем или выключаем лампу Serial.print(n+2); } if (q==1) // если пришла 1000 { n =0; // меняем значение нажатой кнопки digitalWrite(led, n); // включаем или выключаем лампу Serial.print(n+2); } } }
Если у вас все получилось, то поздравляю, вы сделали еще один шаг к созданию умного дома.
Вы создали беспроводное устройство, которое может управлять всем вашим домом и даже больше, ведь беспроводное управление можно использовать практически везде.
В следующий раз я продолжу эту тему и расскажу вам как усовершенствовать наши устройства и придумать новые, чтобы наш дом стал еще умнее, но надеюсь, он не станет умнее вас.