Продолжаем работу с сопроцессором 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));
Мы их теперь не будем выводить, а будем сообщать об ошибке, если они не равны
1 2 3 |
printf("ULP wakeup\n"); if((ulp_crc8_check & UINT16_MAX) != (*(&ulp_scratchpad_memory + 8) & UINT16_MAX)) printf("CRC8 error!\n"); |
А если у нас с контрольной суммой всё нормально, то посчитаем и выведем в терминал показания температуры в градусах
1 2 3 4 5 6 |
printf("CRC8 error!\n"); else { uint16_t tmp01 = ((*(&ulp_scratchpad_memory + 1) & UINT16_MAX) << 8) | (*(&ulp_scratchpad_memory) & UINT16_MAX); printf("Temperature (degrees C): %.2f\n", (float)tmp01 / 16. ); } |
Проверим работу нашего кода, нагревая постепенно наш датчик при помощи пальца руки
Отлично! Всё у нас работает.
Можно было бы конечно собрать сырое значение температуры и в спящем режиме, (сдвинуть старший байт и прикрепить к нему младший, а затем записать в переменную) возможно даже экономия энергии была бы больше, только сделать это в основном коде намного проще, да и память в сопроцессоре не резиновая, так что кто его знает, как оно лучше.
Всем спасибо за внимание!
Предыдущий урок Программирование МК ESP32 Следующий урок
Недорогие отладочные платы ESP32 можно купить здесь Недорогие отладочные платы ESP32
Недорогие отладочные платы ESP32/ESP32-C3/ESP32-S3 можно купить здесь Недорогие отладочные платы ESP32
Датчик температуры DS18B20 в экране с проводом можно приобрести здесь DS18B20
Логический анализатор 16 каналов можно приобрести здесь
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)
Добавить комментарий