Температурный датчик DS18s20 (часть 2)

Digitemp во FreeBSD

В этой части материала мы узнаем как нам извлечь данные с температурного датчика посредством программы Digitemp, сей продукт разрабатывается под лицензией GNU General Public License, соответственно доступен исходный код, имеются сборки под Linux (.deb и .rpm пакеты), Windows(с помощью  Cygwin), так же с недавних пор (c 26 июня 2011) появился в портах FreeBSD.

В первой части материала мы рассмотрели создание простого 1-wire адаптера для com-порта компьютера.

Итак мы будем использовать Digitemp в системе FreeBSD 8.1, но Вы без труда сможете его использовать в Linux и в Windows (работу в windows я не проверял) скачав нужный вам пакет.
Подключаем адаптер к com-порту.

Обновляем порты:

# portsnap fetch update

Устанавливаем  digitemp:

# cd /usr/ports/misc/digitemp/ && make install clean && rehash

В конце установки инсталлятор  выдаст предупреждение.

NOTE: on FreeBSD Digitemp should use /dev/cuau* serial devices, so if running as non-root user, please tune your devfs rules or add running user to «dialer» group which is the default owner of /dev/cuau* devices !

Означающее, что Digitemp использует последовательные устройства /dev/cuau* (* — номер устройства (порта)) и если Вы будете опрашивать эти устройства не от пользователя «root», то пользователя необходимо добавить в группу «dialer».

Проверяем видит ли  Digitemp наш адаптер:

# digitemp_DS9097 -q -w -s /dev/cuau0

Где ключи означают следующее: -q — не выводить © -w — пройтись по всем устройствам в сети 1-wire -s — указываем какой серийный порт опрашивать

Если адаптер спаян правильно, то на вывод мы получим следующее:

10F106E901080025 : DS1820/DS18S20/DS1920 Temperature Sensor

Начинаем радоваться, программа увидела наш температурный датчик, с уникальным адресом 10F106E901080025 который относится к семейству датчиков DS1820/DS18S20/DS1920 и является Temperature Sensor.

Далее для работы Digitemp надо создать конфигурационный файл.

Переходим в директорию где хотим сохранить конфигурационный файл:

# cd ~
# digitemp_DS9097 -q -i -s /dev/cuau0

Ключ -i указывает создать конфигурационный файл (файл создастся в директории откуда была запущена команда, имя файла .digitemprc)
Посмотрим конфигурационный файл:

# less .digitemprc
TTY /dev/cuau0
READ_TIME 1000
LOG_TYPE 1
LOG_FORMAT "%b %d %H:%M:%S 
Sensor %s C: %.2C F: %.2F" 
CNT_FORMAT "%b %d %H:%M:%S 
Sensor %s #%n %C" 
HUM_FORMAT "%b %d %H:%M:%S 
Sensor %s C: %.2C F: %.2F H: %h%%" 
SENSORS 1 ROM 0 0x10 0xF1 0x06 0xE9 0x01 0x08 0x00 0x25

Немного разберем его

  1. TTY — Порт в котором находится наш адаптер
  2. READ_TIME — Время опроса в миллисекундах
  3. LOG_TYPE имеет три формата:
    1 — Выводить температуру в F° и C° с датой и т.п.
    2 — Выводить температуру только в C° и номер датчика
    3 — Выводить температуру только в F° и номер датчика
  4. LOG_FORMAT — форматирование вывода, к примеру указанная в конфиге строка «%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F» выведет нам следующее:
    May 24 21:25:43 Sensor 0 C: 23.66 F: 74.59
    %b — Месяц
    %d — День месяца
    %H — Час
    %M — Минуты
    %S — Секунды
    %s — Номер датчика, у нас он один, нумерация с нуля
    %.2C — Выведет температуру в C° с двумя знаками после запятой
    %.2F  — Выведет температуру в F° с двумя знаками после запятой
  5. CNT_FORMAT — Формат вывода счетчиков типа DS2423, мы его не используем
  6. HUM_FORMAT — Форматированный вывод для датчиков влажности типа HIH-4000
  7. SENSORS 1 — Указывает, что у нас один датчик
  8. ROM — Собственно ROM нашего датчика

Нас интересует вывод только температуры в C°.
Для этого меняем переменную LOG_TYPE  в .digitemprc с 1 на 2.

Запускаем командой:

# digitemp_DS9097 -q -a -c .digitemprc 0       22.62

— 0 номер нашего датчика, 22.62 полученная температура в C°

Создадим скрипт запуска: 

# vi /home/scripts/temperature.sh

#!/bin/sh
# в переменную $line вставляем текущие значения номер датчика и температуры
line=`/usr/local/bin/digitemp_DS9097 -q -a -c /path/.digitemprc`
# в переменной $temperature оставляем только значение температуры
temperature=`echo $line | awk '{print $2}'`
# определяем текущею дату для вывода в лог
date=`date "+%d.%m.%Y_%H:%M"`
# делаем вывод в лог-файл
echo $temperature $date >> /var/log/temperature.log
 

 

Делаем файл исполняемым:

# chmod +x /home/scripts/temperature.sh

 

Добавляем в crontab наш скрипт для выполнения раз в 5 минут:

# crontab -e

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
HOME=/var/log
#minute  hour    mday    month   wday
*/5 * * * * /home/scripts/temperature.sh >/dev/null 2>&1

Теперь раз в 5 минут наши данные с датчика будут писаться в лог-файл, запись «>/dev/null 2>&1» сделана для того, чтобы данные не отправлялись почтой, в принципе уже можно выводить эти данные куда-нибудь, так же не забываем включить пользователя от которого запускается скрипт отличного от «root» в группу «dialer».

В следующей части мы рассмотрим пакет rrdtool и научимся хранить данные от нашего датчика в RRD (Round-robin Database) и рисовать температурные графики.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Комментарии: 2
  1. Andrey Y. Ostanovsky

    Спасибо за подробную статью!

    Хотелось бы только отметить, что лог_формат файла .digitemprc позволяет регулировать вывод не прибегая к средствам awk.

    Например, такая строка (при всех остальных вводных командной строки) выведет данные в формате для munin:

    LOG_FORMAT «sensor%s.value %.2C»

    1. Vladimir (автор)

      Приветствую! Большое спасибо за дополнение.

Добавить комментарий

:) :D :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.