Присоединяйтесь к сообществу Мастерград

Зарегистрироваться
Регистрация: 13.04.2008 Санкт-Петербург Сообщений: 216
#2301210

Попалась мне в руки некая микросхемка (датчик температуры) 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=$hostnameort=$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=$hostnameort=$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]

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

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

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

Регистрация: 13.04.2008 Санкт-Петербург Сообщений: 216

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

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

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

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

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

Регистрация: 13.04.2008 Санкт-Петербург Сообщений: 216

Lazy Wanderer написал :

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

Есть даже готовый софт oww для "погодной станции"