Версия 3.0 (Программируемый терморегулятор для системы «умный дом». Сеть RS-485).

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

Система «умный дом» является именно «системой» благодаря взаимодействию большого числа компонентов между собой. Объединяются эти компоненты по средствам сетей самых различных типов. В данной статье опишу работу терморегулятора, разработанного в предыдущей версии, с возможностью обмена данными по двухпроводной сети с интерфейсом RS-485. Этот интерфейс выбран из-за высокой надежности и большой возможной протяженности линий (это критично для частного дома с использованием компонентов на территории двора).

Для обмена данными используется модуль UART. Для согласования с дифференциальной шиной RS-485 в схеме необходимо использовать микросхему-драйвер, например – MAX487. Выводы микросхемы подключены к выводам RX, TX микроконтроллера. Поскольку интерфейс RS-485 полудуплексный (в один момент времени устройство может работать только как приемник, или только как передатчик), состоянием драйвера (переключение на прием или передачу) управляет еще один вывод микроконтроллера.

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

Для проверки работоспособности, для данной версии, в качестве контроллера системы, я написал простенький конвертер UART/RS-485. В нем введенные в терминал данные, проверяются на допустимые символы (0..9 и A..F) и из ASCII переводятся в char. При получении команды нажатия кнопки «Enter» (0x0D), происходит расчет контрольной суммы, и отправка данных по сети RS-485. Все принятые данные конвертируются в символы ASCII кода и выводятся в терминал.

В построении сети RS-485 есть свои нюансы, о которых много написано в интернет. В статье я их рассматривать не буду. В данном случае важно понять роль «ведущего» контроллера системы.

Контроллер системы последовательно опрашивает состояние всех терморегуляторов. Сначала считывается заданная температура воздуха, затем текущая измеренная. Если текущая температура превышает заданную, контроллер системы передает команду на коммутатор на отключение соответствующего канала реле. Если текущая температура ниже заданной на 0,5С, контроллер системы передает команду на коммутатор на включение соответствующего канала реле.

Каждое устройство в сети должно иметь свой уникальный адрес. Именно по адресу «ведущий» выбирает конкретное устройство для обмена данными.

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

В каждой комнате установлен терморегулятор. Все терморегуляторы объединены в сеть. От выходов реле терморегуляторов проложены двухпроводные кабеля к сервоприводам, установленным на коллекторе «теплого пола». Кроме того от «ведущего» контроллера к котлу проложен кабель для управления котлом.

Теперь посмотрите на следующий рисунок.

В каждой комнате установлен терморегулятор. Все терморегуляторы объединены в сеть. Кроме того возле коллектора и котла установлен коммутатор. Он представляет собой шесть реле, которые управляются микроконтроллером ATTiny2313, подключенным к сети RS-485 через драйвер MAX487. К выходам реле подключены сервоприводы коллектора «теплого пола» и котел.

На втором рисунке кабелей намного меньше…

ПРОТОКОЛ ОБМЕНА ПО СЕТИ.

Для обмена по сети используются модули UART микроконтроллеров. Прием и передача данных осуществляется по прерываниям. Модули настраиваются следующим образом:

  • · скорость передачи (битрейт) – 19200 бод (выбирается из стандартного ряда и зависит от необходимого быстродействия и длинны линий сети);

  • · формат кадра – 9 бит;

  • · 1 стоп бит;

  • · включен контроль четности.

Драйвер контроллера системы включается на передачу (становиться «ведущим» устройством сети), драйвера всех остальных устройств сети включаются на прием (все устройства становятся «ведомыми»). Кроме того, модули UART «ведомых» устройств работают в режиме мультипроцессорного обмена.

Контроллер системы адресует конкретное устройство, передавая в сеть его адрес. Адрес устройства отличается от данных установленным в «1» девятым битом. Приняв адрес, программа «ведомого» устройства сравнивает его с собственным уникальным адресом. Если адрес не совпадает, устройство игнорирует все последующие данные до прихода очередного адреса (с «1» в девятом бите). При совпадении принятого адреса с собственным адресом, программа устройства выключает режим мультипроцессорного обмена, принимает и обрабатывает все последующие данные.

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

Последним байтом любого пакета данных является контрольная сумма, вычисленная по алгоритму CRC8.

В общем виде обмен данными выглядит следующим образом:

[адрес «ведомого» устройства] [адрес устройства отправителя] [команда] [данные] [контрольная сумма].

Посылка запроса контроллера системы на чтение текущей температуры воздуха от терморегулятора с адресом 0x10 выглядит следующим образом:

0x10, 0x01, 0x11, 0x4D.

Здесь:

· 0x10 – адрес устройства, к которому обращается «ведущий» контроллер;

· 0x01 – адрес контроллера «умного дома»;

· 0x11 – команда запроса температуры воздуха;

· 0x4D – контрольная сумма.

Адрес устройства, которое посылает запрос (в данном случае 0x01), возможно, здесь лишний, но он понадобится в версии 5.0. Длина пакета различается в зависимости от команды. В ответ на запрос «ведущего» контроллера, устройство сети (в зависимости от команды) может отвечать, передавая данные своего состояния.

Рассмотрим подробно команды «ведущего» контроллера сети и ответы терморегулятора (допустим, что собственный адрес терморегулятора в сети – 0x10).

Команда чтения текущей температуры воздуха – 0x11.

Для чтения текущей температуры воздуха (температуры датчика 1), измеренной терморегулятором, контроллер системы формирует следующий пакет:

0x10, 0x01, 0x11, 0x4D.

После этого драйвер контроллера системы переключается на прием (контроллер становиться «ведомым» устройством), и контроллер ожидает ответ адресованного устройства.

«Ведомое» устройство (терморегулятор с собственным адресом 0x10), приняв пакет данных, переключает драйвер на передачу (временно становится «ведущим» устройством) и формирует в ответ следующий пакет данных:

0x01, 0x10, 0x48, 0x13, 0x03, 0xBA.

Здесь:

· 0x01 – адрес устройства, для которого передается пакет;

· 0x10 – адрес устройства, от которого передается пакет;

· 0x48 – тип устройства (терморегулятор);

· 0x13, 0x03 – измеренная текущая температура воздуха (целое и десятичное значение), в 16-ричном формате = 19,3°С.

· 0xBA – контрольная сумма.

По окончанию передачи пакета, драйвер терморегулятора переключается на прием (устройство снова становится «ведомым»), а драйвер контроллера системы переключается на передачу (контроллер снова становится «ведущим» устройством сети).

Вот так это выглядит в Proteus.

Значение типа устройства (0x48), возможно, излишнее для текущей разработки. Но это важные данные при построении большой системы. Например, по типу устройства контроллер «умного дома» может определить, какие команды доступны для данного устройства, какой диапазон данных допустим для устройства, как формировать пакет запроса и как обрабатывать данные этого устройства. Но это все выходит за рамки этой статьи.

Команда чтения текущей температуры пола – 0x12.

Для чтения от терморегулятора текущей измеренной температуры пола (температуры датчика 2), контроллер системы формирует следующий пакет:

0x10, 0x01, 0x12, 0xAF.

Терморегулятор, приняв посылку, формирует в ответ пакет данных:

0x01, 0x10, 0x48, 0x13, 0x03, 0xA2.

Значение 0x1C, 0x03 – текущая температура пола (целое и десятичное значение), в 16-ричном формате = 28,3°С.

Команда чтения заданной температуры воздуха – 0x21.

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

0x10, 0x01, 0x21, 0xF3.

Терморегулятор, приняв посылку, формирует в ответ пакет данных:

0x01, 0x10, 0x48, 0x14, 0x00, 0x36.

Значение 0x14, 0x00 – заданная температура воздуха, в 16-ричном формате = 20,0°С.

Если есть возможность прочитать параметры от терморегулятора, что мешает устанавливать некоторые параметры?

Команда установки заданной температуры воздуха – 0x22.

Для установки заданной температуры воздуха, контроллер системы формирует следующий пакет:

0x10, 0x01, 0x22, 0x15, 0x05, 0x04.

Здесь значение 0x15, 0x05 – устанавливаемое значение заданной температуры воздуха = 21,5°С.

Терморегулятор, приняв посылку, устанавливает заданную температуру и формирует в ответ пакет данных:

0x01, 0x10, 0x48, 0x15, 0x05, 0xCD.

Как видно значение 0x15, 0x05 – сообщает, что данные приняты и корректно обработаны, заданная температура воздуха установлена.

Команда чтения заданной температуры пола – 0x23.

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

0x10, 0x01, 0x23, 0x4F.

Терморегулятор, приняв посылку, формирует в ответ пакет данных:

0x01, 0x10, 0x48, 0x1E, 0x05, 0xEE.

Значение 0x1E, 0x05 – заданная максимальная температура пола.

Команда установки заданной температуры пола – 0x24.

Для установки заданной максимальной температуры пола, контроллер системы формирует следующий пакет:

0x10, 0x01, 0x24, 0x1C, 0x00, 0x58.

Здесь значение 0x1C, 0x00 – устанавливаемое значение заданной максимальной температуры пола = 28,0°С. Терморегулятор, приняв посылку, устанавливает заданную максимальную температуру пола и формирует в ответ пакет данных:

0x01, 0x10, 0x48, 0x1С, 0x00, 0x40.

Значение 0x1С, 0x00 – сообщает, что данные приняты и корректно обработаны.

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

Команда чтения дня недели и текущего времени – 0x30.

Для чтения дня недели и текущего времени, контроллер системы формирует следующий пакет:

0x10, 0x01, 0x30, 0x30.

Терморегулятор, приняв посылку, формирует в ответ следующий пакет данных:

0x01, 0x10, 0x48, 0x04, 0x0E, 0x19, 0x19, 0x14.

Здесь:

· 0x04 – номер дня недели;

· 0x0E, 0x19, 0x19 – текущее время (часы, минуты, секунды) = 14:25:25.

Команда установки дня недели и текущего времени – 0x31.

Для установки дня недели и текущего времени микросхемы RTC, контроллер системы формирует следующий пакет:

0x10, 0x01, 0x31, 0x03, 0x0C, 0x00, 0xF8.

Здесь:

· 0x03 – устанавливаемый номер дня недели;

· 0x0C, 0x00 – устанавливаемое время (при установке времени, секунды сбрасываются в :00) = 12:00:00.

Терморегулятор, приняв посылку, устанавливает значение в переменные-счетчики текущего времени и во внутренние регистры микросхемы RTC. После чего формирует следующий пакет данных:

0x01, 0x10, 0x48, 0x03, 0x0С, 0x00, 0x00 0x82.

Значение 0x03, 0x0С, 0x00, 0x00 – сообщает, что данные приняты и корректно обработаны.

Команда чтения программируемых параметров – 0x50.

Для чтения заданных программируемых параметров (например, период № 4 для дня недели № 2), контроллер системы формирует следующий пакет:

0x10, 0x01, 0x50, 0x02, 0x04, 0x78.

Терморегулятор, приняв посылку, считывает данные из EEPROM и формирует в ответ пакет данных:

0x01, 0x10, 0x48, 0x02, 0x04, 0x0E, 0x00, 0x14, 0x00, 0x75.

Здесь:

· 0x02 – номер дня недели;

· 0x04 – номер периода;

· 0x0E, 0x00 –время начала периода (часы, минуты) = 14:00;

· 0x14, 0x00 – заданная температура воздуха = 20,0°С.

Команда установки программируемых параметров – 0x51.

Для установки программируемых параметров (например, нужно установить для периода № 6, дня недели № 7, время начала периода 23:30 и температуру 17,0°С), контроллер системы формирует следующий пакет:

0x10, 0x01, 0x51, 0x07, 0x06, 0x17, 0x1E, 0x11, 0x00, 0xC9.

Терморегулятор, приняв посылку, переписывает данные в EEPROM и формирует в ответ пакет данных:

0x01, 0x10, 0x48, 0x07, 0x06, 0x17, 0x1E, 0x11, 0x00, 0xF7.

Это значит, что данные приняты и корректно обработаны.

Рассмотрим команды для работы с коммутатором (допустим, что в сеть включен коммутатор с собственным адресом – 0x20).

Команда включения определенного порта коммутатора – 0x61.

Для включения одного единственного порта коммутатора (например, реле № 2), контроллер системы формирует следующий пакет:

0x20, 0x01, 0x61, 0x02, 0xF9.

Коммутатор, приняв посылку, включает указанный порт и формирует в ответ пакет данных:

0x01, 0x20, 0xС5, 0x02, 0xEC.

Здесь:

· 0xC5 – тип устройства (коммутатор);

· 0x02 – маска состояния портов коммутатора.

Если контроллер системы подаст команду на включение другого порта (например, включение порта № 4):

0x20, 0x01, 0x61, 0x04, 0x24.

Коммутатор вернет маску состояния портов:

0x01, 0x20, 0xС5, 0x0A, 0x2E.

Значение 0x0A означает, что в данный момент включены порты 2 и 4 – 0b 0000 1010

Команда выключения определенного порта коммутатора – 0x60.

Для выключения одного единственного порта коммутатора (например, реле № 2), контролер системы формирует следующий пакет:

0x20, 0x01, 0x60, 0x02, 0x3D.

Коммутатор, приняв посылку, выключает указанный порт и формирует в ответ следующий пакет данных:

0x01, 0x20, 0xС5, 0x08, 0x92.

Значение 0x08 – показывает, что порт 2 выключен, а порт 4 остался включенным – 0b 0000 1000

Команда включения портов коммутатора по маске – 0x62.

Для включения нескольких портов коммутатора одновременно (например, для включения реле 1, 2 и 5), контроллер системы формирует следующий пакет:

0x20, 0x01, 0x62, 0x13, 0x6F.

Коммутатор, приняв посылку, включает указанные порты и формирует в ответ пакет данных:

0x01, 0x20, 0xС5, 0x13, 0x2F.

Значение 0x13 – показывает, что порты 1, 2 и 5 включены – 0b 0001 0011

Команда чтения состояния портов коммутатора – 0x63.

Для чтения состояния портов коммутатора, контроллер системы формирует следующий пакет:

0x20, 0x01, 0x63, 0xD7.

Коммутатор, приняв посылку, формирует в ответ пакет данных, в котором содержится маска состояние портов:

0x01, 0x20, 0xС5, 0x13, 0x2F.

Значение 0x13 – показывает, что порты 1, 2 и 5 включены – 0b 0001 0011

Команда перезагрузки устройства – 0x52.

Для перезагрузки любого устройства, либо всех устройств в сети используется команда 0x52. Приняв эту команду, устройство перезагружается, устанавливая свои параметры в начальное состояние. Перезагрузить можно как отдельное устройство, так и все устройства сети, используя адрес общего вызова – 0x00.

Если контроллер системы сформирует пакет данных:

0x00, 0x52, 0x67.

Все устройства сети перезагрузятся. Ответный пакет на данную команду устройства не формируют.

СБРОС ПРОГРАММИРУЕМЫХ ПАРАМЕТРОВ К УСТАНОВКАМ ПО УМОЛЧАНИЮ.

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

Для входа в меню «сброс программируемых параметров» необходимо, находясь в режиме «ожидания» нажать и удерживать более 15 секунд обе кнопки. При этом сначала происходит переход в режим «установка» (на дисплей выводится надпись [ SEt]). Через 5 секунд терморегулятор выключится (на дисплей будет выведена бегущая надпись [Good bYE], после чего дисплей гаснет и терморегулятор выключается). Еще через 10 секунд происходит переход в меню «сброс программируемых параметров». При этом на дисплей выводится надпись [rStn] (reset - no).

Нажатием кнопок «+» или «-» можно переключить разрешение сброса программируемых параметров. То есть переключается разрешение/запрет на сброс параметров, на дисплей выводятся надписи [rStn] (reset NO) – [rStY] (reset YES).

Для сброса программируемых параметров необходимо нажать обе кнопки. При этом происходит очистка всей памяти в EEPROM, то есть сбрасываются все параметры меню «установка» и все программируемые параметры. Затем устанавливается использование двух датчиков температуры (пункт меню «выбор датчиков»), минимальная яркость дисплея в «дежурном» режиме (пункт меню «установка яркости дисплея») и устанавливается максимальная температура пола (температура датчика 2) = 30,0°С (пункт меню «установка максимальной температуры датчика 2»)

Далее для всех дней недели устанавливается время начала периодов:

1. 02:00

2. 06:00

3. 10:00

4. 14:00

5. 18:00

6. 22:00

и для всех периодов устанавливается заданная температура воздуха (температура датчика 1) равная 20,0°С.

После этого терморегулятор перезагружается и включается.

Что можно добавить в данную версию.

  1. В данной версии нет команд включения/выключения терморегулятора по сети.

  2. Нет команд чтения/установки яркости дисплея в «дежурном» режиме по сети.

  3. Нет команды сброса программируемых параметров по сети.

  4. Раз уж используется сеть, можно добавить команды для параметров сети (чтение/установка собственного адреса в сети и чтение/установка скорости обмена).

  5. Можно для обмена переписать протокол под MODBUS.

MODBUS предполагает следующий протокол:

[ID устройства] [команда] [адрес данных] [количество байт] [контрольная сумма (CRC16)] –>

[ID устройства] [команда] [количество байт] [данные] [контрольная сумма]

Параметр [адрес данных] в запросе предполагает, что все данные расположены в памяти микроконтроллера последовательно. Это не совсем так. Программируемые параметры расположены последовательно в энергонезависимой памяти EEPROM. Остальные параметры расположены в RAM в разброс. Конечно, при написании ПО можно расположить все данные последовательно, но писать программу для микроконтроллера в таком случае не совсем удобно.

Еще одно но! Все значения температуры сохраняются и обрабатываются как переменные float (размер переменной 4 байта). При применении предложенного протокола, программа микроконтроллера конвертирует температуру в два байта char – целое и десятичное значение температуры. На мой взгляд, такой подход наглядней для отладки.

Вообще, протокол (в том числе команды) полностью зависит от выбранного Вами контроллера системы.