Mục lục:

Hệ thống giám sát chất lượng không khí đối với ô nhiễm hạt: 4 bước
Hệ thống giám sát chất lượng không khí đối với ô nhiễm hạt: 4 bước

Video: Hệ thống giám sát chất lượng không khí đối với ô nhiễm hạt: 4 bước

Video: Hệ thống giám sát chất lượng không khí đối với ô nhiễm hạt: 4 bước
Video: Hệ thống giám sát, làm sạch không khí cho tòa nhà, văn phòng và bệnh viện 2024, Tháng mười một
Anonim
Hệ thống giám sát chất lượng không khí đối với ô nhiễm hạt
Hệ thống giám sát chất lượng không khí đối với ô nhiễm hạt
Hệ thống giám sát chất lượng không khí đối với ô nhiễm hạt
Hệ thống giám sát chất lượng không khí đối với ô nhiễm hạt

GIỚI THIỆU:

1 Trong dự án này, tôi trình bày cách chế tạo một máy dò hạt có hiển thị dữ liệu, sao lưu dữ liệu trên thẻ SD và IOT. Hiển thị vòng neopixels trực quan cho biết chất lượng không khí.

2 Chất lượng không khí là một mối quan tâm ngày càng được quan tâm ngày nay. có hệ thống đo tốc độ bụi nhưng chúng rất đắt. Có những máy dò hạt giá rẻ, chất lượng cao trên thị trường, như một số nghiên cứu đã chỉ ra.

Ví dụ:

www.atmos-meas-tech.net/11/4823/2018/amt-1…

3 Do đó, tôi quyết định chế tạo một thiết bị có khả năng đo số lượng hạt theo các loại kích thước (0,5µm đến 10 µm), trực quan với màn hình đơn giản của kết quả (vòng điểm ảnh mới), hiển thị chi tiết hơn trên màn hình TFT và sao lưu có dấu thời gian trên thẻ SD.

4 Ngoài ra, tôi đã thêm một mô-đun giao tiếp bluetooth để có thể giao tiếp với ứng dụng Android và do đó xuất bản kết quả trên máy chủ IOT.

5 Chi phí chung của toàn bộ không vượt quá 60 €

Quân nhu

-Arduino una R3

-Arduino proto khiên

-TFT màn hình ST7735

-Neopixel vòng 24 dẫn

-Plantower PMS5003

-HC-06 mô-đun bluetooth

Bước 1: Kết nối các thành phần

Kết nối các thành phần
Kết nối các thành phần

các thành phần khác nhau được kết nối theo sơ đồ trên

Bước 2: Thư viện và chương trình Arduino

1 thư viện

cho màn hình TFT

github.com/adafruit/Adafruit-GFX-Library

cho vòng pixel neo

github.com/adafruit/Adafruit_NeoPixel

cho thẻ sd

github.com/arduino-libraries/SD

2 bản phác thảo arduino

#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le mô-đun RTC RTC_DS1307 RTC; #bao gồm

// Chân nào trên Arduino được kết nối với NeoPixels?

#define PIN 6 // Trên Trinket hoặc Gemma, đề xuất thay đổi mã này thành 1

// Có bao nhiêu NeoPixel được gắn vào Arduino?

#define NUMPIXELS 24 // Kích thước vòng NeoPixel phổ biến Adafruit_NeoPixel pixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixel. Color (0, 250, 0); uint32_t orange = pixel. Color (250, 250, 0); uint32_t rouge = pixel. Color (255, 0, 0);

SoftwareSerial pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // bạn cũng có thể kết nối cái này với thiết lập lại Arduino

#include // Thư viện đồ họa cốt lõi

#include // Thư viện dành riêng cho phần cứng #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // khởi tạo du timer au démarrage du loop ()

# nếu được xác định (_ SAM3X8E_)

#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif

// Tùy chọn 1: sử dụng bất kỳ chân nào nhưng chậm hơn một chút

// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);

// Tùy chọn 2: phải sử dụng các chân SPI phần cứng

// (đối với UNO mà sclk = 13 và sid = 11) và chân 10 phải là // một đầu ra. Điều này nhanh hơn nhiều - cũng bắt buộc nếu bạn muốn // sử dụng thẻ microSD (xem ví dụ vẽ hình ảnh) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Khởi tạo la liên lạc I2C Wire.begin (); // Khởi tạo le module RTC RTC.begin (); Serial.print ("init SD"); chậm trễ (1000); if (! SD.begin (cs_sd)) // Điều kiện đặt vé si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); trở lại; } Serial.print ("Carte SD OK");

Dữ liệu tệp = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"

data.println (""); data.println ("Mua lại Démarrage"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // khởi tạo chip ST7735S, tab đen Serial.println ("init"); // đầu ra gỡ lỗi của chúng tôi tft.fillScreen (ST7735_BLACK); // tốc độ truyền của cảm biến là 9600 pmsSerial.begin (9600);

pixel.begin (); // BẮT ĐẦU đối tượng dải NeoPixel (BẮT BUỘC)

pixel.setBrightness (2);

}

struct pms5003data {

uint16_t framelen; uint16_t pm10_ tiêu chuẩn, pm25_ tiêu chuẩn, pm100_ tiêu chuẩn; uint16_t pm10_env, pm25_env, pm100_env; uint16_t hạt_03um, hạt_05um, hạt_10um, hạt_25um, hạt_50um, hạt_100um; uint16_t không sử dụng; uint16_t tổng kiểm tra; };

