No es una oficina estupida

Nunca me atrevería a escribir un artículo sobre la próxima implementación de una casa inteligente con la conexión de sensores para fugas de agua en el baño y sistemas de seguimiento para trucos de gatos en el apartamento. Gracias a Dios que el gato está bajo el control de un perro, el agua tampoco parece fluir. Pero aún así, estamos más en el trabajo, en varias oficinas, donde no siempre es posible crear un ambiente de trabajo óptimo. El artículo está dedicado al sistema de monitoreo ambiental del espacio de trabajo en la oficina y a las actividades que llevamos a cabo después de un mes de su (sorprendentemente) trabajo estable. Por supuesto, enviamos todos los datos a las nubes, los miramos desde nuestros teléfonos inteligentes, no hay utilidad, pero no hay razón para alardear ante familiares y amigos, y la oficina se ha vuelto más cómoda. Todo se implementa en ESP8266, pero ¿cómo?



¿Dónde está el monitor?
No diré que trabajamos directamente en condiciones insoportables. Las oficinas de la empresa son maravillosas, en habitaciones de tres personas, muchas flores. El edificio en sí está rodeado de bosque. En general, se adjunta un panorama de la oficina donde se implementa el sistema de monitoreo.


¿Qué es el monitoreo?
Nada original Eliminamos la temperatura en la oficina, la humedad, la presión y el nivel de CO2. Por supuesto, se ha agregado un sensor de luz al sistema. El nivel de iluminación de los lugares de trabajo está incluso sujeto a control y, en nuestro caso, debería estar en el nivel de 300-400 Lux. Quizás este es el parámetro más importante para un trabajo cómodo. Y lo más dinámico durante el día.


Obtenemos temperatura y humedad del sensor DHT22. Descripción del sensor.


Tomamos presión del sensor BMP180. Descripción del sensor.


El nivel de CO2 es monitoreado por el sensor óptico MH-Z14. Descripción del sensor.


Bueno, el sensor TSL2561 en forma de placa de identificación para la serie Arduino GROVE controla la calidad de la iluminación. Descripción aquí .


Y, por último, el controlador ESP8266 en forma de un pañuelo para la creación rápida de prototipos de NodeMcu (con el nombre del firmware), que en mi caso se actualiza desde el IDE Arduino estándar, lo dirige todo.


Recopilamos la versión en caja
Entonces, todos los sensores están colocados sobre la mesa, es hora de ensamblar el dispositivo. Sin embargo, para empezar analizaremos algunas sutilezas. Dibujó un diagrama esquemático para mayor claridad.


Aquí todos los sensores están alimentados por +3.3 V, que tomaremos de la placa NodeMcu, ya que ya hay tres de ellos en la placa. Pero el sensor de dióxido de carbono tendrá que alimentarse por separado, requiere de 4 a 6 voltios de potencia, y el fabricante recomienda encarecidamente prestar especial atención a esto. Como planeo alimentar el dispositivo desde una fuente de alimentación separada a + 5V, no habrá problemas. Suministramos energía al terminal 1 del sensor MH-Z14 (o 15, ya que están duplicados). Cuando enciende el sensor durante un par de minutos, emite basura al puerto cuando transmite a través de la línea TX / RX, por lo que tomo la señal útil de este sensor de la salida PWM en la sexta pata. En general, me gustó este sensor. Es bastante estable, tiene una salida digital y analógica, pero solo puede funcionar con microcontroladores con lógica de tres voltios, así que ejecútelo, por ejemplo, en UNO sinbailar con panderetas coordinación de niveles lógicos no funcionará. En nuestro caso, el ESP funciona con lógica de tres voltios, como todos los demás sensores. Al mismo tiempo, el ESP en sí es especialmente exigente con la calidad de la energía, pero en la placa que utilicé en este artículo, se ensambla el esquema normal para estabilizar la potencia de entrada hasta +3,3 V, pero no recomendaría alimentar la placa desde ninguna IP dudosa y no lo daría en absoluto Sería más de 5 voltios. Tampoco depuraremos un circuito completamente ensamblado, alimentandolo solo desde un puerto USB. Dado que el sensor de dióxido de carbono tiene un gran consumo debido a la presencia de una bombilla incandescente (como fuente de IR, probablemente) en su diseño, esto puede empujar el puerto. ¿Lo necesitamos? Por lo tanto, completamos el firmware con la fuente de alimentación de terceros incluida, o mediante USB, pero desconectando el sensor de dióxido de carbono.

No es sin un soldador ...
Como puede ver en el diagrama, uso dos sensores en la línea i2c. Este es un sensor de presión y un sensor de luz. Como sabe , en un bus serie puede "colgar" hasta 127 todo tipo de sensores y dispositivos. En la implementación del protocolo, las líneas SDA / SCL deben ajustarse a la potencia, pero solo una vez. Y si colgamos sensores N, en cada uno de los cuales hay llaves, puede plantar una línea. Probablemente, nada hubiera sucedido con los dos sensores, pero siempre soy consistente en el diseño. No debería haber dientes, lo siento ... Por lo tanto, nos deshacemos de las resistencias pull-up en uno de los sensores. Era más conveniente arrancar las resistencias del sensor de presión. La figura muestra.

Después de todos estos ejercicios, recogemos nuestra versión en caja. En una caja de papel)

Lo que es sorprendente: funcionó de inmediato. Esto no es bueno, pero aún así.

Digestamos datos
, entonces, la ideología es esta. Recopilamos datos de los sensores y, por ejemplo, cada 10 minutos, los dejamos en el almacenamiento en la nube a través del Wi-Fi de la oficina. Construimos hermosos gráficos y analizamos los resultados de Thingspeak.com. El servicio es gratuito, bastante estable y fácil de entender. Mucho se ha escrito sobre él . Registramos el canal, obtenemos la clave API y restablecemos los datos de cualquier sensor utilizando el método POST.

Código del programa
//    ,     
#include <Wire.h>
#include <ESP8266WiFi.h> //     ,    
float index_comfort=0; //   

//+++++++++++++++++++++++++++++++++++++++++++++++++++

//   ,    
//   
#include "DHT.h"
#define DHTTYPE DHT22  //   - Grove DHT22
#define DHTPIN 14     //  14  ESP (   D5)  . 

//       
float humidity_room = 0.0; //     
//  humidity_room = dht.readHumidity();
float temp_room = 0.0; //     
//  temp_room = dht.readTemperature();

//    .     
//     
DHT dht(DHTPIN, DHTTYPE);

//++++++++++++++++++++++++++++++++++++++++++++++++++++

//     
#include <Digital_Light_TSL2561.h>
//      
float light_room=0.0;
//  light_room=TSL2561.readVisibleLux();


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++

//  C02  
int CO2; //     
int pin_CO2 = 13; //  13,   7 
//  2


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++

//    . 
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
float pressure =0.0; //   
//  pressure=bmp.readPressure(); 
//   !
// 1013.25 millibar = 101325  = 760  ..   ? ...
//      ,  

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++

//        -
//     thingspeak.com , , ..,  
#define myPeriodic 300; //        
const char* server = "184.106.153.149"; //   thingspeak.com

String apiKey ="1K******************GM"; //   

const char* MY_SSID = "P********x"; //  Wi-Fi  
const char* MY_PWD = ""; //  ,    ,  ""

int sent = 0; //   ()  .  ?  ,  ...

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//    ,  

void setup() {
  Serial.begin(9600); //    
 
  Serial.println("Go! Go! Go!");
  
  Wire.begin(); 
 
  dht.begin(); //    
 
  TSL2561.init(); //    
 
  pinMode(pin_CO2, INPUT); //    CO2  
 
  //   
 if (!bmp.begin()) {
 Serial.println("Promlem with sensor bmp180!");
  while (1) {}
  }
  //  wi-Fi
 connectWifi();
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++

//       
void connectWifi() 
{
  Serial.print("Connecting to "+*MY_SSID);
 WiFi.begin(MY_SSID, MY_PWD);
 while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
 Serial.print(".");
  }
  
 Serial.println("");
 Serial.println("Connected");
 Serial.println(""); 
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  //   
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  //    
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm"); 
}//end connect

//++++++++++++++++++++++++++++++++++++++++++++++++++++
//    
void send_info(float temp_in, float temp_out, float humidity_in, int CO2_in, float light_in, float pressure_all )
{  
  WiFiClient client;
  
   if (client.connect(server, 80)) { // use ip 184.106.153.149 or api.thingspeak.com
   Serial.println("WiFi Client connected ");
   
   //        
   String postStr = apiKey; //  
   postStr += "&field1=";
   postStr += String(temp_in); //    

   postStr += "&field2=";
   postStr += String(temp_out); //   

   postStr += "&field3=";
   postStr += String(humidity_in); //    

   postStr += "&field4=";
   postStr += String(CO2_in); // 2   

   postStr += "&field5=";
   postStr += String(light_in); //    

   postStr += "&field6=";
   postStr += String(pressure_all); //   
   
   postStr += "\r\n\r\n"; //    
   
   client.print("POST /update HTTP/1.1\n");
   client.print("Host: api.thingspeak.com\n");
   client.print("Connection: close\n");
   client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
   client.print("Content-Type: application/x-www-form-urlencoded\n");
   client.print("Content-Length: ");
   client.print(postStr.length());
   client.print("\n\n");
   client.print(postStr);
   delay(1000);  
   }//end if
   sent++; //   
  
 client.stop();
 Serial.println("transmition closed ");
}//end send


