В части 1 — Элементы умного дома z-wave на Razberry и Z-Uno. Часть 1 было рассмотрено создание умного дома для устройств z-wave на контроллере Razberry.
Рассмотрим создание собственных устройств z-wave на плате Z-Uno
Z-Uno — это Arduino в мире Z-Wave. На этой плате вы можете собрать все ваши устройства. Код пишется на языке C в стиле Arduino прямо в среде Arduino IDE. Эта же среда используется для загрузки кода по USB (есть также возможность залить новый код по радио через контроллеры Z-Wave — так называемая перепрошивка OTA). Код управляет всеми ножками как в Arduino. Привычный набор функций Arduino дополнен специфическими для работы с сетью Z-Wave — получения и отправки команд. Все сложности Z-Wave скрыты «под капотом» Z-Uno.
Технические характеристики:
— 28 кБайт FLASH-памяти для ваших скетчей,
— 4 кБайта RAM,
— Z-Wave радио-трансивер на каналах 9.6, 40 и 100 кбит/с,
— 22 GPIO (некоторые перекрываются с другими функциями),
— 4 АЦП,
— 5 ШИМ,
— 2 UART,
— 1 USB (в режиме serial),
— 64 кБайта EEPROM,
— 1 SPI (master или slave режимы)
— 4 ИК-контроллера и 1 ИК-приёмник с функцией обучения,
— 1 TRIAC/ZEROX контроллеры для диммирования,
— 1 прерывание,
— 2 таймера (16 MHz или от внешнего источника),
— I2C (программный на ногах GPIO),
— 1-wire (программный на ногах GPIO),
— 8×6 сканер кнопок (в том числе в режиме глубокого сна),
— 2 сервисных светодиода, 1 сервисная кнопка,
— 1 пользовательский LED (как pin 13 у Arduino).
Распиновка Z-Uno
Режимы питания:
USB 5 В, внешнее 3 В, внешнее 4-15 В или батарейка 3 В,
всегда в сети, спящее или FLiRS,
Функции Z-Wave:
Соответствие Z-Wave Plus,
Все частоты Z-Wave (из-за разных SAW-фильтров будет 3 вида Z-Uno),
Поддержка из коробки шифрования AES 128 бит, описанного в протоколе Z-Wave,
Обновление прошивки и бутлоадера через USB или по радио (Z-Wave OTA),
MultiChannel (10 пользовательских каналов — каждый канал предоставляет одну функцию, см. ниже),
10 групп ассоциаций для управления другими устройствами,
Возможность управлять по радио Z-Wave реле, диммерами, замками, запуском сцен,
Каждый пользовательский канал может содержать один из следующих классов команд Z-Wave:
— Binary Switch (для реле),
— Multilevel Switch (для диммеров, жалюзи),
— Color Switch (для цветных ламп),
— Binary Sensor и Notification (для детекторов и сигнализаций),
— Multilevel Sensor (для датчиков, возвращающих числовое значение),
— Meter (для счётчиков).
Программирование Z-Uno в среде Arduino IDE с дополнительным специальным пакетом для платы Z-Uno. Позволяет создавать свои собственные проекты и загружать их в Z-Uno через USB. Содержит различные примеры для начала.
Запускаем Arduino IDE 1.6.5
Выбираем Файл —> Настройки
B поле Дополнительные ссылки для Менеджера плат добавим адрес z-uno.z-wave.me/files/z-uno/package_z-wave.me_index.json
и нажимаем OK
Выбираем Инструменты —> Плата —> Boards Manager
И в списке плат находим Z-Uno by Z-WANE>ME
и нажимаем Install
После загрузки Плата Z-WANE>ME Z-Uno появится в списке плат
Пункт Записать Загрузчик позволяет обновить загрузчик скетча Z-Uno и стек Z-Wave до самой последней версии, входящей в пакет Z-Uno.
Также в меню появится галочка для включения шифрования (класс команд Security), компактной отправки пакетов (класс команд MultiCommand) и рабочей частоты Frequency (RU, EU, USA). Эти функции не поддерживаются некоторыми контроллерами.
В меню Файл —> Образцы появятся примеры, специфичные для Z-Uno. С них можно начать изучение возможностей Z-Uno.
Создадим 2 устройства на Z-Uno. Одно — RFID-считыватель, второе реле с двойной защелкой.
RFID-считыватель 125 кГц и метки к нему. RFID-считыватель подключается к Z-Uno по последовательному порту
Скетч для Z-Uno
ZUNO_SETUP_CHANNELS(ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_GENERAL_PURPOSE, getter)); // vars byte statusKey=0x00; unsigned long millisOK = 0; // buffer array for data receive over serial port unsigned int buffer[15]; // counter for buffer array int count = 0; // time wait packet unsigned long millis1 = 0; // the code RFID tag combo that opens the door unsigned int rfid_ok[14] = {0x2,0x30,0x31,0x30,0x30,0x30,0x37,0x30,0x36,0x30,0x35,0x30,0x35,0x3}; void setup() { Serial.begin(); // the USB Serial Serial0.begin(9600); // the Serial port of rfid reader } void loop() { // read data from rfid reader if (Serial0.available()) { millis1 = millis(); // read into buffer buffer[count] = Serial0.read(); count++; } if (millis() - millis1 > 1000 && count > 0) { // write rfid tag combo code for (int i = 0; i < count; i++) { Serial.print(buffer[i], HEX); Serial.print(" "); } // code review if (control_rfid()) { Serial.println("OK!!!"); // command to controller statusKey=0xff; zunoSendReport(1); millisOK=millis(); } else { statusKey=0x00; zunoSendReport(1); Serial.println("NO!!!"); } clearBufferArray(); millis1 = millis(); count = 0; } if(statusKey==0xff && (millis()-millisOK >= 5000)) { statusKey=0x00; zunoSendReport(1); } } // function to clear buffer array void clearBufferArray() { for (int i = 0; i < 14; i++) { buffer[i] = NULL; } } // function code review boolean control_rfid() { int count1; count1 = 0; for (int i = 0; i < 14; i++) { if (buffer[i] == rfid_ok[i]) { count1++; } } if (count1 == 14) { return true; } return false; } byte getter(void) { return statusKey; }
Загружаем скетч на плату и добавляем устройство в сеть z-wave (Включить устройство —> тройное нажатие на кнопку BTN на Z-Uno)
Появится устройство ZUNO_SENSOR_BINARY(), которое назовем rfid. Устройство принимает статус 1 при опознании выбранной метки и через 10 секунд принимает статус 0.
Дверная защелка подключена к Z-Uno через реле. При подаче 1 на выход 13 Z-Uno, на защелку подается 12В и она открывается.
Скетч для этой Z-Uno
// pin number, where relay is connected #define RELAY_PIN 13 // variable to store current relay state byte lastSetValue; // next macro sets up the Z-Uno channels // in this example we set up 1 switch binary channel // you can read more on http://z-uno.z-wave.me/Reference/ZUNO_SWITCH_BINARY/ ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_BINARY(getter, setter)); void setup() { pinMode(RELAY_PIN, OUTPUT); // set up relay pin as output } void loop() { // loop is empty, because all the control comes over the Z-Wave } // function, which returns the previously saved relay value // this function runs only once the controller asks byte getter() { return lastSetValue; } // function, which sets new relay state // this function runs only once the controller sends new value void setter(byte newValue) { // newValue is a variable, holding a "value" // which came from the controller or other Z-Wave device if (newValue > 0) { // if greater then zero digitalWrite(RELAY_PIN, HIGH); //turn relay on } else { // if equals zero digitalWrite(RELAY_PIN, LOW); //turn relay off } // save the new value in a variable lastSetValue = newValue; }
Загружаем скетч на плату и добавляем устройство в сеть z-wave (Включить устройство —> тройное нажатие на кнопку BTN на Z-Uno)
Появится устройство Z-Wave.Me Switch.
Создаем 2 приложения Если —> Тогда.
При поднесении нужной метки защелка будет открываться на 10 секунд