Мониторинг температуры с помощью Linux


        Идея снимать показания температуры возникла у меня давно. Однако ничего подходящего , доступного и дешевого я тогда так и не смог найти. Совсем недавно наткнулся на довольно интересную схему, опубликованную в  журнале LinuxFocus
Схема достаточно простая для человека , который плохо разбирается в электронике ( каким я и являюсь :) )

 Практически все детали доступны в магазинах радиотоваров ( покрайней мере в моем городе )
 Итак что нам нужно:

 1. Собственно, самое главное - датчик температуры DS18S20 ( DS1820 )
    Согласно спецификации, данный сенсор работает при температурах от -55 C to 125 C, кроме того , каждый сенсор имеет собственный 64 битный ID, что позволяет использовать одновременно 100 сенсоров на шине, длиной 300 м.
Данная схема имеет ограничения, одновременно можно использовать 10 сенсоров при максимальной длине 60 метров, максимально измеряемая температура - 75 C.
Лично я не пробовал использовать несколько сенсоров на одной шине, однако в вышеупомянутой статье автор использует 4 сенсора при длине шины около 12 метров.

sensor

   Обратите внимание , 3 вывод  не используется !
 
not_use

 2. Два диода Шотки 1N5818
 3. Стабилитрон 1N5228 3.9 V
 4. Стабилитрон 1N5234 6.2 V
 5. Резистор 1.5 кОм.
 6. 9 -pin'овый разъем ( для подключения к Com - порту материнской платы )

  Я не нашел в магазине ни 1N5228 , ни 1N5234 , поэтому просто использовал аналоги с таким же напряжением.

 Схема:
  shema

 Я не стал делать печатную плату, как в вышеупомянутной статье , все элементы разместил непосредственно в  корпусе 9-pin'ого разъема, вынес наружу только датчик. Данная схема не требует никаких настроек и начинает  работать сразу после сборки..

 Теперь, как снимать показания температуры.
 Для этого существует программа Digitemp , которая распространяется под лицензией GPL. Скачать ее можно здесь  или с моего сайта. Кстати на сайте разработчика существует также версия под Windows, но как она работает,  я не проверял.

 После компиляции из исходников, перед началом работы , необходимо проинициализировать датчик, выполнив  digitemp -i -s /dev/ttyS1 ( или /dev/ttyS0 , в зависимости к какому Com порту подключен дачтик ):

# digitemp -i -s /dev/ttyS1

DigiTemp v1.7 Copyright 1996-2002 by Brian C. Lane
GNU Public License v2.0

ROM #0 : 1051655200080088

После этого можно снимать показания  командой digitemp -a

digitemp -a

DigiTemp v1.7 Copyright 1996-2002 by Brian C. Lane
GNU Public License v2.0

Nov 13 15:42:18 Sensor 0 C: 8.69 F: 47.64

Запустив  digitemp без ключей  мы получим детальное описание команды :

digitemp

DigiTemp v1.7 Copyright 1996-2002 by Brian C. Lane

GNU Public License v2.0


Usage: digitemp -s<device> [-i -d -l -r -v -t -p -a]
                -i                            Initalize .digitemprc file
                -s/dev/ttyS0                  Set serial port
                -l/var/log/temperature        Send output to logfile
                -f5                           Fail delay in S
                -r500                         Read delay in mS
                -v                            Verbose output
                -t0                           Read Sensor #
                -a                            Read all Sensors
                -d5                           Delay between samples (in sec.)
                -c/path/configfile            Configuration file
                -q                            Quiet, no copyright banner
                -n50                          Number of times to repeat
                -o2                           Output format for logfile
                -o"output format string"      See description below

Logfile formats:  1 = One line per sensor, time, C, F (default)
                  2 = One line per sample, elapsed time, temperature in C
                  3 = Same as #2, except temperature is in F
        #2 and #3 have the data seperated by tabs, suitable for import
        into a spreadsheet or other graphing software.

        The format string uses strftime tokens plus 3 special ones for
        digitemp - %s for sensor #, %C for centigrage, %F for fahrenheight.
        The case of the token is important! The default format string is:
        "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F" which gives you an
        output of: May 24 21:25:3 Sensor 0 C: 23.66 F: 74.59

    Например , если мы желаем снимать температуру только в ºC, округлять градусы до десятых  и подавить печать баннера то достаточно запустить digitemp с следующими ключами :

# digitemp -a -q -o "%.1C"
8.4

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

Лично я, для сбора и графического анализа, пользуюсь замечательным продуктом под названием Cacti .
Cacti использует для построения графиков RRDTool, имеет понятный интерфейс и очень прост в эксплуатации.

       В данный момент у меня снимаются показания с трех датчиков. Один находиться на улице, два других в серверных. Первая серверная находится в здании , где я работаю. К сожалению , там нет кондиционера , но надеюсь , на основании реально полученных данных, я теперь смогу убедить своих боссов в необходимости его покупки :). Вторая серверная находится далеко от офиса , в ней стоит кондиционер, до утра сегодняшнего дня температура была выставлена 18 ºC,  где то в 10:30 я его отключил, а приблизительно через час включил и выставил температуру 21 ºC, что собственно видно на графике.

graph

На этом, наверное, можно закончить, если у кого то возникнут вопросы прошу писать сюда, постараюсь помочь.

С уважением ,
Столяров Павел
13 ноября 2004 г.