Версия 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.

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