На главную | Где купить | Авторам | Вакансии | Реклама | Издательство | Каталог | Статьи наших авторов | Контакты |
Прайс листы

Статьи наших авторов

Автор Название
Виктор Петин Метеостанция на Arduino и MR3020 для народного мониторинга

Метеостанция на 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.

Установка прошивки 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-накопитель, т.к. недостаточно собственной памяти для выбранных пакетов

Метеостанция на 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();
  longPressure085 = 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};
  
  voidsetup() {
   Serial.begin(9600);
   Wire.begin();
   dps.init(); 
  }
  
  voidloop ()
   {
   if(Serial.available()>0)
   {
   if(Serial.read()==\'1\')
   {
   intTemp=get_temp();
   Serial.print("#2881C4BA0200003B#");
   Serial.print(Temp/16);
   Serial.print(".");
   Serial.print(abs((Temp%16)*100)/16);
   Serial.print("&");
   floath = dht.readHumidity();
   Serial.print("#2981C4BA0200003B#"); 
   Serial.print(h);
   //Serial.print("#3081C4BA0200003B#"); 
   //Serial.print(dps.getPressure(&Pressure085));
   Serial.println();
   } 
   } 
   }
  //получениетемпературыдатчика
  intget_temp()
   {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  intTemp;
   
  
   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 
   returnTemp;
   }
  

Для отправки данных на сайт Народного мониторинга будем запускать по 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

И как это выглядит

Изображение 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

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

На главную | Где купить | Авторам | Вакансии | Реклама | Издательство | Каталог | Статьи наших авторов | Контакты
© 2001–2017 Издательство «БХВ-Петербург».
Все права защищены. Частичное или полное копирование текстов, слоганов и фотоизображений без письменного согласия Правообладателя запрещено.