Система полуумного дома
Получение температуры...
Получение влажности...
Здарова, щеглы! Сегодня своими руками мы соберем основу полоумного дома. Ну а если без приколов, то система и вправду полоумная, так как умного в ней мало чего есть. Кто заходил на мой сайт с компьютера наверняка увидел справа внизу показания температуры и влажности (у мобильной версии этой колонки нет – адаптивный дизайн).
И я намерен рассказать, как это сделано. Во-первых, на понадобиться:
В качестве корпуса я решил использовать деревянную коробочку из-под подаренной мне когда-то авторучки, на лицевой панели надписи «оружие современного мужчины», «совершенно секретно» и т.д. Берем и пилим форточку под дисплей.
С задней стороны делаем два отверстия под газоанализатор и термометр-гигрометр.
Отверстие под газоанализатор подошло идеально, он садится туда плотно. Отверстие под DHT расточил сначала дремелем, потом доработал надфилем. И пока сверлилки были в руках сделал сбоку отверстие для подачи питания. А потом в ход пошёл самый надежный крепеж – термосопли.
Да, дисплей тоже держится на нем…
И термометр-гигрометр тоже.
А посля приступаем к процессу сборки спайки…
Как мне кажется, вряд ли кто-то захочет повторить эту конструкцию (да и не стоит потом объясню почему). Но всё же опишу какие выводы NodeMCU задействованы.
Логика ESP основана на опорном напряжении 3,3 вольта. DHT11 подключить к такому напряжению можно, он по сути работает на дискретных сигналах. Газоанализатор же нет. Во-первых, он питается от 5 вольт, во-вторых, у него аналоговый сигнал (рассчитанный на 5 вольтовую логику). В связи с этим был использован резистивный делитель напряжения.
Где A0 – аналоговый выход газоанализатора, GND – общий минус системы, а средний контакт между резисторов подключается к A0 на плате NodeMCU.
Перед заливкой скетча должен признаться, я не очень хорошо понял тему развертки Веб-сервера на ESP, поэтому данная часть заимствована из примеров на просторах интернета. Второй минус я не нашёл нигде как согласовать выход с газоанализатором именно под углекислый газ, в связи с этим он показывает некую абстрактную величину. Чем больше – тем хуже. Реагирует на газ из зажигалки, на спирт, ну и на выдыхаемый воздух. Именно поэтому, эта версия бета, мною заказан другой датчик и систему ждёт апгрейд.
#include <ESP8266WiFi.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 0
const char* ssid = "Имя вашей WiFi сети";
const char* password = "Пароль вашей WiFi сети";
DHT dht(DHTPIN, DHT11);
WiFiServer server(80);
String header;
float t = 0.0;
int h = 0;
int CO = 0;
int count; //счетчик
// only runs once
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
void setup() {
// Initializing serial port for debugging purposes
Serial.begin(115200);
delay(10);
dht.begin();
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
// preparing GPIOs
// Connecting to WiFi network
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");
// Starting the web server
server.begin();
Serial.println("Web server running. Waiting for the ESP IP...");
delay(1000);
// Printing the ESP IP address
Serial.println(WiFi.localIP());
count = 10;
}
// runs over and over again
void loop() {
t = dht.readTemperature();
h = dht.readHumidity();
// Listenning for new clients
if ((count%10)==0) {
CO = analogRead(A0);
}
//шапка экрана
lcd.setCursor(0, 0);
lcd.print("TempC");
lcd.setCursor(7, 0);
lcd.print("Vlaga");
lcd.setCursor(13, 0);
lcd.print("CO");
//значения
lcd.setCursor(0, 1);
lcd.print(t);
lcd.setCursor(7, 1);
lcd.print(h);
lcd.setCursor(9, 1);
lcd.print("%");
lcd.setCursor(12, 1);
lcd.print(CO);
WiFiClient client = server.available();
if (client) {
Serial.println("New client");
// boolean to locate when the http request ends
boolean blank_line = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
header += c;
if (c == '\n' && blank_line) {
// checking if header is valid
// dXNlcjpwYXNz = 'user:pass' (user:pass) base64 encode
Serial.print(header);
//successful login
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// turns the GPIOs on and off
Serial.println("Main Web Page");
// your web page
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<meta charset='utf-8'>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css\">");
client.println("</head><div class=\"container\">");
client.println("<h1>Важней всего погода в доме</h1>");
client.println("<p>Температура воздуха <span id='t'>");
client.println(t);
client.println("°С</span></p><p>Влажность воздуха <span id='v'>");
client.println(h);
client.println("%</span></p></body></html>");
client.println("</div></html>");
header = "";
break;
}
if (c == '\n') {
// when starts reading a new line
blank_line = true;
}
else if (c != '\r') {
// when finds a character on the current line
blank_line = false;
}
}
}
// closing the client connection
delay(1);
client.stop();
Serial.println("Client disconnected.");
}
count++;
if (count == 999) count = 10;
}
Включаем. Всё работает, коробку надежно склеиваем скотчем. На винты сажать рано, так как это только бета-версия.
После я на своем роутере устанавливаю вручную постоянный IP для этой платы. Это необходимо для парсинга данных для моего веб сайта.
Теперь о реализации на сервере. Где-то на просторах я наткнулся на простейший парсер (так как было давно ссылку привести не могу). И реализовал его у себя. Итак, создаю страничку parsetemp.php, пишу в ней код.
<?php
//Парсим сервер ЕСПшки
function Parse($p1, $p2, $p3) {
$num1 = strpos($p1, $p2);
if ($num1 === false) return 0;
$num2 = substr($p1, $num1);
return strip_tags(substr($num2, 0, strpos($num2, $p3)));
}
$String = @file_get_contents('http://192.168.1.5/'); //получаем контент ЕСПшки
//Вывод температуры, влажности с ардуино или ошибки
if (isset($String)) {
$temp = @Parse($String, "<span id='t'>", "</span>") or die ("Ошибка соединения с ардуино");
$vlazh = @Parse($String, "<span id='v'>", "</span>") or die ("Ошибка соединения с ардуино");
echo "<h5>Система полоумного дома</h5><p>Температура воздуха: <span style = 'color: #008080'>$temp</span></p><p>Влажность воздуха: <span style = 'color: #008080'>$vlazh</span></p>";
} else echo "<p style = 'color: red'>Соединение с ардуино не установлено, попробуйте обновить страницу позже.</p>";
?>
Если зайти на этот файл, то он в принципе покажет температуру и влажность.
Далее переходим к веб разметке, нижняя часть блока справа выглядит так:
<div id="content">
<h5>Система полуумного дома</h5>
<p>Получение температуры...</p>
<p>Получение влажности...</p>
</div>
Далее в ход включается JS. Мой скрипт после полной загрузки страницы он выполняет несколько различных функций, нас интересует только та, что отображает данные.
function show()
{
$.ajax({
url: "parsetemp.php",
cache: false,
success: function(html){
$("#content").html(html);
}
});
}
show();
setInterval(show,1000);
Таким образом, раз в секунду на сайте обновляются значения температуры и влажности с моей полоумной метеостанции.
Данные сходятся…
Подводя итог можно сказать, что модуль MQ135 – фигня, и что система требует дальнейшей доработки, я даже данные с него не транслирую в инет.
Кроме того, система будет расширена еще парочкой серверов, в том числе в планах сделать устройство снаружи дома, чтобы видеть погоду на улице – модули для него в пути.
На этом всё спасибо за внимание.
mcfirsachy написал к публикации QUAD405 из поднебесной cледующее:
Кто дочитал до конца - извините за огромное количество ошибок =)))) Хотелось бы добавить что на выпрямителе стоит защита акустики - подключение колонок с задержкой.Сейчас в Сосновом Бору облачно с прояснениями
Скорость ветра 6.72 м/с
Влажность 81 %
Температура 12.32 °C
Получение температуры...
Получение влажности...