Talaan ng mga Nilalaman:

Sistema para sa Pagsubaybay sa Kalidad ng Air para sa Partulateates Polusyon: 4 na Hakbang
Sistema para sa Pagsubaybay sa Kalidad ng Air para sa Partulateates Polusyon: 4 na Hakbang

Video: Sistema para sa Pagsubaybay sa Kalidad ng Air para sa Partulateates Polusyon: 4 na Hakbang

Video: Sistema para sa Pagsubaybay sa Kalidad ng Air para sa Partulateates Polusyon: 4 na Hakbang
Video: 30 товаров для автомобиля с Алиэкспресс, автотовары №24 2024, Nobyembre
Anonim
Sistema para sa Pagsubaybay sa Kalidad ng Hangin para sa Partulateates Polusyon
Sistema para sa Pagsubaybay sa Kalidad ng Hangin para sa Partulateates Polusyon
Sistema para sa Pagsubaybay sa Kalidad ng Hangin para sa Partulateates Polusyon
Sistema para sa Pagsubaybay sa Kalidad ng Hangin para sa Partulateates Polusyon

INTRO:

1 Sa proyektong ito ipinapakita ko kung paano bumuo ng isang detektor ng maliit na butil na may pagpapakita ng data, pag-backup ng data sa SD card at IOT. Biswal ang isang neopixels ring display ay nagpapahiwatig ng kalidad ng hangin.

2 Ang kalidad ng hangin ay isang lalong mahalagang pag-aalala ngayon. may mga system upang masukat ang dust rate ngunit ang mga ito ay napakamahal. Mayroong mga murang maliit, de-kalidad na mga detektor ng maliit na butil sa merkado, tulad ng ipinakita ng ilang mga pag-aaral.

Halimbawa:

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

3 Napagpasyahan ko samakatuwid na bumuo ng isang aparato na may kakayahang sukatin ang bilang ng mga maliit na butil ayon sa laki ng mga klase (0.5µm hanggang 10 µm), biswal na may isang simpleng pagpapakita ng resulta (neo pixel ring), isang mas detalyadong display sa isang TFT screen at isang time-stamp backup sa isang SD card.

4 Bilang karagdagan nagdagdag ako ng isang module ng komunikasyon ng bluetooth upang makapag-usap sa isang android application at sa gayon ay mai-publish ang mga resulta sa isang IOT server.

5 Ang pangkalahatang gastos ng kabuuan ay hindi hihigit sa 60 €

Mga gamit

-Arduino uno R3

-Arduino proto kalasag

-TFT screen ST7735

-Neopixel ring 24 na humantong

-Plower ng PMS5003

-HC-06 Bluetooth module

Hakbang 1: Pagkonekta sa Mga Sangkap

Pagkonekta sa Mga Sangkap
Pagkonekta sa Mga Sangkap

ang magkakaibang mga bahagi ay konektado ayon sa diagram sa itaas

Hakbang 2: Program sa Library at Arduino

1 ang silid-aklatan

para sa TFT screen

github.com/adafruit/Adafruit-GFX-Library

para sa singsing na neo pixel

github.com/adafruit/Adafruit_NeoPixel

para sa sd card

github.com/arduino-libraries/SD

2 ang arduino sketch

#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; # isama

// Aling pin sa Arduino ang konektado sa NeoPixels?

# tukuyin ang PIN 6 // Sa Trinket o Gemma, imungkahi na baguhin ito sa 1

// Ilan sa mga NeoPixels ang nakakabit sa Arduino?

#define NUMPIXELS 24 // Mga sikat na laki ng singsing na NeoPixel Adafruit_NeoPixel pixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixel. Kulay (0, 250, 0); uint32_t orange = pixel. Kulay (250, 250, 0); uint32_t rouge = pixel. Kulay (255, 0, 0);

SoftwareSerial pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // maaari mo ring ikonekta ito sa pag-reset ng Arduino

# isama // // Core graphics library

#include // Library-specific library # isama ang #include const int cs_sd = 4; int temps; // temps d'acqu acquisition double tempsInit; // initialisation du timer au démarrage du loop ()

# kung tinukoy (_ SAM3X8E_)

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

// Option 1: gumamit ng anumang mga pin ngunit medyo mabagal

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

// Option 2: dapat gamitin ang mga hardware SPI pin

// (para sa UNO na sclk = 13 at sid = 11) at ang pin 10 ay dapat na // isang output. Ito ay mas mabilis - kinakailangan din kung nais mong // gamitin ang microSD card (tingnan ang halimbawa ng pagguhit ng imahe) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Initialise la liaison I2C Wire.begin (); // Initialise le module RTC RTC.begin (); Serial.print ("init SD"); pagkaantala (1000); if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); bumalik; } Serial.print ("OK ng Carte SD");

