Делаем GSM-термометр своими руками

Оглавление статьи: Делаем GSM-термометр своими руками
Содержание

Много говорят в интернете о тех сферах жизни, где можно использовать «интеллектуальные» устройства на основе микроконтроллеров. Речь идет не только о промышленных станках, или к примеру светофорах, но и об обычных домашних нишах: уборке, стирке, коммуникациях, игрушках, часах или климатических системах. Последние особенно актуальны у владельцев собственного и отдельного жилья, с частным отоплением.

Котельная для многоэтажных домов

Обитатели жилищных массивов даже не представляют себе, насколько в реальности проблемно поддерживать комфортную температуру отдельного дома или дачи в зависимости от сезона. Летом душно и жарко, зимой холодно. Конечно, частично проблему можно решить купив множество кондиционеров, но и они имеют свои критичные параметры использования. К примеру, нельзя включать такую технику, если на улице температура падает ниже −5 °C. Вот и приходится зимой круглосуточно жечь отопление, а летом по прибытию домой с работы устраивать вентиляцию. Самое главное, что в обоих случаях человеку создается неудобство. В первом или тратиться уйма денег на обогрев, или дом выстынет. Во втором, много лишних телодвижений.

Пример отопления частного дома

Решение есть — создание своеобразного цифрового «слуги» на основе микроконтроллера, который будет включать отопление на полную перед приходом хозяев зимой, или проветривать помещение в аналогичное время летом. Здесь хорошо подойдет такой вариант логического модуля, как Ардуино. Его ценовая доступность и техническая оснащенность позволяет с легкостью использовать его в деле управления климатическим оборудованием.

Правда есть один нюанс в автоматизированных системах. Логическая техника хоть и надежна, но иногда сбоит. Соответственно требуется контроль действий Arduino, во избежание аварийных ситуаций. Иначе при их возникновении можно вернуться с работы не просто домой, а на пепелище.

Среди доступных схем реализации взят, ставший уже классическим, GSM термометр на основе Arduino. Причина проста — копеечная цена компонентов, и на сам микроконтроллер, и на его обвязку.

Структурная схема GSM термометра

Что имеем

Небольшой деревянный частный дом с отоплением электрическим тэном на 10 кВт. Управлением им осуществляется в ручном режиме пятью выключателями, каждый из которых присоединяет к линии питания отдельный нагревательный элемент. Вентиляция выполнена общей чердачной трубой с распределением рукавов по комнатам и всасыванием воздуха посредством компрессора.

Что хотим

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

Частный дом для установки системы с GSM

Кроме того, нужно учесть форс-мажорный вариант, когда жители дома решили вернуться раньше и предварительно «вручную» требуется запустить процесс создания комфортной температуры. Обязательно нужен и режим удаленного отключения, для блокировки взаимодействия системы с отоплением и вентилятором.

Нужно предусмотреть и требования безопасности, чтобы посторонние не «игрались» климат-контролем дома.

Итак, разложим названое по пунктам:

  • Управление осуществляется только с трех номеров.
  • При запросе отправляется СМС с информацией о текущей температуре и активности климатических систем.
  • В зависимости от сезона, при уходе температуры за установленные значения охлаждать или нагревать воздух в помещениях.
  • Учитывать, что для отопления дома требуется минимум включение его за час. Вентиляцию достаточно активировать за двадцать минут.
  • При получении сообщения «включить» проветрить или нагреть помещение. Схема системы охлаждения дома
  • SMS «выключить» укажет на прекращение контроля за исполняющими устройствами.
  • Среди настроек сделать установку мастер-номера и вторичных командных.
  • При получении команд не от мастер-номера, сбрасывать на него копию проводимых изменений.
  • Предусмотреть сброс до «заводских» параметров.
  • Обрабатывать ошибки часов сети или недоступность показаний термометра. Информировать владельцев путем СМС о происходящем.
  • Распланировать установку минимальных и максимальных лимитов через сообщения сотовой связи.

