$put_perv_real = "/home/www/dvakompa-ru/dopol/"; ?>
Народный мониторинг (http://www.narodmon.ru) — проект по сбору и отображению на карте мира показаний (температура, давление, влажность и т. п.) практически в реальном времени по фактическому состоянию (а не на основе прогнозов) от различных датчиков среды, установленных как на улице для публичного доступа, так и в помещении для приватного.
Ограничения бесплатного использования сервиса:
* для передачи показаний: одно устройство на IP-адрес, интервал приема от 5 минут, хранение показаний 30 дней;
* для камер: размер картинки до 640 пикселов, интервал скачивания от 10 минут, хранение 24 часа.
Для сбора данных была собрана метеостанция на Arduino (собирает показания с датчиков DS18B20, DHT11, BMP085). Raspberry Pi по командам планировщика cron получает данные из Arduino и отправляет на сайт Народного мониторинга.
В листинге 4.13 представлен скетч для сбора данных со следующих датчиков:
* ds18b20 — цифровой датчик температуры;
* dht11 — модуль для измерения относительной влажности воздуха;
* bmp085 — блок для измерения атмосферного давления воздуха.
Обратите внимание на размер кода скетча — результат использования распространенных библиотек для Arduino.
Листинг 4.13
#include "SPI.h"
#include "OneWire.h"
#include "Wire.h"
#include "DHT.h"
#include "BMP085.h"
BMP085 dps = BMP085(); long Pressure085 = 0;
#define DHTTYPE DHT11 // DHT 11 DHT dht(8, DHTTYPE);
OneWire ds(7); // on pin 7
byte my_addr={0x28,0xB0,0x16,0xB8,3,0,0,0x90};
void setup() {
Serial.begin(9600);
Wire.begin(); dps.init();
}
void loop ()
{
if (Serial.available()>0)
{
if(Serial.read()=='1')
{
int Temp=get temp();
Serial.print("#28B016B8030000 90#"); Serial.print(Temp/16);
Serial.print(".");
Serial.print(abs((Temp%16)*100)/16);
Serial.print("&");
float h = dht.readHumidity();
Serial.print("#2 9B016B8030000 90#"); Serial.print(h);
Serial.print("&");
Serial.print("#30B016B8030000 90#");
Serial.print(dps.getPressure(&Pressure085)) ;
Serial.println();
}
}
}
// получение температуры датчика int get temp()
{
byte i;
byte present = 0; byte data; byte addr; int Temp;
ds.reset(); ds.select(my addr); ds.write(0x44,1); delay(1000); present = ds.reset(); ds.select(my addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
Temp=(data<<8)+data;
Temp=Temp; return Temp;
}
На рис. 4.47 представлена схема подключения датчиков к Arduino.
Сборка Arduino прослушивает последовательный порт, по которому она подключена к компьютеру Raspberry Pi. При получении из последовательного порта символа '1' происходит съем показаний с датчиков и отправка сообщения в последовательный порт в виде:
#2881C4BA0200003B#TEMP 981C4BA0200003B#HUMIDITYఉC4BA0200003B#PRESSURE где:
□ #2881C4BA0200003B, #2881C4BA0200003B, #2881C4BA0200003B идентификаторы
датчиков в системе Народного мониторинга;
□ temp, humidity, pressure — показания датчиков.
Идентификаторы датчиков для Народного мониторинга берутся произвольные. Так, для датчика температуры я брал уникальный идентификатор 1-Wire датчика ds18b20, для датчиков влажности и давления изменял первые 2 цифры идентификатора датчика температуры.
Теперь пишем скрипт на PHP для отправки данных на сайт Народного мониторинга. Скрипт соединяется с последовательным портом, отправляет в порт символ '1' и получает из последовательного порта строку с данными датчиков. И затем после небольшого преобразования строки отправляет ее на сервер narodmon.ru. Задержка в 5 секунд перед отправкой данных в порт связана с тем, что при открытии порта Arduino плата перезагружается. Содержимое скрипта cron_narodmon.php представлено в листинге 4.14.
Листинг 4.14. Скрипт cron_narodmon.php
<?php
define('SERIAL_DEVICE', '/dev/ttyACM0'); $fp = fopen(SERIAL_DEVICE, "w+"); if( !$fp) { die("can\'t open " . SERIAL_DEVICE);
}
else
print "open port - ok\n"; sleep(5);
if( fwrite($fp, "1" )) {
print "OK\n\n";
}
else { print "FAILED!!!\n\n";
}
$cc="";
$x=true;
while($x==true){
$c=fread($fp,1);
if($c=="\n")
$x=false;
$cc=$cc.$c;
}
$sdata="#B8:27:EB:83:A3:2C\n".str_replace("&","\n",$cc)."##";
print $sdata;
fclose($fp);
$fs = @fsockopen(''tcp://narodmon.ru", 8283, $errno, $errstr); if(!$fs) exit("ERROR(".$errno."): ".$errstr); fwrite($fs, $sdata); fclose($fs);
?>
Чтобы зарегистрировать датчики в системе Народного мониторинга, необходимо предварительно отправить данные на сайт.
Запускаем скрипт cron_narodmon.php:
php-cgi /home/pi/cron narodmon.php
Заходим в свой профиль на сайте narodmon.ru и добавляем датчики (рис. 4.48).
Скрипт cron_narodmon.php мы будем запускать по командам cron каждые 5 минут. Открываем файл конфигурации cron:
crontab -e
И записываем в него строку:
*/5 * * * * /usr/bin/php -q /home/pi/cron narodmon.php > /dev/null 2>&1
Теперь наши датчики расположены на карте Народного мониторинга (рис. 4.49), и каждые 5 минут отправляют данные на сайт.
Примечание
Файл скрипта cron_narodmon.php а также другие вспомогательные файлы этого примера находятся в папке glava_04\narodmon сопровождающего книгу электронного архива (см. приложение).