Pas un bureau stupide

Je n'oserais jamais écrire un article sur la prochaine mise en œuvre d'une maison intelligente avec la connexion de capteurs de fuites d'eau dans la salle de bain et de systèmes de suivi des tours de chats dans l'appartement. Dieu merci, le chat est sous le contrôle d'un chien, l'eau ne semble pas non plus couler. Mais encore, nous sommes plus au travail, dans divers bureaux, où il n'est pas toujours possible de créer un environnement de travail optimal. L'article est consacré au système de surveillance environnementale de l'espace de travail du bureau et aux activités que nous avons menées après un mois de travail (étonnamment) stable. Bien sûr, nous envoyons toutes les données dans les nuages, les regardons depuis nos smartphones, il n'y a aucune utilité, mais il n'y a aucune raison de se vanter auprès de parents et amis, et le bureau est devenu plus confortable. Tout est implémenté sur ESP8266, mais comment - vous êtes les bienvenus sous cat)



Où est le moniteur?
Je ne dirai pas que nous travaillons directement dans des conditions insupportables. Les bureaux de l'entreprise sont magnifiques, dans des chambres de trois personnes, beaucoup de fleurs. Le bâtiment lui-même est entouré de forêt. En général, un panorama du bureau où le système de surveillance est déployé est joint.


Qu'est-ce que la surveillance?
Rien d'original. Nous supprimons la température au bureau, l'humidité, la pression et le niveau de CO2. Bien sûr, un capteur de lumière a été ajouté au système. Le niveau d'éclairage des lieux de travail est même soumis à contrôle et devrait dans notre cas être au niveau de 300-400 Lux. C'est peut-être le paramètre le plus important pour un travail confortable. Et le plus dynamique de la journée.


Nous obtenons la température et l'humidité du capteur DHT22. Description du capteur.


Nous prenons la pression du capteur BMP180. Description du capteur.


Le niveau de CO2 est surveillé par le capteur optique MH-Z14. Description du capteur.


Eh bien, le capteur TSL2561 sous la forme d'une plaque signalétique pour la série Arduino GROVE surveille la qualité de l'éclairage. Description ici .


Et enfin, le contrôleur ESP8266 sous la forme d'un mouchoir pour le prototypage rapide de NodeMcu (du nom du firmware), qui dans mon cas est flashé depuis l'IDE Arduino standard, dirige tout cela.


Nous collectons la version en boîte
Donc, tous les capteurs sont disposés sur la table - il est temps d'assembler l'appareil. Cependant, pour commencer, nous analyserons quelques subtilités. Esquissé un diagramme schématique pour plus de clarté.


Ici, tous les capteurs sont alimentés à +3,3 V, que nous prendrons de la carte NodeMcu, car il y en a déjà trois sur la carte. Mais le capteur de dioxyde de carbone devra être alimenté séparément, il nécessite une alimentation de 4 à 6 volts, et le fabricant recommande fortement d'y prêter une attention particulière. Étant donné que je prévois d'alimenter l'appareil à partir d'une alimentation séparée à + 5 V, il n'y aura aucun problème. Nous alimentons la borne 1 du capteur MH-Z14 (ou 15, car elles sont dupliquées). Lorsque vous allumez le capteur pendant quelques minutes, cela dégage des ordures sur le port lors de la transmission via la ligne TX / RX, donc je prends le signal utile de ce capteur de la sortie PWM sur la 6e étape. En général, j'ai aimé ce capteur. Il est assez stable, a une sortie numérique et analogique, mais ne peut fonctionner qu'avec des microcontrôleurs avec une logique à trois volts, alors exécutez-le, par exemple, sur UNO sansdanser avec des tambourins, la coordination des niveaux logiques ne fonctionnera pas. Dans notre cas, l'ESP fonctionne sur une logique à trois volts, comme tous les autres capteurs. Dans le même temps, l'ESP lui-même est particulièrement pointilleux sur la qualité de l'énergie, mais sur la carte que j'ai utilisée dans cet article, le schéma normal de stabilisation de la puissance d'entrée jusqu'à +3,3 V est assemblé, mais je ne conseillerais toujours pas la carte à partir d'une IP douteuse serait plus de 5 volts. Nous ne déboguerons pas non plus un circuit entièrement assemblé, en l'alimentant uniquement à partir d'un port USB. Étant donné que le capteur de dioxyde de carbone a une grande consommation en raison de la présence d'une ampoule à incandescence (comme source infrarouge, probablement) dans sa conception, cela peut pousser le port. En avons-nous besoin?). Par conséquent, nous remplissons le firmware avec l'alimentation tierce incluse ou via USB, mais en déconnectant le capteur de dioxyde de carbone.

