Понедельник, 20 февраля, 2012 года

OWFS, мастер сети DS9490R и температурные датчики DS18B20 в Xubuntu 11.10 (1-Wire)




 

Теория коротко: 1-Wire (англ. один провод) — двунаправленная шина связи для устройств с низкоскоростной передачей данных (обычно 15,4 Кбит/с, максимум 125 Кбит/с в режиме overdrive), в которой данные и питание передаются по одной линии (то есть всего используются два провода — один для заземления, а второй для питания и данных; в некоторых случаях используют и отдельный провод питания). Разработана корпорацией Dallas Semiconductor и является её зарегистрированной торговой маркой. Соответственно, топология такой сети — общая шина.

1-wire сеть

1-wire сеть

Строим простейшую сеть 1-wire. Начальный этап, попрактиковаться) Заказываем DS9490R (ведущий шины) и DS18B20 (ведомый, термометр), я брал в Rainbow Electronics. Для справки, Rainbow Electronics является дистрибьютором компании Maxim. DS9490R мне обошелся с доставкой 996,92 р., а DS18B20 79,66 руб (за шт.). Распиновку разъема мастера сети и датчиков можно посмотреть в Datasheet здесь и здесь. Будем считать, что мы все собрали-спаяли верно, приступим к установке программы owfs.

Вставляем DS9490R (мастер сети) 1-wire в USB разъем и в терминале вводим:

# dmesg
[15.534873] Driver for 1-wire Dallas network protocol.
[15.777030] usbcore: registered new interface driver DS9490R
[1553882.700959] w1_master_driver w1_bus_master1: Family 81 for 81.0000002d0f1d.39 is not registered.

Ставим пакеты для компиляции owfs:

# apt-get install automake autoconf autotools-dev gcc g++ libtool  libusb-dev fuse-utils libfuse-dev swig python2.7-dev tcl8.4-dev php5-dev

Скачиваем и распаковываем owfs. Я брал самую последнюю версию, но у кого то с ней проблемы и советуют ставить 2.8p13:

# cd /usr/src
# wget http://downloads.sourceforge.net/project/owfs/owfs/2.8p14/owfs-2.8p14.tar.gz
# tar zxpf owfs-2.8p14.tar.gz

Переходим в директорию и вводим:

# cd owfs-2.8p14/
# ./configure

Будет много букв, но в конце должно быть примерно так:

Current configuration:
 
    Deployment location: /opt/owfs
 
Compile-time options:
                  Caching is enabled
                      USB is enabled
                      I2C is enabled
                   HA7Net is enabled
                       W1 is enabled
           Multithreading is enabled
    Parallel port DS1410E is enabled
        TAI8570 barometer is enabled
             Thermocouple is enabled
         Zeroconf/Bonjour is enabled
             Debug-output is enabled
                Profiling is DISABLED
Tracing memory allocation is DISABLED
1wire bus traffic reports is DISABLED
 
Module configuration:
                    owlib is enabled
                  owshell is enabled
                     owfs is enabled
                  owhttpd is enabled
                   owftpd is enabled
                 owserver is enabled
                    ownet is enabled
                 ownetlib is enabled
                    owtap is enabled
                    owmon is enabled
                   owcapi is enabled
                     swig is enabled
                   owperl is enabled
                    owphp is enabled
                 owpython is enabled
                    owtcl is enabled

Компилируем и устанавливаем OWFS:

# make
# make install

Финальная стадия.
Создадим директорию для монтирования датчиков:

# mkdir /var/1-wire

Проверим наличие нашего 1-Wire адаптера. OWFS поддерживает два типа мастера и с USB, и с COM портом. Будет выведен текущий список устройств USB, что-то вроде:

# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 003: ID 04fa:2490 Dallas Semiconductor DS1490F 2-in-1 Fob, 1-Wire adapter
Bus 003 Device 002: ID 0458:003a KYE Systems Corp. (Mouse Systems) NetScroll+ Mini Traveler / Genius NetScroll 120
Bus 001 Device 004: ID 04e8:6761 Samsung Electronics Co., Ltd

Теперь мы знаем, наши адаптер найден, запускаем OWFS:

# /opt/owfs/bin/owfs --allow_other -u /var/1-wire/
DEFAULT: ow_usb_msg.c:(276) Opened USB DS9490 bus master at 2:3.
DEFAULT: ow_usb_cycle.c:(191) Set DS9490 2:3 unique id to 81 C5 86 30 00 00 00 C1
fuse: mountpoint is not empty
fuse: if you are sure this is safe, use the 'nonempty' mount option

Программа запущена, теперь нам необходимо взглянуть на примонтированные 1-Wire датчики:

# ls -lah /var/1-wire
итого 4,0K
drwxr-xr-x  1 root root    8 2012-02-20 15:32 .
drwxr-xr-x 17 root root 4,0K 2012-02-17 19:06 ..
drwxrwxrwx  1 root root    8 2012-02-20 17:32 28.A34A8A030000
drwxrwxrwx  1 root root    8 2012-02-20 17:32 28.A7CD09030000
drwxrwxrwx  1 root root    8 2012-02-20 17:32 81.C58630000000
drwxr-xr-x  1 root root    8 2012-02-20 15:32 alarm
drwxr-xr-x  1 root root    8 2012-02-20 15:32 bus.0
drwxr-xr-x  1 root root    8 2012-02-20 15:32 settings
drwxrwxrwx  1 root root    8 2012-02-20 17:32 simultaneous
drwxr-xr-x  1 root root    8 2012-02-20 15:32 statistics
drwxr-xr-x  1 root root   32 2012-02-20 15:32 structure
drwxr-xr-x  1 root root    8 2012-02-20 15:32 system
drwxr-xr-x  1 root root    8 2012-02-20 15:32 uncached

Мы видим папки — 28.A34A8A030000 и 28.A7CD09030000. Это и есть температурные датчики DS18B20, а 28.A34A8A030000 и 28.A7CD09030000 уникальные идентификаторы устройств (навроде MAC адреса). Считаем температуру:

# cat /var/1-wire/28.A34A8A030000/temperature
  22.4375
# cat /var/1-wire/28.A7CD09030000/temperature
  22.3465

Чтобы датчика монтировались при старте системы в /etc/rc.local до строчки exit 0 пишем:

modprobe -a ds2490 &
/opt/owfs/bin/owfs --allow_other -u /var/1-wire &

OWFS, сам по себе, является Web-сервером. Запустим его:

/opt/owfs/bin/owserver -uall -p 3000
/opt/owfs/bin/owhttpd -s 3000 -p 3001
/opt/owfs/bin/owfs -s 3000 /var/1-wire/

Теперь мы можем зайти на него таким образом, наберем в браузере:

http://localhost:3001/

Результат:

Интерфейс Web-сервера owfs

Интерфейс Web-сервера owfs

owfs, помимо всего прочего, поддерживает множество сетей 1-wire. Вы можете использовать два и более управляющих элемента DS9490R, использовав одну сеть, например, для работы достаточно медленных температурных датчиков, а другую — для исполнительных механизмов.

Интерфейс, доступный через Интернет (на скриншоте), которым располагает owfs для считывания показаний устройств вполне пригоден для отладки и администрирования, но выглядит несколько пугающим для домочадцев, ведь в будующем я рассчитываю наращивать сеть (управляющими датчиками освещения, отопления, видеонаблюдения). Поэтому я решил воспользоваться библиотекой ownet из пакета owfs для считывания показаний из PHP-скриптов.

В планах: считывать датчики раз в 5 минут и записывать их в базу mysql. Неплохо было бы отображать какую-нибудь аналитику. Например, среднюю, максимальную и минимальную температуру за день и за сутки, перепад температуры в течение суток. Также неплохо было рисовать температурный график, думаю RRDtool для этого подойдет. Сделать реагирование на события, например при достижении минимально допустимой температуры в помещении информировать меня по sms и email. Прикрутить датчики движения, тоже с информированием меня о вторжении. Поменять газовый котел в котором есть эл. управлением, например «Vaillant», и рулить им из веб-интерфейса. И да, видеонаблюдение.

Ну, а пока протестируем ownet, создадим виртуальный хост в Apache и кинем туда простейший скриптик:

<?php
require "/opt/owfs/bin/ownet.php";
$ow=new OWNet("tcp://localhost:3000");
$temp1 = $ow->read("28.A34A8A030000/temperature");
$temp2 = $ow->read("28.A7CD09030000/temperature");
echo "small $temp2<br>";
echo "big $temp1";
unset($ow);
?>

Проверим:

http://localhost/

Результат:

Результат работы скрипта

Результат работы скрипта

Наброски сделаны и теперь нужно сваять нормальный, масштабируемый интерфейс.
Пошел думать. Продолжение следует 🙂





 

6 комментариев на “OWFS, мастер сети DS9490R и температурные датчики DS18B20 в Xubuntu 11.10 (1-Wire)”

  1. Serg Пишет:
    20 августа, 2012 в 17:36

    >Продолжение следует

    Где продолжение? 🙂

  2. you too Пишет:
    20 августа, 2012 в 22:14

    Serg, Да не успеваю ничего 🙁 на основной работе завал. Да и потом столкнулся с небольшими проблемками, при прокладке сети в реальных условиях телефонным кабелем теряются устройства, много ошибок, да и вообще сеть не стабильна. Сейчас хочу проложить сеть таким кабелем (ШГЭС экранированный) и уж потом что-нибудь продолжу, но уже с работой над ошибками.

  3. you too Пишет:
    10 сентября, 2012 в 16:35

    Serg, вот небольшое продолжение

  4. anatoliy Пишет:
    19 июля, 2013 в 18:14

    Я сделал сеть — одни DS9490R и 21 датчик DS18B20. Дом, гараж, сауна, котел. Первый вариант был на двухпроводке, но после подсоединения удаленных датчиков, суммарная длина линии 60 метров, пошли сбои. Переделал на трехпроводку. Витая пара — информационня в повиве с землей и третий провод питание от стабилизатора 7805 +5 вольт. Земля отдельным проводом на шину контура заземления. (Земля в компьютере всегда с большим уровнем помех. Так как берется из электророзетки, а на этой земле Холодильник кондиционер, микроволновка и прочие китайские электроустановки). Все сбои прекратились. Сейчас сумарная длина всех лучей 350 метров.

  5. Сергей Пишет:
    10 октября, 2013 в 11:27

    Сделал все точно так как здесь описано. Стоит один температурный датчик с маркировкой DS1820 (хотя в файле type указано DS18S20). При этом содержимое файла temperature — 85 ровно и не меняется. Должен ведь показывать температуру у меня на столе:) Может датчик неисправен?

  6. anatoliy Пишет:
    3 марта, 2014 в 15:26

    Дополнение 19 июля, 2013 в 18:14

    На длинные кабельные лучи и на вход USB поставил ферритовые фильтры типа ZCAT (ferrite.ru/warehouse/zcat...nom-korpuse.html)

    Еденичные сбои практически прекратились.

Оставьте комментарий!

Записи в RSS и Комментарии в RSS.