rss
Навигация
ИнструментыЯмаПолезные ссылкиЗачем мне блог?Рейтинг контентаКодекс админаФотогалереяi-payrss
Последние записи
Смонтировал видюху, моменты из жизни 2013-15На уазике до ск. Верблюд по Торгашинскому хребтуBreaks волна #9 осенний funkК нам на дачу пришел медведьСтарая бомба! Крутой рифмоплет
Каменты [еще]
2017-05-17 11:25:31 [articles] Владимир:
2016-12-20 17:49:41 [articles] Виталик:
2016-12-01 23:34:25 [news] Meteor:
2016-11-11 03:35:47 [articles] Tata10:
2016-07-27 14:28:19 [articles] Сергей:
2016-05-17 09:56:26 [articles] юра:
2016-04-29 18:03:48 [articles] agatsky.dn:
Теги
Друзья
Блог малова Лучшие стихи зая =) Мед в Красноярске Daniil V. Savenkoff Blog | То, что мне когда-то пригодилось... Велкам в друзья!

Настройка термостанции на Windows

Февраля
2011 года
25
Теги: windows, термоклиент, скрипты,
Раздел: zgbox.ru -> Статьи -> TermoService aka TermoClient -> Настройка термостанции на Windows
Просмотров: 3734
Статья о том как спаять схему на COM порт и подключить термодатчик DS18B20 к ПК на Windows. А также орагизовать хранение данных в MySQL базе.

Эта статья является составной частью проекта TermoClient



Итак, для начала нам нужно собрать эту схему:

image


Почему эту? ну вообще в инете не мало схем для термодатчиков DS1820. Я собирал уже 4, и остановился на этой поскольку в моем опыте она оказалась самой надежной, так что собираем ее! =)

Для тех кто мало знаком с радиотехникой, скажу что слева на схеме - RS232 это COM порт, а справа датчик температуры, Zender Diode - это обычные стабилитроны, Shottkie Diode - собсно диоды шотки, кондинсатор на схеме указан тантловый, но в полне подойдет и обычный электролит (у мня на нем собрано). В общем берем паяльник, канифоль, припой, прямые руки и вперед... =)

А вот тут описание самого термодатчика:

image

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

Настройка digitemp


Файл digitemp.zip Digitemp для Windows. Консольная программа для сбора данных с температурных датчиков типа DS18B20 Размещен
размер 0.59 mb 2013-01-10 14:01:43
Скачан 534

После того как схема правильно собрана, и датчик к ней подключен, берем
digitemp и запускаем его с параметром digitemp.exe -q -a -s /dev/ttyS0 где /dev/ttyS0 - адрес COM порта в который воткнута схема, соответственно ttyS0 - первый COM порт, ttyS1 - второй, итд... в общем после запуска, если схема собрана правильно, то digitemp нам покажет примерно следующее:

d:\ZSOFT\ddd\digitemp -q -w -s /dev/ttyS1
103FF6BE000800FA : DS1820/DS18S20/DS1920 Temperature Sensor
282929270200008C : DS18B20 Temperature Sensor
283DB82E020000E2 : DS18B20 Temperature Sensor

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

Кстати чуть не забыл, к схеме можно подключать до 100 слишним датчиков, все они должны быть соеденены паралельно, у меня вот например 3 датчика: на улице на солнце, в тени и дома в серваке.

итак, если digitemp увидил датчики - запускаем его с параметрами digitemp -q -i -s /dev/ttyS1 для того чтоб он записал данные о датчиках в конфиг, вывод будет примерно такой:

d:\ZSOFT\ddd\digitemp -q -i -s /dev/ttyS1
103FF6BE000800FA : DS1820/DS18S20/DS1920 Temperature Sensor
282929270200008C : DS18B20 Temperature Sensor
283DB82E020000E2 : DS18B20 Temperature Sensor
ROM #0 : 103FF6BE000800FA
ROM #1 : 282929270200008C
ROM #2 : 283DB82E020000E2

после выполнения этой комманды, в папке с digitemp будет создан конфиг .digitemprc
который он будет использовать при последующих запусках, конфиг можно переиминовать и создать несколько конфигов, и запускать digitemp с ними...
чтобы указать конфиг digitemp'у нужно запустить программу с параметром -с
например
digitemp -q -a -c c:\digimyconfig

В результате выпооления этой комманды, данные о датчиках и ком порте дигитемп возьмет из конфига, тамже он возьмет и шаблон вывода данных и покажет значения всех датчиков которые имеются в конфиге

