СОПРЯЖЕНИЕ КОМПЬЮТЕРОВ С ВНЕШНИМИ УСТРОЙСТВАМИ

Яндекс цитирования

Друзья ресурса:

www.roboforum.ru




§ 15. Подключение датчика температуры к Ke-USB24A

Дмитрий Иванов, 8 января 2010

Файлы к статье скачать
Имя: TemperatureSensor.zip (ZIP архив)
Размер: 143 КБ

В свое время мы посмотрели как можно с помощью Ke-USB24A помигать светодиодами, принимать данные снаружи через дискретные линии, настроенные на вход. Здесь поговорим о более полезных на практике вещах, например об измерении температуры. К модулю можно подключить внешний датчик температуры и получать измерения последней на компьютере в нашей собственной программе. А дальше с ней можно делать все что угодно. Начиная от ее банального отображения в программе (некая программа-градусник) до "умного" управления различной автоматикой, включение или выключение которой определяется уровнем текущей температуры.

Какй же датчик использовать и как его собственно использовать, возникает вопрос. В этой статье я буду применять датчик температьуры от KernelChip, т.е. тойже фирмы которая и делает модули Ke-USB24A. Выглядит этот датчик вот так:

Датчик температуры

Т.е. это собственно сам датчик (синия трубка на конце) который установлен на отрезке кабеля длинной примерно 1.5 м. Из кабеля торчат два провода: один с красным маркером, другой с черным.

Схема подключения датчика показана на рисунке ниже. Сам датчик подключается к АЦП. К счастью, в модуле Ke-USB24A как раз "завалялся" один АЦП. Дополнительно потребуется один постоянный резистор величиной в 110 кОм. Приведенная схема довольно подробная и напутать здесь что-либо будет довольно сложно.

Схема подключения датчика температуры

Итак, датчик "прикрутили", хотелось бы и температуру померить в моей собственной программе. Как мы будем это делать? Довольно просто. Давайте напишем простенькое Windows приложение на языке C++ в Microsoft Visual Studio с использованием MFC.


Небольшое лирическое отступление

Так уж у меня исторически сложилось что С/C++ являются языком программирования де-факто для меня. Ибо писать пришивку микроконтроллера на Delphi или С# пока в голову не приходило. Поэтому, поклонники остальных языков, приношу извинения, писать буду на С++. По мере возможностей стараюсь разбавлять сишные статьи и другими языками тоже но не всегда хватает сил и времени на это. Тем же кто еще окончательно не определился с языком программирования для себя - настоятельно рекомендую выбрать C/C++. Потом не пожалеете. И еще момент - все современные операционные системы пишутся исключительно на С++, а это что-то да значит.


Так, отвлекся немного, поехали дальше. Подробно расписывать процедуру создания проекта не буду. Много раз уже делал. Готовый проект можно скачать в шапке этой статьи.

Что же эта программу будет уметь делать? Да ничего особенного. С ее помощью можно будет в режиме реального времени наблюдать показания датчика температуры. Вмзуально она выглядит вот так:

Программа измерения температуры

Другими словами, выглядит она незатейливо и незамысловато (во какие удивительные слова есть в русском языке). Давайте ее запустим. Итак, датчик подключен к модулю, модуль подключен к компьютеру. Указываем номер COM порта, который был выдан системой для нашего модуля и нажимаем кнопку Open. Наблюдаем показания температуры. Отлично, роаботает. Как видно у меня вполне комфортная температура.

Программа измерения температуры

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

Теперь посмотрим как же работает программа. Когда мы нажимаем на кнопку Open - вызывается соответствующая функция обработчик. Мельком проверяется валидность введенного номера порта и проводится попытка его открытия с помощью класса SerialGate, предназначенного для работы с COM портом. Можно было конечно написать все и прямыми вызовами функций, но мне всю эту рутинную работу делать не захотелось. Поэтому и использую SerialGate. Итак, порт открыли. Далее, отправляем в него команду на включение переодической выдачи резульатов АЦП с частотой 1 Гц. Потм стартуем системный тайсмер и настраиваем его на срабатывание каждыую секунду. Потом запускаем отдельный прогпраммный поток, который будет заниматься чтением COM порта.

Отдельный поток нужен для того чтобы программа не зависала все время на одной задаче - чтения порта, но и могла выполнять и другие операции, например, обрабатывать сообщения перемещения окна и т.д. Функция потока реализованна на "коленке" и меня можно за нее забросать тухлыми помидорами, но мне было лень делать все красиво и аккуратно. Здесь мы читаем порцию данных из порта и пытаемся вычленить от туда результат чтения АЦП, который передается в виде #ADC,Value. Значение Value четырехзначное, поэтому я там и применяю некую странную технику "склейки" числа.

Итак, значение АЦП получили. Переводим его в величину напряжения в вольтах используя очевидное преобразование. Далее интерсенее. Нам нужно из этого напряжения получить значение температуры. Для этого существует готовая формула, которую можно найти на сатранице используемого датчика температьуры. Аккуратно ее записываем на языке Си и получаем вот такого "крокодила". С помощью его рассчитываем значение температуры и помещаем результат в переменную, ассоциированную с окном ввода, размещенного на диалоговом окне. Раз в 1 секунду срабатывает таймер и обновляет информацию в окне температуры.

Вот собственно и все. Что еще можно добавить? Описанная техника позволяет подключить этот датчик и к другим модулям KernelChip, например, Ke-GSM или Ke-USB24R. Технология таже самая. Используя этот датчик можно строить различные системы автоматического управления и регулирования.

© Дмитрий Иванов
8 января 2010 года
www.pcports.ru



Контакты | Гостевая книга

© 2005-2009 сопряжение компьютеров с внешними устройствами PCPORTS.RU © Иванов Д.В.