Não é um escritório estúpido

Eu nunca ousaria escrever um artigo sobre a próxima implementação de uma casa inteligente com a conexão de sensores para vazamentos de água no banheiro e sistemas de rastreamento para truques de gatos no apartamento. Graças a Deus o gato está sob o controle de um cachorro, a água também não parece fluir. Ainda assim, estamos mais trabalhando, em vários escritórios, onde nem sempre é possível criar um ambiente de trabalho ideal. O artigo é dedicado ao sistema de monitoramento ambiental da área de trabalho no escritório e às atividades que realizamos após um mês de seu trabalho (surpreendentemente) estável. Obviamente, enviamos todos os dados para as nuvens, olhamos para eles a partir de nossos smartphones, não há utilidade, mas não há motivo para nos vangloriarmos de parentes e amigos, e o escritório ficou mais confortável. Tudo é implementado no ESP8266, mas como - você é bem-vindo sob cat)



Onde está o monitor?
Não direi que trabalhamos diretamente em condições insuportáveis. Os escritórios da empresa são maravilhosos, em salas de três pessoas, muitas flores. O próprio edifício é cercado por floresta. Em geral, é anexado um panorama do escritório em que o sistema de monitoramento está implantado.


O que é monitoramento?
Nada original. Removemos a temperatura no escritório, a umidade, a pressão e o nível de CO2. Obviamente, um sensor de luz foi adicionado ao sistema. O nível de iluminação dos locais de trabalho ainda está sujeito a controle e, no nosso caso, deve estar no nível de 300 a 400 Lux. Talvez este seja o parâmetro mais importante para um trabalho confortável. E o mais dinâmico durante o dia.


Obtemos temperatura e umidade do sensor DHT22. Descrição do sensor.


Pressionamos o sensor BMP180. Descrição do sensor.


O nível de CO2 é monitorado pelo sensor óptico MH-Z14. Descrição do sensor.


Bem, o sensor TSL2561 na forma de uma placa de identificação para a série Arduino GROVE monitora a qualidade da iluminação. Descrição aqui .


E, finalmente, o controlador ESP8266 na forma de um lenço para a prototipagem rápida do NodeMcu (pelo nome do firmware), que no meu caso é exibido a partir do IDE padrão do Arduino, orienta tudo.


Coletamos a versão em caixa
Portanto, todos os sensores estão dispostos sobre a mesa - é hora de montar o dispositivo. No entanto, para começar, analisaremos algumas sutilezas. Esboçou um diagrama esquemático para maior clareza.


Aqui todos os sensores são alimentados a partir de +3,3 V, que serão retirados da placa NodeMcu, já que já existem três na placa. Mas o sensor de dióxido de carbono precisará ser alimentado separadamente, requer 4-6 volts de energia e o fabricante recomenda enfaticamente a atenção especial a isso. Como pretendo alimentar o dispositivo a partir de uma fonte de alimentação separada em + 5V, não haverá problemas. Fornecemos energia ao terminal 1 do sensor MH-Z14 (ou 15, pois eles são duplicados). Quando você liga o sensor por alguns minutos, ele libera qualquer lixo para a porta ao transmitir pela linha TX / RX, então eu recebo o sinal útil desse sensor da saída PWM na sexta etapa. Em geral, gostei desse sensor. É bastante estável, possui uma saída digital e analógica, mas só pode funcionar com microcontroladores com lógica de três volts; portanto, execute-o, por exemplo, no UNO semdançar com pandeiros a coordenação dos níveis lógicos não funcionará. No nosso caso, o ESP funciona com lógica de três volts, como todos os outros sensores. Ao mesmo tempo, o próprio ESP é especialmente exigente quanto à qualidade da energia, mas na placa que usei neste artigo, o esquema normal para estabilizar a energia de entrada até +3,3 V é montado, mas eu ainda não recomendaria à placa qualquer IP duvidoso seria mais do que 5 volts. Também não depuraremos um circuito totalmente montado, alimentando-o apenas a partir de uma porta USB. Como o sensor de dióxido de carbono tem um grande consumo devido à presença de uma lâmpada incandescente (como uma fonte de infravermelho, provavelmente) em seu design, isso pode empurrar a porta. Nós precisamos disso?). Portanto, preenchemos o firmware com a fonte de alimentação de terceiros incluída ou via USB, mas desconectamos o sensor de dióxido de carbono.

