Ethernet-модуль датчиков на Arduino и web-интерфейс для множества таких модулей


Устройство создавалось на заказ. Из серии умный дом. Каждое устройство представляет собой web-сервер (контроллер Arduino + Ethernet shield) , к контроллеру Arduino подсоединены следующие датчики
1. датчик температуры DS18B20
2. модуль датчика влажности DHT11
3. модуль датчика освещенности BH1750
4. модуль датчика движения HC-SR501
5. модуль звука

Схема устройства следующая

Каждое устройство имеет уникальный ip адрес. При обращении к устройству, оно отдает данные датчиков в формате Json
температура, влажность, освещенность, количество срабатываний датчика движения и датчика звука после последнего обращения.
Данные такого вида
{«meteo»: {«temp1″:»25.31″,»humidity1″:»35.00″,»lux1″:»10″,»sound1″:»0″,»motion1″:»0»} }
У всех устройств свой уникальный порт обращения, есть задумка получать данные с каждого устройства из внешней сети для приложение для смартфона.
Вот содержимое скетча для модуля

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <Wire.h>
#include <BH1750.h>
BH1750 light1;
#include "DHT.h"
DHT dht(8, DHTTYPE);
OneWire  ds(7);  // on pin 7

// датчик 1
/**/
byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xF1 };
byte ip[] = { 192, 168, 1, 121 };
EthernetServer server(10001);
byte my_addr[8]={0x28,0x2A,0x78,0x65,5,0,0,0x10};
/**/
// датчик 2
/*
byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xF2 };
byte ip[] = { 192, 168, 0, 122 };
EthernetServer server(10002);
byte my_addr[8]={0x28,0x1,0x65,0x65,5,0,0,0xCE};
*/
int count_motion=0;
uint16_t count_sound=0;

void setup() {
  Serial.begin(9600);
  Serial.println("start");
  Ethernet.begin(mac, ip);
  // запуск сервера
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());

  Wire.begin();
  delay(1000);
  light1.begin();
  attachInterrupt(0,motion,RISING);

}

void loop ()
 {
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          client.print('{');
          client.print('"');client.print("meteo");client.print('"');client.println(":");
          client.print('{');

            int Temp=get_temp();
            //Serial.print(Temp/16);
            //Serial.print(".");
            //Serial.print(((Temp%16)*100)/16);
            //Serial.println();
            client.print('"');client.print("temp1");client.print('"');client.print(":");
            client.print('"');client.print(Temp/16);
            client.print(".");
            client.print(((Temp%16)*100)/16);client.print('"');client.print(',');
           float h = dht.readHumidity();
           client.print('"');client.print("humidity1");client.print('"');client.print(":");
           client.print('"');client.print(h);client.print('"');
           client.print(',');
           // bh1750
           uint16_t lux = light1.readLightLevel();
           client.print('"');client.print("lux1");client.print('"');client.print(":");
           client.print('"');client.print(lux);client.print('"');
           client.print(',');
           // sound
           client.print('"');client.print("sound1");client.print('"');client.print(":");
           client.print('"');client.print(count_sound);client.print('"');
           client.print(',');
           count_sound=0;
           //датчик движения
           client.print('"');client.print("motion1");client.print('"');client.print(":");
           client.print('"');client.print(count_motion);client.print('"');
           client.println("}");
           client.print("}");
           count_motion=0;
        break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
  // sound
  if(analogRead(A0)<500)
    {count_sound++;delay(1000);}
 }
// получение тмпературы датчика
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;
 }

 // обработка прерывания ик датчика движения
//
void motion()
  {
  detachInterrupt(0);
  count_motion++;
  attachInterrupt(0,motion,RISING);
  }

Все устройства находятся в одной локальной сети. В сети находится сайт для сбора данных с устройств и представления данных в виде графиков и таблиц. А также отображение данных в виде виджетов на плане дома или квартиры.
Опрос модулей по cron каждые 5 минут, данные собираются в базу данных mySQL,
где также хранятся настройки для всех модулей, находящихся в системе

