ESP32 Урок 51. ULP. Датчик DS18B20. Измеряем температуру



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

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

 

 

Проект за основу был взят из прошлого урока с именем ULP_FSM_DS18B20_CRC и получил новое имя ULP_FSM_DS18B20.

Откроем проект в Espressif IDE, перейдём в файл ulp_assembly_source_file.S и проведём там некоторые изменения в получении контрольной суммы.

 

 

Мы удалим переменную для принятой контрольной суммы, так как она у нас уже есть в массиве скратчпада

 

.global crc8_value   crc8_value: .long 0

 

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

 

    printf("CRC8 Scratchpad value: 0x%02x\n", (unsigned int) (*(&ulp_scratchpad_memory + 8) & UINT16_MAX));

 

В файле ulp_assembly_source_file.S мы удалим вот этот код

 

move r1,

scratchpad_memory add r1, r1, 8

ld r1, r1, 0

move r2, crc8_value

st r1, r2, 0

 

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

 

 

Всё нормально. Также глюк, который имел место в прошлом уроке с неравенством контрольных сумм полученной и рассчитанной, у нас исчез. Это происходило скорей всего из-за того, что использовались одни и те же регистры в коде.

 

 

Вернёмся в файл main.c и удалим пока вывод контрольных сумм в терминал

 

printf("CRC8 Checked result: 0x%02x\n", (unsigned int) ulp_crc8_check & UINT16_MAX);

printf("CRC8 Scratchpad value: 0x%02x\n", (unsigned int) (*(&ulp_scratchpad_memory + 8) & UINT16_MAX));

 

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

 

 

А если у нас с контрольной суммой всё нормально, то посчитаем и выведем в терминал показания температуры в градусах

 

 

Проверим работу нашего кода, нагревая постепенно наш датчик при помощи пальца руки

 

 

Отлично! Всё у нас работает.

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

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

 

 

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

 

Исходный код

 

 

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

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

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

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

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

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

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

 

 

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

ESP32 ULP. Датчик DS18B20. Измеряем температуру

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

ESP32 ULP. Датчик DS18B20. Измеряем температуру

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

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

*