Talaan ng mga Nilalaman:
- Mga gamit
- Hakbang 1: Pagkonekta sa Mga Sangkap
- Hakbang 2: Program sa Library at Arduino
- Hakbang 3: MIT App Inventor 2 Program
- Hakbang 4: ANG RESULTA
Video: Sistema para sa Pagsubaybay sa Kalidad ng Air para sa Partulateates Polusyon: 4 na Hakbang
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:12
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
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
ito ang MIT app block code ng imbentor
Hakbang 4: ANG RESULTA
narito ang video ng resulta
Inirerekumendang:
Simpleng Pagsubaybay sa Kalidad ng Hangin Sa TFT LCD Display-- Ameba Arduino: 3 Hakbang
Simpleng Pagsubaybay sa Kalidad ng Air Sa TFT LCD Display-- Ameba Arduino: Panimula Ngayon na ang karamihan sa mga tao ay nanatili sa bahay upang maiwasan ang malapit na pakikipag-ugnay sa potensyal na carrier ng virus ng COVID-19, ang kalidad ng hangin ay nagiging isang mahalagang kadahilanan sa kagalingan ng mga tao, lalo na sa mga tropikal na bansa kung saan ang paggamit ng air-con ay kinakailangan sa panahon ng da
Pagtuklas ng Air Polusyon + Pagsasala ng Air: 4 na Hakbang
Pagtuklas ng Air Pollution + Air Filtration: Ang mga mag-aaral (Aristobulus Lam, Victor Sim, Nathan Rosenzweig at Declan Loges) ng German Swiss International School ay nakipagtulungan sa mga tauhan ng MakerBay upang makabuo ng isang pinagsamang sistema ng pagsukat ng polusyon sa hangin at pagiging epektibo ng pagsala ng hangin. Ito
Pagsubaybay sa Kalidad ng Hangin Sa DSM501A Sa Nokia LCD: 7 Mga Hakbang
Pagsubaybay sa Kalidad ng Air Sa DSM501A Sa Nokia LCD: Kamusta mga kaibigan! Sa maikling itinuturo na ito ay ipapakita ko sa iyo kung paano masubaybayan ang air qulaity sa iyong bahay o saanman. Napakadali upang tipunin ang badyet na presyo na ito sa istasyon ng pagsubaybay sa kalidad ng hangin
AirCitizen - Pagsubaybay sa Kalidad ng Air: 11 Hakbang (na may Mga Larawan)
AirCitizen - Pagsubaybay sa Kalidad ng Air: Kumusta ang lahat! Ngayon, tuturuan namin kayo kung paano muling gawin ang aming proyekto: AirCitizen ng AirCitizenPolytech Team! - Galing sa 'OpenAir / Ano ang iyong hangin?' Mga proyekto, nilalayon ng proyekto ng AirCitizen na paganahin ang mga mamamayan na aktibong suriin ang kalidad
Pagsubaybay sa Polusyon sa Hangin - IoT-Data Viz-ML: 3 Hakbang (na may Mga Larawan)
Pagsubaybay sa Polusyon sa Hangin | IoT-Data Viz-ML: Kaya ito ay karaniwang isang kumpletong IoT Application na may kasamang bahagi ng hardware pati na rin ang bahagi ng software. Sa tutorial na ito makikita mo kung paano i-set up ang IoT aparato at kung paano ito sa amin upang masubaybayan ang iba't ibang mga uri ng mga gas ng polusyon na naroroon sa hangin.