Não é sem um ferro de soldar ...
Como você pode ver no diagrama, eu uso dois sensores na linha i2c. Este é um sensor de pressão e um sensor de luz. Como você sabe , em um barramento serial, você pode "pendurar" até 127 todos os tipos de sensores e dispositivos. Na implementação do protocolo, as linhas SDA / SCL devem ser apertadas à energia, mas apenas uma vez. E se pendurarmos sensores N, em cada um dos quais existem aparelhos - você pode plantar uma linha. Provavelmente, nada teria acontecido com os dois sensores - mas eu sou sempre consistente no design. Não deve haver dente - desculpe ... Portanto, nos livramos dos resistores de pull-up em um dos sensores. Era mais conveniente arrancar os resistores do sensor de pressão. A figura mostra.

Após todos esses exercícios, coletamos nossa versão em caixa. Em uma caixa de papel)

O que é surpreendente - funcionou imediatamente. Isso não é bom, mas ainda assim.

Nós digerimos dados
, então a ideologia é essa. Coletamos dados de sensores e, por exemplo, a cada 10 minutos, os colocamos no armazenamento em nuvem via Wi-Fi do escritório. Criamos belos gráficos e analisamos os resultados do Thingspeak.com. O serviço é gratuito, bastante estável e fácil de entender. Muito foi escrito sobre ele . Registramos o canal, obtemos a chave API e redefinimos os dados de qualquer sensor usando o método POST.

Código do 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 .    
}


Se tudo funcionar corretamente, será algo assim)



Para que isso funcione, você precisará de bibliotecas para trabalhar com sensores selecionados e uma biblioteca para trabalhar com o ESP8266 via Wi-Fi. Você também precisa adicionar a placa NodeMcu à lista de placas Arduino IDE e, para que o computador a veja, é necessário um driver USB-SERIAL CH340, que é fácil de encontrar e baixar na rede sem problemas.

Biblioteca para ESP8266 Download da
Biblioteca para trabalhar com um sensor de umidade. Baixe a
Biblioteca para trabalhar com o sensor de luz. Baixe a
Biblioteca para trabalhar com um sensor de pressão. Download

O sensor de CO2 não precisa de bibliotecas. As indicações são calculadas pela duração da saída de pulso proveniente de PWM e calculadas pela fórmula da descriçãosensor. A propósito, a faixa de medição não é de 2000 ppm, mas de 5000, que, aliás, também é escrita pelo usuário Hellsy22 em um artigo recente sobre um sensor de dióxido de carbono semelhante.

Conclusões organizacionais
1. Trabalhos
2. O ofício é digno de sair de uma caixa de papel para um prédio decente.
Aqui está. Será como um semáforo para mostrar o nível de conforto no escritório.


3. Não há muita luz no escritório à noite - eles adicionaram algumas luzes de teto. Ficou melhor. 350 lx
4. A faxineira realmente funciona. Vem de manhã cedo, acende a luz, a limpeza úmida aumenta a umidade do escritório por meia hora. Não muito, mas ainda assim ...
5. Após duas horas de trabalho (três pessoas respiram com dificuldade) no escritório, o nível de CO2 fica fora de escala. A ventilação de cinco minutos corrige a situação para normal (500 ppm). Combine (se desejado) a aeração com a ginástica)))
6. muito seco. O aquecimento no inverno, é claro, é a razão direta. Não é possível atingir uma umidade confortável de 40 a 50%. No entanto, as flores no escritório realmente dão mais 10% à umidade em comparação com uma sala semelhante sem flores. Não se esqueça de regá-los, é claro). A propósito, são necessários 10 a 12 litros de água para regar as flores. O escritório possui 13 vasos de flores. Regue duas vezes por semana.
7. A utilidade disso em tudo, francamente, não é suficiente. No entanto, por exemplo, para aulas escolares ou clínicas, esses sistemas provavelmente seriam mais úteis.

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


All Articles