Необходимые компоненты

Наименование Количество
Arduino 1
Датчик температуры LM35 или подобный 1
Блок питания на 5 В 1
Релейный модуль на четыре линии 1
GSM модуль SIM800L 1
Светодиоды отличающихся цветов 3
Разные резисторы

Можно заметить, что в списке компонентов нет отдельных часов. Они и не нужны. Будет использоваться время GSM сети.

Структурная схема синхронизации сети

Здесь требуется маленькое отступление: не все операторы поддерживают такую возможность. Следует ее вначале проверить, прогнав в тестовом режиме через SIM800L команды:

AT+CTZU=1\r\n
AT+CREG=1\r\n
AT+CCLK?\r\n

Результат будет получен от модема в форме:

+CCLK: "00/01/01,05:44:53+00"

Причем число и время должны быть близки реальным.

Схема

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

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

Электрическая схема системы с GSM термометром

Соответствие выходов Arduino UNO:

Порт Arduino К чему подключен
A0 Показания LM35
D7 TX GSM модуля
D8 RX GSM модуля
D2 Свободен
D3 IN1 релейного модуля
D4 IN2 релейного модуля
D5 IN3 релейного модуля
D6 IN4 релейного модуля
D10 Белый светодиод
D11 Зеленый светодиод
D12 Красный светодиод

Обратите внимание, что к SIM800L приходит отдельное питание с напряжением от +3.3 до 4.2 В получаемое классическим делителем от БП на пять вольт. Причина состоит в неспособности Ардуино пропускать 2 А тока нужных модулю SIM800L для работы.

Тем не менее GND обязан быть общим между приемником GSM и микроконтроллером.

Скетч

Теперь программа, которая управляет GSM терморегулятором:

