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