不是一个愚蠢的办公室

我永远都不敢写一篇关于智能家居的下一个实现的文章,该智能家居的连接是用于浴室漏水的传感器和用于公寓中猫咪捣蛋的跟踪系统。谢天谢地,猫在狗的控制之下,水似乎也不流动。但是,我们在各个办公室的工作更多,而并非总是能够创建最佳的工作环境。本文专门讨论办公室工作区的环境监控系统,以及我们经过一个月(令人惊讶)稳定的工作后进行的活动。当然,我们将所有数据发送到云端,通过智能手机查看它们,没有用,但是没有理由夸大亲戚和朋友,办公室变得更加舒适。一切都在ESP8266上实现,但如何实现-欢迎您进入Cat)



显示器在哪里?
我不会说我们在难以忍受的条件下直接工作。公司的办公室很棒,三个人的房间里放着很多花。建筑本身被森林所环绕。通常,将附加部署了监视系统的办公室的全景图。


什么是监控?
没什么原创的。我们去除办公室中的温度,湿度,压力和二氧化碳水平。当然,光传感器已添加到系统中。工作场所的照明水平甚至受到控制,在我们的情况下应为300-400勒克斯。也许这是舒适工作的最重要参数。并且白天最活跃。


我们从DHT22传感器获得温度和湿度。传感器说明


我们从BMP180传感器承受压力。传感器说明


CO2水平由光学传感器MH-Z14监控。传感器说明


嗯,Arduino GROVE系列的铭牌形式的TSL2561传感器可监控照明质量。在这里描述


最后,以手帕形式的ESP8266控制器(用于对NodeMcu进行快速原型制作)(以固件名称命名)(在我的情况下,该Flash可以从标准Arduino IDE中读取)进行操作。


我们收集盒装版本,
因此,所有传感器都布置在桌子上-现在该组装设备了。但是,首先我们将分析一些细节。为清楚起见,绘制了示意图。


在这里,所有传感器均由+3.3 V供电,我们将从NodeMcu板上获取该电压,因为板上已经有三个传感器。但是二氧化碳传感器必须单独供电,需要4-6伏特的电源,制造商强烈建议对此特别注意。由于我计划使用+ 5V的单独电源为设备供电,因此不会有问题。我们为MH-Z14传感器的端子1(或15,因为它们是重复的)供电。当您打开传感器几分钟后,通过TX / RX线传输时,它会向端口发出任何垃圾,因此我从第六路PWM输出中提取了该传感器的有用信号。总的来说,我喜欢这个传感器。它非常稳定,具有数字和模拟输出,但是只能与具有三伏逻辑的微控制器一起使用,因此可以在例如UNO上运行而无需用铃鼓跳舞时,逻辑上的协调是行不通的。在我们的案例中,ESP像所有其他传感器一样在三伏逻辑上运行。同时,ESP本身对电源质量特别挑剔,但在我在本文中使用的板上,已经组装了将输入电源稳定到+3.3 V的正常方案,但我不建议从任何可疑IP供电给板子,也不愿提供它将超过5伏。我们也不会调试仅由USB端口供电的完整组装电路。由于二氧化碳传感器由于其设计中存在白炽灯泡(可能是红外光源)而消耗大量能量,因此会推动端口。我们需要吗?)。因此,我们使用随附的第三方电源或通过USB填充固件,但断开了二氧化碳传感器的连接。

并非没有烙铁...
从图中可以看出,我在i2c线上使用了两个传感器。这是压力传感器和光线传感器。如您所知,在串行总线上,您可以“挂起”多达127种各种传感器和设备。在协议的实施中,应将SDA / SCL线上紧电源,但只能上紧一次。如果我们悬挂N个传感器,每个传感器中都有大括号-您可以种植一条线。两个传感器可能什么也不会发生-但我在设计中始终保持一致。应该没有牙齿-对不起...因此,我们摆脱了其中一个传感器的上拉电阻。将电阻器从压力传感器中拉出更方便。如图所示。

完成所有这些练习后,我们将收集盒装版本。在纸盒中)

令人惊讶的是-它立即起作用。这不好,但是仍然如此。

我们消化数据,
所以意识形态就是这个。我们从传感器收集数据,例如,每隔10分钟,我们通过办公室Wi-Fi将其放入云存储中。我们构建漂亮的图形并分析Thingspeak.com的结果。该服务是免费的,相当稳定并且易于理解。关于他的很多文章我们使用POST方法注册通道,获取API密钥并重置来自任何传感器的数据。

程式码
//    ,     
#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 .    
}


如果一切正常,那么将是这样)



为了使其正常工作,您将需要用于与选定传感器配合使用的库以及用于通过Wi-Fi与ESP8266配合使用的库。您还需要将一个NodeMcu板添加到Arduino IDE板列表中,并且要查看它,您需要一个USB-SERIAL CH340驱动程序,该驱动程序很容易在网络上找到并下载而没有任何问题。

ESP8266的 资料库下载
资料库,用于使用湿度传感器。下载
库以使用光传感器。下载
库,用于使用压力传感器。下载

CO2传感器不需要库。指示是根据PWM输出的脉冲持续时间来计算的,并根据描述中的公式来计算传感器。顺便说一下,测量范围不是2000 ppm,而是5000,顺便说一下,用户Hellsy22在最近的一篇关于类似二氧化碳传感器的文章中也写了这个范围

组织结论
1.工程
2.工艺值得将一盒纸箱搬到一座体面的建筑物中。
来了 它还将作为交通信号灯显示办公室的舒适度。


3.晚上办公室里光线不足-他们加了几盏天花灯。好了350磅
4.清洁女工确实工作。清晨到来,打开灯,湿式清洁使办公室内的湿度增加了半个小时。数量不多,但仍然...
5.在办公室工作了两个小时(三个人呼吸困难)后,CO2含量超标。播出五分钟可将情况纠正为正常(500 ppm)。结合(如果需要的话)与体操比赛一起播放)))
6.非常干燥。当然,冬季取暖是直接原因。不可能达到舒适的40-50%湿度。但是,与没有鲜花的类似房间相比,办公室的鲜花确实可以使湿度增加10%。当然,不要忘记给它们浇水。顺便说一句,要花10到12升水才能浇花。该办公室有13个花盆。每周两次。
7.坦率地说,这在所有方面的用处还不够。但是,例如,对于学校课程或诊所,这样的系统可能会更有用。

Source: https://habr.com/ru/post/zh-CN391399/


All Articles