Бродил как-то несколько лет назад по виртуальным развалам сайта tixer.ru.
Лениво приглядывался к новинкам китайской народной электронной промышленности.
Мучительно думал, а что бы такого еще прикупить.
Вам знакомо чувство, возникающее, когда все необходимые радиодетали уже куплены и запасы их аж на двести лет вперед спокойно расположились на шкафу в бесчисленных коробках и коробочках?
[Где они, скорее всего, и останутся на ближайшие двести лет, спокойно обрастая пылью. Ибо мечтания и желания Плюшкина сильны, а возможности творца и создателя конструкций уже совсем не те, что были раньше].
Вот в таком лениво-задумчивом настроении и наткнулся я на эти зеленые модули, скромно лежащие в дальнем уголке каталога сайта.
Цифровой датчик температуры и влажности MTH02 (SHT10) ‒ так было написано на страничке.
Да там и сейчас так написано, сами можете в этом убедиться.
С такими приборами я еще не работал.
Сразу представились современные цифровые технологии умного дома, продвинутая домашняя метеостанция, совмещенная с часами.
И то самое удовольствие, когда для узнавания температуры за окном не придется больше заглядывать на pogoda.yandex.ru.
От того, чтобы просто высунуться в окошко и почуять свежий ветер и бодрящий мороз я давно отвык. Ибо долго это, и лениво.
А тут прямо на стене над компьютером огненными надписями полезные словеса с цифрами.
И на улице, и в комнате и даже, не побоюсь этого слова, у рыб в аквариуме, хотя бы и с другим датчиком!
В общем ‒ раскатал губу.
Только вот как программировать-то его?
Поискал во всезнающем Интернете ‒ информации маловато.
Только datasheet из нескольких страничек состоящий.
Зато по SHT10 данных достаточно. И даже куча готового кода, знай, копируй-вставляй и пользуйся в удовольствие. И даже на Bascom-AVR код есть.
Купил я эти датчики, аж целую пару штук.
Готовый код на дисплее в готовых модельках для SHT10 в схеме домашних часов отладил.
А потом перенес прошивку в реальный железный микроконтроллер ATmega328, что на беспаечной макетной плате стоял, цветными проводками весь утыканный.
И пришла тут ко мне прекрасная розовая птица, называемая "обломинго".
Ибо не хотел железный микроконтроллер температуру измерять, хотя часами-секундами щелкал исправно.
Я снова полез в отладку кода. Виртуальная модель на дисплее работала. Работала правильно. А вот в железе - нет.
Стал разбираться.
Дошел даже до того, что datasheet'ы стал сравнивать.
[Кстати, хорошее описание алгоритма обмена данными для датчика MTH02 на русском также есть и вот здесь].
Внимательно вчитывался в строчки сухого машинного перевода, пытаясь разгадать великую мудрость, за теми словами спрятанную.
И пришел к выводу, что устройство, именуемое MTH02 не есть полноценный аналог устройству SHT10.
Ибо обмениваются они с микроконтроллером данными совершенно по разным протоколам. И кодироваться должны также по разному.
То есть вроде бы аналог, но аналог всего лишь функциональный.
С таким же успехом может быть аналогом обычного ртутного стеклянного, из раньших времен, термометра, которым температуру при ангине измеряют.
А что, температуру ведь измеряет? Измеряет. Следовательно аналог.
Вполне взаимоменяем.
Но сообразив, что код от SHT10, наскоро из Интернета выдернутый не подходит, задался я вопросом, а дальше-то что? Неужели цифровая радужная империя, заботчиво нарисованная моим воображением так и разрушится от такого пустяка?
Да не бывать такому.
На реализацию "да не бывать такому" у меня с перерывами ушло несколько лет. Но что взять с дилетанта?
И помогла в реализации этих нескольких программных строчек к неизвестному модулю хорошо известная и доступная плата, Arduino Nano. Да еще команда PulseIn от Bascom-AVR, измеряющая длину импульса в микросекундах.
Дальше нам, помимо всего прочего, понадобится компьютер, с установленными на нем программами Arduino IDE и Bascom-AVR.
1. Сама наглядная схема подключения модулей к Arduino выглядит так.
2. Так как шаг между контактами у этих датчиков не 2.54 мм, как у обычных микросхем в DIP-корпусе, а 2.00 мм, то потребуются соответствующие переходные разъемы для подключения.
3. А вот собранный по этой схеме тестовый стенд.
4. Подключим модуль Arduino к USB-порту компьютера.
5. Исходный код программы с подробными комментариями можно взять здесь.
Я всегда стараюсь как можно подробнее комментировать свои программы, но если разобраться не получится - спрашивайте в комментариях к данной статье, постараюсь ответить.
6. Загружаем его в редактор Bascom-AVR.
7. Запускаем компиляцию программы выбрав пункты меню [Program - Compile] или нажав клавишу F7.
8. Я использую плату Arduino Nano с микросхемой CH340 для обмена данными через USB-порт.
Если драйверы этой микросхемы установлены корректно, то в диспетчере устройств будет видно подключение нашего USB-устройства в виде COM-порта.
Номер порта нам понадобится позже, нужно его запомнить.
9. Сам Bascom-AVR нужно настроить на вывод cкомпилированного кода в Arduino. Это делается с помощью пунктов меню [Options - Programmer].
В раскрывающемся списке в поле Programmer указываем Arduino.
Также нужно указать порт вывода в поле COM-port, у нас это COM12, и скорость передачи в поле BAUD при загрузке кода в Arduino, для нашей платы Arduino Nano она выставлена в 57600.
10. Загружаем скомпилированный код в модуль Arduino, подключенный к компьютеру через USB-порт.
Для этого выберем пункты меню [Program - Send to chip - Program].
11. В открывшемся окне выберем в меню режим [Chip - Identify].
Если связь с платой Arduino установлена корректно, то после выбора данного режима в поле Chip вместо вопросительных знаков должно начитаться наименование нашего чипа ATmega328P.
12. Теперь можно загружать скомпилированный код в плату Arduino. Для этого выберем пункты меню [Chip - Write buffer into chip].
13. Загруженная в нашу плату Arduino программа сразу же начинает работать.
Для просмотра результатов ее работы воспользуемся режимом монитора порта.
Для этого запустим среду разработки Arduino IDE и в главном меню выберем пункты [Инструменты - Монитор порта].
14. Результаты работы программы будут выводиться в отдельном окне с периодичностью примерно в 20 секунд.
15. Если же на экран будут выдаваться невнятные "кракозябры" ‒ попробуйте в правом нижнем углу окна монитора порта установить иную скорость вывода.
Конечно, в таком виде это всего лишь тестовый стенд.
Но при необходимости никто не мешает Вам адаптировать данный код под свою конструкцию, отказавшись от Arduino и используя микроконтроллер Atmega328 в виде простого железного чипа. Также при этом потребуются отдельные дополнительные средства индикации вместо используемого здесь мониторинга на экране компьютера.
Данный исходный код рассчитан на работу микроконтроллера на частоте 16 мГц. При этом для различения нулевых и единичных битов посылки по длительности принятых импульсов используется константа равная 4.
$crystal = 16000000
'для датчика
If A1(K) > 4 then 'если длительность принятого импульса
set S1(I).J '6 микросекунд - выставляем бит в 1
else 'иначе
reset S1(I).J '2 микросекунды - сбрасываем бит в 0
endif
'для датчика 2
If A2(K) > 4 then 'если длительность принятого импульса
set S2(I).J '6 микросекунд - выставляем бит в 1
else 'иначе
reset S2(I).J '2 микросекунды - сбрасываем бит в 0
endif
Если будете переносить код на микроконтроллер, работающий на другой тактовой частоте, может потребоваться откорректировать значение этой константы.
Например, если микроконтроллер работает на частоте 1 мГц, то значение разделительной константы по длительности должно равняться 44.
$crystal = 1000000
'для датчика 1
If A1(K) > 44 then 'если длительность принятого импульса
set S1(I).J '6 микросекунд - выставляем бит в 1
else 'иначе
reset S1(I).J '2 микросекунды - сбрасываем бит в 0
endif
'для датчика 2
If A2(K) > 44 then 'если длительность принятого импульса
set S2(I).J '6 микросекунд - выставляем бит в 1
else 'иначе
reset S2(I).J '2 микросекунды - сбрасываем бит в 0
endif
Самой окончательной конструкции ‒ законченного устройства у меня пока нет. Если когда-нибудь все-таки его доделаю ‒ напишу об этом дополнительно.
А работающий код от такого электронного термометра, еще раз ‒ вот он.
Быть может и Вам пригодится.
Пользуйтесь на здоровье.
9 декабря 2019 года.
С уважением. Ваш @mp42b.