ESP32. Урок 41. RMT. DS18B20. Измеряем температуру



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

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

Лишний раз повторю, что с использованием других контроллеров мы всё это неоднократно проделывали, причём с STM32 мы в уроке 92 мы использовали один датчик DS18B20 на шине, а в уроке 94 у нас их было несколько. Поэтому, думаю, что с данной задачей мы легко справимся и с использование контроллера ESP32.

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

 

 

Проект был сделан на основе проекта прошлого урока с именем RMT_DS18B20_INIT и получил новое имя RMT_DS18B20.

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

 

 

Измерять мы будем один раз в секунду, поэтому объявим макрос с количеством милисекунд между измерениями

 

 

Затем организуем бесконечный цикл для измерений с использованием продвинутой задержки, которую мы изучали, когда работали над изучением ОС FreeRTOS с контроллером STM32

 

 

В файле DS18B20.c объявим макрос команды запуска конвертирования (аналого-цифрового преобразования) температуры датчиком

 

 

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

 

 

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

 

 

Перейдём в файл owb.c и выше функции owb_rmt_initialize добавим функцию, которая настроит жёстко ножку порта на притягивание к питанию

 

 

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

 

 

Далее нам надо как-то дождаться окончания конверсии температуры.

 

 

Добавим ниже функцию для этого

 

 

Конечно же, это пока только заготовка функции.

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

 

 

Вернёмся в файл ds18b20.c и объявим макрос времени, которое мы будем ждать до считывания температуры из скратчпада, в милисекундах. Данное время мы будем ожидать, если до этого обнаружились устройства на шине с паразитным питанием

 

 

Выше функции  _read_scratchpad добавим функцию для ожидания данного времени

 

 

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

 

 

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

 

 

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

 

 

В функции ds18b20_wait_for_conversion в блоке противного случая вызовем нашу функцию

 

 

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

 

 

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

 

 

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

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

 

 

Посчитаем ошибки, если таковые будут иметь место

 

У нас также может произойти ситуация, когда мы вообще не обнаружим устройств на шине. Соответственно, в данном случае мы не попадём в бесконечный цикл и провалимся вниз.

Давайте проработаем данный момент.

Перейдём в файл ds18b20.c и выше функции ds18b20_init добавим функцию освобождения памяти, запрошенного под переменную типа структуры со свойствами датчика

 

 

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

 

 

Вообще-то данный код добавлен только из эстетических соображений. По идее, у нас цикл будет нулевым, так как устройств на шине 0.

Проделаем ещё кое какие действия.

Для этого в файле owb.c в самом низу добавим функцию деинициализации шины

 

 

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

 

 

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

 

 

Отлично. Попробуем немного нагреть датчик рукой

 

 

Значение температуры возрастёт

 

 

Подключим остальные два датчика

 

 

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

 

                     

 

Попробуем также нагреть рукой датчики

 

  

 

Посмотрим изменения показаний температуры

 

 

Показания увеличились.

Попробуем извлечь все датчики из схемы

 

 

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

 

 

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

Итак, на данном уроке нам удалось считать показания температуры с одного и нескольких датчиков DS18B20 с использование модуля RMT контроллера ESP32.

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

 

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

 

 

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

 

Исходный код

 

 

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

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

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

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

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

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

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

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

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

 

 

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

ESP32 RMT. DS18B20. Измеряем температуру

 

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

ESP32 RMT. DS18B20. Измеряем температуру

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

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

*