Hawk-IT
Hawk-IT
Местный

Регистрация: 13.04.2008

Санкт-Петербург

Сообщений: 216

11.03.2011 в 13:26:54

Попалась мне в руки некая микросхемка (датчик температуры) Dallas DS1820.

http://tec.org.ru/publ/stati_po_ehlektroinke/mikroskhemy/o_termodatchikakh_ds1820_ds18s20_ds18b20/8-1-0-14

И 1-ware \ USB адаптер - DS9490R

Опять-таки подумалось, что в те времена кода многие теребят "твиттер" и говорят об "умных домах", почему бы не сделать хотя бы "умную теплицу". А точнее автоматическую защиту от заморозка. Всю технологию описывать долго, те кто шарит в технике и дружит с паяльником, те сами разбирутся что такое 1-ware шина. А здесь выложу только основную идею и некоторые скрипты.

Итак. Существует в природе некая технология предсказания заморозка:

http://www.holodilshchik.ru/index_holodilshchik_issue_5_2006_Zamorozki.htm

А у нас есть микросхемка, адаптер и старый престарый хламовный комп, или ноут 10-ти летней давности в гараже.

Для наблюдения за температурой, можно написать простой скриптик на языке "Perl", который будет опрашивать подсоединенный датчик, и заносить данные в базу данных.

"Базка" на mysql будет выглядеть примерно так:

+---------------------------+----------------+ | time_m | temperature | +---------------------------+----------------+ | 2011-03-11 12:29:01 | 24.31 | | 2011-03-11 12:30:01 | 24.44 | | 2011-03-11 12:31:02 | 24.31 | | 2011-03-11 12:32:01 | 24.44 | | 2011-03-11 12:33:01 | 24.44 | +---------------------+----------------------+

А скрипт опроса и занесения в базу так:

[code]

!/usr/bin/perl

$debug=1; $daemon=0; $syslog=1; $pidfile="/var/run/temper.pid"; $database = "nabl"; $hostname = "10.10.10.10"; $port = "3306"; $username = "user"; $password = 'pass';

use Net::hostent; use Sys::Syslog; use POSIX; use DBI; $|=1;

############################

Main part of the program

############################ my $dsn = "DBI:mysql:database=$database:host=$hostname:port=$port"; my $dbh = DBI->connect($dsn, $username, $password) or die("Could not connect to MySQL!");

########################

TEMPERATURE DATABASE

########################

Upload data

$date = date '+%Y-%m-%d %H:%M:%S';

$t1= /usr/bin/sudo /usr/bin/digitemp\_DS2490 -c ./temper/digitemp.conf -t 0 | grep C:; $t1 =~ s/\s*//; # Убираем пробел $t1 =~ m/(.*)C\:(.*)F\:(.*)/; # Выделяем значение температуры

print $t1;

my $t = $2; chomp $t;

print $t . "\n";

Add temperature to table 'temperat'

my $sqladd = "INSERT into temperat values ('".$ip."','".$date."');";

    my $sqladd = "INSERT INTO temperat (`temperature`, `time\_m`, `subzero`, `comment`) VALUES ('".$t."', '".$date."', '0', NULL);";
    my $sthadd = $dbh->prepare($sqladd);
    $sthadd->execute;
    $sthadd->finish;

[/code]

Ставим скрипт на выполние в cron каждую минуту, и наслаждаемся, как данные о температуре с вашего участка, заносятся в базу данных.

Что бы сделать выводы о возможности наступления заморозков по графику, мы должны вспомнить геометрию класс так за 6-й... И описать график в виде функции. Вспоминаем уравнение прямой в декартовой системе координат: y = a*x+b. С помощью этого уравнения описываем все характерные линии графика:

$y1=0.4*$x+1.6; #100% описывает линию 100%-го заморозка и т.д. $y2=0.391*$x+2.7; #80% $y3=0.382*$x+4.7; #60% $y4=0.382*$x+6.7; #40% $y5=0.391*$x+8.7; #20% $y6=0.375*$x+11; #10

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

[code]

!/usr/bin/perl

$debug=1; $daemon=0; $syslog=1; $pidfile="/var/run/mrtg.pid"; $database = "nabl"; $hostname = "-----"; $port = "3306"; $username = "юзернэйм"; $password = 'пароль';

use Net::hostent; use Sys::Syslog; use POSIX; use DBI; $|=1;

############################

Main part of the program

############################ my $dsn = "DBI:mysql:database=$database:host=$hostname:port=$port"; my $dbh = DBI->connect($dsn, $username, $password) or die("Could not connect to MySQL!");

$filename = './'. get_timestamp() './.dat';

$filename = . get_timestamp();

sub get_timestamp {

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

if ($mon prepare($sth)

             || die "Can't prepare statement: $DBI::errstr";

    $sth->execute; 
    my @row = $sth->fetchrow\_array();
    $t13 = $row[0];
    $sth->finish;

chomp $t13;

print $t13 . "\n";

my $sth = "SELECT temperature FROM temperat WHERE time_m LIKE '%".$date."%".$time21."%'";

my $sth = "SELECT temperature FROM temperat WHERE time_m LIKE '%".$time21."%'";

print $sth;

$sth = $dbh->prepare($sth) || die "Can't prepare statement: $DBI::errstr";

    $sth->execute; 
    my @row = $sth->fetchrow\_array();
    $t21 = $row[0];
    $sth->finish;

chomp $t21;

print $t21 . "\n";

Определяем координаты точки для расчета

$x = ($t13 - $t21);

print $x . "\n";

$y = $t21;

print $t21 . "\n";

$y1=0.4*$x+1.6; #100% $y2=0.391*$x+2.7; #80% $y3=0.382*$x+4.7; #60% $y4=0.382*$x+6.7; #40% $y5=0.391*$x+8.7; #20% $y6=0.375*$x+11; #10

print $y1 . "\n";

if($y1 > $y) { print "Вероятность заморозка 100% !!! \n"; ** elsif($y2 >= $y) { print "Вероятность заморозка 80% !! \n"; ** elsif($y3 >= $y) { print "Вероятность заморозка 60% ! \n"; ** elsif($y4 >= $y) { print "Вероятность заморозка 40% \n"; ** elsif($y5 >= $y) { print "Вероятность заморозка 20% \n"; ** else { print "Вероятность заморозка 10% \n"; **

[/code]

Этот скрипт можно запускать из любого места и на основании полученных данных например, включить отопление в теплице, вывести график температуры (другим скриптом) на интернет страницу, отправить на ваш телефон СМС-ку, чтоб Вы брали руки в ноги, и чапали на дачу укрывать посадки.

В общем это пример, как на коленке, можно собрать основу действующей системы. ))) Может кому понадобится.

0
dadyjo
dadyjo
Местный

Регистрация: 03.08.2008

Москва

Сообщений: 398

11.03.2011 в 15:32:56

Это конечно все замечательно, но ИМХО лучше подогрев организовать автоматический, чем предсказывать заморозки. А в идеале как бы занедорого на базе ПК орагнизовать надежное автоматическое управление теплицей парником, поддержание в ней необходимой температуры и влажности с дистанционным контролем через интернет.

0
Hawk-IT
Hawk-IT
Местный

Регистрация: 13.04.2008

Санкт-Петербург

Сообщений: 216

11.03.2011 в 16:20:08

dadyjo написал : А в идеале как бы занедорого на базе ПК...

Скажу больше, можно ПК не использовать (т.к. все-таки там вентиляторы, большой корпус и т.д.), можно использовать старый Wi-Fi роутер прошитый линуксовой прошивкой типа OpenWRT или DD-Wrt. Тогда мы молучаем тоже как-бы компьютер, но в маленьком корпусе.

0
Lazy Wanderer
Lazy Wanderer
Местный

Регистрация: 29.10.2005

Томск

Сообщений: 610

11.03.2011 в 18:17:07

Hawk-IT написал : Скажу больше, можно ПК не использовать

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

А вот еще вопрос: как там с давлением и влажностью на вашем огороде?

0
Hawk-IT
Hawk-IT
Местный

Регистрация: 13.04.2008

Санкт-Петербург

Сообщений: 216

11.03.2011 в 22:47:42

Lazy Wanderer написал :

Этот пост не пошаговое руководство "куда нажимать", а рабочая "лаба". У кого прямые руки - сам додумает и доделает то, что ему необходимо. Что касается измерения температуры и влажности в огороде - ставьте соответствующие датчики и измеряйте.

Есть даже готовый софт oww для "погодной станции" http://oww.sourceforge.net/features.html

0

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий.

Присоединяйтесь к самому крупному DIY сообществу