Открытая платформа для создания заботливой квартиры

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

Почему Arduino?

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

Причина №1. Arduino - это очень просто, широко распространено, доступно и невероятно дешево. Вы сможете найти примеры кода под любые датчики, которые захотите использовать. Это просто создано для любительского прототипирования.

Кто-то скажет, что язык C уже анахронизм, а программировать устройства нужно на Python и JavaScript, ведь есть esp32, Espruino, Iskra JS и т.п. В домашней автоматизации есть очень разные задачи: простые и сложные. Простых очень много - управление исполнительными устройствами, снятие показаний с датчиков. На разных платформах количество кода будет одинаковое (вряд ли больше одного экрана), но цена за это окажется несопоставима. Нет никакого смысла впустую гонять такие мощности и переплачивать за это!

Причина №2. Arduino - это адекватное решение простых задач домашней автоматизации.

Часто можно встретить "холивар", что ESPxx куда круче Arduino по возможностям и главное - на борту есть WiFi-модуль. Для решения большинства задач домашней автоматизации WiFi крайне избыточен, ведь приходится передавать всего по несколько байт информации. Однако, при этом он очень энергоемкий и добавляет лишних забот по конфигурированию (хранит имя сети и пароль). А если WiFi не использовать, тогда зачем нужен этот модуль вообще?

Причина №3. Arduino - не содержит ничего лишнего, позволяет строить энергоэффективные решения.

Радиоинтерфейс

При выборе стандарта радиосвязи мы руководствовались доступностью устройств, широтой распространения технологии, простотой настройки и мобильностью. Наилучшим образом под эти критерии подходят WiFi и Bluetooth. Например, в Raspberry Pi и Orange Pi 2 Plus эти стандарты поддерживаются из коробки.

Интерфейс Плюсы Минусы Потребление
WiFi Высокая скорость передачи данных, есть связь с Интернет-сервисами. Приличный радиус действия. Зависимость от параметров локальной сети. Для приема данных нужен режим HTTP-сервера. 30 мА - 200 мА
Bluetooth LE Независим от Интернета. Есть широковещательный режим. Есть готовые прошивки. Небольшой радиус действия (10 м). Передаются небольшие объемы данных. Может быть задержка в передаче данных. 0.1 мА
Другие Устраняют недостатки предыдущих Слабое распространение элементной базы. Требуют лицензионных отчислений.

Принципиальное отличиее между WiFi и Bluetooth - топология сети устройств:

  • Все WiFi устройства образуют "звезду", то есть у них есть центр, на который они передают данные и принимают команды для управления. В каждом оконечном устройстве должны быть прописаны имя сети и пароль. Если вы захотите сменить сеть, то вам придется перепрошить все устройства.
  • Устройства Bluetooth LE передают свои данные в режиме широковещательной рассылки, таким образом, центральный узел всегда знает, какие устройства есть в его поле действия и получает данные. При необходимости он может подключиться к этому устройству и передать ему команду. Вам не нужно конфигурировать оконечные устройства вовсе. Перенесите их в другой дом или квартиру и они сразу заработают!

При всех своих минусах Bluetooth LE идеально подходит для прототипирования устройств, подключаемых к умной квартире и дому. Такие устройства являются мобильными, легко собираются, длительное время работают от одной или нескольких батареек.

Обзор BLE-модулей

Чтобы устройства домашней автоматизации могли использовать радиоинтерфейс Bluetooth LE, нужно подключить к Arduino чип, который реализует эту спецификацию. Она совсем не простая и "пустые" чипы (без полезной нам прошивки) нам не подойдут, хоть их и великое множество.

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

Название модуля Производитель Прошивка Скорость, бод Описание
HM-10 BLE 4.0 JNHuaMao Самый полнофункциональный BLE-модуль. Нужно уметь визуально отличать его от других реализаций, чтобы не купить аналог
BLE CC41-A описание команд Bolutek V3.0.6 9600 Простой BLE-модуль. Может передавать показания двух датчиков в широковещательном режиме. Может передавать пользовательские данные при подключении.
BLE JDY-08 описание команд jdy-rf V3.383 115200 Содержит развитые возможности по управлению выходами IO и PWM. Позволяет считывать параметры датчиков (до 5-ти устройств) в режиме iBeacon.
BLE JDY-10 - V2.4 9600 или 115200 Простой BLE-модуль на базе мощного китайского SoC TLSR8266F512. Позволяет передавать AT-команды или показания двух датчиков в режиме iBeacon.

