Статья с блога друга ZG с небольшими наработками о том как спаять схему на COM порт и подключить термодатчик DS18B20 к ПК на FreeBSD. А также организовать хранение данных в MySQL базе.
1. Собираем схему:
Схем много, но ZG остановился на этой, ну и я не стал изобретать велосипед.
НА схеме слева COM-порт, справа датчик DS18B20.
Zender Diode — это обычные стабилитроны, Shottkie Diode (подойдут 1N4007 и на 1N4005) — собсно диоды шотки, конденсатор на схеме указан танталовый, но вполне подойдет и обычный электролит.
Сам датчик:
О датчиках, можно использовать и DS1820 и DS18S20, но я рекомендую DS18B20 потому что он умеет показывать десятые доли градуса, а два первых — только по 0.5 градуса…
Настройка digitemp
После того как схема правильно собрана, и датчик к ней подключен, можно приступать к настройке digitemp (программа для работы с датчиками) оффсайт: www.digitemp.com
Скачиваем digitemp (папка /mnt/soft/1_arch взята как пример):
1 2 |
cd /mnt/soft/1_arch fetch http://www.digitemp.com/software/linux/digitemp-3.6.0.tar.gz |
Распаковываем и компилируем:
1 2 3 |
tar -xzvf digitemp-3.6.0.tar.gz cd digitemp-3.6.0 gmake ds9097 |
После удачного компилинга выполняем:
1 |
./digitemp_DS9097 |
Смотрим показывает ли нам digitemp свой мануал, если да то все ок.
Для удобства скопируем этот файл с новым именем dt в директорию в которой будем все хранить и настраивать:
1 2 |
cp digitemp_DS9097 /mnt/soft/digitemp cd /mnt/soft/digitemp |
Пробуем про инициализировать датчики, для этого нам нужно запустить digitemp с параметрами -q -w и указать com порт в который воткнута схема:
1 2 |
./dt -q -w -s /dev/cuau0 28050627020000D0 : DS18B20 Temperature Sensor |
Отсюда видно что digitemp нашел 1 датчик 28050627020000D0 : DS18B20 Temperature Sensor, если он ничего не находит значить криво собрана схема или указант не тот com порт теперь сохраняем параметры в конфиг, для этого выполняем:
1 2 3 |
./dt -q -i -s /dev/cuau0 28050627020000D0 : DS18B20 Temperature Sensor ROM #0 : 28050627020000D0 |
После чего digitemp в своем каталоге создаcт файл .digitemprc в котором лежат данные о порте, датчиках и формате вывода. Теперь чтоб посмотреть температуру достаточно выполнить:
1 |
./dt -a -q -c /usr/local/etc/digitemp/.digitemprc |
Формат вывода информации можно задать как в .digitemprc LOG_FORMAT, так и через параметры запуска, например -o%.1C (покажет только температуру по цельсию).
Создание процедур и таблиц в MySQL:
1 2 3 |
pkg_info | grep mysql mysql-client-5.5.29 Multithreaded SQL database (client) mysql-server-5.5.29 Multithreaded SQL database (server) |
Имеем установленный MySQL — ну и инструмент работы с ним. Создаем базу, пользователя, пароль.
Ниже представлен скрипт для создания таблиц:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 таблицы, одна для текущих показаний, вторая для истории.
Создаём процедуру:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 ; |
Проверяем доступ к БД, если всё ок — идём дальше.
Скрипт добавления данных в базу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/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. Скрипт рассчитан на работу со всеми датчиками в собранной Вами цепи.
Даем скрипту права на исполнение:
1 |
chmod 777 dt2db |
Добавляем скрипт в крон для выполнения раз в минуту:
1 |
echo "*/1 * * * * root /mnt/soft/digitemp/dt2db" >> /etc/crontab |
3 Comments Добавить комментарий