Bukan kantor bodoh

Saya tidak akan pernah berani menulis artikel tentang implementasi rumah pintar berikutnya dengan koneksi sensor untuk kebocoran air di kamar mandi dan sistem pelacakan untuk trik kucing di apartemen. Syukurlah kucing itu ada di bawah kendali seekor anjing, air sepertinya juga tidak mengalir. Tapi tetap saja, kami lebih banyak bekerja, di berbagai kantor, di mana tidak selalu memungkinkan untuk menciptakan lingkungan kerja yang optimal. Artikel ini dikhususkan untuk sistem pemantauan lingkungan dari ruang kerja di kantor dan untuk kegiatan yang kami lakukan setelah sebulan bekerja stabil (secara mengejutkan). Tentu saja, kami mengirim semua data ke cloud, melihatnya dari smartphone kami, tidak ada manfaatnya, tetapi tidak ada alasan untuk menyombongkan diri kepada kerabat dan teman, dan kantor menjadi lebih nyaman. Semuanya diimplementasikan pada ESP8266, tetapi bagaimana - Anda disambut di bawah cat)



Dimana monitornya?
Saya tidak akan mengatakan bahwa kami bekerja secara langsung dalam kondisi yang tidak tertahankan. Kantor-kantor di perusahaan itu luar biasa, di kamar tiga orang, banyak bunga. Bangunan itu sendiri dikelilingi oleh hutan. Secara umum, panorama kantor tempat sistem pemantauan digunakan.


Apa itu pemantauan?
Tidak ada yang asli. Kami menghapus suhu di kantor, kelembaban, tekanan, dan tingkat CO2. Tentu saja, sensor cahaya telah ditambahkan ke sistem. Tingkat penerangan tempat kerja bahkan dapat dikendalikan dan dalam kasus kami harus berada pada level 300-400 Lux. Mungkin ini adalah parameter paling penting untuk pekerjaan yang nyaman. Dan yang paling dinamis di siang hari.


Kami mendapatkan suhu dan kelembaban dari sensor DHT22. Deskripsi sensor.


Kami menerima tekanan dari sensor BMP180. Deskripsi sensor.


Level CO2 dipantau oleh sensor optik MH-Z14. Deskripsi sensor.


Nah, sensor TSL2561 dalam bentuk papan nama untuk seri Arduino GROVE memantau kualitas pencahayaan. Deskripsi di sini .


Dan akhirnya, kontroler ESP8266 dalam bentuk sapu tangan untuk pembuatan prototipe cepat NodeMcu (dengan nama firmware), yang dalam kasus saya di-flash dari standar Arduino IDE, mengarahkan semuanya.


Kami mengumpulkan versi kotak
Jadi, semua sensor diletakkan di atas meja - saatnya untuk merakit perangkat. Namun, sebagai permulaan kami akan menganalisis beberapa seluk-beluk. Membuat sketsa diagram skematis untuk kejelasan.


Di sini semua sensor diaktifkan dari +3,3 V, yang akan kita ambil dari papan NodeMcu, karena sudah ada tiga dari mereka di papan tulis. Tetapi sensor karbon dioksida harus diberdayakan secara terpisah, ini membutuhkan daya 4-6 volt, dan pabrikan sangat merekomendasikan untuk memberikan perhatian khusus pada hal ini. Karena saya berencana untuk menghidupkan daya perangkat dari catu daya terpisah pada + 5V, tidak akan ada masalah. Kami menyuplai daya ke terminal 1 sensor MH-Z14 (atau 15, karena diduplikasi). Ketika Anda menyalakan sensor selama beberapa menit, ia mengeluarkan semua sampah ke port saat mentransmisikan melalui jalur TX / RX, jadi saya mengambil sinyal yang berguna dari sensor ini dari output PWM pada kaki ke-6. Secara umum, saya suka sensor ini. Ini cukup stabil, memiliki keluaran digital dan analog, tetapi hanya dapat bekerja dengan mikrokontroler dengan logika tiga volt, jadi jalankan, misalnya, pada UNO tanpamenari dengan rebana koordinasi tingkat logis tidak akan berhasil. Dalam kasus kami, ESP berjalan pada logika tiga volt, seperti semua sensor lainnya. Pada saat yang sama, ESP itu sendiri sangat pilih-pilih tentang kualitas daya, tetapi di papan yang saya gunakan dalam artikel ini, skema normal untuk menstabilkan daya input hingga +3,3 V dirakit, tapi saya masih tidak akan menyarankan papan dari IP meragukan akan lebih dari 5 volt. Kami juga tidak akan men-debug sirkuit yang dirakit penuh, hanya menyalakannya dari port USB. Karena sensor karbon dioksida memiliki konsumsi besar karena kehadiran bola lampu pijar (sebagai sumber IR, mungkin) dalam desainnya, ini dapat mendorong port. Apakah kita membutuhkannya?). Oleh karena itu, kami mengisi firmware dengan catu daya pihak ketiga yang disertakan, atau melalui USB, tetapi melepaskan sensor karbon dioksida.

Ini bukan tanpa besi solder ...
Seperti yang Anda lihat dari diagram, saya menggunakan dua sensor pada garis i2c. Ini adalah sensor tekanan dan sensor cahaya. Seperti yang Anda ketahui , pada bus serial Anda dapat "menggantung" hingga 127 semua jenis sensor dan perangkat. Dalam implementasi protokol, garis SDA / SCL harus dikencangkan ke daya, tetapi hanya sekali. Dan jika kita menggantung sensor N, yang masing-masing memiliki kawat gigi - Anda dapat menanam garis. Mungkin, tidak ada yang akan terjadi dari kedua sensor - tetapi saya selalu konsisten dalam desain. Seharusnya tidak ada gigi - maaf ... Karena itu, kami menyingkirkan resistor pull-up di salah satu sensor. Lebih mudah merobek resistor dari sensor tekanan. Angka tersebut menunjukkan.

Setelah semua latihan ini, kami mengumpulkan versi kotak kami. Dalam kotak kertas)

Apa yang mengejutkan - itu berhasil segera. Ini tidak baik, tapi tetap saja.

Kami mencerna data
, jadi ideologinya adalah ini. Kami mengumpulkan data dari sensor dan, misalnya, setiap 10 menit, kami memasukkannya ke penyimpanan cloud melalui Wi-Fi kantor. Kami membuat grafik yang indah dan menganalisis hasil dari Thingspeak.com. Layanan ini gratis, cukup stabil dan mudah dimengerti. Banyak yang telah ditulis tentang dia . Kami mendaftarkan saluran, mendapatkan kunci API, dan mengatur ulang data dari sensor apa pun menggunakan metode POST.

Kode program
//    ,     
#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 .    
}


Jika semuanya bekerja dengan benar, maka akan menjadi seperti ini)



Agar ini berfungsi, Anda akan membutuhkan perpustakaan untuk bekerja dengan sensor yang dipilih dan perpustakaan untuk bekerja dengan ESP8266 melalui Wi-Fi. Anda juga perlu menambahkan papan NodeMcu ke daftar papan IDE Arduino, dan untuk melihatnya, Anda memerlukan driver USB-SERIAL CH340, yang mudah ditemukan dan diunduh di jaringan tanpa masalah.

Library for ESP8266 Unduh
Library untuk bekerja dengan sensor kelembaban. Unduh
Library untuk bekerja dengan sensor cahaya. Unduh
Library untuk bekerja dengan sensor tekanan. Unduh

Sensor CO2 tidak perlu perpustakaan. Indikasi dihitung dengan durasi output pulsa yang berasal dari PWM dan dihitung oleh rumus dari deskripsisensor. Omong-omong, rentang pengukurannya bukan 2000 ppm, tetapi 5000, yang, kebetulan, juga ditulis oleh pengguna Hellsy22 dalam sebuah artikel baru-baru ini tentang sensor karbon dioksida yang serupa.

Kesimpulan organisasi
1. Pekerjaan
2. Kerajinan layak dipindahkan dari kotak kertas ke gedung yang layak.
Ini dia. Ini juga akan menunjukkan tingkat kenyamanan di kantor sebagai lampu lalu lintas.


3. Tidak banyak cahaya di kantor di malam hari - mereka menambahkan beberapa lampu langit-langit. Itu menjadi lebih baik. 350 lx
4. Wanita pembersih benar-benar bekerja. Datang lebih awal di pagi hari, menyalakan lampu, pembersihan basah memberikan gelombang kelembaban di kantor selama setengah jam. Tidak banyak, tapi tetap saja ...
5. Setelah dua jam bekerja (tiga orang bernapas dengan berat) di kantor, level CO2 keluar dari skala. Siaran lima menit memperbaiki situasi menjadi normal (500 ppm). Kombinasikan (jika diinginkan) ditayangkan dengan senam)))
6. Sangat kering. Pemanasan di musim dingin, tentu saja, adalah alasan langsung. Tidak mungkin mencapai kelembaban 40-50% yang nyaman. Namun, bunga di kantor benar-benar memberi plus 10 persen kelembaban dibandingkan dengan ruangan serupa tanpa bunga. Jangan lupa menyirami mereka, tentu saja). Ngomong-ngomong, dibutuhkan 10-12 liter air untuk menyirami bunga. Kantor ini memiliki 13 pot bunga. Siram dua kali seminggu.
7. Kegunaan ini dalam segala hal, terus terang, tidak cukup. Namun, misalnya, untuk kelas sekolah atau klinik sistem seperti itu mungkin akan lebih bermanfaat.

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


All Articles