В этом проекте мы собираемся создать систему мониторинга загрязнения/качества воздуха на основе технологий интернета вещей (IoT) с NodeMCU ESP8266, датчиком твердых частиц PM2.5, датчиком качества воздуха MQ-135 и датчиком барометрического давления BME280. Мы будем контролировать качество воздуха на сервере Thinspeak через сеть Интернет.
Это простой прототип системы мониторинга загрязнения/качества воздуха IoT для мониторинга концентраций основных загрязняющих воздух газов. Система использует 3 датчика, такие как датчик твердых частиц PMS5003 PM2.5, датчик качества воздуха MQ-135, датчик барометрического давления BME280 . В этом проекте IoT вы можете контролировать уровень загрязнения из любой точки мира с помощью компьютера или мобильного телефона.
Датчик твердых частиц PMS5003 PM2.5 от Plantpower измеряет концентрацию частиц PM1.0, PM2.5 и PM10. Датчик качества воздуха MQ-135 измеряет концентрацию газов, таких как CO, CO2, SO2 и NO2, и выдает результат в PPM (части на миллион). Аналогично, BME280 измеряет температуру, давление и влажность окружающей среды.
Более подробно прочитать о работе с каждым из этих датчиков вы можете в следующих статьях на нашем сайте:
- метеостанция на NodeMCU ESP8266 и датчике BME280;
- подключение датчика газа MQ-135 к NodeMCU ESP8266;
- анализатор качества воздуха с определением частиц PM1.0, PM2.5 и PM10 на Arduino и датчике PMS5003.
Датчики будут собирать данные различных параметров окружающей среды и отправлять их на сервер Thingspeak, который отображает данные онлайн с интервалом в 15 секунд. Мы можем установить эту систему где угодно и также можем активировать некоторые устройства, когда загрязнение превышает определенный уровень, например, мы можем включить вытяжной вентилятор.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- Датчик PM2.5/PM10 PMS5003 (купить на AliExpress).
- Датчик BME280 (купить на AliExpress).
- Датчик качества воздуха MQ-135 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик твердых частиц PM2.5 PMS5003
Plantower PMS5003 — это недорогой лазерный счетчик частиц, один из ряда датчиков Plantower, который также включает PMS1003, PMS3003 и PMS7003. PMS5003 — это своего рода цифровой и универсальный датчик концентрации частиц, который можно использовать для получения количества взвешенных частиц в воздухе, т. е. концентрации частиц, и выводить их значения через цифровой интерфейс. Этот датчик можно вставлять в приборы, связанные с измерением концентрации взвешенных частиц в воздухе или в другое оборудование для улучшения окружающей среды, чтобы вовремя предоставлять правильные данные о концентрации.
Датчик качества воздуха MQ-135
Газовый датчик MQ-135 обнаруживает такие газы, как аммиак, азот, кислород, спирты, ароматические соединения, сульфид и дым. Газовый датчик MQ-3 имеет более низкую проводимость для очистки воздуха в качестве материала для измерения газа. В атмосфере мы можем обнаружить загрязняющие газы, но проводимость газового датчика увеличивается по мере увеличения концентрации загрязняющего газа. Газовый датчик MQ-135 может быть реализован для обнаружения дыма, бензола, пара и других вредных газов. Он имеет потенциал для обнаружения различных вредных газов. Он имеет низкую стоимость и особенно подходит для приложений мониторинга качества воздуха.
Датчик MQ135 имеет два выхода: аналоговый выход и выход TTL. Выход TTL представляет собой слабый цифровой сигнал, доступ к которому можно получить через порты ввода-вывода на микроконтроллере. Аналоговый выход напрямую связан с концентрацией газов, т. е. увеличение напряжения на нем прямо пропорционально увеличению концентрации. Этот датчик также имеет длительный срок службы и надежную стабильность.
Датчик барометрического давления BME280
Датчик влажности, температуры и давления Bosch BME280 — это интегрированный датчик окружающей среды, который очень мал по размеру и потребляет мало энергии. Этот атмосферный датчик BME280 — это простой способ измерения барометрического давления, влажности и показаний температуры, не занимая при этом слишком много места. По сути, все, что вам нужно знать об атмосферных условиях, вы можете узнать из этого крошечного датчика.
Этот модуль использует датчик окружающей среды производства Bosch с датчиком температуры и барометрического давления, который является следующим поколением обновлений популярного датчика BMP085/BMP180/BMP183. Этот датчик отлично подходит для всех видов погодных зондирований и может использоваться как с интерфейсом I2C, так и с интерфейсом SPI. Этот прецизионный датчик от Bosch является лучшим недорогим, точным решением для измерения барометрического давления с абсолютной точностью ±1 гПа и температуры с точностью ±1,0 °C. Поскольку давление меняется с высотой, а измерения давления настолько хороши, вы также можете использовать его в качестве высотомера с точностью ±1 метр.
Схема проекта
Схема устройства для комплексного мониторинга качества воздуха на основе платы NodeMCU ESP8266 представлена на следующем рисунке. Она содержит 3 датчика, которые подключены к чипу Wi-Fi NodeMCU ESP8266-12E.
Датчик PMS5003 работает по протоколу UART. Он имеет 8 контактов, а подсчет ведется справа. Подключите Pin1 VCC датчика к Vin-контакту NodeMCU, а Pin2 GND датчика - к GND платы. 4-й контакт — это Rx-контакт, который подключен к Tx-контакту NodeMCU. Аналогично, 5-й контакт — это Tx-контакт, который подключен к Rx-контакту NodeMCU.
MQ-135 — это аналоговый датчик. Поэтому подключите его вывод A0 к выводу A0 NodeMCU. Подключите вывод VCC датчика к Vin 5V платы, а GND датчика - к GND платы. И затем у нас есть датчик BME280, который работает по протоколу I2C. Поэтому подключите его выводы SCL и SDA к выводам I2C NodeMCU, т. е. D1, D2.
На следующем рисунке вы можете увидеть, как все датчики взаимодействуют с NodeMCU ESP8266-12E.
Настройка Thingspeak
Нам нужно настроить учетную запись Thingspeak для мониторинга данных с Nodemcu ESP8266-12E онлайн. Для настройки thingspeak посетите https://thingspeak.com/. Здесь вам нужно создать учетную запись.
После создания учетной записи вам необходимо создать новый канал, заполнив следующие данные, показанные на изображении ниже.
Теперь скопируйте ключ API записи и внесите изменения в код программы, заменив скопированный вами ключ API.
Исходный код программы
Исходный код программы написан для платы NodeMCU ESP8266-12E. Перед компиляцией кода необходимо добавить 3 библиотеки в Arduino IDE из менеджера библиотек или по ссылке на библиотеку, указанной ниже:
- Библиотека BME280: Загрузить
- Библиотека унифицированных датчиков Adafruit: Загрузить
- Библиотека MQ135: Загрузить
Обязательно измените SSID Wi-Fi, пароль и ключ API перед загрузкой кода. Также, пожалуйста, удалите соединение Rx Tx pin между Nodemcu и PMS5003 во время загрузки, иначе код не загрузится. Вы можете снова подключить его после загрузки кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
#include <ESP8266WiFi.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include "MQ135.h" #include <Arduino.h> #define LENG 31 //0x42 + 31 bytes equal to 32 bytes unsigned char buf[LENG]; int PM01Value=0; //define PM1.0 value of the air detector module int PM2_5Value=0; //define PM2.5 value of the air detector module int PM10Value=0; //define PM10 value of the air detector module float h, t, p, pin, dp; char temperatureFString[6]; char dpString[6]; char humidityString[6]; char pressureString[7]; char pressureInchString[6]; Adafruit_BME280 bme; // I2C String apiKey = "85JJUZZ7WX809P3M"; // replace with your routers SSID const char* ssid = "Sri Krishna 2."; // replace with your routers password const char* password = "subbu@123"; const char* server = "api.thingspeak.com"; WiFiClient client; void setup() { Serial.begin(9600); delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Printing the ESP IP address Serial.println(WiFi.localIP()); if (!bme.begin()) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } } void loop() { if(Serial.find(0x42)){ //start to read when detect 0x42 Serial.readBytes(buf,LENG); if(buf[0] == 0x4d){ if(checkValue(buf,LENG)){ PM01Value=transmitPM01(buf); //count PM1.0 value of the air detector module PM2_5Value=transmitPM2_5(buf);//count PM2.5 value of the air detector module PM10Value=transmitPM10(buf); //count PM10 value of the air detector module } } } static unsigned long OledTimer=millis(); if (millis() - OledTimer >=1000) { OledTimer=millis(); Serial.print("PM1.0: "); Serial.print(PM01Value); Serial.println(" ug/m3"); Serial.print("PM2.5: "); Serial.print(PM2_5Value); Serial.println(" ug/m3"); Serial.print("PM10 : "); Serial.print(PM10Value); Serial.println(" ug/m3"); Serial.println(); MQ135 gasSensor = MQ135(A0); float air_quality = gasSensor.getPPM(); Serial.print("Air Quality: "); Serial.print(air_quality); Serial.println(" PPM"); Serial.println(); h = bme.readHumidity(); t = bme.readTemperature(); t = t*1.8+32.0; dp = t-0.36*(100.0-h); p = bme.readPressure()/100.0F; pin = 0.02953*p; dtostrf(t, 5, 1, temperatureFString); dtostrf(h, 5, 1, humidityString); dtostrf(p, 6, 1, pressureString); dtostrf(pin, 5, 2, pressureInchString); dtostrf(dp, 5, 1, dpString); Serial.print("Temperature = "); Serial.println(temperatureFString); Serial.print("Humidity = "); Serial.println(humidityString); Serial.print("Pressure = "); Serial.println(pressureString); Serial.print("Pressure Inch = "); Serial.println(pressureInchString); Serial.print("Dew Point = "); Serial.println(dpString); Serial.println("..............................................."); if (client.connect(server,80)) // "184.106.153.149" or api.thingspeak.com { String postStr = apiKey; postStr +="&field1="; postStr += String(PM01Value); postStr +="&field2="; postStr += String(PM2_5Value); postStr +="&field3="; postStr += String(PM10Value); postStr +="&field4="; postStr += String(air_quality); postStr +="&field5="; postStr += String(temperatureFString); postStr +="&field6="; postStr += String(humidityString); postStr +="&field7="; postStr += String(pressureInchString); 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); } client.stop(); } } char checkValue(unsigned char *thebuf, char leng) { char receiveflag=0; int receiveSum=0; for(int i=0; i<(leng-2); i++){ receiveSum=receiveSum+thebuf[i]; } receiveSum=receiveSum + 0x42; if(receiveSum == ((thebuf[leng-2]<<8)+thebuf[leng-1])) //check the serial data { receiveSum = 0; receiveflag = 1; } return receiveflag; } int transmitPM01(unsigned char *thebuf) { int PM01Val; PM01Val=((thebuf[3]<<8) + thebuf[4]); //count PM1.0 value of the air detector module return PM01Val; } //transmit PM Value to PC int transmitPM2_5(unsigned char *thebuf) { int PM2_5Val; PM2_5Val=((thebuf[5]<<8) + thebuf[6]);//count PM2.5 value of the air detector module return PM2_5Val; } //transmit PM Value to PC int transmitPM10(unsigned char *thebuf) { int PM10Val; PM10Val=((thebuf[7]<<8) + thebuf[8]); //count PM10 value of the air detector module return PM10Val; } |
Тестирование работы проекта
После загрузки кода в NodeMCU вы можете нажать на последовательный монитор и увидеть следующие результаты.
Аналогичным образом вы можете зайти на Thingspeak и проверить закрытый просмотр, чтобы увидеть следующий график ниже.
Существует улучшенная версия датчика BME280 под названием BME680, которая также может измерять индекс качества воздуха (IAQ) и может использоваться для измерения качества воздуха. Таким образом, одного датчика достаточно для замены BME280 и MQ-135.