Отже, маючи на руках Arduino, температурні датчики, блоки реле, хочеться якомога швидше все це перетворити на розумний дім. Для централізованого управління всіма пристроями необхідний «керуючий». Можна написати таку систему самому, а можна використовувати готові рішення.
Виходячи з того, що писати якось не хочеться, то спробувати тут і зараз допоможе готова платформа для інтернет речей mydevices.com.
Дана платформа дозволяє досить просто підключати готові пристрої на мікроконтролерах.
Після реєстрації на цьому сервісі мені доступний певний перелік інструментів для отримання інформації з мого пристрою, а також управління ними.
Скільки простору надається користувачеві на цьому сервісі, я не знаю, але воно необхідне для зберігання інформації, що отримується від датчиків, тригерів тощо.
На око все здається досить простим, зручний і красивий інтерфейс з набором віджетів для різних пристроїв — бери і кидай на панель, як душа забажає.

Після налаштування всіх датчиків і реле, параметрів мікроконтролера сервіс генерує код для прошивки.
Прошиваю ардуїнку і пробую зайти на панель управління. Але, щось не все так гладко. Ну не хоче підключатися до хмари і все. Черговий день пішов на вивчення проблеми. Моя проблема вирішилася примусовою установкою ДНС на 8.8.8.8, чому не захотів ДНС мого роутера, я так і не дізнався.
Ну, що ж, найголовніше почалося. З тестового прикладу підключив одне реле і керуючи віджетом з телефону і ноутбука я радію простоті всього цього. За аналогією додаю ще 2 реле і підключаю на них освітлення діодними стрічками.
Пізніше, маючи жменю датчиків температури ds18b20, я підключив перший датчик і він запрацював. Один це мало, тим більше, що дані датчики працюють на одному піні, роблю зі звичайного датчика «всепогодний» і виставляю його на вулицю. А ще один вивів у сусідню кімнату. Залишилося прописати їх у скетчі і готово.
Насправді, я не відразу зрозумів ідеологію налаштування коду для роботи з більш ніж одним датчиком, а в мережі так і не знайшов прикладів для більш ніж одного датчика. Але, все ж розібрався і все запрацювало як треба.
Ось так виглядав інтерфейс програми на мобільному клієнті.
Після запуску програма намагається підключитися до хмарного сервісу і отримати дані з пристрою. Якщо назва пристрою неактивна – значить немає з ним зв’язку.
Після натискання на пристрій переходимо до огляду доступних віджетів підключених датчиків і виконавчих пристроїв.
Натискання на іконки реле – вмикає або вимикає їх. Натискання на температуру відкриває статистику (за годину, день, тиждень, місяць, 3 місяці, рік).

На даному зображенні відсутній графік через те, що я вже перейшов на іншу систему (розповім наступного разу) і програма при відсутності підключення до контролера не видає дані історії вимірювань.
Що мені сподобалося в цьому сервісі.
1. Простота. За якихось пару годин вже можна керувати реле.
2. Наявність планувальника. Я використовував його для автоматичного ввімкнення світла вранці замість будильника (діодна стрічка підсвічування ліжка), контрольне вимкнення всього освітлення після виходу з квартири, автоматичне ввімкнення і вимкнення у вечірній час.

Що не сподобалося.
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();
}
//————КІНЕЦЬ скетча