ESP32. Урок 37. RMT. 1-Wire. Инициализация. Часть 2

 

 

 

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

 

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

 

 

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

 

 

Включим соответствующий бит в регистре порта для ножки GPIO

 

 

Включим режимы RMT приёмника и передатчика для ножек (вернее для одной ножки)

 

 

Включим направление на вход

 

 

Включим режим открытого коллектора

 

 

Ещё раз прошьём и запустим наш проект, а затем посмотрим результат в терминале

 

 

Теперь у нас нет никаких ошибок.

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

 

 

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

 

 

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

 

 

В файле owb.h объявим тип структуры для структурированного хранения ROM-кода устройства

 

 

Вернёмся в файл main.c и объявим макрос со значением максимального количества устройств на одной шине

 

 

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

 

 

В файле owb.h объявим тип структуры, которая будет хранить некоторые параметры найденного устройства, включая и его ROM-код

 

 

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

 

 

В файле owb.c выше функции _uninitialize добавим функцию, которая будет искать первое устройство на шине (или единственное, если оно будет одно)

 

 

К данной функции мы вернёмся позже.

А сейчас создадим на неё прототип в заголовочном файле и вызовем её в функции app_main файла main.c

 

 

Вернёмся в файл owb.c и выше функции owb_search_first добавим функцию поиска устройства на шине

 

 

В файле owb.h объявим макрос функции создания контейнера с информацией об устройстве

 

 

Вернёмся в файл owb.c и объявим подобный макрос для информации об устройстве

 

 

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

 

 

Выше объявим массив ячеек памяти RMT из одного элемента для передачи

 

 

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

 

 

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

 

 

Получим пороговые значения

 

 

Выше функции _search добавим функцию освобождению буфера

 

 

Вернёмся в функцию _reset и вызовем нашу функцию

 

 

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

 

 

Используя данные из ячейки памяти отправим импульс в канал

 

 

Вернёмся пока в функцию _search и вызовем функцию _reset, а также заполним параметры состояния

 

 

В функции owb_search_first при условии наличия параметров, а также инициализации шины, сохраним также состояние в поля и вызовем функцию _search

 

 

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

 

 

Здесь вроде никаких плохих сообщений нет.

Также посмотрим, что у нас в анализе

 

 

Мы видим, что команда RESET у нас ушла, и также датчик тоже на неё ответил.

Значит идём в функцию _reset и будем ловить ответ от датчика.

 

 

Определим количество записанных ячеек памяти и выведем в терминал содержимое их полей

 

 

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

 

 

Всё в пределах таймингов. Ответ от датчика получен.

Объявим локальную переменную булевого типа присутствия устройства на шине

 

 

Определим, соответствуют ли тайминги своим пределам и на основе этого присвоим переменной значение

 

 

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

 

 

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

 

 

Выйдем ещё из двух условий и также в противном установим соответствующий статус

 

 

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

 

 

Для порядка ещё заполним тело функции _uninitialize

 

 

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

 

 

Всё нормально, ошибок нет.

Вешать ещё один датчик на шину смысла нет, так как результат будет тот же самый. Смысл будет, когда начнём читать ROM-код.

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

 

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

 

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

 

Исходный код

 

 

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

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

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

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

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

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

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

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

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

 

 

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

ESP32 1-Wire. Инициализация

 

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

ESP32 1-Wire. Инициализация

2 комментария на “ESP32. Урок 37. RMT. 1-Wire. Инициализация. Часть 2
  1. Виктор:

    Добрый день! Спасибо за огромную работу!
    Возникли сложности с компиляцией кода, выложенного в 41 уроке.
    Строка 768 owb.c Не объявлена GPIO! наверное должна использоваться переменная из info->gpio? GPIO упоминается в этой строке первый раз.
    И поскольку у меня esp-idf v5.1 получаю сообщение, что driver/rmt.h считается устаревшим с рекомендацией использовать на driver/rmt_rx.h и driver/rmt_tx.h.
    Попробую довести довести до компиляции.

  2. VVK:

    Добрый день! Спасибо за проделанную просветительскую работу!

    При попытке компиляции проекта (исходный код урока 41) появляется сообщение о том, что в owb.c GPIO не объявлена.
    Есть ещё вопрос по более свежей версии esp-idf. Cообщение driver/rmt.h устарела, рекомендуют использовать driver/rmt_rx.h и driver/rmt_tx.h. Но простой замены недостаточно, поскольку в новых заголовочных файлах отсутствует тип RingbufHandle_t.

    Спасибо ещё раз!

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

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

*