//+++++++++++++++++++++++++++++++++++++++++++++++++++++

//    ,   ? 

void loop()
{
 delay(5000);
 // 
 dht.begin();
 humidity_room = dht.readHumidity();
delay(500);

//   
 temp_room = dht.readTemperature();
delay(500);

//   
light_room=TSL2561.readVisibleLux();
delay(500);


// CO2  
 while(digitalRead(pin_CO2)==HIGH){;}
float duration_h = pulseIn(pin_CO2,HIGH)/1000;
 
 CO2= int(5000*(duration_h-2)/(duration_h+(1004-duration_h)-4)); //   
 delay(500);

//  
bmp.begin();
pressure=bmp.readPressure(); 
pressure=int((pressure/101325)*760);
delay(500);

//    
if (temp_room<18) {
  index_comfort=(2*light_room/300)+(400/CO2)+humidity_room/40;
  }

if (temp_room>25) {
  index_comfort=(2*light_room/300)+(400/CO2)+humidity_room/40;
  }

  index_comfort=1+(2*(light_room/300)+(400/CO2)+humidity_room/40);

  if (index_comfort>5){
    index_comfort=5;
    }
  
//    
send_info(temp_room, index_comfort, humidity_room, CO2, light_room, pressure);
  
  //.      
  int count = myPeriodic;
  while(count--)
  delay(1000);

  // ,  .   ...
  // , 
  //
  //       i2c    ,   
  // .     . 
  //     .  .    
  //  ,   .    ,   . 
  //     ,  DHT22,    . 
  // --,     ... 
  // 15  2016 .    
}


Si todo funciona correctamente, será algo como esto)



Para que esto funcione, necesitará bibliotecas para trabajar con sensores seleccionados y una biblioteca para trabajar con ESP8266 a través de Wi-Fi. También necesita agregar una placa NodeMcu a la lista de placas Arduino IDE, y para verla, necesita un controlador USB-SERIAL CH340, que es fácil de encontrar y descargar en la red sin ningún problema.

Biblioteca para ESP8266 Descargar
Biblioteca para trabajar con un sensor de humedad. Descargue la
Biblioteca para trabajar con el sensor de luz. Descargue la
Biblioteca para trabajar con un sensor de presión. Descargar

El sensor de CO2 no necesita bibliotecas. Las indicaciones se calculan por la duración de la salida de pulso proveniente de PWM y se calculan por la fórmula de la descripciónsensor Por cierto, el rango de medición no es de 2000 ppm, sino de 5000, que, por cierto, también fue escrito por el usuario Hellsy22 en un artículo reciente sobre un sensor de dióxido de carbono similar.

Conclusiones de la organización
1. Trabajos
2. El oficio es digno de mudarse de una caja de papel a un edificio decente.
Aqui esta También mostrará el nivel de comodidad en la oficina como un semáforo.


3. No hay mucha luz en la oficina por la noche, agregaron un par de luces de techo. Se puso mejor. 350 lx
4. La señora de la limpieza realmente trabaja. Viene temprano en la mañana, enciende la luz, la limpieza húmeda produce una oleada de humedad en la oficina durante media hora. No mucho, pero aún así ...
5. Después de dos horas de trabajo (tres personas respiran con dificultad) en la oficina, el nivel de CO2 sale de la escala. La ventilación de cinco minutos corrige la situación a la normalidad (500 ppm). Combina (si lo deseas) airear con gimnasia)))
6. Muy seco. La calefacción en invierno, por supuesto, es la razón directa. No es posible alcanzar una humedad confortable del 40-50%. Sin embargo, las flores en la oficina realmente dan más del 10 por ciento de humedad en comparación con una habitación similar sin flores. No te olvides de regarlos, por supuesto). Por cierto, se necesitan de 10 a 12 litros de agua para regar las flores. La oficina tiene 13 macetas. Riegue dos veces por semana.
7. La utilidad de esto en todo, francamente, no es suficiente. Sin embargo, por ejemplo, para las clases escolares o una clínica, tales sistemas probablemente serían más útiles.

Source: https://habr.com/ru/post/es391399/


All Articles