/*
* Пины Arduino на которых висит оборудование
*/
#define LM35_pin A0
#define SIM800L_tx 7
#define SIM800L_rx 8
#define LEDG_pin 12
#define LEDR_pin 11
#define LEDW_pin 10
#define RELAY_WIND 3
#define RELAY_HOT1 4
#define RELAY_HOT2 5
#define RELAY_HOT3 6
/*
*  мало памяти, некоторые строки помещаем в флеш
*/
const char sms_0[] PROGMEM = "Учет выходных включен";
const char sms_1[] PROGMEM = "Учет выходных выключен";
const char sms_2[] PROGMEM = "Ручное включение климатической системы осуществлено";
const char sms_3[] PROGMEM = "Температура контролируется автоматически";
const char sms_4[] PROGMEM = "Система контроля климата отключена";
const char sms_5[] PROGMEM = "Изменена температура холодно на ";
const char sms_6[] PROGMEM = "Изменена температура жарко на ";
const char sms_7[] PROGMEM = "Установлен второй номер ";
const char sms_8[] PROGMEM = "Установлен третий номер ";
const char sms_9[] PROGMEM = "Вы установлены главным номером ";
const char sms_10[] PROGMEM = "Изменено время прихода на ";
const char sms_11[] PROGMEM = "Изменено время ухода на ";
const char* const sms_table[] PROGMEM = {sms_0, sms_1, sms_2, sms_3, sms_4,sms_5,sms_6,sms_7,sms_8,sms_9,sms_10,sms_11};
#define _FA "Климатическое оборудование активно. Температура "
#define _FD "Климатическое оборудование выключено. Температура "
#include <EEPROM.h>
#include <SoftwareSerial.h>
SoftwareSerial SIM800(SIM800L_rx, SIM800L_tx);
bool delete_old_message = false;
String SIM800_received    = "";// Ответы от модема
long LU = millis();      // Тики когда последний раз проверяли смс
long updLeng   = 60000;    // Частота опросов поступления сообщений
/*
* Базовая конструкция с данными программы в энергонезависимой памяти
*/
struct t_memory_data{
int8_t check_first_start = 69;   // маленький фокус - при первом старте, с вероятность 254 к 1 там будет другое число
String phones = "+7xxxxxxxxxx, +7xxxxxxxxxx, +7xxxxxxxxxx";   // Белый список телефонов
float min_t, max_t;                                           // минимальная и максимальная температура активации
int8_t in_m_hh,in_m_mm;  // время, начиная с которого люди дома часы, минуты
int8_t out_m_hh,out_m_mm; // время, после которого люди отсутствуют дома часы, минуты
bool weekends=true;    // учитывать выходные
};
t_memory_data memory_data;
float current_t;  // текущая температура
/*
* Структура, в которой будет храниться текущее время
*/
struct t_current_datetime{
int8_t yy,mo,dd,hh,mm,ss;  // год,месяц,день,часы,минуты
};
t_current_datetime current_datetime;
bool is_active=false;     //флаг ТЕКУЩЕГО статуса
bool manual_on=false;     //флаг ручного ВКЛЮЧЕНИЯ отопления или вентиляции
void setup() {
Serial.begin(9600);                                         // Скорость обмена данными с компьютером
SIM800.begin(9600);                                         // Скорость обмена данными с модемом
to_SIM800("AT", true);                                  // Отправили AT для настройки скорости обмена данными
to_SIM800("AT+CMGDA=\"DEL ALL\"", true);               // Удаляем все SMS, чтобы не забивать память
// Команды настройки модема при каждом запуске
to_SIM800("AT+CLIP=1", true);             // Включаем АОН
//to_SIM800("AT+DDET=1", true);             // Включаем DTMF
//sendATComman("ATE0=0",true);            // Отключаем "эхо" модема
to_SIM800("AT+CMGF=1;&W", true);           // SIM800 переводиться в режим текста для смс (+сохранить)
LU = millis();
// Подготавливаем индикаторы
pinMode( LEDG_pin, OUTPUT );
pinMode( LEDR_pin, OUTPUT );
pinMode( LEDW_pin, OUTPUT );
// Установка для датчика температуры
pinMode( LM35_pin, INPUT );
// Чтение предварительно записанного из EEPROM
int8_t test_var;
EEPROM.get(16,test_var);
if (test_var!=69){
// Скетч ранее не запускался, сохраняем в EEPROM умолчания
EEPROM.put(16,memory_data);
// Заодно устанавливаем режим синхронизации времени на модеме и сбрасываем последний (делается 1 раз)
to_SIM800("AT+CLTS=1",true);
to_SIM800("AT&W",true);
// Выключение/включение по причине периодических глюков CFUN=1,1
to_SIM800("AT+CFUN=0",true);
to_SIM800("AT+CFUN=1",true);
}
EEPROM.get(16,memory_data);
}
String to_SIM800(String cmd, bool waiting) {
String retri_ = "";
SIM800.println(cmd);
if (waiting) {
retri_ = waitResponse();
// При ATE0=0 три строки далее удалить
if (retri_.startsWith(cmd)) {
retri_ = retri_.substring(retri_.indexOf("\r", cmd.length()) + 2);
}
}
return retri_;
}
String waitResponse() {      // Функция ожидания ответа и возврата полученного результата
String retri_ = "";     // здесь хранится ответ от SIM800
long out_of_time = millis() + 10000;
while (!SIM800.available() && millis() < out_of_time)  {};
if (SIM800.available()) {
retri_ = SIM800.readString();
}
return retri_;
}
void send_a_message(String phone, String message)
{
to_SIM800("AT+CMGS=\"" + phone + "\"", true); // вводим смс
to_SIM800(message + "\r\n" + (String)((char)26), true);   // оканчиваем \13\26
}
/*
* Выдергиваем время и дату "в лоб"
*/
void set_current_datetime(String SimBuff){
char res_t[4]="00";
if (SimBuff.indexOf("+CCLK:")>-1) {
res_t[0]=SimBuff[8];
res_t[1]=SimBuff[9];
current_datetime.yy=atoi(res_t);
res_t[0]=SimBuff[11];
res_t[1]=SimBuff[12];
current_datetime.mo=atoi(res_t);
res_t[0]=SimBuff[14];
res_t[1]=SimBuff[15];
current_datetime.dd=atoi(res_t);
// Часы,минуты,секунды
res_t[0]=SimBuff[17];
res_t[1]=SimBuff[18];
current_datetime.hh=atoi(res_t);
res_t[0]=SimBuff[20];
res_t[1]=SimBuff[21];
current_datetime.mm=atoi(res_t);
res_t[0]=SimBuff[23];
res_t[1]=SimBuff[24];
current_datetime.ss=atoi(res_t);
}
}
/*
* Получение текущей температуры
*/
float get_current_t(){
return analogRead(LM35_pin)/1023*5*1000/10;
}
void _deactivate(){
// здесь безразлично -- отключаем все
digitalWrite(RELAY_WIND,LOW);
digitalWrite(RELAY_HOT1,LOW);
digitalWrite(RELAY_HOT2,LOW);
digitalWrite(RELAY_HOT3,LOW);
is_active=false;
}
void _activate(){
//если лето и current_t>max_t активируем вентилятор месяца подкорректируйте под свой климат
if ((current_datetime.mm>4) && (current_datetime.mm<11) && (current_t>memory_data.max_t)){
digitalWrite(RELAY_WIND,HIGH);
} else if (current_t<memory_data.min_t){
//в остальных случаях, если зима и холодно (current_t < min_t) включаем отопление
digitalWrite(RELAY_HOT1,HIGH);
digitalWrite(RELAY_HOT2,HIGH);
digitalWrite(RELAY_HOT3,HIGH);
}
is_active=true;
}
/*
* Возвращает день недели, 1-Пн,7-Вс
*/
int what_day(){
int8_t a = (14 - current_datetime.mo) / 12;
int8_t y = current_datetime.yy - a;
int8_t m = current_datetime.mo + 12 * a - 2;
float _tret=(7000 + (current_datetime.dd + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7;
if (_tret==0) _tret=7;
return _tret;
}
void set_min_t(String sender_sms_phone, String temp){
char t[4];
char buff[43];
temp.toCharArray(t,4);
memory_data.min_t=atof(t);
EEPROM.put(16,memory_data);
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[5])));
send_a_message(sender_sms_phone,buff+temp);
if (sender_sms_phone!=memory_data.phones.substring(0,12))
send_a_message(memory_data.phones.substring(0,12),buff+temp);
}
void set_max_t(String sender_sms_phone, String temp){
char t[4];
char buff[43];
temp.toCharArray(t,4);
memory_data.max_t=atof(t);
EEPROM.put(16,memory_data);
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[6])));
send_a_message(sender_sms_phone,buff+temp);
if (sender_sms_phone!=memory_data.phones.substring(0,12))
send_a_message(memory_data.phones.substring(0,12),buff+temp);
}
void set_sequrity_phone2(String smsphone){
char buff[43];
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[7])));
memory_data.phones=memory_data.phones.substring(0,16)+smsphone+memory_data.phones.substring(26,40);
EEPROM.put(16,memory_data);
send_a_message(memory_data.phones.substring(0,12),buff+smsphone);
}
void set_sequrity_phone3(String smsphone){
memory_data.phones=memory_data.phones.substring(0,30)+smsphone;
EEPROM.put(16,memory_data);
char buff[43];
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[8])));
send_a_message(memory_data.phones.substring(0,12),buff+smsphone);
}
void set_sequrity_phone1(String smsphone){
memory_data.phones=smsphone+memory_data.phones.substring(12,40);
EEPROM.put(16,memory_data);
char buff[43];
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[9])));
send_a_message(memory_data.phones.substring(0,12),buff);
}
/* время-прихода-ухода */
void set_time_in(String sender_sms_phone, String intime){
char tt[4];
tt[0]=intime[0];
tt[1]=intime[1];
memory_data.in_m_hh=atoi(tt);
tt[0]=intime[3];
tt[1]=intime[4];
memory_data.in_m_mm=atoi(tt);
EEPROM.put(16,memory_data);
char buff[43];
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[10])));
send_a_message(sender_sms_phone,buff+intime);
if (sender_sms_phone!=memory_data.phones.substring(0,12))
send_a_message(memory_data.phones.substring(0,12),buff+intime);
}
void set_time_out(String sender_sms_phone,String outtime){
char tt[4];
tt[0]=outtime[0];
tt[1]=outtime[1];
memory_data.out_m_hh=atoi(tt);
tt[0]=outtime[3];
tt[1]=outtime[4];
memory_data.out_m_mm=atoi(tt);
EEPROM.put(16,memory_data);
char buff[43];
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[11])));
send_a_message(sender_sms_phone,buff+outtime);
if (sender_sms_phone!=memory_data.phones.substring(0,12))
send_a_message(memory_data.phones.substring(0,12),buff+outtime);
}
void loop() {
/* Работа с модемом в цикле  */
if (LU + updLeng < millis() ) {                    // Смотрим, не послали ли нам что-то
do {
SIM800_received = to_SIM800("AT+CMGL=\"REC UNREAD\",1", true);
if (SIM800_received.indexOf("+CMGL: ") > -1) {
int message_fullIndex = SIM800_received.substring(SIM800_received.indexOf("+CMGL: ") + 7, SIM800_received.indexOf("\"REC UNREAD\"", SIM800_received.indexOf("+CMGL: ")) - 1).toInt();
char i = 0;
do {
i++;
SIM800_received = to_SIM800("AT+CMGR=" + (String)message_fullIndex + ",1", true);
SIM800_received.trim();
if (SIM800_received.endsWith("OK")) {
if (!delete_old_message) delete_old_message = true;
to_SIM800("AT+CMGR=" + (String)message_fullIndex, true);
to_SIM800("\n", true);
work_on_message(SIM800_received);
break;
}
else {
digitalWrite(LEDR_pin,HIGH);// Какая-то ошибка
to_SIM800("\n", true);
}
} while (i < 10);
break;
}
else {
LU = millis();                                    // Обнуляем таймер
if (delete_old_message) {
to_SIM800("AT+CMGDA=\"DEL READ\"", true);           // Удаляем все прочитанные сообщения
delete_old_message = false;
}
break;
}
} while (1);
}
/*
* Запрашиваем у модема время и дату, устанавливаем ее в системе
*/
set_current_datetime(to_SIM800("AT+CCLK?",true));
current_t=get_current_t(); //получаем текущую температуру в помещении
/* Устанавливаем индикаторы в текущий режим работы
* зеленый горит - климатическое оборудование активно
* белый - ручной режим
* красный загарается при ошибке, но это не здесь
*/
if (manual_on) digitalWrite(LEDW_pin,HIGH); else digitalWrite(LEDW_pin,LOW);
if (is_active) digitalWrite(LEDG_pin,HIGH); else digitalWrite(LEDG_pin,LOW);
// совпадение времени с установленным промежутком и при отключенном ручном режиме работаем
if (!manual_on){
//проверяем время, чтобы не путаться распишем через дополнительные переменные
int ct=current_datetime.hh*60+current_datetime.mm;//текущее время
int m_mout=memory_data.out_m_hh*60+memory_data.out_m_mm;//время начала экономии
int m_min=memory_data.in_m_hh*60+memory_data.in_m_mm;
if ((ct>m_mout)&&(ct<m_min)){
// экономим, если не стоит флаг выходных
if (memory_data.weekends){
switch(what_day()){
case 1:_deactivate();
break;
case 2:_deactivate();
break;
case 3:_deactivate();
break;
case 4:_deactivate();
break;
case 5:_deactivate();
break;
}
} else _deactivate(); //экономить без оглядки на выходные
}
}
if (SIM800.available())   { // SIM800 что-то послал
SIM800_received = waitResponse();
SIM800_received.trim();
if (SIM800_received.indexOf("+CMTI:")>-1) {// Модем вернул подтверждение, что сообщение выслано
LU = millis() -  updLeng;
}
}
}
void work_on_message(String message_full) {       // Разбор Сообщения
String smshead  = "";
String smstext    = "";
String sender_sms_phone   = "";
message_full = message_full.substring(message_full.indexOf("+CMGR: "));
smshead = message_full.substring(0, message_full.indexOf("\r"));            // Выдергиваем телефон
smstext = message_full.substring(smshead.length() + 2);
smstext = smstext.substring(0, smstext.lastIndexOf("OK"));  // Выдергиваем текст SMS
smstext.trim();
int8_t StIdx = smshead.indexOf("\",\"") + 3;
int8_t EdIdx = smshead.indexOf("\",\"", StIdx);
sender_sms_phone = smshead.substring(StIdx, EdIdx);
if (sender_sms_phone.length() > 6 && memory_data.phones.indexOf(sender_sms_phone) > -1) { // Если телефон в белом списке, то...
/*
* Обрабатываем команду с акцентированых телефонов!
*/
char buff[80];
if (smstext.indexOf("установить номер2")>-1) {
set_sequrity_phone2(smstext.substring(33,48));
}
if (smstext.indexOf("установить номер3")>-1) {
set_sequrity_phone3(smstext.substring(33,48));
}
if (smstext.indexOf("установить время прихода")>-1) set_time_in(sender_sms_phone,smstext.substring(47,52));
if (smstext.indexOf("установить время ухода")>-1) set_time_out(sender_sms_phone,smstext.substring(43,48));
if (smstext.indexOf("установить холодно")>-1) set_min_t(sender_sms_phone,smstext.substring(36,smstext.length()));
if (smstext.indexOf("установить жарко")>-1) set_max_t(sender_sms_phone,smstext.substring(32,smstext.length()));
if (smstext.indexOf("учитывать выходные")>-1) {
memory_data.weekends = true;
EEPROM.put(16,memory_data);
// нулевая смс
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[0])));
send_a_message(sender_sms_phone,buff);
if (sender_sms_phone!=memory_data.phones.substring(0,12))
send_a_message(memory_data.phones.substring(0,12),buff);
}
if (smstext.indexOf("не учитывать выходные")>-1) {
memory_data.weekends = false;
EEPROM.put(16,memory_data);
// первая смс
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[1])));
send_a_message(sender_sms_phone,buff);
if (sender_sms_phone!=memory_data.phones.substring(0,12))
send_a_message(memory_data.phones.substring(0,12),buff);
}
if (smstext.indexOf("инфо")>-1){
if (is_active)
send_a_message(sender_sms_phone,_FA+ String(current_t) +"C");
else
send_a_message(sender_sms_phone,_FD+ String(current_t) +"C");
}
if (smstext.indexOf("включить")>-1){ // ручное включение
manual_on=true;
_activate();
// вторая смс
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[2])));
send_a_message(sender_sms_phone,buff);
if (sender_sms_phone!=memory_data.phones.substring(0,12))
send_a_message(memory_data.phones.substring(0,12),buff);
}
if (smstext.indexOf("авто")>-1){
// работа в обычном режиме
manual_on=false;
_deactivate();
// третья смс
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[3])));
send_a_message(sender_sms_phone,buff);
if (sender_sms_phone!=memory_data.phones.substring(0,12))
send_a_message(memory_data.phones.substring(0,12),buff);
}
if (smstext.indexOf("выключить")>-1){ // ручное отключение
manual_on=true;
_deactivate();
// четвертая смс
strcpy_P(buff, (char*)pgm_read_word(&(sms_table[4])));
send_a_message(sender_sms_phone,buff);
if (sender_sms_phone!=memory_data.phones.substring(0,12))
send_a_message(memory_data.phones.substring(0,12),buff);
}
}
// установка главного телефона может быть только на сброшеном на дефолт скетче
if ((smstext.indexOf("установить главный номер")>-1) && (memory_data.phones.substring(0,12)=="+7xxxxxxxxxx"))
set_sequrity_phone1(sender_sms_phone);
}

