Система предназначена для удаленного мониторинга температуры и влажности и состоит из аппаратного модуля с интерфейсом Ethernet и сервера. Аппаратный модуль реализован на базе платформы Arduino и сенсора AM2302.

ARDUINO-UNO
Плата Arduino Uno выполняет функции центрального процессора модуля, а плата Ethernet Shield

ETHERNET-SHIELD
обеспечивает связь с сервером посредством интерфейса TCP/IP и при необходимости сохранение данных полученных с сенсора температуры и влажности AM2302 на SD-CARD.
AM2302
AM2302 - это датчик, состоящий из емкостного сенсора для измерения влажности и полупроводникового сенсора для измерения температуры, с выходным сигналом в виде цифрового кода.

Для сборки модуля надо плату Arduino Uno R3 соединить с платой ETHERNET-SHIELD и к выводу A0 подключить сенсор AM2302 (DHT22).


Скетч (прошивка) для модуля разработан на базе стандартного примера WebClient поставляемого вместе со средой разработки Arduino IDE

/*
  Web client

  This sketch connects to a website (http://ibot.example.com)
  using an Arduino Wiznet Ethernet shield.

  Circuit:
   Ethernet shield attached to pins 10, 11, 12, 13

*/

#include <DHT.h>
#include <SPI.h>
#include <Ethernet.h>

//Контакт к которому подключен датчик температуры и влажности
#define DHTPIN A0

// Выбираем сенсор который используется 
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

// MAC address модуля
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

byte server[] = {1xx, 2x, 1xx, 7x}; // IP adress server

// Инициализация Ethernet client library (port 80 is default for HTTP)

EthernetClient client;

void setup() {
  // Открываем последовательный порт (скорость обмена 9600)
  Serial.begin(9600);
  // Устанавливаем Ethernet соеденение (DHCP):
  Ethernet.begin(mac);
}

  dht.begin();

  // give the Ethernet shield a second to initialize:
  delay(1000);
  //print out the IP address
  Serial.print("IP = ");
  Serial.println(Ethernet.localIP());

}

void loop() {
  // Serial.println("Begin loop");
  char buf[80];
  int h = dht.readHumidity();
  int t = dht.readTemperature();

  sprintf(buf, "GET /sensors.php?t=%d&h=%d HTTP/1.0", t, h);

  Serial.print("T = ");
  Serial.print(t);
  Serial.print(";  H = ");
  Serial.print(h);
  Serial.println(";");

  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println(buf); // Отправляем GET запрос
    client.println("Host: ibot.example.com");
    client.println("Connection: close");
    client.println();
  } else {
    // если не получилось подключиться к серверу:
    Serial.println("connection failed");
  }

  Serial.println("disconnecting.");
  client.stop();

  delay(10000);
}

Для питания модуля можно использовать однополярный источник питания 5В или 9В.

Данные, полученные с сенсора, обрабатываются в аппаратном модуле и передаются на сервер, который находится на хостинге (php + mysql) посредством протокола HTTP. Для хранения необходимо создать базу данных (dbname) и пользователя со всеми правами на эту базу данных (dbuser) и паролем (dbpass). В базе данных(БД) создаем таблицу с полями:

  • дата и время (заполняются автоматически сервером)

  • температура (данные с аппаратного модуля)

  • влажность (данные с аппаратного модуля)

  • IP клиента с которого отправлен запрос(заполняются автоматически сервером)

Для этого необходимо зайти phpMyAdmin и выбирать вкладку SQL, в которую вставляем следующий код и жмем ОК.

CREATE TABLE IF NOT EXISTS `sensor_data` (
  `date_time` datetime NOT NULL,
  `sensor_temp` float(9,3) NOT NULL DEFAULT '0.00',
  `sensor_humidity` float(9,3) NOT NULL DEFAULT '0.00',
  `client_ip` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


Программное обеспечение серверной части системы состоит всего из двух файлов: index.php и sensors.php

index.php

<?php
//адрес хоста
$dbhost = 'db24.com';
//имя пользователя
$dbuser = 'dbuser';
//пароль для подключения к Mysql
$dbpass = 'dbpass';
//имя базы данных
$dbname = 'dbname';
// сохраняем IP на всякий случай
$client_ip = $_SERVER['REMOTE_ADDR'];
// получение значения переменной температура
$temp = $_GET["t"];
// получение значения влажность
$hum = $_GET["h"];

//устанавливаем подключение к MySQL
$connect = mysql_connect($dbhost, $dbuser, $dbpass);
// проверяем состояние подключения
if(! $connect )
{
  die('Could not connect: ' . mysql_error());
}

mysql_select_db('dbpass') or die('Не удалось выбрать базу данных');

mysql_set_charset('utf8');

// Выполняем SQL-запрос
$query = 'SELECT *
FROM `sensor_data`
ORDER BY `sensor_data`.`date_time` DESC
LIMIT 0 , 5';

$result = mysql_query($query) or die('Запрос не удался: ' . mysql_error());

// Выводим результаты в html
echo "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    echo "\t<tr>\n";
    foreach ($line as $col_value) {
        echo "\t\t<td>$col_value</td>\n";
    }
    echo "\t</tr>\n";
}
echo "</table>\n";

// Освобождаем память от результата
mysql_free_result($result);

// Закрываем соединение
mysql_close();
?>


sensors.php

<?php
//адрес хоста
$dbhost = 'db24.com';
//имя пользователя
$dbuser = 'dbuser';
//пароль для подключения к Mysql
$dbpass = 'dbpass';
//имя базы данных
$dbname = 'dbname';
// сохраняем IP на всякий случай
$client_ip = $_SERVER['REMOTE_ADDR'];
// получение значения переменной температура
$temp = $_GET["t"];
// получение значения влажность
$hum = $_GET["h"];

//устанавливаем подключение к MySQL
$connect = mysql_connect($dbhost, $dbuser, $dbpass);
// проверяем состояние подключения
if(! $connect )
{
  die('Could not connect: ' . mysql_error());
}
// Выбираем базу данных
mysql_select_db ($dbname, $connect);

//Отправляем данные в таблицу
$sql = "INSERT INTO sensor_data VALUES (NOW(), '$temp', '$hum', '$client_ip')";

// проверяем состояние отправки
if(!mysql_query($sql))
{echo '<p><b>Data upload error!</b></p>';}
else
{echo '<p><b>OK</b></p>';}
// закрываем соединение с базой
mysql_close($connect);
?>