Попалась мне в руки некая микросхемка (датчик температуры) Dallas DS1820.
И 1-ware \ USB адаптер - DS9490R

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

А у нас есть микросхемка, адаптер и старый престарый хламовный комп, или ноут 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]
Этот скрипт можно запускать из любого места и на основании полученных данных например, включить отопление в теплице, вывести график температуры (другим скриптом) на интернет страницу, отправить на ваш телефон СМС-ку, чтоб Вы брали руки в ноги, и чапали на дачу укрывать посадки.
В общем это пример, как на коленке, можно собрать основу действующей системы. ))) Может кому понадобится.