Скачать текст программы можно здесь:

https://cloud.mail.ru/public/uDWS/d7PTGdRtQ

Что в скетче пока не реализовано — включение тепла/вентиляции заранее. Приходится выставлять время приблизительно. Кроме того, не добавлена функция сброса до «заводских настроек». В остальном все работает. Недостающую функциональность не сложно внести по аналогии с остальными возможностями цифрового помощника.

Микроконтроллер Arduino

Как пользоваться

Три индикатора в виде светодиодов устройства показывают его текущее состояние. Зеленый — включено отопление или вентиляция, белый сообщает о ручном режиме, красный указывает на ошибку. Управление осуществляется только по СМС. Если на первый запуск скетча в энергонезависимой памяти нет данных, они туда прописываются. Установить мастер-телефон (главный), можно только в том случае, если его нет среди сохраненных в Arduino. В таком случае, на управляющее устройство высылается СМС с текстом «установить главный номер». Обратно вернется сообщение с подтверждением.

Обратите внимание: важно, чтобы расстояние между командных слов содержали не более одного пробела, а сами они должны быть написаны нижней раскладкой (без больших букв).

Остальные команды:

СМС Описание Ответ
инфо Запрос текущего состояния Будет ответное сообщение с информацией о текущей температуре и режиме работы
установить номер2  xxxxxxxxxx Установка второго административного номера, его нужно указать вместо xxxxxxxxxx, без кода страны Подтверждающее СМС
установить номер3  xxxxxxxxxx Установка третьего административного номера, он указывается вместо xxxxxxxxxx, без кода страны
установить время прихода ЧЧ:ММ Время, когда возвращаются домой
установить время ухода ЧЧ:ММ После этого времени будет экономиться энергия
установить холодно X Установить температуру X, ниже которой будет включаться отопление.
установить жарко x Установить температуру X, выше которой будет запускаться вентиляция
учитывать выходные На выходных днях не экономить электроэнергию
не учитывать выходные Отменяет предыдущую команду.
включить Активировать отопление или вентиляцию, ручной режим работы
авто Автоматическое управление обогревом и охлаждением (обычный режим работы)
выключить Выключить отопление или вентиляцию, перейти в ручной режим

Выполнение всех перечисленных последовательностей приведет к отправке дополнительной информационной СМС на мастер-номер, с описанием сделанных изменений. Исключение составит команда «инфо». Ответ на нее не дублируется.

Готовые модели

Самостоятельное изготовление GSM термостата не единственный способ его приобретения. Существуют аппараты подобного класса, производимые серийно. Основная направленность их использования, как и в случае самодельного — контроль оборудования повышающего или снижающего температуру воздуха в помещении. Управление часто дублируется голосовыми функциями (меню через дозвон) и отдельной физической панелью с кнопками.

ТОП-3 приобретаемых на рынке моделей:

GSM термостаты

Наименование Порог срабатывания Расписание Контроль нагревателя Контроль кондиционера Дополнительно подключаемые датчики Аккумулятор/работа без сети Цена
Microline ZONT BT-2 −30 .. +55 ºС Да Газовый котел по специальному протоколу OpenTherm Нет Охрана, газ, дым Нет 15600
Microline ZONT Lite Только GSM контроль Нет Электрический/газовый котел — реле Нет Нет Нет 5940
SIMply MAX Р03 −35 .. +65 ºС Да Вентилятор/котел Да 2 ввода для любых контрольных датчиков Нет 10639

Резюмируя

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

Видео по теме

Добавить комментарий Ваш e-mail не будет опубликован. Обязательные поля помечены *

Adblock
detector
Кнопка - вверх