Система полоумного дома. Начало

Здарова, щеглы! Сегодня своими руками мы соберем основу полоумного дома. Ну а если без приколов, то система и вправду полоумная, так как умного в ней мало чего есть. Кто заходил на мой сайт с компьютера наверняка увидел  справа внизу показания температуры и влажности (у мобильной версии этой колонки нет – адаптивный дизайн).

И я намерен рассказать, как это сделано. Во-первых, на понадобиться:

  1. ESP-модуль NodeMCU
  2. Датчик температуры и влажности DHT11
  3. Модуль газоанализатор MQ135
  4. Дисплей 2*64  (на фото вместе с газоанализатором)
  5. 5-вольтовый источник питания, так как дисплей и газоанализатор питаются именного от этого напряжения, и к тому же газоанализатор может нормально тока потреблять.
  6. Ну и какую-нибудь коробушку, куда всё это поместится.

В качестве корпуса я решил использовать деревянную коробочку из-под подаренной мне когда-то авторучки, на лицевой панели надписи «оружие современного мужчины», «совершенно секретно» и т.д. Берем и пилим форточку под дисплей.

С задней стороны делаем два отверстия под газоанализатор и термометр-гигрометр.

Отверстие под газоанализатор подошло идеально, он садится туда плотно. Отверстие под DHT расточил сначала дремелем, потом доработал надфилем. И пока сверлилки были  в руках сделал сбоку отверстие для подачи питания. А потом в ход пошёл самый надежный крепеж – термосопли.

Да, дисплей тоже держится на нем…

И термометр-гигрометр тоже.

А посля приступаем к процессу сборки спайки…

Как мне кажется, вряд ли кто-то захочет повторить эту конструкцию (да и не стоит потом объясню почему). Но всё же опишу какие выводы NodeMCU задействованы.

  • D1 – SCL дисплея
  • D2 – SDA дисплея
  • D3 – данные с DHT11
  • A0 – данные с газоанализатора через делитель напряжения
  • 3V – питание DHT11
  • G – один пин - минус питания DHT11, другой минус своего питания (можно делать общий)
  • Vin – плюс 5 вольт

Логика 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("&deg;С</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 – фигня, и что система требует дальнейшей доработки, я даже данные с него не транслирую в инет.

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

На этом всё спасибо за внимание.

Вы не можете комментировать записи, для этого вам необходимо войти или зарегистрироваться
Последняя публикация
BST дерево опубликовано во вторник 31 августа 2021 года в 20:50
Последний комментарий

mcfirsachy написал к публикации QUAD405 из поднебесной cледующее:

Кто дочитал до конца - извините за огромное количество ошибок =)))) Хотелось бы добавить что на выпрямителе стоит защита акустики - подключение колонок с задержкой.
Самая просматриваемая публикация
сервер на малине просмотров: 1275
Самая комментируемая публикация
К публикации сервер на малине было написано 8 комментариев.
Погода за бортом

Сейчас в Сосновом Бору облачно с прояснениями

Скорость ветра 6.72 м/с

Влажность 81 %

Температура 12.32 °C


Система полуумного дома

Получение температуры...

Получение влажности...