ESP32. Урок 38. RMT. 1-Wire. Поиск устройства



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

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

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

 

 

Проект мы сделаем из проекта прошлого урока с именем RMT_ONEWIRE_INIT и назовём его RMT_ONEWIRE_SEARH_ROM.

Откроем наш проект в Espressif IDE и функции app_main файла main.c добавим цикл, в котором будем определять присутствие каждого устройства на шине

 

 

Если при вызове функции owb_search_first в переменную found запишется false, то мы в данный цикл вообще не попадаем, а если true, то попадаем. Поэтому, если мы оставим всё так, как есть, то мы вообще никогда из цикла не выйдем. Тогда мы пока не будем проект прошивать, только соберём.

Если всё нормально собралось, то в файле owb.c ниже функции owb_search_first добавим ещё одну подобную функцию, которая будет искать следующее устройство на шине

 

 

Здесь проверяется сначала, инициализирована ли шина, а в случае успеха (здесь это наоборот противный случай) устанавливается статус в OK и записывается в переменную.

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

 

 

На данную функцию также объявим прототип в заголовочном файле и вызовем её в функции app_main файла main.c

 

 

В результате данного вызова ROM-код устройства пропишется в символьный массив rom_code_s.

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

 

 

Инкрементируем переменную количества устройств на шину и вызовем функцию поиска следующего устройства

 

 

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

 

 

Сейчас также нет смысла проверять работоспособность написанного кода, так как у нас ещё в owb.c много чего не дописано. Перейдём пока что в файл owb.h и объявим там макрос с кодом команды поиска устройства на шине

 

 

Перейдём в файл owb.c и в функции _search выйдем из условия наличия устройства на шине и попытаемся передать код функции в шину

 

 

Только, конечно же, ничего у нас никуда не передастся, так как функция _write_bits у нас ещё не дописана.

Объявим макрос максимального количество бит в слоте

 

 

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

 

 

Объявим указатель на переменную типа структуры информации о шине, присвоив ему адрес из входного параметра

 

 

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

 

 

Объявим макросы с таймингами уровней для передачи бит

 

 

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

 

 

В функции _write_bits занесём в цикле значения всех передаваемых бит в соответствующие элементы массива

 

 

Занесём в последнюю ячейку маркер окончания передачи, не зря же мы массив создавали на один элемент больше

 

 

 

Удалим вот эту сроку

 

owb_status status = OWB_STATUS_OK;

 

Вместо неё добавим другую

 

owb_status status = OWB_STATUS_NOT_SET;

 

Попытаемся передать наши данные в шину

 

 

В случае неудачи выведем соответствующее сообщение в терминал.

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

 

 

Не обращаем внимание на то, что у нас 0 устройств, это всё потому, что ещё не дописан код, самое главное, что не выскочили ошибки.

Теперь посмотрим логический анализ

 

 

 

Команда успешно передана в шину.

Дальнейшая задача — прочитать код найденного устройства из шины.

В функции _search объявим переменную для номера бита ROM-кода и две переменные для сравнения бит идентификаторов устройств

 

 

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

 

 

Подобным занятием мы занимались в уроке 94 по контроллерам STM32.

Перейдём в функцию _read_bits и также создадим указатель на свойства устройства и присвоим адрес из входного параметра

 

 

Затем также проверим на то, что мы не превысили количество бит в слоте

 

 

Также объявим переменную для ячеек памяти для передачи в шину

 

 

Выше добавим функцию, которая подготовит ячейку памяти

 

 

Вернёмся в функцию _read_bits и подготовим все ячейки памяти

 

 

Подготовим ячейку концевого маркера

 

 

Освободим буфер канала чтения

 

 

Запустим канал

 

 

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

 

 

 

Пока отобразим в терминале данные ячеек буфера в структурированном виде

 

 

Объявим переменную для хранения считанных данных из буфера

 

 

Объявим макрос длины сэмпла

 

 

В функции _read_bits запишем значение побитно из буфера в переменную

 

 

Выйдем из одного условия и возвратим оставшиеся элементы буфера

 

 

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

 

 

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

 

 

Остановим канал и запишем считанные данные по указателю входного параметра

 

 

В функции _search в цикле прочитаем два бита для сравнения

 

 

Объявим две локальных переменных

 

 

Объявим ещё две

 

 

И ещё одну для контрольной суммы

 

 

Вернёмся в наш цикл и добавим код подобный коду 94 урока по STM32 для считывания битов ROM-кодов

 

 

Добавим функцию для подсчёта контрольной суммы

 

 

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

 

 

Вернёмся в функцию _search и, если считанных битов достаточное количество, также если контрольная сумма ненулевая, то запишем в переменную search_result значение true, также в теле условия мы проверим наличие бита несоответствия. Если он нулевой, то установим флаг определения последнего устройства на шине

 

 

Выйдем из всех условий и, если устройство не найдено, то сбросим флаги

 

 

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

 

 

У нас найдено одно устройство и его ROM-код считан и отображён в терминале.

Закомментируем режим отладки, чтобы в терминале не мешали значения полей ячеек памяти, а также чтобы не тормозился процесс работы с шиной

 

//#define OW_DEBUG

 

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

 

 

Теперь нет ничего лишнего.

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

 

 

Там также всё корректно.

Подключим ещё один датчик к контроллеру, обычный, без провода

 

 

Перезагрузим контроллер и посмотрим результат

 

 

 

Оба устройства отлично видятся.

Подключим третий датчик

 

 

Перезагрузим контроллер и посмотрим результат

 

 

 

Все три устройства видны, коды их считаны.

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

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

 

 

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

 

Исходный код

 

 

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

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

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

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

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

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

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

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

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

 

 

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

ESP32 RMT. 1-Wire. Поиск устройства

 

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

ESP32 RMT. 1-Wire. Поиск устройства

2 комментария на “ESP32. Урок 38. RMT. 1-Wire. Поиск устройства
  1. Роман:

    Огромнейшее спасибо за очень познавательные и полезные уроки. Не так давно перешёл на ESP32. Пытаюсь повторить все, что Вы показываете. Были найдены несколько несоответствий в текстовом описании уроков. Если интересно, то могу предложить вариант тестирования (естественно, совершенно безвозмездно и, конечно, тех статей, на которые имею в наличии соответствующее железо, т.е. пока только без TFT дисплея.)

  2. Роман:

    Здравствуйте! Не так давно заинтересовался ESP32. Уроки оказались очень ко времени и полезными, за что отдельное спасибо! Пытаюсь повторить каждый из них по текстовому описанию. Обнаружил несколько несоответствий в описании. Если интересно, то предлагаю проводить тестирование уроков (без коммерции) с предоставлением результатов с целью устранения ошибок и улучшения сайта. Также есть ещё предложения по улучшению подачи информации для лучшего понимания новичками, такими каким являюсь и я.

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

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

*