Введение
У.Дача – полное название «Умная дача». Изначально предназначено для управления различными системами для загородного дома:
включения обогрева и подержания температуры, поддержания уровня воды, управление уличным освещением и освещением внутри дома, автополива, автопроветривания. Но данное решение в том числе можно использовать и в квартирах и в других местах, где возникают задачи управления различными устройствами.
Сама конфигурация расположена в отдельной публикации //infostart.ru/public/1732878/
Мы рассмотрим развёртывание системы на живом примере и сможем на основе готового решения реализовать простую задачу управления.
Задача
Необходимо собрать «умное» устройство для поддержания контроля температуры и включения/выключения освещения, которым можно будет управлять с помощью мобильного приложения. Классическая система для поддержания контроля температуры состоит из электронного реле (включает/отключает подачу электрического тока на обогреватель), датчика температуры (дает понимание достигли ли нужной температуры) и микрокомпьютера (управляет реле на основании данных от датчиков). Для включения выключения освещения нам понадобится еще дополнительное реле.
Как будем решать.
Свяжем микрокомпьютер с сервером 1С и будем использовать мобильное приложение для управления сервером 1С. Микрокомпьютер будет отправлять HTTP-запрос, в параметрах которого будут данные датчиков, параметры авторизации. Ответ будет приходить в JSON-формате, в котором определяется на какой выход подать управляющий сигнал.
Схема взаимодействия будет примерно такая
Вся бизнес-логика размещается в системе 1С, микрокомпьютер служит удаленным приемником команд от сервера, с помощью которых он управляет реле и другими устройствами управления. И также микрокомпьютер передает данные с подключенных к нему различных датчиков. 1С же принимает значения датчиков и по алгоритму, заданному для каждого из выходных устройств, вычисляет какую команду нужно этому устройству отправить. Т.е. микрокомпьютер служит некоторым удаленным посредником между 1С и датчиками и между 1С и устройствами управления.
Развертывание 1С
В качестве backend системы будет использоваться 1С. При этом 1С может быть развернута как в серверном, так и в файловом виде (для простоты далее будем называть Сервер 1С и для файлового варианта и для серверного). Кроме того, эта же база будет использоваться как источник для публикации мобильного приложения 1С, в качестве сервера для запросов от мобильного приложения и микрокомпьютера, а также для конфигурирования управления умным домом.
При установке платформы 1С необходимо выбрать «Модули расширения web-сервера»
Также необходимо развернуть на сервере Apache версии 2.2, 2.4 (или любой другой web-сервер, поддерживаемый 1С).
Создайте чистую файловую или серверную чистую базу, загрузите в неё прилагаемую конфигурацию (см.публикацию //infostart.ru/public/1732878/). Далее необходимо опубликовать http-сервисы и web-сервисы (http- для обмена с микроконтроллером и мобильный приложением, web – для загрузки объектов 1с, прежде всего справочников-описаний устройств)
После выбора соответствующих настроек необходимо нажать «Опубликовать».
Для публикации мобильной части системы необходимо выбрать
Сервер 1С в должен быть подключен к Интернет со статическим (белым адресом). Это позволит управлять системой удаленно, т.е. включать/выключать устройства, которые расположены удаленно географически, например, включить тепло на даче пока вы туда едете. Вариант работы внутри одной локальной сети в едином WiFi тоже возможен.
Настройка данных 1С.
При первоначальном открытии базы заходим в справочник домов и создаем дом:
Назовем дом «Мой дом», зададим ему токен доступа, например, 4adf7886f7 и укажем описание
Дом – в данном случае это объединение нескольких устройств управления в единое окно управления на мобильном приложении, как правило, внутри одного географического положения. Домов может быть несколько, например, «квартира», «дача». Токен дома – служит для авторизации мобильного приложения, которая используется в обработке Htpp-запросов.
Нажмем «Записать» и по ссылке «Устройства» создаем новое устройство, которое, предположим, будет находится в частном доме и назовем его как «Основной дом». Зададим ему токен доступа, например, 3adf3456f7, и укажем описание «Основной дом» (допустим, еще есть гостевой дом или баня, где будет свои микрокомпьютеры для управления).
Нажмем «Записать» и введем Входные сигналы. В данном примере входной сигнал у нас будет только один – датчик температуры. Этот датчик на микрокомпьютере будет подсоединен к ножке 2:
Далее на карточке устройства введём выходные сигналы. У нас их будет 2 – управление включением и отключением реле обогрева и управление включением/выключением света:
Тут мы указали, что реле управления розеткой для обогрева будет подключаться к PIN 4 устройства, а реле для управления светом к PIN 5. Пометка "Инверсный" нужна для тех моделей реле, которые при подаче на них "+" (т.е. логической "единицы" для цифрового выхода), реле размыкают, а при подаче 0 - соединяют. Если вы не знаете какого типа у вас реле и на смартфоне при нажатии на "вкл" у вас будет выключаться, а при нажатии "выкл" включаться, то нужно будет в справочнике пометить выходной сигнал как инверсный и перезалить скетч в Arduino.
А также создадим 3 кнопки управления: 1 общая кнопка – полностью включает/выключает управление всего дома, вторую кнопку – управление обогревом холла, третья кнопка - включение освещения
Далее возвращаемся в карточку устройства закладки "Основное" и в табличной части заведем строку для управления, которая свяжет входной сигнал и выходной сигнал через кнопки управления
В колонке «алгоритм» вводится простая формула, по которому будет включаться алгоритм управления, в данном случае управление температурой будет работать, когда включены кнопки «Вкл всё» и «Холл», а освещение - когда включены «Вкл всё» и «Свет». Строка "вкл всё" не имеет входных и выходных сигналов, служит для того, чтобы на экране отобразилась кнопка управления. Она будет использоваться в алгоритмах выходных сигналов, которые мы введем в следующих строках. В колонках «Цель мин» и «Цель» вводятся значения по умолчанию для целевых значений температуры, затем в мобильном приложении пользователь уже самостоятельно введёт нужный ему параметр. Также в мобильном приложении вводится только одно целевое значение (то, до которого будет нагрев), после достижение температуры нагрева датчик будет отключен, пока не будет снижена температура в данном случае на 0.5 градусов (так называемый температурный гистерезис). Таким образом, будет поддерживается климат-контроль помещения.
После завершения ввода данных об устройстве можно автоматически сгенерировать для него код (скетч), который будет загружаться в это устройство. Это делается нажатием «Сформировать скетч»:
В открывшейся форме необходимо ввести параметры подключения к WiFi, параметры сервера для отправки http-запросов из микрокомпьютера. Эта информация затем будет сохранена в коде сформированного скетча для Arduino-устройства
В Url сервера может быть введен и локальный адрес сервера и соответствующий порт, если сервер 1С находится в той же сети, что и микрокомпьютер.
В результате получится вот такой код (скетч), который затем необходимо загрузить в устройство Arduino
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(2);
DallasTemperature t_sensors(&oneWire);
uint8_t t_count;
#define STASSID "AtlWifiMob"
#define STAPSK "01235467890"
const char* ssid = STASSID;
const char* password = STAPSK;
const char* host = "man.yourdomain.ru";
const uint16_t port = 8080;
#define D_MNG_COUNT 2
//PIN'ы управления
uint8_t d_mng_Pins[D_MNG_COUNT] = {4, 5};
//некоторые реле управляются наоборот: 0 вкл, + выкл
uint8_t d_mng_On[D_MNG_COUNT] = {HIGH, HIGH};
uint8_t d_mng_Off[D_MNG_COUNT] = {LOW, LOW};
uint8_t d_mng_Val[D_MNG_COUNT] = {0, 0};
//для парсинга
char curch;
uint8_t isKey=0;
int mng_nbr=0;
uint8_t mng_value=0;
//инициализация
void setup() {
Serial.begin(115200);
//соединение с WiFi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//t
//инициализация температурных датчиков
t_sensors.begin();
t_count = t_sensors.getDeviceCount();
//.t
//m
//инициализация PIN'ов управления
for (uint8_t i=0;i<D_MNG_COUNT;i++)
{
pinMode(d_mng_Pins[i], OUTPUT);
digitalWrite(d_mng_Pins[i], d_mng_Off[i]); //выключаем всё управление
}
//.m
}
//собственно управление выходными PIN'ами
void manageIt()
{
/*
Serial.print("<mng_nbr=");
Serial.print(mng_nbr);
Serial.print(",mng_val=");
Serial.print(mng_value);
Serial.print(", PIN");
Serial.print(d_mng_Pins[mng_nbr]);
Serial.print("=");
*/
//m
if (mng_value==1)
{
digitalWrite(d_mng_Pins[mng_nbr], d_mng_On[mng_nbr]); //вкл
//Serial.print(d_mng_On[mng_nbr]);
}
else
{
digitalWrite(d_mng_Pins[mng_nbr], d_mng_Off[mng_nbr]); //выкл
//Serial.print(d_mng_Off[mng_nbr]);
}
d_mng_Val[mng_nbr] = mng_value;
//Serial.println(">");
//.m
}
//анализ очередного символа в ответе JSON
void addChar(){
if (curch==':')
{
if(isKey==1)
isKey = 0;
}
else if(curch=='}')
{
manageIt();
return;
}
else if(curch=='{')
{
//isKey=1;
}
else if(curch=='"')
{
//кавычки пропускаем
}
else if(curch=='m')
{
isKey=1;
mng_nbr = 0; //встретили символ 'm'
mng_value = 0;
}
else if(curch==',')
{
manageIt();
isKey = 1;
}
else
{
if(isKey==1)
{
mng_nbr = mng_nbr*10 + (curch-48);
}
else if(isKey==0)
mng_value = mng_value*10 + (curch-48);
}
}
void loop() {
String url="GET /udachaSrv1/hs/setSignal?id=00001&token=3adf3456f7";
//соединямся с сервером
WiFiClient client;
if (!client.connect(host, port)) {
Serial.println("connection failed");
delay(3000);
//нет ответа, задержка, новая попытка
return;
}
if (client.connected()) {
//собираем параметры GET
//t
t_sensors.requestTemperatures();
for (uint8_t ti=0;ti<t_count;ti++)
{
float t = t_sensors.getTempCByIndex(ti);
url=url+"&ti"+ti+"="+t;
}
//.t
//do
for (uint8_t d_o=0;d_o<D_MNG_COUNT;d_o++)
{
url=url+"&do"+d_o+"="+d_mng_Val[d_o];
}
//.do
client.println(url);
Serial.println(url);
}
//получаем ответ сервера
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
//больше 5сек ожидания, задержка, новая попытка
Serial.println(">>> Client Timeout !");
client.stop();
delay(3000);
return;
}
}
//разбор (парсинг) ответа, ожидаем {"m1":0,"m2":1}
while (client.available()) {
curch = static_cast<char>(client.read());
addChar();
//Serial.print(curch);
}
//Serial.println();
client.stop();
}
Далее этот скетч необходимо загрузить в устройство Arduino. Как это сделать изложено подробнее ниже.
Сборка устройства управления.
Здесь приведены описания устройств, которые работают в том числе с высоким напряжением, поэтому перед началом работы всегда помните о технике безопасности при работе с электрическим током, а лучше не лишне будет прочитать, например, вот тут https://zen.yandex.ru/media/id/5b3cbf1fede9b500a95ba643/tehnika-bezopasnosti-v-obrascenii-s-elektricheskim-tokom-6047473858285736dd069e4f или еще где-либо.
Для реализации проекта нам понадобится микроконтроллер серии Arduino со встроенным WiFi модулем. Один из хороших вариантов - это NodeMCU, второй тоже неплохой вариант - WeMOS D1 mini. В конце статьи смотрите варианты ссылок на устройства
Ниже приведена схема сборки устройства для управления освещением.
Если сборка идёт на устройстве типа WeMOS - то там можно купить плату с реле, которое непосредственно можно воткнуть в плату с микроконтроллером: в случае, когда микрокомпьютер управляет только одним реле (например, на каждую розетку свой такой контроллер) это очень удобно.
Но у нас подразумевается подключение нескольких реле и еще датчика температуры, поэтому микрокомпьютер будет отдельно от реле.
Для учебного примера будем подключать два отдельных реле (или плату, на которой расположены сразу 2 реле), одно для управления освещением, другое - для управления розеткой, в которую будет подключаться нагреватель.
В ножку микрокомпьютра G (земля) втыкаем провод (ссылки на удобные варианты проводов для сборки этого конструктора приведены в конце статьи), который идет на питание реле, в ножку питания (3.3В или 5В) - соответственно, провод питания для реле. В ножку D5 (GPIO5) подключим провод управления реле светом. Обратите внимание на тот факт, что для устройств NodeMCU номера ножек, обозначенные на плате, несколько другие по сравнение с тем, что мы используем в коде (см.распиновку ниже в схеме), поэтому провод управления для NodeMCU мы втыкаем в ножку D1, для WeMOS - в D5.
Аналогичным образом подключаем реле для розетки управления, для нее будем использовать ножку D4 (для NodeMCU это D2). Нулевой и земляной провод электрики подключаем непосредственно к розетке, а фазовый провод заводим через это реле в разрыв, т.е. реле будет сложить выключателем розетки.
Более подробно о подключении реле можно почитать здесь https://arduinomaster.ru/datchiki-arduino/podklyuchenie-rele-k-arduino/
Осталось подключить датчик температуры. Я рекомендую использовать датчик DS18B20. Он отлично зарекомендовал себя в работе, в т.ч. и сложных погодных и температурных условиях. Для его подключения будем использовать ножку D2 (для NodeMCU это D4). Если подключается несколько датчиков температуры, то все они подключаются на одну ножку микрокомпьютера. Это возможно благодаря шине 1-wire: у каждого датчика есть свой адрес и по нему микрокомьютер будет считывать значения каждого. Вот пример схемы подключения датчиков
Есть небольшая сложность в подключении датчика: необходимо между проводом питания + и проводом данных подключить резистор на 4.7К.
Более подробно о подключении датчика температуры можно почитать здесь https://arduinomaster.ru/datchiki-arduino/arduino-ds18b20/
В целом схема подключения для NodeMCU v3 выглядит примерно так
Сам микрокомпьютер будем запитывать обычным блоком питания от телефона с проводом MicroUSB. После того как макет будет полностью собран, оттестирован и т.п., можно использовать стационарный блок питания, или, например, подключиться к питанию уже готовых собранных розеток 220В, в которых есть USB
Подготовка среды Arduino для прошивки уcтройств.
Скачиваем и устанавливаем среду Arduino IDE https://www.arduino.cc/en/software (автор использует версию Arduino IDE 1.8.19)
После установки необходимо провести подготовительные действия.
В работе планируется использовать устройства на базе WiFi модуля ESP8266. Для того, чтобы появилась возможность работы с этими устройствами установим соответствующие библиотеки. Для этого необходимо в настройках указать дополнительные настройки для менеджера плат
Укажем в поле "Дополнительные ссылки.." следующую строку http://arduino.esp8266.com/stable/package_esp8266com_index.json
Далее идем в менеджер плат
И в поиске вводим ESP8266, выбираем необходимый пакет и устанавливаем его
При этом в меню выбора плат появляются необходимые нам платы
Если мы работаем с устройством NodeMCU, то выбираем его
И настраиваем устройство. Порт выбираете тот, который у вас отображается в диспетчере устройств для USB-Serial CH340
Аналогично настраиваем устройство WeMOS, если используем его.
Также установим необходимые библиотеки для работы с датчиками температуры
Установим библиотеку OneWire, для этого начнём набирать название библиотеки, выберем найденную и установим
Аналогичным образом установим библиотеку DallasTemperature
Итак, мы установили среду Arduino, добавили пакет для работы с необходимыми нам платами на базе ESP8266, а также установили библиотеки для работы с температурными датчиками.
Для того чтобы загрузить скетч в устройство, необходимо выбрать необходимую плату в меню инструменты, выбрать порт как описано выше, а затем нажать "Загрузить"
PS. Формируемый скетч из 1с в виде текстового файла "не нравится" среде Arduino, при открытии подсвечивается первая строка темным цветом, необходимо встать в самое начало скетча, нажать Del, удалится невидимый файл, при этом #include станет зеленым и можно прошивать скетч в устройство
Работа с мобильным приложением
Мобильную платформу можно установить, скачав платформу с сайта ИТС. Необходима версия 8.3.13 и выше. Следуйте рекомендациям по установке мобильной платформы. Для Android достаточно из скачанного дистрибутива перенести Apk-файл на своё мобильное устройство apk-файл «1cem-arm.apk» и установить его, затем добавить опубликованное мобильное приложение, например вот так.
При открытии приложения в окне
необходимо открыть настройки и ввести необходимые параметры: url сервера, путь к серверу публикации http-сервисов, а также код и токен дома
Само окно управления открывается по кнопке "Управление":
При этом все необходимые элементы управления на экране создаются автоматически на основании данных в веденных в справочники Домов и Устройств в пользовательском режиме приложения 1С, расположенного на сервере
На этом резвёртывание системы завершено и можно попробовать поуправлять умным домом с помощью установленного и настроенного приложения
Дополнительные материалы. Ссылки на используемые устройства
- NodeMCU v3
Примерная стоимость 130руб (цены приведены примерные, на момент написания статьи, все ссылки ориентировочные, никакой финансовой заинтересованности в них у автора нет, поэтому можно легко использовать другие).
- WeMOS D1 mini
Если у вас нет навыка пайки ножек на платы, то рекомендую связываться с поставщиком и попросить прислать с напаянными ножками. Выглядеть это будет примерно вот так
WeMOS удобен тем, что в него можно вставить другой модуль – реле.
- Реле бывают нескольких видов. Более простой вариант - контактное реле с оптроном.
Пример ссылки
Также часто используются твердотельные реле
или в таком варианте
При выборе реле необходимо ОБЯЗАТЕЛЬНО учитывать нагрузку, которая будет использоваться и выбирать ток, соответствующий ей 2А, 6A, 10А и т.п. А также необходимо учитывать, что твердотельные реле имеют свойство нагреваться и возможно потребуется дополнительные радиатор и т.п.
Подробнее о реле можно почитать, например тут https://zen.yandex.ru/media/semfik/glavnye-pliusy-i-minusy-tverdotelnyh-rele-5f55d19372b2bd4697aba7e2 или тут https://elektrikexpert.ru/tverdotelnoe-rele.html
И пожалуйста, не забывайте о технике безопасности по работе с электрическим током при работе с реле!
- Также рекомендую приобрести набор проводов
https://aliexpress.ru/item/1005002000655439.html?spm=a2g2w.productlist.list.4.75122ccfm0Frvq&sku_id=12000018371624180 c комбинациями «папа-папа», «мама-мама», «папа-мама». Эти провода послужат для соединения микроконтроллера с устройствами управления в случаях, если они не модульные, например, Вы заходите подключить отдельное твердотельное реле.
- Блок питания нам понадобится самый обычный от телефона, MicroUSB, с током от 0.5А. Для более серьёзных систем (если вы хотите подключить несколько реле к одному устройству, много разных датчиков) я рекомендую стационарный блок питания.
- Датчик температуры DS18B20