Немного о ключах Digitemp
  • -q выключает вывод данных about
  • -a показать значения всех датчиков
  • -c для указания конфига ( -c c\:digimyconfig )
  • -s для указания COM порта ( -s /dev/ttyS0 )
  • -i чтобы записать данные о датчиках в конфиг
  • -t чтб выдать температуру конкретного датчка с номером (-t 1)

    остальные ключи смотрите в мануале digitemp

    Итак теперь редактируем .digitemprc у меня он имеет такой вид:

    TTY /dev/ttyS1
    READ_TIME 1000
    LOG_TYPE 1
    LOG_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F"
    CNT_FORMAT "%b %d %H:%M:%S Sensor %s #%n %C"
    HUM_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F H: %h%%"
    SENSORS 3
    ROM 0 0x10 0x3F 0xF6 0xBE 0x00 0x08 0x00 0xFA
    ROM 1 0x28 0x29 0x29 0x27 0x02 0x00 0x00 0x8C
    ROM 2 0x28 0x3D 0xB8 0x2E 0x02 0x00 0x00 0xE2

    заменяем везде LOG_FORMAT на
    LOG_FORMAT "%s %.1C"

    теперь при выполнении digitemp -q -a -c d:\ZSOFT\ddd\.digitemprc
    он нам выведет данные датчиков в таком виде:

    d:\ZSOFT\ddd\digitemp -q -a -c d:\ZSOFT\ddd\.digitemprc
    0 4.4
    1 3.9
    2 33.4

    что собсно и требовалось, на этом настройка digitemp завершена

    Настройка MYSQL


    Устанавливаем MYSQL Сервер версии не ниже 5 (нам нужно чтоб он поддерживал встроенные процедуры и фукции)

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

    создаем базу данных, например с именем zgdb и юзера от которого будем вносить изменения

    создаем таблицы ds_sensors - для хранения текущих температур датчиков
    ds_temps - для архива показаний датчиков (заточено под каждые 5 мин) и процедуру update_temp для добавления данных в таблицы

    sql запросы на создание таблиц и функции:

    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;


    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) and (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

    Немного о прецедуре, в запросе ана вызывается как CALL update_temp(temp,id);
    где temp - текущее показание датчика, id - его порядковый номер в таблице ds_sensors. Суть процедуры в том чтоб проверить показание датчика чтоб температура была в пределах -60..+60, обновить показание датчика в таблице ds_sensors и добавить запись в хранилище статистики температур в таблицу ds_temps но не просто добавить а добавлять только раз в 5 мин, и если там уже добавлено значние за последние 5 мин то процедура просто обновит показание счетчика в ds_sensors

    после создания таблиц и процедуры нужно добавить в таблицу ds_sensors столько датчиков сколько у нас задумано и реализовано, ну например 3 штуки, соответственно добавляем значения в таблицу через какойнибудь БД админ софт, (я использую navicat, кто-то phpmyadmin... в общем кому как) или просто выполняем запросы залогинившись в нашу базу zgdb

    INSERT INTO ds_sensors (model, place) values ('DS18B20','home');
    INSERT INTO ds_sensors (model, place) values ('DS18B20','street');
    INSERT INTO ds_sensors (model, place) values ('DS18B20','server');


    если таблицы и процедура созданы, переходим к следующему этапу.

    Настройка скриптов


    создаем cmd скрипт digi.cmd следующего содержания:
    cls
    @echo off
    set digibin=d:ZSOFTddddigitemp.exe
    set digicfg=d:ZSOFTddd.digitemprc
    set digibuf=d:ZSOFTdddbuff
    set db=zgdb
    set host=localhost
    set user=root
    set pass=mypassw
    %digibin% -q -a -c %digicfg% > %digibuf%

    set sql1=echo use %db%; call update_temp
    set sql2=mysql -h %host% -u %user% -p%pass%

    rem echo %sql1%

    (for /f "tokens=1-5" %%A in (%digibuf%) do (
    if %%A==0 (
    %sql1%^(%%B,2^); | %sql2%
    )
    if %%A==1 (
    %sql1%^(%%B,1^); | %sql2%
    )
    if %%A==2 (
    %sql1%^(%%B,3^); | %sql2%
    )
    ))
    del /q %digibuf%


    правим скрипт, указываем в нем путь к digitemp.exe, его конфигу и буферу в который будем получать данные
    а также хост, имя, пароль для mysql

    суть скрипта:
  • 1. запсутить digitemp снять показания счетчиков и записать их в буфер, в данном случае d:ZSOFTdddbuff
  • 2. открыть буфер пробежаться по списку, обработать 3 датчика и выполнить sql запрос к mysql из коммандной строки который добавит данные куда надо через процедуру update_temp

    в этом скрипте у меня указаны условия типа:
    if %%A==0 (
    %sql1%^(%%B,2^); | %sql2%
    )

    это сделано для того чтобы например данные датчика с порядковым номером 0 из digitemp добавить в базу с id датчика 2 у мня это сделано потому что в базе у меня в данный момент 6 датчиков с разных районов города =) в общем в вашем случае нужно в скрипт добавить столько уловий сколько у вас датчиков и правильно указать id, он должен быть от 1 и не может быть 0 а в digitemp датчики исчисляются с нуля, в общем если 3 датчика то должно быть так:

    if %%A==0 (
    %sql1%^(%%B,1^); | %sql2%
    )
    if %%A==1 (
    %sql1%^(%%B,2^); | %sql2%
    )
    if %%A==2 (
    %sql1%^(%%B,3^); | %sql2%
    )

    запускаем скрипт, проверяем обновились ли данные в mysql если да то танцуем, если нет то убираем в скрипте echo off и смотрим на вывод скрипта и выясняем где сабака зарылась....

    если скрипт работает хорошо, то теперь осталось добавить его в планировщик и выполнять например каждую минуту, но поскольку он cmd то чтоб не выскакивало окно создаем еще один скрипт run.vbs для скрытого запуска скрипта digi.cmd =)

    содержимое run.vbs
    Set objApp = CreateObject("Shell.Application")
    objApp.ShellExecute "d:ZSOFTddddigi.cmd","","d:ZSOFTddd","",0


    Запускаем скрипт, проверяем обновились ли данные в базе, и пихаем его в планировщик на выполнение кадую минуту

    вот и все
  • Комментариев нет

    Добавление комментария

    Ваше имя: (Антиспам) Какой сейчас год?
    Ваш комментариий: