Продолжаем работу с сопроцессором 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 можно купить здесь:
На AliExpress Недорогие отладочные платы ESP32
На Яндекс.Маркет Недорогие отладочные платы ESP32
Датчик температуры в экране с проводом можно приобрести здесь:
На AliExpress DS18B20 в экране с проводом
На Яндекс.Маркет DS18B20 в экране с проводом
Логический анализатор 16 каналов можно приобрести (AliExpress) здесь
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)
Добавить комментарий