Дмитрий DarkByte Москин

Мой блог, да.
logo

Температурный датчик DS18B20

Опубликовано 07.04.2011 автором Дмитрий Москин
Надоело каждый раз бегать до градусника, чтобы посмотреть температуру за окном, поэтому решено было сделано электронный термометр с выводом температуры на сервер.

Выбор пал на цифровой датчик температуры DS18B20, который питается 3-5В и поддерживает температурный диапазон от -55 до +125°С с точностью 0.06°С.

Датчик очень просто подключается к компьютерному COM порту и кроме того имеется уже готовый софт для работы с ним.

Первым делом необходимо проверить напряжение, которое выдаёт COM порт. На некоторых материнских платах это ±12В, на некоторых ±5В.

В моём случае COM порт выдавал 12В, но уже был занят другими девайсами и поэтому датчик пришлось подключить через переходник USB->COM от МастерКита ВМ8050, который как раз таки выдавал ±5В

Схема подключения очень проста:

DS18B20 COM adapter

Для её сбора нам понадобится:
1) 2 диода, в принципе не важно каких
2) 2 стабилитрона* (на 3-6В)
3) сопротивление на 1.5 кОм (у меня был на 1К)
4) сам датчик DS18B20 (стоит 50-60руб)

*стабилитроны нужно использовать если COM порт выдаёт 12В.
При 5В они не нужны и схема адаптера упрощается до трёх элементов.

При данной схеме подключения датчика, используется "паразитное" питание, т.е. пока в датчик отправляются данные, конденсатор внутри его заряжается и его заряда хватает для питания датчика, пока тот отправляет ответ. Тем самым количество проводов для подключения датчика уменьшается до двух, но и расстояние, на которое датчик может быть удалён сокращается примерно до 100-300 метров :)

Хотя проблему расстояния можно решить подключив внешний конденсатор большей ёмкости к выходах питания и земли датчика и через диод подключить пин данных к пину питания. Это так же увеличивает стабильность работы датчика.

Итак, адаптер готов, можно подключать к компьютеру и приниматься за софтовую часть.
Будем использовать готовую программу, под названием digitemp.

К сожалению порта под FreeBSD не оказалось, но исходники скомпилировались без особых проблем.
Если нет gmake, то ставим его:
cd /usr/ports/devel/gmake
make install clean

Затем ставим сам digitemp:
fetch http://www.digitemp.com/software/linux/digitemp-3.6.0.tar.gz
tar -xzvf digitemp-3.6.0.tar.gz
cd digitemp-3.6.0
gmake ds9097
mkdir /usr/local/etc/digitemp/
cp digitemp_DS9097 /usr/local/etc/digitemp/digitemp
cd ..
rm –r digitemp-3.6.0
rm digitemp-3.6.0.tar.gz


Переходник ВМ8050 под фряхой определился автоматически и в системе появился новый COM порт /dev/cuaU0. COM порт на материнской плате скорее всего называется /dev/cuau0

Если всё прошло без ошибок, тогда можно проверять датчик. Первым делом нужно определить все подключенные датчики, а на эти два провода их можно подключить довольно много, ибо каждый имеет свой уникальный идентификатор.

В моём случае их два:
#digitemp -q -i -s /dev/cuaU0
28C0A1BA020000BA : DS18B20 Temperature Sensor
28E6AEBA020000D1 : DS18B20 Temperature Sensor
ROM #0 : 28C0A1BA020000BA
ROM #1 : 28E6AEBA020000D1

После этой команды программа сохраняет конфиг в файл .digitemprc, в котором перечисляет имеющиеся датчики, а так же другие параметры, такие как имя устройства, формат вывода и время чтения показаний с каждого датчика.

Далее считываем показания с датчиков:
#digitemp -q -a
Apr 08 14:59:41 Sensor 0 C: 11.25 F: 52.25
Apr 08 14:59:44 Sensor 1 C: 39.38 F: 102.88


Иногда датчик может возвращать температуру 85°C что означает то, что датчик не успел инициализироваться, что может быть вызвано большим удалением датчика или не надёжным его подключением. В этом случает можно увеличить время чтения данных с датчика до 2000мс или добавить дополнительный внешний конденсатор или просто подвести внешнее питание к датчику.

Если программа возвращает ошибку контрольной суммы (CRC), то следует проверить правильность подключения (полярность).

Показания с двух датчиков, установленных на улице города Челябинска можно увидеть на сайте http://sens.darkbyte.ru/
Кроме того, для удобства сделал плагин для Google Chrome, отображающий текущую температуру в Челябинске.

Для съёма показаний с датчиков имеется API, подробнее можно прочитать по ссылке.