ESP32. Урок 39. RMT. 1-Wire. Поиск устройства по известному ROM-коду



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

Задача данного урока — обращение к устройству с уже известным ROM-кодом, так как если коды известны, то нет смысла из каждый раз перебирать по сложному алгоритму.

Схема урока пока будет такая же, как и в прошлом уроке — с одним датчиком, остальные мы также подключим чуть позже

 

 

И проект также был выполнен из проекта прошлого урока с именем RMT_ONEWIRE_SEARH_ROM и получил новое имя RMT_ONEWIRE_SEARH_KNOWN_ROM.

Откроем наш проект в Espressiv IDE, откроем файл owb.h и ниже функции _init добавим функцию, которая будет читать ROM-код устройства

 

 

Объявим на данную функцию прототип в соответствующем заголовочном файле owb.h, а также в данном файле объявим макрос для кода команды чтения ROM-кода и макрос с длиной ROM-кода

 

 

Перейдём в функцию app_main файла main.c и в том случае, если у нас на шине только одно устройство, вызовем нашу функцию

 

 

Затем отобразим наш ROM-код в терминале

 

 

Только все мы прекрасно понимаем, что ничего у нас пока не прочитается и не отобразится, так как функция чтения — это пока только функция-заготовка.

Поэтому возвращаемся в функцию owb_read_rom файла owb.c и забьём нулями память, отведённую под переменную типа структуры свойств ROM-кода

 

 

Затем узнаем, не пустой ли адрес свойств шина и ROM-кода, а также инициализировано ли устройство. Если нет, то уходим из функции с соответствующим статусом, а если всё нормально, то создаём переменную булевого типа и вызываем функцию перезагрузки шины

 

 

Если устройство присутствует, то попытаемся отправить в шину команду чтения ROM-кода

 

 

 

Для удобства считывания всего ROM-кода мы ниже функции _read_bits добавим ещё одну функцию, которая будет читать сразу несколько байт из шины

 

 

В данной функции мы аналогично проверили наличие адресов и факт инициализации шины, а если всё нормально, то в цикле считываем все байты.

Вернёмся в функцию owb_read_rom и попытаемся прочитать наш ROM-код

 

 

Ниже функции _calc_crc добавим функцию, которая будет считать контрольную суммы на целый блок байтов

 

 

Ниже функции owb_crc8_byte добавим функцию, которая будет возвращать контрольную сумму на массив определенной длины

 

 

Вернёмся в функцию owb_read_rom и в случае, если в свойствах шины установлен параметр проверки контрольной суммы, прочитаем контрольную сумму

 

 

Запишем ROM-код в символьный массив и в случае режима отладки выведем его в терминал

 

 

Выйдем из условия присутствия устройства на шине и в противном случае выведем сообщение об ошибке в терминал

 

 

Попробуем собрать код, прошить контроллер и посмотрим результат работы в терминале

 

 

Всё считалось и устройство определилось.

 

 

Посмотрим также исполнение нашей команды в логическом анализе

 

 

Здесь также всё отлично распознаётся.

Добавим ещё один датчик в схему

 

 

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

 

 

Зато теперь мы знаем код второго устройства.

В случае наличия более одного устройства к определённому устройству нам теперь придётся обращаться по его коду.

В функции app_main файла main.c мы добавим блок с противным случаем (устройство не одно), в котором в комментарии напишем ROM-код пока первого устройства для удобства его записи в переменную типа структуры свойств ROM-кода, которую мы объявим ниже

 

 

Занесём ROM-код в символьный массив, создадим переменную присутствия устройства булевого типа и пока присвоим ей значение false

 

 

В файле owb.c ниже функции owb_read_rom добавим функцию, которая будет проверять ROM-код

 

 

В теле данной функции опять же в случае наличия действующих адресов, а также факта инициализации шины объявим и инициализируем переменную типа структуры состояния поиска устройства

 

 

Вызовем функцию поиска устройства на шине

 

 

Если устройство нашлось, то сравним считанный ROM-код с образцовым, если байты при сравнении совпадут, то выйдем из функции с результатом true

 

 

Объявим на нашу функцию прототип в заголовочном файле и в функции app_main файла main.c в случае наличия устройства выведем в терминал соответствующее сообщение, причём если коды совпали, то выведем сообщение, что данное устройство присутствует, а если нет — то не присутствует. Также в противном случае выведем сообщение о том, что устройства на шине вообще не обнаружены

 

 

То же самое проделаем и для кода второго устройства

 

 

Соберём код, прошьём контроллер и посмотрим результат в терминале

 

 

Отлично!

Добавим ещё один датчик в схему

 

 

Соберём код, прошьём контроллер и узнаем ROM-код оставшегося датчика

 

 

Напишем подобный код также и для него

 

 

Соберём, код, прошьём контроллер и снова посмотрим результат

 

 

Все три устройства определились.

Проверим также обмен в программе логического анализа

 

 

Здесь также всё хорошо.

Итак, на данном уроке мы научились искать на шине 1-Wire с использованием модуля RMT устройство с определённым кодом, также научились пользоваться командой чтения ROM-кода.

Всем спасибо за внимание!

 

Данная статья в Дзен.

 

 

Предыдущий урок Программирование МК ESP32 Следующий урок

 

Исходный код

 

 

Недорогие отладочные платы ESP32 можно купить здесь:

На AliExpress Недорогие отладочные платы ESP32

На Яндекс.Маркет Недорогие отладочные платы ESP32

Недорогие отладочные платы ESP32-S3 можно купить здесь:

Недорогие отладочные платы ESP32-S3

Датчик температуры в экране с проводом можно приобрести здесь:

На AliExpress DS18B20 в экране с проводом

На Яндекс.Маркет DS18B20 в экране с проводом

Логический анализатор 16 каналов можно приобрести (AliExpress) здесь

 

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

ESP32 RMT. 1-Wire. Поиск устройства по известному ROM-коду

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

ESP32 RMT. 1-Wire. Поиск устройства по известному ROM-коду

2 комментария на “ESP32. Урок 39. RMT. 1-Wire. Поиск устройства по известному ROM-коду
  1. Ivan:

    Здравствуйте. Смотрю Ваш канал практически с открытия. Микроконтроллерами увлекаюсь в качестве хобби. В основном avr. По мере выхода ваших уроков по STM, приобрел контроллеров, и с Вашей помощью воплощал свои идеи в не сложных проектах. В данный момент оказался без Ide. ST, keil не доступны. Буду учить с Вашей помощью Е SP. Подскажите варианты ПО для STM в 2022

    • Спасибо за такой тёплый комментарий! Простите, что оперативно отвечать не могу. С ПО для STM всё зависит от места проживания в данный момент. На территории России не всё доступно. Только я считаю, дело не в ПО, а в умении писать код. Поэтому не важно какая именно среда программирования. Удачи Вам в Ваших начинаниях!

Добавить комментарий

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

*