http://tec.org.ru/publ/stati_po_ehlektr ... 0/8-1-0-14
И 1-ware \ USB адаптер - DS9490R
Опять-таки подумалось, что в те времена кода многие теребят "твиттер" и говорят об "умных домах", почему бы не сделать хотя бы "умную теплицу". А точнее автоматическую защиту от заморозка.
Всю технологию описывать долго, те кто шарит в технике и дружит с паяльником, те сами разбирутся что такое 1-ware шина.
А здесь выложу только основную идею и некоторые скрипты.
Итак. Существует в природе некая технология предсказания заморозка:
http://www.holodilshchik.ru/index_holod ... orozki.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 |
+---------------------+----------------------+
Cоздается база элементарным SQL-запросом:
Код: Выделить всё
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Структура таблицы `temperat`
--
CREATE TABLE IF NOT EXISTS `temperat` (
`temperature` varchar(10) NOT NULL,
`time_m` datetime NOT NULL default '0000-00-00 00:00:00',
`subzero` int(2) NOT NULL,
`comment` varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='sbor temperature';
Код: Выделить всё
#!/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;
Что бы сделать выводы о возможности наступления заморозков по графику, мы должны вспомнить геометрию класс так за 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
Дальше нехитрыми математическими действиями мы вычисляем вероятность заморозка по графику. Вот пример скрипта, который делает выборку из базы и выводит данные о заморозке.
Код: Выделить всё
#!/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!");
$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";
} elsif($y6 >= $y) {
print "Вероятность заморозка 10% \n";
} else {
print "Заморозка не будет! ... Совсем... :-) \n";
}
Если использовать программку gnuplot
на на основании полученных данных из базы можно строить подобные графики:
В общем это пример, как на коленке, можно собрать основу действующей системы. ))) Может кому понадобится.
Кстати если использовать COM-порт вместо USB-адаптера, то стоимость всей системы будет рублей 300-400 (в основном цена датчика)
http://www.kusto.com.ru/temperature/