Arduino. Умный дом с cayenne.mydevices.com

Итак, имея на руках Arduino, температурные датчики, блоки реле хочется как можно быстрее все это превратить в умный дом. Для централизованного управления всеми устройствами необходим «управляющий». Можно написать такую систему самому, а можно использовать готовые решения.
Исходя из того, что писать как-то не хочется, то попробовать здесь и сейчас поможет готовая платформа для интернет вещей mydevices.com.

Данная платформа позволяет достаточно просто подключать готовые устройства на микроконтроллерах.

После регистрации на этом сервисе мне доступен определенный перечень инструментов для получения информации с моего устройства, а также управление ими.

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

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

Скриншот Android mydevices.com

После настройки всех датчиков и реле, параметров микроконтроллера сервис генерирует код для прошивки.
Прошиваю ардуинку и пробую зайти на панель управления. Но, что-то не все так гладко. Ну не хочет подключаться к облаку и все. Очередной день ушел на изучение проблемы. Моя проблема разрешилась принудительной установкой ДНС на  8.8.8.8, почему не захотел ДНС моего роутера, я так и не узнал.

Ну, что же, самое главное началось. Из тестового примера подключил одно реле и управляя виджетом из телефона и ноута я радуюсь простоте всего этого. По аналогии добавляю еще 2 реле и подключаю на них освещение диодными лентами.

Позже, имея жменю датчиков температуры ds18b20 я подключил первый датчик и он заработал. Один это мало,тем более, что данные датчики работают на одном пине, делаю из обычного  датчика «всепогодный» и выставляю его на улицу. А еще один вывел в соседнюю комнату. Осталось прописать их в скетче и готово.

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

Вот так выглядел интерфейс программы на мобильном клиенте.

После запуска, программа пытается подключиться к облачному сервису и получить данные с устройства. Если название устройства неактивное — значит нет с ним связи.
Скриншот Android mydevices.comПосле нажатия на устройство переходим к обзору доступных виджетов подключенных датчиков и исполнительных устройств.
Скриншот Android mydevices.comНажатие на иконки реле — включает или отключает их. Нажатие на температуру открывает статистику (за час, день, неделю, месяц, 3 месяца, год).
Скриншот Android mydevices.comНа данной картинке отсутствует график по причине того, что я уже перешел на другую систему (расскажу в следующий раз) и программа при отсутствии подключения к контроллеру не выдает данные истории измерений.

Что понравилось мне в этом сервисе.
1. Простота. За каких-то пару часов уже можно управлять реле.
2. Наличие планировщика. Его я использовал для автоматического включения света утром вместо будильника (диодная лента подсветки кровати), контрольное выключение всего освещения после ухода из квартиры, автоматическое включение и выключение в вечернее время.
Скриншот Android mydevices.com Скриншот Android mydevices.com

Что не понравилось.
1. Очень малая библиотека виджетов для устройств.
2. Иногда отсутствовала связь с облачным сервером и устройство не выполняло запланированные функции.
3. После добавления второго и третьего реле — планировщик через некоторое время (3-5 дней) переставал выполнять запланированные мероприятия. А для того, чтобы его восстановить, необходимо все задания удалить и завести их заново. Также, удалить мероприятие можно только! в десктопной версии, в мобильной можно только создавать. Для меня, основное удобство этого сервиса — автономная работа планировщика. После 4-го сноса всего и повторного прописывания пришлось искать альтернативу.
4. Мобильный клиент не захотел становиться на телефоны THLW100 и Lenovo S660 и получается что управлять мог только я, а это очень неудобно.

Если стабилизировать работу планировщика, то этот сервис достаточно неплох для своих функций, но мои хотелки он уже не удовлетворяет.

Я нашел для себя новый сервис https://majordomo.smartliving.ru. Сервис бесплатный, может работать на собственном контроллере и…. ну там много всего хорошего и удобного. Это уже материал следующей статьи, хотя в сети достаточно разнообразной информации по нему.

Мой скетч на 3 реле и 3 датчика ds18b20, может кому будет интересно — пользуйтесь на здоровья.
/*
Рабочий скетч домовой!!!!!
*/

#define CAYENNE_PRINT Serial // Comment this out to disable prints and save space
// If you’re not using the Ethernet W5100 shield, change this to match your connection type. See Communications examples.
#include <CayenneEthernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define VIRTUAL_PIN 1
#define RELAY_DIGITAL_PIN 4
#define VIRTUAL_PIN2 2
#define RELAY_DIGITAL_PIN2 5
#define VIRTUAL_PIN3 3
#define RELAY_DIGITAL_PIN3 6
#define VIRTUAL_PIN8 V8
const int tmpPin = 8;
OneWire oneWire(tmpPin);
#define VIRTUAL_PIN9 V9
#define VIRTUAL_PIN10 V10
DallasTemperature sensors(&oneWire);
// Cayenne authentication token. This should be obtained from the Cayenne Dashboard.
char token[] = «werhyikrt9jhy»;

void setup(){
pinMode(RELAY_DIGITAL_PIN, OUTPUT);
pinMode(RELAY_DIGITAL_PIN2, OUTPUT);
pinMode(RELAY_DIGITAL_PIN3, OUTPUT);
digitalWrite(RELAY_DIGITAL_PIN, HIGH);
digitalWrite(RELAY_DIGITAL_PIN2, HIGH);
digitalWrite(RELAY_DIGITAL_PIN3, HIGH);
Serial.begin(9600);
Cayenne.begin(token);
sensors.begin();
}

CAYENNE_OUT(VIRTUAL_PIN8){
// Send the command to get temperatures.
sensors.requestTemperatures();
// This command writes the temperature in Celsius to the Virtual Pin.
Cayenne.celsiusWrite(VIRTUAL_PIN8, sensors.getTempCByIndex(0));
// To send the temperature in Fahrenheit use the corresponding code below.
//Cayenne.fahrenheitWrite(VIRTUAL_PIN, sensors.getTempFByIndex(0));
}

CAYENNE_OUT(VIRTUAL_PIN9){
sensors.requestTemperatures();
Cayenne.celsiusWrite(VIRTUAL_PIN9, sensors.getTempCByIndex(1));
sensors.getTempFByIndex(0));
}

CAYENNE_OUT(VIRTUAL_PIN10){
sensors.requestTemperatures();
Cayenne.celsiusWrite(VIRTUAL_PIN10, sensors.getTempCByIndex(2));
sensors.getTempFByIndex(0));
}

CAYENNE_IN(VIRTUAL_PIN){
int currentValue = getValue.asInt(); // 0 to 1
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN, LOW);
}
}

CAYENNE_IN(VIRTUAL_PIN2){
int currentValue = getValue.asInt(); // 0 to 1
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN2, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN2, LOW);
}
}

CAYENNE_IN(VIRTUAL_PIN3){
int currentValue = getValue.asInt(); // 0 to 1
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN3, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN3, LOW);
}
}

void loop(){
Cayenne.run();
}
//————КОНЕЦ скетча

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

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