Добавление датчиков умного дома

http://portalrabot.ru/?page_id=1098

Добавил в систему статистики новые датчики умного дома. Теперь все показания датчиков пишутся в базу данных, выводится по ним мгновенные показания, показания за сутки и есть возможность посмотреть показания за все время наблюдения.

Теперь в системе существуют:

  1. Датчик температуры на улице
  2. Датчик влажности на улице
  3. Датчик атмосферного давления
  4. Датчик угарного газа на кухне ( установлена автономная пищалка не зависящая от интернета и базы данных, так же стоит независимый индикатор из 3х цветного светодиода)
  5. Датчик метана на кухне (( установлена автономная пищалка не зависящая от интернета и базы данных, так же стоит независимый индикатор из 3х цветного светодиода)
  6. Датчик давления воды
  7. Датчик потока воды

Пока формируем и собираем статистику данных, затем система будет реагировать на показания данных.

Принцип работы с интернетом, с базой данных и построения графиков и индикаторов одинаковый, так что разобравшись с одним остальные идут по накатанной дороге и гораздо проще.

Система построена на Ардуино нано, который передает данные по COM порту на wifi модуль esp8622, который в свою очередь пересылает их в базу данных на сайте.

Программная часть сложная. Приведу примеры как я сделал. Но подробно объяснить и описать процесс понятно наверное не смогу, целая книга получится.

Скетч для ардуино нано:

int sensorch = A0; //порт входа датчика сн
int sensorco = A1;
int sensordavl = A3;
int blue = 2;
int green = 5;
int red = 4;
int blueco = 8;
int greenco = 6;
int redco = 7;
float ch; // переменная сн
float co; // переменная co
float davl;// переменная давления
volatile int flow_frequency; // Water flow
unsigned int l_hour,f_val; // Water flow
unsigned long ctTime,flow_val,cloopTime; // Water flow
unsigned long vrem;

void flow () // Water flow Interrupt function
{
flow_frequency++; f_val++;
}

void setup()
{
Serial.begin(9600);
pinMode(sensorch, INPUT); // определяем что вход
pinMode(blue, OUTPUT);
pinMode(green, OUTPUT);
pinMode(red, OUTPUT);
pinMode(sensorco, INPUT); // определяем что вход
pinMode(blueco, OUTPUT);
pinMode(greenco, OUTPUT);
pinMode(redco, OUTPUT);
pinMode(sensordavl, INPUT);

attachInterrupt(1, flow, RISING); sei(); ctTime = millis(); cloopTime = ctTime; // Water flow

}

void loop()
{

ctTime = millis();
if(ctTime >= (cloopTime + 1000))
{
cloopTime = ctTime;
l_hour = (flow_frequency * 60 / 7.5);
flow_frequency = 0; // Сброс счётчика
//Serial.println(l_hour, DEC);
//Serial.println(” L/hour”); // Литров в час
}

if(f_val>=450){flow_val++;f_val=0;}
//Serial.println(flow_val);
//Serial.println(“L”); // Всего литров
davl=analogRead(sensordavl);
ch=analogRead(sensorch);
co=analogRead(sensorco);
if (ch<200){digitalWrite(green, HIGH);}else{digitalWrite(green, LOW);}
if (ch>200 and ch<500){digitalWrite(blue, HIGH);}else{digitalWrite(blue, LOW);}
if (ch>500){digitalWrite(red, HIGH);}else{digitalWrite(red, LOW);}
if (co<200){digitalWrite(greenco, HIGH);}else{digitalWrite(greenco, LOW);}
if (co>200 and co<500){digitalWrite(blueco, HIGH);}else{digitalWrite(blueco, LOW);}
if (co>500){digitalWrite(redco, HIGH);}else{digitalWrite(redco, LOW);}
//Serial.println(ch);
//Serial.println(co);
vrem=vrem+1;
if(vrem>=100000){
vrem=0;
String msg =String(co) + “&ch=” + String(ch) + “&litrtime=” + String(l_hour) + “&litrall=” + String(flow_val) + “&davl=” + String(davl);
//+ ” HTTP/1.1\r\n” + “Host: ” + “portalrabot.ru” + “\r\n” + “User-Agent: arduino-ethernet” + “Connection: close\r\n\r\n”;
Serial.print(msg);
}
//delay(5000);

}

Скетч для esp8622

#include <ESP8266WiFi.h>
String inString;
String msg;

const char* ssid = “*****”;
const char* password = “******”;

const char* host = “*******.ru”;
void setup() {
Serial.begin(9600);
//Serial.println();
//Serial.println();
Serial.print(“Connecting to “);
Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}

Serial.println(“”);
Serial.println(“WiFi connected”);
Serial.println(“IP address: “);
Serial.println(WiFi.localIP());

}

void loop() {
delay(2000);
msg = “”;
inString = “”;
WiFiClient client;
if (Serial.available() > 0){
Serial.print(“connecting to “);
Serial.println(host);

// Use WiFiClient class to create TCP connections
//WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println(“connection failed”);
return;
}

while (Serial.available() > 0) {

int inChar = Serial.read();
inString += (char)inChar;

}
String msg =”GET /*****.php?cod=******&co=” + String(inString) +
” HTTP/1.1\r\n” +
“Host: ” + host +
“\r\n” + “User-Agent: arduino-ethernet” +
“Connection: close\r\n\r\n”;
client.print(msg);
Serial.print(msg);
delay(1000);

//Serial.println(inString);
while (client.available()) {
String line = client.readStringUntil(‘\r’);
Serial.print(line);
}
Serial.println();
Serial.println(“closing connection”);
}
//delay(5000);
}

 

Файл на хостинге ****.php для записи в базу данных

<?php
$key = $_GET[“cod”];
if ($key !=”*****”) {// Специальный код, например asREb25C
exit;
}
//адрес хоста
$dbhost = ‘localhost’;
//Имя пользовтаеля
$dbuser = ‘******’;
//пароль для подключения к Mysql
$dbpass = ‘*******’;
//имя базы данных
$dbname = ‘******’;
// сохраняем IP на всякий случай
$client_ip = $_SERVER[‘REMOTE_ADDR’];
// получение значения переменной
$co = $_GET[“co”];
$ch = $_GET[“ch”];
$litrtime = $_GET[“litrtime”];
$litrall = $_GET[“litrall”];
//if ($litrall != 0) {
//exit;
//}
$davl = $_GET[“davl”];
$co=$co/100;
$ch=$ch/100;
$litrtime=$litrtime/10;
$davl=$davl/100;
// получение значения влажность
//$hum = $_GET[“h”];
//$hum2 = $_GET[“h2”];

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

//Отправляем данные в таблицу
$sql = “INSERT INTO gasvoda VALUES (‘$id’, NOW(), ‘$co’, ‘$ch’, ‘$litrtime’, ‘$litrall’, ‘$davl’, ‘$client_ip’)”;
//mysql_query($sql); echo “<p>Новая запись вставлена в базу!</p>”;
//$sql = “INSERT INTO sensor_data4 VALUES (NOW(), ‘$temp2’, ‘$hum2’, ‘$client_ip’)”;
// проверяем состояние отправки
if(!mysql_query($sql))
{echo ‘<p><b>Data upload error!</b></p>’;}
else
{echo ‘<p><b>OK</b></p>’;}
// закрываем соединение с базой
mysql_close($connect);
?>

Файл на хостинге *****.php для выборки из базы данных параметров датчика СО для индикатора

<?php
define(“HOST”, “localhost”);
define(“USER”, “****”);
define(“PASSWORD”, “*****”);
define(“DB_NAME”, “klim”);

$db_connect = mysql_connect(HOST,USER,PASSWORD,TRUE);
if(!$db_connect){
die(‘Ошибка подключени’.mysql_error());
}

mysql_select_db(DB_NAME, $db_connect);
//echo ‘Подключение прошло успешно’;
//mysql_set_charset(DB_NAME,’utf8′);
//mysql_query(“SET NAMES ‘utf8′”,DB_NAME);

function getDataString() {
global $db_connect;
$query=mysql_query(“SELECT `co` FROM `gasvoda` ORDER BY id DESC LIMIT 1″);//`data_time` >= (now() – interval 0.5 minute)”);
//echo $query;
$data= ”;
while($row=mysql_fetch_assoc($query)){
$data.=”.$row[‘co’].”;
}
//$data=rtrim($data,’,’);
$data.=”;
return $data;
}
echo getDataString();
?>

Файл на хостинге для построения индикатора СО  *****.js

$(function () {
newVal = $.ajax({url: “co.php” , dataType:”json” , async: false}).responseText;
newVal = +newVal;
var myChart = Highcharts.chart(‘container’, {

chart: {
type: ‘gauge’,
plotBackgroundColor: null,
plotBackgroundImage: null,
plotBorderWidth: 0,
plotShadow: false
},

title: {
text: ‘Содержание СO’
},

pane: {
startAngle: -150,
endAngle: 150,
background: [{
backgroundColor: {
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
stops: [
[0, ‘#FFF’],
[1, ‘#333’] ] },
borderWidth: 0,
outerRadius: ‘109%’
}, {
backgroundColor: {
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
stops: [
[0, ‘#333’],
[1, ‘#FFF’] ] },
borderWidth: 1,
outerRadius: ‘107%’
}, {
// default background
}, {
backgroundColor: ‘#DDD’,
borderWidth: 0,
outerRadius: ‘105%’,
innerRadius: ‘103%’
}] },

// the value axis
yAxis: {
min: 0,
max: 17,

minorTickInterval: ‘auto’,
minorTickWidth: 1,
minorTickLength: 10,
minorTickPosition: ‘inside’,
minorTickColor: ‘#666’,

tickPixelInterval: 30,
tickWidth: 2,
tickPosition: ‘inside’,
tickLength: 10,
tickColor: ‘#666’,
labels: {
step: 2,
rotation: ‘auto’
},
title: {
text: ‘Процентов’
},
plotBands: [{
from: 0,
to: 2.2,
color: ‘#228B22’ //зеленый
}, {
from: 2.2,
to: 4.4,
color: ‘#00008B’ // синий
},{
from: 4.4,
to: 17,
color: ‘#FF0000’ // red
}] },

series: [{
name: ‘Содержание’,
data: [newVal],
tooltip: {
valueSuffix: ‘%’
}
}],
“plotOptions”: {
“series”: {
“animation”: true,
“dataLabels”: {
“style”: {
“color”: “contrast”,
“fontSize”: “21px”,
“fontWeight”: “bold”,
“textOutline”: “1px 1px contrast”
},
“enabled”: true
}
}
},
},
// Add some life
function (chart) {
setInterval(function () {
if (chart.axes) { // not destroyed
var point = chart.series[0].points[0],
newVal,
//inc = Math.round((Math.random() – 0.5) * 20);
newVal = $.ajax({url: “co.php” , dataType:”json” , async: false}).responseText;
//document.write(newVal);
newVal = +newVal;
//newVal = point.y + 1; //+ inc;

//if (newVal < 0 || newVal > 200) {
//newVal = point.y – inc;
//}

point.update(newVal);
}
}, 10000);

});
});

Файл на хостинге для выборки данных датчика СО ****.php для линейного графика

<?php
define(“HOST”, “localhost”);
define(“USER”, “***”);
define(“PASSWORD”, “***”);
define(“DB_NAME”, “klim”);

$db_connect = mysql_connect(HOST,USER,PASSWORD,TRUE);
if(!$db_connect){
die(‘Ошибка подключени’.mysql_error());
}

mysql_select_db(DB_NAME, $db_connect);
//echo ‘Подключение прошло успешно’;
//mysql_set_charset(DB_NAME,’utf8′);
//mysql_query(“SET NAMES ‘utf8′”,DB_NAME);

function getDataString() {
global $db_connect;
$query=mysql_query(“SELECT `co` FROM `gasvoda` WHERE `data_time` >= CURDATE()”);
//echo $query;
$data= ”;
while($row=mysql_fetch_assoc($query)){
$data.=”.$row[‘co’].’, ‘;
}
$data=rtrim($data,’, ‘);
$data.=”;
return $data;
}
echo getDataString();
?>

Файл на хостинге для построения линейного графика СО ***.js

$(function () {
//newVal = newVal[];
newVal = $.ajax({url: “col.php” , dataType:”json” , async: false}).responseText;
//document.write(newVal);
var newVal = newVal.split(‘, ‘);
//document.write(newVal);
var max = +newVal[0];
for(var i = 0; i < newVal.length; i++){
newVal[i] = +newVal[i];
if(newVal[i] > max){max = newVal[i]}
}
var myChart = Highcharts.chart(‘container2’, {
chart: {
type: ‘spline’
},
title: {
text: ‘Содержание за сутки’
},
subtitle: {
text: ‘Содержание %’
},
xAxis: {
categories: [‘0:00’, ‘1:00’, ‘2:00’, ‘3:00’, ‘4:00’, ‘5:00’,
‘6:00’, ‘7:00’, ‘8:00’, ‘9:00′, ’10:00′, ’11:00′,’12:00′, ’13:00′, ’14:00′, ’15:00′,
’16:00′, ’17:00′, ’18:00′, ’19:00′, ’20:00′, ’21:00′, ’22:00′, ’23:00’] },
yAxis: {
title: {
text: ‘Проценты’
},
labels: {
formatter: function () {
return this.value + ‘%’;
}
}
},
tooltip: {
crosshairs: true,
shared: true
},
plotOptions: {
spline: {
marker: {
radius: 4,
lineColor: ‘#666666’,
lineWidth: 1
}
}
},
series: [{
name: ‘Дом’,
marker: {
symbol: ‘square’
},
data: [newVal[0], newVal[90], newVal[180], newVal[270], newVal[360], newVal[450], newVal[540], newVal[630], newVal[720], newVal[810], newVal[900], newVal[990], newVal[1080], newVal[1170], newVal[1260], newVal[1350], newVal[1440], newVal[1530], newVal[1620], newVal[1710], newVal[1800], newVal[1890], newVal[1980], newVal[2070]]

}] });
});

 

Файл на хостинге для вывода индикатора и линейного графика на экран co.html

<html>
<head>
<meta http-equiv=”content-type” content=”text/html; charset=utf-8″>
<script src=”https://code.highcharts.com/highcharts.js”></script>
<script src=”https://code.highcharts.com/highcharts-more.js”></script>
<script src=”https://code.highcharts.com/modules/exporting.js”></script>
<script src=”https://code.highcharts.com/modules/export-data.js”></script>

<script src=”/graf/highcharts.js”></script>
<script src=”/graf/exporting.js”></script>
<script src=”/graf/jquery.js”></script>
<script src=”/graf/grafco.js”></script>
<script src=”/graf/grafcolin.js”></script>
<script src=”https://code.highcharts.com/highcharts-more.js”></script>
<script src=”https://code.highcharts.com/modules/exporting.js”></script>
</head>
<div id=”container” style=”min-width: 310px; max-width: 800px; height: 600px; margin: 0 auto”></div>
<div id=”container2″ style=”min-width: 310px; max-width: 800px; height: 600px; margin: 0 auto”></div>
</html>

Views All Time
Views All Time
249
Views Today
Views Today
1
0

Автор публикации

не в сети 1 неделя

koordinator

0
Комментарии: 2Публикации: 230Регистрация: 02-12-2017

1 комментарий к “Добавление датчиков умного дома”

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Авторизация
*
*
Генерация пароля