Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Метеостанция на Arduino и MR3020 для народного мониторинга

Народный мониторинг - молодой проект по сбору и отображению на карте мира показаний различных датчиков среды (температура, давление, влажность и т.п.) практически в реальном времени по фактическому состоянию(а не на основе прогнозов) установленных как на улице для публичного доступа так и в помещении для приватного.

Для отображения данных  была собрана метеостанция на 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 UNO1 Поиск в магазине ОтронВ блокнот
DS18B20 Датчик температурыDS18B201 Поиск в магазине ОтронВ блокнот
DHT11 Модуль измерения влажностиDHT111 Поиск в магазине ОтронВ блокнот
BMP085 Модуль атм. давленияBMP0851 Поиск в магазине ОтронВ блокнот
R1 Резистор
4.7 кОм
1 Поиск в магазине ОтронВ блокнот
РоутерMR30201 Поиск в магазине ОтронВ блокнот
WEB-камераLogitech C2701 Поиск в магазине ОтронВ блокнот
USB-накопитель2 Гб1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 1
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (22) | Я собрал (0) | Подписаться

0
Дмитрий #
И где устанавливать датчики и как?
Ответить
0

[Автор]
victoruni #
Плата Arduino по USB к MR3020, от Arduino от контактов D7, D8, A4, A5, GND, +5V, +3.3V кабелем для прокладки сети уходят на улицу, где находятся DS18B20, BMP085, DHT11. Двусторонним скотчем к куску стеклотекстолита.
Ответить
0
maksms #
А зачем BMP085 устанавливать на улице? Тем более, насколько я знаю, они боятся воды...
Ответить
0

[Автор]
victoruni #
Не знал этого, но модуль на улице защищен колпаком сверху от попадания воды
Ответить
0
asutpka #
DHT22 значительно предпочтительней в этой конструкции, поскольку DHT11 работает исключительно при положительных температурах и влажность показывает не известно от какого фонаря.
Ответить
0

[Автор]
victoruni #
Да, конечно DHT11 похуже, чем DHT22, но влажность показывает не от фонаря, может погрешность и большая, но в целом картина правильная - дождливо - высокая, сухо - низкая влажность. Насчет низких температур - не знаю, для моего города практически не застал этот период.
Ответить
0
grass #
Обращаюсь к Вам за помощью второй раз (1-й Arduino-монетоприемник). Собрал данную схему пока без атрибутов подключения к narodmon т.е. без PHP5 + SQlite3 и USB диска. Хочу проверить работоспособность устройства пока через COM в комплексе со всеми датчиками. Запускаю скетч Arduino_narodmon, а COM молчит. Проверяю в собранной схеме отдельными скетчами, все работает т.е. каждый датчик выводит показания. Если не составляет труда, объясните как правильно протестировать девайс, не отправляя на стадии отладки "мусор" на сайт. На narodmon мой датчик уже висит-CyberWRT 3020 модуль "Термометр" местоположение - столица соловьинного края.
Разобрался! Arduino ждет "1" в моем случае с клавиатуры.
З.Ы. Теперь буду разбираться как лучше организовать внешний USB и выяснять что за зверь "PHP5 + SQlite3" и как мне его приручить.
Ответить
0
grass #
victoruni добрый день. Не будете ли Вы так любезны, поподробнее описать процесс "php-cgi /www/cron_narodmon.php". Все установлено из списка в в начале поста : PHP5 + SQlite3 и USB, планировщик etc. А вот что делать со скриптом PHP (куда его вставлять) не доходит. Изучать с нуля PHP уже не тот возраст и этот проект всего лишь хобби.
Ответить
0

[Автор]
victoruni #
/www/cron_narodmon.php - в папку www
Еще необходимо подключить модуль Планировщик и добавить в него запуск скрипта
php-cgi /www/cron_narodmon.php
см. в тексте статьи
Ответить
0
олег #
Не подскажите почему при выполнении php скрипта в окне браузера, результат выглядит следующим образом:
open port - ok OK #E8:DE:27:54:72:2A #101#101F400D020800C9#21 #E8DE2754722A02#214 #E8DE2754722A03#249 ##
Почему появляется часть выделенная жирным?
Первый раз скрипт выполняется совершенно верно
Ответить
0

[Автор]
victoruni #
Видимо в команду print попадает служебный символ - у меня также
Ответить
0
vovanw7 #
Как подключить флешку, если в MR3020 подключена Ардуина?
Ответить
0

[Автор]
victoruni #
Используйте USB HUB (и лучше со своим блоком питания)
Ответить
0
Николай #
Решил повторить данный проект, но после сборки никак не хочет отрабатывать скрипт. Подскажите, нужно ли править конфиги PHP.ini ?
Ответить
0

[Автор]
victoruni #
Пробовали запускать в терминале
php-cgi /www/cron_narodmon.php
Что выдает?
Проверьте выдачу данных в последовательный порт из arduino в мониторе последовательного порта Arduino IDE
Ответить
0
Николай #
Да пробовал, результат всегда один. Неоднократный полный сброс и повторная установка пакетов результата не дали. В терминале всегда одно и тоже выдаёт при запуске скрипта:
root@CyberWrt:/www/> php-cgi /www/cron_narodmon.php
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"`
Ответить
0
omer #
Скрипт работает, но он "забирает" с ардуины только одну строку, хотя если смотреть в монитор ардуины, то там выводится 2 строки - давление и температура (датчик BMP180). Если я в скетче уберу перенос строки, тогда скрипт будет забирать все данные в одной строке, например #P#756.04#T#20.10. Но в таком виде на narodmon не передать.
То есть если я сделаю построчно в скетче, то скрипт не видит вторую строку, если сделать в одну строку, то не понятно как ее разбить в скрипте для передачи на narodmon.
В PHP, к сожалению,не разбираюсь совсем, пытался что-то делать, но не получилось. Может быть найдется пара минут показать решение проблемы?
Ответить
+1

[Автор]
victoruni #
С arduino приходит ОДНА строка
#P#756.04&#T#20.10
данные между датчиками разделяются символом &
А в php скрипте & заменяется на \n
$sdata="#A0:F3:C1:70:AA:93\n".str_replace("&","\n",$cc)."##";
И все отправляется
Ответить
0
omer #
Супер! Банально просто, все работает. Спасибо!
Ответить
0
Лопух #
А если на Дуньке используется мост CH341 в скрипте ttyACM0 на ttyUSB0 поменять нужно?
Ответить
0
Quemu #
Зачем использовать ардуино и прочее, если можно прицепиться через gpio роутера? У меня bme280 подцеплен по i2c к wr703n
Ответить
0
Alex #
Вот тоже увидел эту статью и пдумал об этом.wr703n У меня правда подцеплен через UART и датчик только DS18B20. То что написали что роутер понимает i2c и bme280, радует!
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
USB осциллограф DSO-2090 Квадрокоптер Syma X11
вверх