Data ng file = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fagway "donnees.txt"

data.println (""); data.println ("acquisition ng Démarrage"); // Ecrit dans ce file ng file.close (); tft.initR (INITR_GREENTAB); // initialize a ST7735S chip, black tab Serial.println ("init"); // our debugging output tft.fillScreen (ST7735_BLACK); // sensor baud rate ay 9600 pmsSerial.begin (9600);

pix.begin (); // INITIALIZE NeoPixel strip object (KINAKAILANGAN)

pix.setBightness (2);

}

struct pms5003data {

uint16_t framelen; uint16_t pm10_tandard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t particle_03um, particle_05um, particle_10um, particle_25um, particle_50um, particle_100um; uint16_t hindi nagamit; uint16_t checksum; };

data ng struct pms5003data; void loop () {pix.clear (); // Itakda ang lahat ng mga kulay ng pixel sa 'off' DateTime ngayon = RTC.ngayon (); // Récupère l'heure et le date courante // affiche_date_heure (ngayon);

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

kung (readPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("nbre bahagi / 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 ("nbre bahagi / 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);

kung ((nombre_leds = 1)) {

pix.fill (vert, 0, nombre_leds); } iba pa kung ((nombre_leds = 8)) {pix.fill (vert, 0, 8); pix.fill (orange, 8, ((nombre_leds) -8)); } iba pa kung (nombre_leds> 16) {

mga pixel.fill (vert, 0, 8); mga pixel. pinuno (kahel, 8, 8); pix.fill (rouge, 16, ((nombre_leds) -16)); } iba pa kung (nombre_leds <= 1) {pix.fill (vert, 0, 1); } pix.show (); // Ipadala ang na-update na mga kulay ng pixel sa hardware.

// Définition 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_tandard); String PMS25 = String (data.pm25_standard); String PMS100 = String (data.pm100_standard); String Temps = String (temps);

// Ecriture des données dans le file file

Data ng file = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps + "" + PM03 + "" + PM05 + "" + PM10 + "" + PM25 + "" + PM50 + "" + PM100 + "" + PMS10 + "" + PMS25 + "" + PMS100 + ""); data.close (); }

}

boolean readPMSdata (Stream * s) {

kung (! s-> magagamit ()) {return false; } // Basahin ang isang byte nang paisa-isa hanggang sa makarating kami sa espesyal na '0x42' start-byte kung (s-> silip ()! = 0x42) {s-> basahin (); bumalik ng hindi totoo; }

// Ngayon basahin ang lahat ng 32 bytes

kung (s-> magagamit () readBytes (buffer, 32);

// maghanda ng tsekum

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

/ * pag-debug

para sa (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffer , HEX); Serial.print (","); } Serial.println (); * / // Ang data ay dumating sa endian'd, malulutas ito upang gumana ito sa lahat ng mga platform uint16_t buffer_u16 [15]; para sa (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffer [2 + i * 2 + 1]; buffer_u16 + = (buffer [2 + i * 2] << 8); }

// ilagay ito sa isang magandang struct:)

memcpy ((walang bisa *) at data, (walang bisa *) buffer_u16, 30);

kung (kabuuan! = data.checksum) {

Serial.println ("pagkabigo ng Checksum"); bumalik ng hindi totoo; } // tagumpay! bumalik totoo; }

// Converti le numéro de jour en jour /! / La semaine commence un dimanche

String donne_jour_semaine (uint8_t j) {switch (j) {case 0: ibalik ang "DIM"; kaso 1: ibalik ang "LUN"; kaso 2: ibalik ang "MAR"; kaso 3: ibalik ang "MER"; kaso 4: ibalik ang "JEU"; kaso 5: ibalik ang "VEN"; kaso 6: ibalik ang "SAM"; default: ibalik ""; }}

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

void affiche_date_heure (DateTime datime) {// Date String jour = donne_jour_semaine (datime.dayOfTheWeek ()) + "" + Vers2Chiffres (datime.day ()) + "/" + Vers2Chiffres (datime.month ()) + "/" + String (datime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datime.hour ()) + ":" + Vers2Chiffres (datime.minute ()) + ":" + Vers2Chiffres (datime.second ());

Serial.print (jour); Serial.print (""); Serial.print (heure); //Serial.print (""); Data ng file = 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);

pagkaantala (500);

}

// permet d'afficher les nombres sur deux chiffres

String Vers2Chiffres (byte nombre) {String resultat = ""; kung (nombre <10) resulta = "0"; ibalik ang resulta + = String (nombre, DEC); }

Hakbang 3: MIT App Inventor 2 Program

MIT App Inventor 2 Program
MIT App Inventor 2 Program

ito ang MIT app block code ng imbentor

Hakbang 4: ANG RESULTA

narito ang video ng resulta

Inirerekumendang: