Система управления умным домом на расстоянии

В этом уроке разберем средства управления умным домом.

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.

Теперь поговорим о том, что мы хотим сделать с помощью нашей кнопки.

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

Реле подключена через 13 пин.

#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)

После настройки, отключаем ногу KEY от +3.3В, и перезапускаем модуль. Готово!

А теперь подготовим устройство 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);
         }
      }    
   }

 

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

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

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

2 апреля 2018 в 14:35 | Обновлено 20 января 2020 в 19:19 (редакция)
Опубликовано:
Уроки,

Добавить комментарий

Ваш E-mail не будет никому виден. Обязательные поля отмечены *