dữ liệu struct pms5003data; void loop () {pixel.clear (); // Đặt tất cả các màu pixel thành 'off' DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (now);

temps = ((millis () - tempsInit)) / 1000; // Démarrage du chrono

if (readPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("phần nbre / 0,1 l");

tft.setCursor (10, 17); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.setCursor (10, 17); tft.print ("0,3 um"); tft.print (data.particles_03um); tft.print ("");

tft.setCursor (10, 29);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("0,5 um"); tft.print (data.particles_05um); tft.print ("");

tft.setCursor (10, 41);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("1,0 um"); tft.print (data.particles_10um); tft.print ("");

tft.setCursor (10, 53);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("2,5 um"); tft.print (data.particles_25um); tft.print ("");

tft.setCursor (10, 65);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("5,0 um"); tft.print (data.particles_50um); tft.print ("");

tft.setCursor (10, 77);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("10 um"); tft.print (data.particles_100um); tft.print ("");

tft.setCursor (2, 89);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("PM 1.0"); tft.setTextColor (ST7735_YELLOW, ST7735_BLACK); tft.print (data.pm10_standard); tft.print (""); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.print (" microg / m3 ");

tft.setCursor (2, 100); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("PM 2.5"); tft.setTextColor (ST7735_YELLOW, ST7735_BLACK); tft.print (data.pm25_standard); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.print ("microg / m3");

tft.setCursor (2, 110);

tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("PM 10"); tft.setTextColor (ST7735_YELLOW, ST7735_BLACK); tft.print (data.pm100_standard); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.print ("microg / m3");

tft.setCursor (10, 5);

tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize (1); tft.println ("phần nbre / 0,1 l");

// Serial.print (temps);

// Serial.print (""); Serial.print ("#"); Serial.print ("03µm"); Serial.print (data.particles_03um); Serial.print (""); Serial.print ("05µm"); Serial.print (data.particles_05um); Serial.print (""); Serial.print ("1µm"); Serial.print (data.particles_10um); Serial.print (""); Serial.print ("25µm"); Serial.print (data.particles_25um); Serial.print (""); Serial.print ("50µm"); Serial.print (data.particles_50um); Serial.print (""); Serial.print ("100µm"); Serial.print (data.particles_100um); Serial.println (""); nombre_leds = int (((float (data.particles_03um) / 65535) * 24)); // nombre_leds = (8); Serial.println (nombre_leds);

if ((nombre_leds = 1)) {

pixel.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixel.fill (vert, 0, 8); pixel.fill (cam, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {

pixel.fill (vert, 0, 8); pixel.fill (màu cam, 8, 8); pixel.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixel.fill (vert, 0, 1); } pixel.show (); // Gửi các màu pixel đã cập nhật tới phần cứng.

// Định nghĩa données String PM03 = String (data.particles_03um); String PM05 = String (data.particles_05um); String PM10 = String (data.particles_10um); String PM25 = String (data.particles_25um); String PM50 = String (data.particles_50um); String PM100 = String (data.particles_100um); String PMS10 = String (data.pm10_standard); String PMS25 = String (data.pm25_standard); String PMS100 = String (data.pm100_standard); String Temps = Chuỗi (tạm thời);

// Ecriture des données dans le fichier texte

Dữ liệu tệp = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps + "" + PM03 + "" + PM05 + "" + PM10 + "" + PM25 + "" + PM50 + "" + PM100 + "" + PMS10 + "" + PMS25 + "" + PMS100 + ""); data.close (); }

}

boolean readPMSdata (Stream * s) {

if (! s-> available ()) {return false; } // Đọc từng byte một cho đến khi chúng ta đến byte bắt đầu '0x42' đặc biệt if (s-> peek ()! = 0x42) {s-> read (); trả về sai; }

// Bây giờ đọc tất cả 32 byte

if (s-> available () readBytes (đệm, 32);

// chuẩn bị sẵn sàng tổng kiểm tra

for (uint8_t i = 0; i <30; i ++) {sum + = buffer ; }

/ * gỡ lỗi

for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (đệm , HEX); Serial.print (","); } Serial.println (); * / // Dữ liệu có trong endian'd, điều này giải quyết nó để nó hoạt động trên tất cả các nền tảng uint16_t buffer_u16 [15]; for (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffer [2 + i * 2 + 1]; buffer_u16 + = (buffer [2 + i * 2] << 8); }

// đặt nó vào một cấu trúc đẹp:)

memcpy ((void *) & data, (void *) buffer_u16, 30);

if (sum! = data.checksum) {

Serial.println ("Kiểm tra thất bại"); trả về sai; } // sự thành công! trả về true; }

// Converti le numéro de jour en jour /! / La semaine bắt đầu un dimanche

Chuỗi donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; trường hợp 1: return "LUN"; trường hợp 2: trả về "MAR"; trường hợp 3: trả về "MER"; trường hợp 4: trả về "JEU"; trường hợp 5: return "VEN"; trường hợp 6: return "SAM"; default: return ""; }}

// affiche la date et l'heure sur l'écran

void affiche_date_heure (DateTime datetime) {// Chuỗi ngày tháng. + Chuỗi (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());

Serial.print (tạp chí); Serial.print (""); Serial.print (heure); //Serial.print (""); Dữ liệu tệp = SD.open ("donnees.txt", FILE_WRITE); data.print (jour + "" + heure + ""); data.close ();

tft.setCursor (2, 120);

tft.setTextColor (ST7735_GREEN); tft.setTextSize (1); tft.print ("date"); tft.setTextColor (ST7735_YELLOW); tft.print (jour); tft.setTextColor (ST7735_GREEN); tft.setCursor (2, 130); tft.print ("heure"); tft. setTextColor (ST7735_YELLOW); tft.print (heure);

chậm trễ (500);

}

// permet d'afficher les nombres sur deux chiffres

String Vers2Chiffres (byte nombre) {String resultat = ""; if (nombre <10) resultat = "0"; trả về resultat + = String (nombre, DEC); }

Bước 3: Chương trình MIT App Inventor 2

Chương trình nhà phát minh ứng dụng 2 của MIT
Chương trình nhà phát minh ứng dụng 2 của MIT

đây là khối mã nhà phát minh ứng dụng MIT

Bước 4: KẾT QUẢ

đây là video kết quả

Đề xuất: