1-wire термо станция на FreeBSD

1-wire термо станция на FreeBSD

Статья с блога друга ZG с небольшими наработками о том как спаять схему на COM порт и подключить термодатчик DS18B20 к ПК на FreeBSD. А также организовать хранение данных в MySQL базе.

Собираем схему

Схем много, но ZG остановился на этой, ну и я не стал изобретать велосипед. На схеме слева COM-порт, справа датчик DS18B20.

Zender Diode — это обычные стабилитроны, Shottkie Diode (подойдут 1N4007 и на 1N4005) — собсно диоды шотки, конденсатор на схеме указан танталовый, но вполне подойдет и обычный электролит.

Сам датчик:

О датчиках, можно использовать и DS1820 и DS18S20, но я рекомендую DS18B20 потому что он умеет показывать десятые доли градуса, а два первых — только по 0.5 градуса…

Настройка digitemp

После того как схема правильно собрана, и датчик к ней подключен, можно приступать к настройке digitemp (программа для работы с датчиками) оффсайт: www.digitemp.com

Скачиваем digitemp (папка /mnt/soft/1_arch взята как пример):

cd /mnt/soft/1_arch
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

После удачного компилинга выполняем:

./digitemp_DS9097

Смотрим показывает ли нам digitemp свой мануал, если да то все ок.

Для удобства скопируем этот файл с новым именем dt в директорию в которой будем все хранить и настраивать:

cp digitemp_DS9097 /mnt/soft/digitemp
cd /mnt/soft/digitemp

Пробуем про инициализировать датчики, для этого нам нужно запустить digitemp с параметрами -q -w и указать com порт в который воткнута схема:

./dt -q -w -s /dev/cuau0
28050627020000D0 : DS18B20 Temperature Sensor

Отсюда видно что digitemp нашел 1 датчик 28050627020000D0 : DS18B20 Temperature Sensor, если он ничего не находит значить криво собрана схема или указан не тот com порт теперь сохраняем параметры в конфиг, для этого выполняем:

./dt -q -i -s /dev/cuau0
28050627020000D0 : DS18B20 Temperature Sensor
ROM #0 : 28050627020000D0

После чего digitemp в своем каталоге создаcт файл .digitemprc в котором лежат данные о порте, датчиках и формате вывода. Теперь чтоб посмотреть температуру достаточно выполнить:

./dt -a -q -c /usr/local/etc/digitemp/.digitemprc

Формат вывода информации можно задать как в .digitemprc LOG_FORMAT, так и через параметры запуска, например -o%.1C (покажет только температуру по Цельсию).

Создание процедур и таблиц в MySQL

pkg_info | grep mysql
mysql-client-5.5.29 Multithreaded SQL database (client)
mysql-server-5.5.29 Multithreaded SQL database (server)

Имеем установленный MySQL — ну и инструмент работы с ним. Создаем базу, пользователя, пароль.

Ниже представлен скрипт для создания таблиц:

CREATE TABLE `ds_sensors` (
`id` smallint(6) NOT NULL AUTO_INCREMENT,
`curtemp` float NOT NULL DEFAULT '0',
`lastupdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`place` varchar(100) DEFAULT NULL,
`model` varchar(30) DEFAULT NULL,
`top` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251;

CREATE TABLE `ds_temps` (
`id` int(6) NOT NULL AUTO_INCREMENT,
`sensor_id` smallint(6) NOT NULL DEFAULT '0',
`num` smallint(6) NOT NULL DEFAULT '0',
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`temp` float NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251;

Скрипт создаёт 2 таблицы, одна для текущих показаний, вторая для истории.

Создаём процедуру:

DELIMITER $
CREATE PROCEDURE update_temp (IN ctemp VARCHAR(10), IN sens_id INT)
begin
set @lnum=(select max(num) from ds_temps where (date(datetime)=curdate()) and (sensor_id=sens_id));
set @cnum=(select truncate(((time_to_sec(now())/300)+1), 0));
IF @lnum = @cnum THEN
update ds_sensors set lastupdate=now(), curtemp=ctemp where id=sens_id;
else begin
if (ctemp-60) then insert into ds_temps (temp,datetime,num,sensor_id) values (ctemp, now(), (select truncate(((time_to_sec(now())/300)+1), 0)),sens_id);
end if;
update ds_sensors set lastupdate=now(), curtemp=ctemp where id=sens_id;
end;
end if;
END$
DELIMITER ;

Проверяем доступ к БД, если всё ок — идём дальше.

Скрипт добавления данных в базу

#!/bin/sh

db_host=localhost
db_pass=Пароль_для_БД
db_user=Пользователь_БД
db_name=Таблица_БД

digitemp_bin=/mnt/soft/digitemp/dt
digitemp_conf=/mnt/soft/digitemp/.digitemprc
digitemp_format=%.1C
digitemp_sensor=13

`$digitemp_bin -a -q -o $digitemp_format -c $digitemp_conf -l temperature.log`
cat temperature.log | while read line;
do
        sql="call update_temp($line,$digitemp_sensor);";
        digitemp_sensor=`expr $digitemp_sensor + 1`;
        `/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user $db_name -p$db_pass`;
done
rm -f temperature.log;

В скрипте указываются параметры соединения с БД, а так же каталоги для работы. digitemp_sensor указывает номер, с которого начинают присваиваться идентификаторами датчики по порядку (в данной схеме их может быть до ста), обычно digitemp_sensor = 0. Скрипт рассчитан на работу со всеми датчиками в собранной Вами цепи.

Даем скрипту права на исполнение:

chmod 777 dt2db

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

echo "*/1 * * * * root /mnt/soft/digitemp/dt2db" >> /etc/crontab