Версия 4.0 (Программируемый терморегулятор для системы «умный дом». Сеть 1-wire).
Целью разработки является модернизация разработанного ранее устройства для работы в сети с интерфейсом 1-wire. От предыдущей версии данная разработка отличается примененным драйвером и измененным протоколом обмена.
Во многих конструкциях возможно реализовать подчиненное (ведомое) устройство с интерфейсом 1-wire на том же контроллере, который выполняет основные функции. Но при разработке данного терморегулятора я столкнулся с определенными проблемами.
Дело в том, что реализация протокола 1-wire требует строгого соблюдения параметров таймслота. В частности время определения значения бита равно 15 микросекундам с момента начала его передачи.
Во первых – обработка задач в программе выполняется через диспетчер, во вторых – существуют прерывания, которые необходимо обрабатывать, в третьих – микроконтроллер обращается к двум датчикам температуры по протоколу 1-wire. Реализация стабильной работы в качестве ведомого устройства сети 1-wireоказалась невозможной. При обмене данными происходят постоянные сбои …
Но: “задача поставлена, задачу нужно выполнять”…
Для реализации поставленной задачи я использовал промежуточный микроконтроллер в качестве «драйвера» сети 1-wire. Он обрабатывает сам интерфейс, обрабатывает команды протокола 1-wire и может быть связан с основным микроконтроллером через UART, SPI или I2C. Обработка обмена данными между контроллерами происходит по прерываниям. Вообще такое решение позволяет работать терморегулятору практически в любой сети. Промежуточный контроллер (при разработке соответствующего ПО) может быть подключен хоть к CAN шине, хоть к LAN интерфейсу с поддержкой TCP/IP, хоть к приемопередатчику радиомодуля, хоть к Wi-Fi, хоть к Bluetooth.
Для реализации «физического» уровня используется всего один вывод микроконтроллера, но обязательно с обработкой внешнего прерывания (например – INT0). Для реального устройства следует использовать транзисторы и два вывода, один – для управления шиной, второй – для чтения данных. Для реализации «сетевого» уровня, в область памяти EEPROM записывается уникальный, 64-битный адрес устройства (драйвера). Для реализации «транспортного» уровня, используется один 8-битный таймер. Остальные, более высокие уровни обрабатываются микроконтроллером терморегулятора. Рассмотрим подключение к шине 1-wire с использованием в качестве «драйвера» микроконтроллера ATTiny2313A.
Следует внести некоторую ясность в . Я разделил понятие команда на – команды протокола 1-wire и команды управления терморегулятором.
Здесь, как и в предыдущей версии, я написал простенький конвертор UART/1-wire. В нем введенные в терминал данные, проверяются на допустимые символы (0..9 и A..F) и из символов ASCII переводятся в char. При получении команды нажатия кнопки «Enter» (0x0D) происходит расчет контрольной суммы, и отправка данных по сети 1-wire. Формируется сигнал Reset, проверяется присутствие устройств на шине (получение сигнала Presence) и далее происходит прием/передача данных. Все принятые данные конвертируются в символы ASCII и выводятся в терминал.
Тут я пришел еще к одной интересной идее. В предыдущей версии, количество передаваемых байтов данных определялось командой. То есть, при передаче, например, температуры – передавалось 2 байта значащих данных, а при передаче программируемых параметров – 6 байтов значащих данных. Для того чтобы упростить программу, я решил длину пакета данных сделать одинаковой для всех команд терморегулятора. Максимальное количество байтов данных, с учетом кода команды и контрольной суммы составляет 8 байтов. Все незначащие байты заполняются нулями.
Так же как и в предыдущей версии, для управления сервоприводами коллектора «теплого пола» используется коммутатор. Для обеспечения его работы в сети 1-wire достаточно контроллера ATTiny2313.
ПРОТОКОЛ ОБМЕНА ПО СЕТИ 1-WIRE.
Обмен данными инициализируется управляющим контроллером системы. «Драйвер» терморегулятора поддерживает стандартные команды протокола 1-wire:
SEARCH_ROM (0xF0) – определение адресов устройств на шине;
MATCH_ROM (0x55) – адресация конкретного устройства на шине;
WRITE_SCRATCHPAD (0x4E) - запись данных в RAM устройства;
READ_SCRATCHPAD (0xBE) - чтение данных из RAM устройства.
Все устройства в сети имеют собственный уникальный адрес длинной 64 бита. В общем виде обмен данными выглядит следующим образом:
[адрес устройства] [команда 1-wire] [команда терморегулятора] [данные] [контрольная сумма].
Здесь:
адрес устройства – 64-битный адрес «драйвера» в сети;
команда 1-wire – одна из команд протокола сети (0x55, 0x4E, 0xBE);
команда терморегулятора – одна из команд управления терморегулятором (например, 0x11 – чтение текущей температуры воздуха);
данные – данные управления (например, 0x13, 0x05 – заданная температура воздуха = 19,5°С);
контрольная сумма – проверочный байт, вычисленный по алгоритму CRC8 для команды терморегулятора и данных.
КОМАНДЫ СЕТИ 1-WIRE.
Я предполагаю, ну или хотя бы надеюсь, что Вы уже знакомы с протоколом 1-wire. Все команды обрабатывает только микроконтроллер «драйвера». Допустим, что собственный адрес «драйвера» в сети – 0xCC, 0xE0, 0x44, 0x1E, 0xD4, 0x4A, 0x31, 0xBC.
Команда определения адресов устройств, подключенных к сети 1-wire SEARCH_ROM (0xF0).
Контроллер системы обращается к «ведомым» устройствам по 64-битному адресу. Для того чтобы «знать» эти адреса, контроллеру необходимо сначала определить их. Для этих целей в сети 1-wire существует команда Search Rom, которая обрабатывается всеми устройствами по определенному алгоритму. Как работает эта команда много и хорошо описано в интернет. Эта команда используется при включении напряжения питания контролера системы.
Команда адресации конкретного устройства MATHC_ROM (0x55).
Для обращения к конкретному устройству в сети, контроллер системы адресует устройство, отправляя в сеть команду Match Rom и адрес устройства. Таким образом, для адресации устройства контроллер передает в сеть следующую посылку:
Reset, 0x55, 0xCC, 0xE0, 0x44, 0x1E, 0xD4, 0x4A, 0x31, 0xBC.
Приняв команду Match Rom, «ведомое» устройство сравнивает полученные байты с собственным адресом. Если байт адреса не совпадает, устройство игнорирует все последующие данные до прихода очередного импульса сброса (Reset). При совпадении всех принятых байтов адреса с собственным адресом, программа устройства принимает и обрабатывает все последующие данные.
Команда записи данных в промежуточное ОЗУ WRITE_SCRATCHPAD (0x4E).
После того, как «ведомое» устройство адресовано, можно установить некоторые параметры этого устройства, записав данные с использованием команды Write Scratchpad. Данные всегда имеют длину 8 байт и записываются в буфер приема «драйвера» сети 1-wire. Восьмой байт является контрольной суммой данных. Если контрольная сумма верна, «драйвер» передает эти данные через модуль UART в микроконтроллер терморегулятора. Программа терморегулятора обрабатывает принятые данные и, в случае необходимости, формирует ответный пакет, который передается через UART обратно в микроконтроллер «драйвера» сети 1-wire.
Например, для записи заданной температуры воздуха, контроллер системы передает следующую посылку:
Reset, 0x55, 0xCC, 0xE0, 0x44, 0x1E, 0xD4, 0x4A, 0x31, 0xBC, 0x4E, 0x22, 0x15, 0x05, 0x00, 0x00, 0x00, 0x00, 0xF7.
Здесь:
· 0x55 – команда Match Rom;
· 0xCC, 0xE0, 0x44, 0x1E, 0xD4, 0x4A, 0x31, 0xBC – адрес устройства в сети;
· 0x4E – команда Write Scratchpad;
· 0x22 – команда установки заданной температуры воздуха;
· 0x15, 0x05 – устанавливаемая заданная температура воздуха;
· 0x00, 0x00, 0x00, 0x00 – не значащие байты;
· 0xF7 – контрольная сумма пакета (0x22, 0x15, 0x05, 0x00, 0x00, 0x00).
Команда чтения данных из промежуточного ОЗУ READ_SCRATCHPAD (0xBE).
После того, как «ведомое» устройство адресовано, можно считать данные из буфера микроконтроллера «драйвера» сети 1-wire с использованием команды Read Scratchpad. Приняв эту команду, программа «драйвера» вычисляет контрольную сумму данных буфера и передает данные в сеть.
Например, для чтения текущей температуры воздуха, контроллер системы передает следующую посылку:
Reset, 0x55, 0xCC, 0xE0, 0x44, 0x1E, 0xD4, 0x4A, 0x31, 0xBC, 0x4E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xС6.
Здесь:
· 0x55 – команда Match Rom;
· 0xCC, 0xE0, 0x44, 0x1E, 0xD4, 0x4A, 0x31, 0xBC – адрес устройства в сети;
· 0x4E – команда Write Scratchpad;
· 0x11 – команда чтения текущей температуры воздуха;
· 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 – не значащие байты;
· 0xС6 – контрольная сумма пакета.
«Драйвер», приняв данные и проверив контрольную сумму, передает через модуль UART пакет данных в микроконтроллер терморегулятора. По команде 0x11, программа терморегулятора преобразует текущую измеренную температуры воздуха из float в два байта char (целое и десятичное значение), и передает через модуль UART данные в микроконтроллер «драйвера». Теперь можно прочитать текущую температуру воздуха с использованием команды Read Scratchpad.
Контроллер системы формирует запрос на чтение данных и считывает данные от «драйвера». Полный обмен выглядит следующим образом:
Reset, 0x55, 0xCC, 0xE0, 0x44, 0x1E, 0xD4, 0x4A, 0x31, 0xBC, 0xBE, 0x15, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5С.
Здесь:
· 0x55 – команда Match Rom;
· 0xCC, 0xE0, 0x44, 0x1E, 0xD4, 0x4A, 0x31, 0xBC – адрес устройства в сети;
· 0xBE – команда Read Scratchpad;
· 0x15, 0x02 – текущая температура воздуха (21,2°С);
· 0x00, 0x00, 0x00, 0x00, 0x00 – не значащие байты;
· 0x5С – контрольная сумма пакета.
КОМАНДЫ ОБСЛУЖИВАНИЯ ТЕРМОРЕГУЛЯТОРА.
Далее будет рассматриваться только пакет данных, обрабатываемый микроконтроллером терморегулятора. Внутренние команды терморегулятора такие же, как и в прошлой версии терморегулятора.
Команда чтения текущей температуры воздуха (0x11).
Для чтения текущей измеренной температуры воздуха (температуры датчика 1), контроллер системы адресует конкретное устройство, передает команду Write Scratchpad и в качестве внутренней команды терморегулятора передает команду чтения текущей температуры воздуха – 0x11. Пакет данных получаемых микроконтроллером терморегулятора через UART выглядит следующим образом:
0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xС6.
Здесь:
· 0x11 – команда чтения текущей температуры воздуха;
· 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 – не значащие байты;
· 0xС6 – контрольная сумма.
Программа терморегулятора преобразует текущую температуру воздуха в два байта и возвращает ее через UART в «драйвер». Конечно, для передачи данных необходимо какое-то время. Оно напрямую зависит от скорости обмена через UART.
Пакет данных выглядит следующим образом:
0x15, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5С.
Здесь:
· 0x15, 0x02 –текущая температура воздуха = 21,2°С;
· 0x5С – контрольная сумма.
Команда чтения текущей температуры пола (0x12).
Для чтения текущей измеренной температуры пола (температуры датчика 2), контроллер системы адресует конкретное устройство, передает команду Write Scratchpad и в качестве внутренней команды терморегулятора передает команду чтения текущей температуры пола – 0x12. Пакет данных выглядит следующим образом:
0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81.
Здесь:
· 0x12 – команда чтения текущей температуры пола;
· 0x81 – контрольная сумма.
Программа терморегулятора преобразует текущую температуру пола в два байта и возвращает ее через UART в «драйвер».
Пакет данных выглядит следующим образом:
0x1B, 0x03, 0x00, 0x00, 0x00, 0x00, 0xED.
Здесь:
· 0x1B, 0x03 – текущая температура пола = 27,3°С;
· 0xED – контрольная сумма.
Команда чтения заданной температуры воздуха (0x21).
Для чтения заданной температуры воздуха, контроллер системы, в качестве внутренней, передает команду – 0x21. Пакет данных выглядит следующим образом:
0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2.
Здесь:
· 0x21 – команда чтения заданной температуры воздуха;
· 0xD2 – контрольная сумма.
Программа терморегулятора преобразует заданную температуру воздуха в два байта. Пакет данных выглядит следующим образом:
0x14, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4.
Здесь:
· 0x14, 0x05 – заданная температура воздуха = 20,5°С;
· 0xE4 – контрольная сумма.
Команда установки заданной температуры воздуха (0x22).
Для установки заданной температуры воздуха, контроллер системы, в качестве внутренней, передает команду – 0x22. Пакет данных выглядит следующим образом:
0x22, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25.
Здесь:
· 0x22 – команда установки заданной температуры воздуха;
· 0x15, 0x00 – значение устанавливаемой температура воздуха = 21,0°С;
· 0x25 – контрольная сумма.
Программа терморегулятора преобразует и записывает заданную температуру воздуха в переменную float.
На команды установки параметров микроконтроллер терморегулятора не «отвечает». То есть, в отличие от предыдущей версии, для проверки установленного параметра его значение нужно прочитать из устройства с использованием соответствующих команд (в данном случае – 0x21).
Команда чтения заданной температуры пола (0x23).
Для чтения заданной температуры пола, контроллер системы, в качестве внутренней, передает команду – 0x23. Пакет данных выглядит следующим образом:
0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAB.
Здесь:
· 0x23 – команда чтения заданной температуры воздуха;
· 0xAB – контрольная сумма.
Программа терморегулятора преобразует заданную температуру пола в два байта. Пакет данных выглядит следующим образом:
0x17, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3.
Здесь:
· 0x17, 0x05 – заданная температура воздуха = 23,5°С;
· 0xA3 – контрольная сумма.
Команда установки заданной температуры пола (0x24).
Для установки заданной температуры пола, контроллер системы, в качестве внутренней, передает команду – 0x24. Пакет данных выглядит следующим образом:
0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1.
Здесь:
· 0x24 – команда установки заданной температуры воздуха;
· 0x18, 0x00 – значение устанавливаемой максимальной температура пола = 24,0°С;
· 0xE1 – контрольная сумма.
Программа терморегулятора преобразует и записывает заданную температуру пола в переменную float.
Команда чтения дня недели и текущего времени (0x30).
Для чтения дня недели и текущего времени на устройстве, контроллер системы, в качестве внутренней, передает команду – 0x30. Пакет данных выглядит следующим образом:
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14.
Здесь:
· 0x30 – команда чтения дня недели и текущего времени;
· 0x14 – контрольная сумма.
Программа терморегулятора формирует пакет данных из переменных-счетчиков дня недели, часов, минут, секунд (заметьте, именно из переменных, а не из регистров микросхемы RTC). Пакет данных выглядит следующим образом:
0x02, 0x0C, 0x0F, 0x24, 0x00, 0x00, 0x00, 0x16.
Здесь:
· 0x02 – текущий день недели (вторник);
· 0x0С, 0x0F, 0x24 – текущее время (12:15:36);
· 0x16 – контрольная сумма.
Команда установки дня недели и текущего времени (0x31).
Для установки дня недели и текущего времени на устройстве, контроллер системы, в качестве внутренней, передает команду – 0x31. Пакет данных выглядит следующим образом:
0x30, 0x04, 0x08, 0x2D, 0x00, 0x00, 0x00, 0x1B.
Здесь:
· 0x30 – команда установки дня недели и текущего времени;
· 0x04 – текущий день недели (четверг);
· 0x08, 0x2D, 0x00 – устанавливаемое текущее время (08:45:00);
· 0x1B – контрольная сумма.
Программа терморегулятора записывает данные в переменные-счетчики дня недели, часов, минут, секунд и по шине I2C, записывает данные в регистры микросхемы RTC.
Заметьте, что значение секунд, всегда сбрасывается в 00!
Команда чтения программируемых параметров (0x50).
Для чтения программируемых параметров, контроллер системы, в качестве внутренней, передает команду – 0x50. Кроме того, необходимо определить день недели и номер периода программируемого параметра. Пакет данных выглядит следующим образом:
0x50, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x45.
Здесь:
· 0x50 – команда чтения программируемых параметров;
· 0x01 – день недели параметра (понедельник);
· 0x03 – номер периода программируемого параметра;
· 0x45 – контрольная сумма.
Программа терморегулятора считывает из EEPROM время начала периода, считывает и преобразует из floatв два байта заданную температуру воздуха и формирует пакет данных. Пакет данных выглядит следующим образом:
0x01, 0x03, 0x0E, 0x1E, 0x11, 0x00, 0x00, 0x0A.
Здесь:
· 0x01 –день недели, программируемого параметра (понедельник);
· 0x03 – номер периода программируемого параметра;
· 0x0E, 0x1E – время начала периода программируемого параметра (14:30);
· 0x11, 0x00 – заданная температура воздуха программируемого периода (17,0°С);
· 0x0A – контрольная сумма.
Команда установки программируемого параметра (0x51).
Для установки программируемых параметров, контроллер системы, в качестве внутренней, передает команду – 0x51. Кроме того, необходимо определить день недели, номер периода, время начала программируемого периода и заданную температуру воздуха для данного программируемого периода. Пакет данных выглядит следующим образом:
0x51, 0x01, 0x02, 0x06, 0x00, 0x14, 0x05, 0x54.
Здесь:
· 0x51 – команда установки программируемых параметров;
· 0x02 – номер периода программируемого параметра;
· 0x06, 0x00 – время начала периода (06:00);
· 0x14, 0x05 – заданная температура воздуха (20,5°С);
· 0x54 – контрольная сумма.
Программа терморегулятора преобразует и записывает данные EEPROM.
Заметьте, в данном пакете нет незначащих байтов. Именно исходя из размера данного пакета было выбранно количество байтов для обмена.
Команда перезагрузки устройства (0x52).
Для перезагрузки отдельного устройства, контроллер системы, в качестве внутренней, передает команду – 0x52. Пакет данных выглядит следующим образом:
0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46.
Получив данную команду, устройство перезагружается.