Arduino → Собираем статистику изменений температуры и влажности с помощью Arduino и записываем ее в MySQL
Давно хотел написать статью на тему Arduino. Моя история работы с ней началась с банальной необходимости, а дело было так:
Когда я админил одну риелторскую контору, была у меня серверная комната, в которой работал кондиционер, но закуплен он был давно, был совершенно тупой, мог только охлаждать, но совершенно не отслеживал температуру в помещении, соответственно если он включен, то «сопли в носу замерзают», а если выключен, то в «каморке» создавался настоящий филиал крематория, со всеми вытекающими.
Была и еще одна неприятная особенность, если включить «кондей», то через какое-то время его выключали, мотивируя это тем, что он жрет энергию почем зря, а глючаший сервер терминалов и почта это так, приятный бонус… facepalm!
Данная «ситуёвина», меня совершенно не устраивала, для начала я решил снять статистику, того как быстро нагревается помещение и как быстро охлаждается. Совершено забыл добавить, у кондиционера был пульт, от которого принималось только 2 значения- Вкл и Выкл.
Руководство конторы, ничего о покупке нового кондиционера слышать не хотело, но ситуацию нужно было менять в корне.
Про программируемые микроконтроллеры я слышал давно, еще во времена господства микросхем PIC. Но необходимость осваивать язык С и пайка программаторов для них, остудила мой пыл и отсрочило знакомство, примерно лет на 6, но это я отвлекся.
Примерно полтора года назад мной была куплена плата Arduino, в слепом приступе «потреблятства» был, за одно, куплен и Ethernet Shield о чем, в последствии, я нисколько не пожалел. С этого все и началось…
Данный мануал является слегка переработанным вариантом той системы которая отработала у меня примерно 3 мес, после чего фирма закрылась. На выходных, перебирая свои старые файлы нашел скетч и php скрипт, а в столе лежала Arduino, наработку было жалко выбрасывать, все таки я потратил на ее разработку какое-то время, по этому я решил ее переписать под новую версию Arduino IDE, благо переделывать пришлось совсем не много, и выложить, надеюсь кому-то она окажется полезной и поможет сделать первые шаги в создании своего устройства.
Для создания системы нам понадобится Web сервер с MySQL и phpMyAdmin
1) Как настроить Web сервер с Nginx, PHP, MySQL можно прочитать в моей статье: Настройка Nginx с поддержкой PHP-FPM в Ubuntu
2) Также нам понадобится phpMyAdmin для облегчения работы с MySQL, пример настройки есть в статье: Установка phpMyAdmin на Nginx в Ubuntu
3) Ну и собственно Arduino, моя выглядит вот так:

Многие, по не знанию, скажут-" Нафига нам Nginx и PHP нужно сразу гнать данные в MySQL" и будут не правы, Nginx является прокладкой между реляционной базой данных и устройством, возможно, через какое-то время, вы решите сменить MySQL на Postgre SQL или Oracle, то вам не придется переделывать скетч Arduino, а достаточно внести изменения в php скрипт и все данные будут оправляться уже в другую базу данных…
Заходим в phpMyAdmin создаем пользователя и предоставляем ему все права на базу данных, я назвал пользователя test, база получила такое-же название, пароль password.
Переходим в базу данных и создаем в ней таблицу с необходимыми полями:
Выбираем вкладку SQL, вставляем в поле следующий код и жмем ОК.
У нас в таблице будет 4 поля
1-Дата и время (заполняются автоматически сервером)
2-данные с сенсора температуры (заполняются данными от Arduino)
3-данные сенсора влажности (заполняются данными от Arduino)
4- IP клиента с которого отправлен запрос (лишним не будет)(заполняются автоматически сервером)
Немного «поговнокодим»
Создаем скрипт в корневой директории сайта, назовем его test.php
Так будет выглядеть запрос для записи данных в базу:
httр://192.168.1.20/test.php?t=43&h=80
Где:
t-параметр температура
43 -значение параметра температура
h-параметр влажность
80-значение параметра влажность
Ну и собственно скетч:
Правда, у меня еще была идея, прикрутить ИК диод чтобы Arduino могла самостоятельно включать кондиционер когда становится жарко и выключать, когда становится холодно, но это я сделать не успел, контора накрылась медным тазом, в то время когда все это создавалось, у меня не хватало знаний, а теперь у меня нет необходимости, вот такой парадокс…
Благодаря этому девайсу я узнал что коморка охлаждается до +15 за 40 мин, а нагревается до +35 за 26 мин. Статистика, она такая, статистика…
Когда я админил одну риелторскую контору, была у меня серверная комната, в которой работал кондиционер, но закуплен он был давно, был совершенно тупой, мог только охлаждать, но совершенно не отслеживал температуру в помещении, соответственно если он включен, то «сопли в носу замерзают», а если выключен, то в «каморке» создавался настоящий филиал крематория, со всеми вытекающими.
Была и еще одна неприятная особенность, если включить «кондей», то через какое-то время его выключали, мотивируя это тем, что он жрет энергию почем зря, а глючаший сервер терминалов и почта это так, приятный бонус… 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, моя выглядит вот так:

Многие, по не знанию, скажут-" Нафига нам 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 комментария