Настройка модулей

Взаимодействие с CC2541 осуществляется через интерфейс UART. На платке специально выведены ножки Rx и Tx для подключения к ПК или микроконтроллерам. Предварительно необходимо настроить модуль, например, задать ему дружественное имя, выбрать режим работы, мощность радиосигнала и т.п. Достигается это передачей AT-команд через UART-интерфейс, прямо как в старых модемах. У каждой прошивки есть свой собственный набор AT-команд и спецификация, где описано их назначение.

Есть два простых способа настройки BLЕ-модуля:

  1. при помощи кабеля конвертера USB - RS232 и программки типа Terminal
  2. при помощи Arduino-платы, к пинам которой подключается BLE-модуль.

Для реализации второго сценария мы подготовили схему подключения:

Схема USB-RS232

Откройте COM-монитор, встроенный в Arduino IDE, и загрузите следующую программу в Arduino. В результате BLE-модуль СС41-A сообщит свой адрес и версию прошивки.

#include <SoftwareSerial.h>

SoftwareSerial bleSerial(2, 3); // RX, TX

void setup() {
  // проверьте, что скорость связи совпадает со скоростью по умолчанию для конкретного BLE-модуля
  bleSerial.begin(9600);
  bleSerial.setTimeout(500);
  Serial.begin(9600);
  configureDevice();
}

void loop() {
  char c;
  if (Serial.available()) {
    c = Serial.read();
    bleSerial.print(c);
  }
  if (bleSerial.available()) {
    c = bleSerial.read();
    Serial.print(c);    
  }
}

void configureDevice() {
  sendCommand("AT");
  sendCommand("AT+VERSION");
  sendCommand("AT+VER");
  sendCommand("AT+LADDR"); 
}

void sendCommand(const char * data) {
  Serial.println(data);
  bleSerial.println(data);
  while(bleSerial.available()) {
    Serial.println(bleSerial.readStringUntil('\n'));
  }
  delay(20);
}

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

Где купить

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

  • Amperkot.ru - у ребят отличные цены на макетные платы, провода, батарейные отсеки, кнопки/светодиоды/резиторы и т.п. Некоторые простые датчики также можно купить здесь, например, touch-сенсоры, RCWL-сенсоры и т.п.
  • ebay.com - в Китае лучше заказывать всевозможные датчики, BLE-модули, микроконтроллеры и микрокомпьютеры - это будет минимум в два раза дешевле, чем в интернет магазинах в РФ. Срок бесплатной доставки составит примерно от 20 до 40 дней.

Отладка

Спецификация Bluetooth LE определяет некий способ работы с BLE-устройствами:

  1. сначала устройства нужно подключить по радиоканалу;
  2. при помощи утилит (или ПО, установенного на телефоне) можно запросить перечень характеристик (или функций), поддерживаемых устройством;
  3. тем же способом можно считывать/записывать значения характеристик. То, на какие характеристики будет какой отклик, определяется прошивкой BLE-модуля.
  4. BLE-устройства поддерживают режим рассылки сообщений (advertising, iBeacon). В этом режиме с некоторой частотой отправляются сервисные сообщения, в которых можно передавать пользовательские данные.

Подайте питание на BLE-модуль и светодиод, расположенный на платке, скорее всего начнет периодически мигать. Это означает, что соединение с модулем не установлено.

Подключаемся к RPi по SSH и выполняем такие команды:

sudo -s
docker exec -it hass bash

Теперь мы можем выполнять команды внутри docker-контейнера с Home Assistant. Запустим сканирование BLE-устройств:

# hcitool lescan
LE Scan ...
00:15:84:00:70:C1 CC41-A

Пробуем подключиться, после чего светодиод на платке станет светиться постоянно:

# hcitool lecc 00:15:84:00:70:C1
Connection handle 64