avatar Arduino Собираем статистику изменений температуры и влажности с помощью Arduino и записываем ее в MySQL

Давно хотел написать статью на тему Arduino. Моя история работы с ней началась с банальной необходимости, а дело было так:
Когда я админил одну риелторскую контору, была у меня серверная комната, в которой работал кондиционер, но закуплен он был давно, был совершенно тупой, мог только охлаждать, но совершенно не отслеживал температуру в помещении, соответственно если он включен, то «сопли в носу замерзают», а если выключен, то в «каморке» создавался настоящий филиал крематория, со всеми вытекающими.
Была и еще одна неприятная особенность, если включить «кондей», то через какое-то время его выключали, мотивируя это тем, что он жрет энергию почем зря, а глючаший сервер терминалов и почта это так, приятный бонус… facepalm!
Данная «ситуёвина», меня совершенно не устраивала, для начала я решил снять статистику, того как быстро нагревается помещение и как быстро охлаждается. Совершено забыл добавить, у кондиционера был пульт, от которого принималось только 2 значения- Вкл и Выкл.
Руководство конторы, ничего о покупке нового кондиционера слышать не хотело, но ситуацию нужно было менять в корне.
Про программируемые микроконтроллеры я слышал давно, еще во времена господства микросхем PIC. Но необходимость осваивать язык С и пайка программаторов для них, остудила мой пыл и отсрочило знакомство, примерно лет на 6, но это я отвлекся.
Примерно полтора года назад мной была куплена плата Arduino, в слепом приступе «потреблятства» был, за одно, куплен и Ethernet Shield о чем, в последствии, я нисколько не пожалел. С этого все и началось…

Данный мануал является слегка переработанным вариантом той системы которая отработала у меня примерно 3 мес, после чего фирма закрылась. На выходных, перебирая свои старые файлы нашел скетч и php скрипт, а в столе лежала Arduino, наработку было жалко выбрасывать, все таки я потратил на ее разработку какое-то время, по этому я решил ее переписать под новую версию Arduino IDE, благо переделывать пришлось совсем не много, и выложить, надеюсь кому-то она окажется полезной и поможет сделать первые шаги в создании своего устройства.

Лирическое отступление:
Я не являюсь программистом PHP или специалистом по работе с электроникой, этому я никогда не учился, все мои знания в этой области появились по тому что у меня была проблема и мне нужно было ее решить и я ее, таки, решил. Возможно, мой код является классическим образцом «говнокодинга», но он работает, так что, прошу помидорами не бросаться… :)

Для создания системы нам понадобится Web сервер с MySQL и phpMyAdmin
1) Как настроить Web сервер с Nginx, PHP, MySQL можно прочитать в моей статье: Настройка Nginx с поддержкой PHP-FPM в Ubuntu
2) Также нам понадобится phpMyAdmin для облегчения работы с MySQL, пример настройки есть в статье: Установка phpMyAdmin на Nginx в Ubuntu
3) Ну и собственно Arduino, моя выглядит вот так:
Arduino Mega 2560+Ethernet Shield+DHT11 sensor
Многие, по не знанию, скажут-" Нафига нам Nginx и PHP нужно сразу гнать данные в MySQL" и будут не правы, Nginx является прокладкой между реляционной базой данных и устройством, возможно, через какое-то время, вы решите сменить MySQL на Postgre SQL или Oracle, то вам не придется переделывать скетч Arduino, а достаточно внести изменения в php скрипт и все данные будут оправляться уже в другую базу данных…

Заходим в phpMyAdmin создаем пользователя и предоставляем ему все права на базу данных, я назвал пользователя test, база получила такое-же название, пароль password.
Переходим в базу данных и создаем в ней таблицу с необходимыми полями:

Выбираем вкладку 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 ;


У нас в таблице будет 4 поля
1-Дата и время (заполняются автоматически сервером)
2-данные с сенсора температуры (заполняются данными от Arduino)
3-данные сенсора влажности (заполняются данными от Arduino)
4- IP клиента с которого отправлен запрос (лишним не будет)(заполняются автоматически сервером)

Немного «поговнокодим»

Создаем скрипт в корневой директории сайта, назовем его test.php

<?php
//адрес хоста
$dbhost = 'localhost';
//Имя пользовтаеля
$dbuser = 'test';
//пароль для подключения к Mysql
$dbpass = 'password';
//имя базы данных
$dbname = 'test';
// сохраняем 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);
?>


Так будет выглядеть запрос для записи данных в базу:
httр://192.168.1.20/test.php?t=43&h=80

Где:
t-параметр температура
43 -значение параметра температура
h-параметр влажность
80-значение параметра влажность

Ну и собственно скетч:
#include <DHT.h>
#include <Ethernet.h>
#include <SPI.h>


byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4C, 0xFB };
byte ip[] = { 192, 168, 1, 30 };

//IP адрес сервера который будет собирать статистику
byte server[] = { 192, 168, 1, 20 };

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

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


DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  Ethernet.begin(mac, ip);
  dht.begin();
  // Для отладки включим отправку данных в COM порт
  Serial.begin(9600);
  
}

void loop()
{
int h = dht.readHumidity();
int t = dht.readTemperature();
int l = analogRead(A0);
String msg = "GET /test.php?t="+ String(t) + "&h="+String(h);

// Для отладки включим отправку данных в COM порт
Serial.println(msg);
// Если это не требуется, то можно закомментировать


client.connect(server, 80);
client.println(msg);
//Ждем 2 сек. 
delay (2000);

//потом отключаемся
client.stop();

//Данные будут отправляться каждые 10 сек, выше мы уже подождали 2 сек, подождем еще 8 сек. 
 delay (8000);
  }


Правда, у меня еще была идея, прикрутить ИК диод чтобы Arduino могла самостоятельно включать кондиционер когда становится жарко и выключать, когда становится холодно, но это я сделать не успел, контора накрылась медным тазом, в то время когда все это создавалось, у меня не хватало знаний, а теперь у меня нет необходимости, вот такой парадокс…
Благодаря этому девайсу я узнал что коморка охлаждается до +15 за 40 мин, а нагревается до +35 за 26 мин. Статистика, она такая, статистика…

3 комментария

avatar
Экономить на охлаждении — на кол их, сказал бы Иван Грозный, говорили мне иди в ПТУ учится на ремонт телевизоров и другой техники — хоть бы в схемах разбирался, нет же на экономиста пошёл — толку никакого 3 года впустую
avatar
Так они, сами себя, на кол и посадили. :)
комментарий был удален
Есть что добавить? Регистрируйся и оставляй комментарии!