Ce n'est pas sans fer à souder ...
Comme vous pouvez le voir sur le schéma, j'utilise deux capteurs sur la ligne i2c. Il s'agit d'un capteur de pression et d'un capteur de lumière. Comme vous le savez , sur un bus série, vous pouvez "accrocher" jusqu'à 127 toutes sortes de capteurs et d'appareils. Dans la mise en œuvre du protocole, les lignes SDA / SCL doivent être serrées à la puissance, mais une seule fois. Et si nous accrochons N capteurs, dans chacun desquels il y a des accolades - vous pouvez planter une ligne. Probablement, rien ne serait arrivé des deux capteurs - mais je suis toujours cohérent dans la conception. Il ne devrait pas y avoir de dent - désolé ... Par conséquent, nous nous débarrassons des résistances de traction dans l'un des capteurs. Il était plus pratique de retirer les résistances du capteur de pression. La figure montre.

Après tous ces exercices, nous récupérons notre version en boîte. Dans une boîte en papier)

Ce qui est surprenant - cela a fonctionné tout de suite. Ce n'est pas bon, mais quand même.

Nous digérons les données.
Donc, l'idéologie est la suivante. Nous collectons des données à partir de capteurs et, par exemple, toutes les 10 minutes, nous les déposons dans le stockage cloud via le Wi-Fi de bureau. Nous construisons de beaux graphiques et analysons les résultats de Thingspeak.com. Le service est gratuit, assez stable et facile à comprendre. Beaucoup a été écrit sur lui . Nous enregistrons le canal, obtenons la clé API et réinitialisons les données de tous les capteurs à l'aide de la méthode POST.

Code de programme
//    ,     
#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 tout fonctionne correctement, alors ce sera quelque chose comme ça)



Pour que cela fonctionne, vous aurez besoin de bibliothèques pour travailler avec des capteurs sélectionnés et d'une bibliothèque pour travailler avec ESP8266 via Wi-Fi. Vous devez également ajouter la carte NodeMcu à la liste des cartes IDE Arduino, et pour que l'ordinateur la voie, vous avez besoin d'un pilote USB-SERIAL CH340, qui est facile à trouver et à télécharger sur le réseau sans aucun problème.

Bibliothèque pour ESP8266 Téléchargez la
bibliothèque pour travailler avec un capteur d'humidité. Bibliothèque de téléchargement
pour travailler avec le capteur de lumière. Bibliothèque de téléchargement
pour travailler avec un capteur de pression. Télécharger

Le capteur de CO2 n'a pas besoin de bibliothèques. Les indications sont calculées par la durée de la sortie d'impulsion provenant de PWM et calculées par la formule de la descriptioncapteur. À propos, la plage de mesure n'est pas de 2000 ppm, mais de 5000, ce qui, d'ailleurs, est également écrit par l'utilisateur Hellsy22 dans un article récent sur un capteur de dioxyde de carbone similaire.

Conclusions organisationnelles
1. Travaux
2. L'engin est digne de sortir d'une boîte de papier pour un bâtiment décent.
Ça y est. Ce sera comme un feu de circulation pour montrer le niveau de confort dans le bureau.


3. Il n'y a pas beaucoup de lumière dans le bureau le soir - ils ont ajouté quelques plafonniers. Ça s'est amélioré. 350 lx
4. La femme de ménage travaille vraiment. Arrive tôt le matin, allume la lumière, le nettoyage humide donne une poussée d'humidité dans le bureau pendant une demi-heure. Pas beaucoup, mais quand même ...
5. Après deux heures de travail (trois personnes respirent fort) au bureau, le niveau de CO2 décroît. Une diffusion de cinq minutes corrige la situation à la normale (500 ppm). Combinez (si vous le souhaitez) la diffusion avec de la gymnastique)))
6. Très sec. Le chauffage en hiver, bien sûr, est la raison directe. Il n'est pas possible d'atteindre une humidité confortable de 40 à 50%. Cependant, les fleurs du bureau donnent vraiment plus de 10% d'humidité par rapport à une pièce similaire sans fleurs. N'oubliez pas de les arroser, bien sûr). Au fait, il faut 10 à 12 litres d'eau pour arroser les fleurs. Le bureau dispose de 13 pots de fleurs. Arrosez deux fois par semaine.
7. L'utilité de cela dans tout, franchement, ne suffit pas. Cependant, par exemple, pour les classes scolaires ou une clinique, de tels systèmes seraient probablement plus utiles.

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


All Articles