Сайт написан на html5 с элементами canvas при выводе виджетов на плане объекта
Отправка информации на сервер - без перезагрузки страницы (ajax, библиотека xajax)
Вид объектов с виджетами (средние значения температуры, влажности, освещенности)

При авторизации активируются ссылки с виджетов в админскую часть
В админской части просмотр данных
c выбором объекта (квартира, дача, гараж)
подобъекта (1 этаж ....)
комнаты
и даты

для температуры, влажности, освещенности строятся графики

для датчиков звука и датчиков движения - таблицы с количеством срабатываний между запросами

При построении графиков и таблиц используется API Google Chart

Архив с файлами сайта - скачать

Посмотреть можно здесь
Логин - admin1
пароль - 123456

числа 03.05, 04.05, 05.05


0 комментариев на «“Ethernet-модуль датчиков на Arduino и web-интерфейс для множества таких модулей”»

  1. Интересный проект. Хочу что то похожее сделать, вот только имею затруднения с PHP, скачал, хотел посмотреть, не получается зайти с помощью указанных данных, в лог ошибок пишется, но из-за объема комментария включить не получается.

    Помогите разобраться!

  2. Не получается запустить — в архив забыл включить дамп базы данных
    Напишите почту — я вышлю
    Поставьте на Денвер и работайте
    Посмотреть в сети
    lermontov-kmv.ru/online-spravka.ru/magazin/thpmi/
    на там графиков не увидите — т.к. графики берут данные из бд, а сейчас нет записи показаний в базу
    можно посмотреть за 2014-05-04

    • Здравствуйте, Спасибо Вам!
      Я по роду работы нахожусь в разъездах по просторам нашей страны, а так хочется посмотреть «как там дома». Для запуска необходим — «дамп базы данных», в виду «ограничения рейтинга» не могу написать сообщение с указанием почты, если можете
      напишите сообщение с указанием Вашей почты, конфиденциальность со своей стороны гарантирую.

  3. Здравствуйте, Спасибо Вам!
    тоже очень заинтересовал проект. Не могли бы вы выслать мне дамп базы данных и инструкцию небольшую куда чего вставлять, и работает ли под виндой
    С уважением Алексей
    [email protected]

    • Здравствуйте, Спасибо Вам!
      тоже очень заинтересовал проект. Не могли бы вы выслать мне дамп базы данных и инструкцию небольшую куда чего вставлять, и работает ли под виндой
      С уважением Борис ученик робошколы г.Рязани
      [email protected]

    • Спасибо… Виктор. БД получил.
      Сервер после ввода логина с паролем подвисает. В итоге белый лист. Что делаю не так?
      Система Win XP. Установлен Денвер.

    • Здравствуйте!
      Вам наверное уже надоело рассылать базу данных от проекта.

      Но все же, если можно, скиньте на адрес:
      [email protected]

  4. Здравствуйте, Спасибо Вам!
    тоже очень заинтересовал проект. Не могли бы вы выслать мне дамп базы данных и инструкцию небольшую куда чего вставлять, и работает ли под виндой
    С уважением Борис ученик робошколы
    [email protected]

  5. Подскажите чайнику в Arduino если не трудно и Сталкивались:
    Имею Arduino Mega и Internet Shild Wiznet W5100 Ethernet controller;
    Так вот мега работает нормально, а вот шилд начинает нормально работать только после нажатия кнопки reset на нем до следующего выключения питания.
    Что в нем нет так или я что то туплю. Спасибо!!!

  6. Интересный проект. У меня на данный момент автоматизация без веб сервера, чуток не удобно стало. Хочу добавить функцию эту и толком не знаю с чего начинать. Плиз сбросьте мне на почту гляну. Спасибо.
    [email protected]

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение