Народный мониторинг - молодой проект по сбору и отображению на карте мира показаний различных датчиков среды (температура, давление, влажность и т.п.) практически в реальном времени по фактическому состоянию(а не на основе прогнозов) установленных как на улице для публичного доступа так и в помещении для приватного.
Для отображения данных была собрана метеостанция на Arduino ( собирает показания с датчиков DS18B20, DHT11, BMP085). Отправка данных осуществлялась с роутера MR3020 с прошивкой CyberWrt. для передачи данных на сайт Народный мониторинг. Можно было использовать Arduino c Ethernet shield, но хотелось еще отправлять на сайт изображение с камеры.
Устанавливаем на роутер прошивку CyberWrt. СyberWrt - это прошивка собранная на базе OpenWrt и предназначенная в первую очередь для роботов, мини-серверов Умного Дома, и других устройств на базе популярных моделей роутеров. Страница проекта - http://cyber-place.ru/forumdisplay.php?f=44
В составе CyberWrt имеется модуль Термометр, Меня не устроил по причине того, что отправляет на сайт только температуру, мне необходимо еще влажность и атмосферное давление.
Решено было по cron получать данные по последовательному из Arduino и отправлять на сайт по протоколу HTTP POST/GET.
1. Установка прошивки CyberWrt на роутер MR3020
Роутер MR3020 имеет процессор Atheros AR7240 частотой 400 МГц, 32 МБ RAM, 4 МБ флэш-памяти, порт USB2.0, Wi-Fi 802.11 b/g/n 150Mbps, Ethernet-порт 100MBit. Кроме того может питаться от напряжения 5В USB-порта, или от внешнего питания в диапазоне от 3.7В-6В при токе в 100мА с включенным Wi-Fi или 80мА без него. То есть максимальная мощность 0.5 ватт.
Сперва, заливаем прошивку (берем ее со страницы http://cyber-place.ru/showthread.php?t=720). Подключаемся к роутеру (адрес по-умолчанию:192.168.0.254), логин/пароль: admin/admin, идем в системные настройки, выбираем файл с прошивкой, ждем пока зальется. После прошивки модуль доступен по адресу http://192.168.1.100. Здесь необходимо настроить модуль либо в качестве точки доступа, либо клиента беспроводной сети. На сайте проекта все очень хорошо расписано - FAQ
Прошивка CyberWrt создавалась для того что бы уйти от пугающих новичков, терминальных программ и для более легкого и упрощенного использования. За основу была взята прошивка OpenWRT версии r37816.Все управление роутером производится из любого веб браузера через Веб-интерфейс, для этого не требуется установка дополнительных программ.
Так же доступен классический способ подключения через telnet, SSH, SCP
Сконфигурирована минимальная сборка пакетов для того что бы было достаточно свободного пространства и пользователь мог сам выбирать из репозитория нужные ему модули или утилиты. На роутере после прошивки CyberWrt доступно свободного места 1,2МБ (для сравнения, после установки OpenWrt остается свободного места 300 КБ).
Из веб-интерфейса установим нужные нам пакеты:
- Драйвер Веб камеры
- Драйвера USB Serial
- Планировщик - для запуска скрипта по cron
- PHP5 + SQlite3
- Системный диск - USB-накопитель, т.к. недостаточно собственной памяти для выбранных пакетов
2. Метеостанция на Arduino.
К Arduino подключаем датчики DHT11, DS18B20, BMP085
Схема
И скетч - ожидание '1' из последовательного порта и выдача данных в последовательный порт
Кроме того, данные из Arduino мы отправляем в виде максимально приближенном к протоколу отправки данных на сайт narodmon
#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[8]={0x28,0x81,0xC4,0xBA,2,0,0,0x3B}; 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("#2881C4BA0200003B#"); Serial.print(Temp/16); Serial.print("."); Serial.print(abs((Temp%16)*100)/16); Serial.print("&"); float h = dht.readHumidity(); Serial.print("#2981C4BA0200003B#"); Serial.print(h); //Serial.print("#3081C4BA0200003B#"); //Serial.print(dps.getPressure(&Pressure085)); Serial.println(); } } } // получение температуры датчика int get_temp() { byte i; byte present = 0; byte data[12]; byte addr[8]; int Temp; ds.reset(); ds.select(my_addr); ds.write(0x44,1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(my_addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } Temp=(data[1]<<8)+data[0];//take the two bytes from the response relating to temperature Temp=Temp;//divide by 16 to get pure celcius readout return Temp; }
Для отправки данных на сайт Народного мониторинга будем запускать по cron php-скрипт.
Данные, необходимые для передачи на сервер
- Уникальный MAC(ID) устройства мониторинга (использовал )
- Уникальные macN (серийные номера) датчиков подключенных к устройству
для DS18B20 - уникальный номер для 1-wire датчика
для BMP085 и DHT11 - произвольные
- Показания (valueN) датчиков
Скрипт 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="#A0:F3:C1:70:AA:93\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
php-cgi /www/cron_narodmon.php
И как это выглядит
4. Изображение web-камеры на сайт Народного мониторинга.
Модуль "Драйвер Веб камеры" предназначен для работы с UVC Веб камерами. Я использовал Logitech C270/ Если подключена камера, то сразу после установки модуля вы увидите изображение.
В модуле можно изменить разрешение изображения камеры и количество кадров в сек. Можно так же остановить стриминг или запустить его когда Вам потребуется
Для подключения камеры на сайте Народный мониторинг
Устройства -- Мои камеры -- Добавить камеру
Открыть порты на роутере
Сервис имеет API, позволяющий получать показания список устройств и камер, а также показания датчиков и изображения с камер
Страница с описанием методов API и примерами
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
Arduino | Контроллер | Arduino UNO | 1 | Поиск в магазине Отрон | ||
DS18B20 | Датчик температуры | DS18B20 | 1 | Поиск в магазине Отрон | ||
DHT11 | Модуль измерения влажности | DHT11 | 1 | Поиск в магазине Отрон | ||
BMP085 | Модуль атм. давления | BMP085 | 1 | Поиск в магазине Отрон | ||
R1 | Резистор | 4.7 кОм | 1 | Поиск в магазине Отрон | ||
Роутер | MR3020 | 1 | Поиск в магазине Отрон | |||
WEB-камера | Logitech C270 | 1 | Поиск в магазине Отрон | |||
USB-накопитель | 2 Гб | 1 | Поиск в магазине Отрон | |||
Скачать список элементов (PDF)
Прикрепленные файлы:
- cron_narodmon_php.zip (1 Кб)
- Arduino_narodmon.zip (1 Кб)
Комментарии (22) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
[Автор]
Разобрался! Arduino ждет "1" в моем случае с клавиатуры.
З.Ы. Теперь буду разбираться как лучше организовать внешний USB и выяснять что за зверь "PHP5 + SQlite3" и как мне его приручить.
[Автор]
Еще необходимо подключить модуль Планировщик и добавить в него запуск скрипта
php-cgi /www/cron_narodmon.php
см. в тексте статьи
Первый раз скрипт выполняется совершенно верно
[Автор]
[Автор]
[Автор]
php-cgi /www/cron_narodmon.php
Что выдает?
Проверьте выдачу данных в последовательный порт из arduino в мониторе последовательного порта Arduino IDE
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/pdo_sqlite.so' - File not found in Unknown on line 0
PHP Warning: Module 'gd' already loaded in Unknown on line 0
PHP Warning: Module 'PDO' already loaded in Unknown on line 0
PHP Warning: Module 'session' already loaded in Unknown on line 0
PHP Warning: Module 'sqlite3' already loaded in Unknown on line 0
X-Powered-By: PHP/5.4.19
Content-type: text/html
#Copyright (C) 2013 cyberwrt.ru, carduino.ru, cyber-place.ru, mp3car.ru
echo "Content-type: text/html"
echo
if echo "$QUERY_STRING" | egrep -q "terminal=" ; then
QUERY_STRING=${QUERY_STRING//terminal=}
QUERY_STRING=${QUERY_STRING//+/ }
#echo "$QUERY_STRING"
QUERY_STRING=${QUERY_STRING//%/\\x}
echo "root@CyberWrt:/www/> $(echo -e $QUERY_STRING)"
if [ $QUERY_STRING == "top" ] ; then
echo "
`$QUERY_STRING -n1`
"
`killall top`
echo ""
echo ""
else
rrr=$(echo -e $QUERY_STRING)
echo "
`eval $rrr 2>&1`
"
fi
else
echo "
`cat /etc/banner`
Сегодня: `date`
"
fi
#rrr=$(ls /dev | egrep "tty")
#rrr=`$rrr`
#rrr=`ls /dev | egrep "tty"`
#echo "$rrr"
#echo "
`$(echo $rrr 2>&1)`
"
#echo "
`$(echo -e $QUERY_STRING)`
"
#echo `echo -e $QUERY_STRING`
#echo `"$rrr"`
То есть если я сделаю построчно в скетче, то скрипт не видит вторую строку, если сделать в одну строку, то не понятно как ее разбить в скрипте для передачи на narodmon.
В PHP, к сожалению,не разбираюсь совсем, пытался что-то делать, но не получилось. Может быть найдется пара минут показать решение проблемы?
[Автор]
#P#756.04T#20.10
данные между датчиками разделяются символом &
А в php скрипте & заменяется на \n
$sdata="#A0:F3:C1:70:AA:93\n".str_replace("&","\n",$cc)."##";
И все отправляется