Отправка данных на сайт Народного мониторинга связкой Raspberry Pi + Arduino


Предыдущая | Следующая

Народный мониторинг (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&#2 981C4BA0200003B#HUMIDITY&#3081C4BA0200003B#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 сопровождающего книгу электронного архива (см. приложение).