14.05.2018 11:17, автор DiEitch
Когда я собрался отладить очередную свою конструкцию на ATMEGA8 в Proteus7, то столкнулся с тем, что датчик DHT11(DHT22) никак не представлен в этой версии. Переставлять программу очень не хотелось (много проектов у меня сделано именно в этой версии). И я решил "по-быстрому" сэмулировать этот "нужный" датчик на микроконтроллере ATTINY13. Т.к. протокол датчика очень простой, много кода для ATTINY13 не потребовалось.
Первым делом я скачал датащит https://akizukidenshi.com/download/ds/aosong/DHT11.pdf. Но в нём приведена какая-то невнятная эпюра без таймингов (они разбросаны по документу, как-будто, нельзя было их сразу на этой эпюре изобразить), по которым невозможно сразу составить полное впечатление о работе этого прибора.
В интернете я моментально нашёл то, что нужно: http://blog.usinainfo.com.br/sensor-de-temperatura-e-umidade-com-jumper-dht11/dht11-funcionamento/. Чёткая и внятная картинка со всеми параметрами. На месте авторов, именно такую я бы и добавил в датащит.
Продублирую её ниже:
Принцип работы моего эмулятора прост: к контроллеру подключаем два потенциометра (их значения оцифровываются встроенным АЦП и пересчитываются, как показано ниже), один задаёт влажность, а другой - температуру.
Значения в % потенциометров для удобства совпадают со значениями влажности в % и температуры в *С. Всё остальное легко почерпнуть из проекта в Proteus7.
При любом датчике (DHT11 или DHT22) мы всегда читаем пять байт. А вся разница лишь в том, что в DHT11 температура и влажность в восьмибитном формате, а в DHT22 - в шестнадцатибитном. Комментарии ниже объясняют обработку данных для разных типов датчиков.
Датчик считает CRC8 и отправляет пятым (последним) байтом. Для проверки достаточно сложить первых четыре байта и сравнить сумму с пятым байтом (пример выше). Не ленитесь ввести проверку CRC8 в своём проекте, это убережёт вас от неправильных данных с датчика при внешних помехах, ошибках в опросе (как правило, ошибка бывает в том, что разработчик слишком часто опрашивает датчик) и неправильном обращении к датчику.
Частоту опроса датчика делайте не чаще одного раза в две секунды. Новое значение от датчика вы быстро не получите (усреднение идёт дольше), а вот вероятность получить неправильный результат резко возрастает.
Итак, прошивка эмулятора написана (правда, значения влажности и температуры после значения 41 не совсем совпадают с показаними эмуляторов потенциометров из-за целочисленных расчётов приведенных после функции adc_read, но я исправлять это пока не стал, для теста сгодится и так), как её проверить?
В тестировании эмулятора мне помог тематический форум http://www.m.radiokot.ru/forum/viewtopic.php?f=57&t=110563.
По картинкам на форуме я накидал свой проект в Proteus7: https://embedded.by/414.
Но! Ни на моём эмуляторе (в протеусе), ни на реальном датчике (на отладочной плате) этот код из форума сразу у меня не заработал (индикатор показывал 253..255). После внесения исправлений в соответствии с кодом для реального датчика DHT22 из моего проекта (смотрите различия этих датчиков выше), всё тотчас заработало (виной всему были небольшие различия в коде).
Прошивка DHT11 (для ATTINY13) прилагается: https://embedded.by/412.
Фьюзы для тиньки взяты стандартные:
Позже я расскажу о проекте, где мне уже пригодился данный эмулятор.