विषयसूची:

कण प्रदूषण के लिए वायु गुणवत्ता की निगरानी के लिए प्रणाली: 4 कदम
कण प्रदूषण के लिए वायु गुणवत्ता की निगरानी के लिए प्रणाली: 4 कदम

वीडियो: कण प्रदूषण के लिए वायु गुणवत्ता की निगरानी के लिए प्रणाली: 4 कदम

वीडियो: कण प्रदूषण के लिए वायु गुणवत्ता की निगरानी के लिए प्रणाली: 4 कदम
वीडियो: DNS: NATIONAL CLEAN AIR PROGRAMME 2024, जुलाई
Anonim
कण प्रदूषण के लिए वायु गुणवत्ता की निगरानी के लिए प्रणाली
कण प्रदूषण के लिए वायु गुणवत्ता की निगरानी के लिए प्रणाली
कण प्रदूषण के लिए वायु गुणवत्ता की निगरानी के लिए प्रणाली
कण प्रदूषण के लिए वायु गुणवत्ता की निगरानी के लिए प्रणाली

परिचय:

1 इस परियोजना में मैं दिखाता हूं कि डेटा डिस्प्ले, एसडी कार्ड और आईओटी पर डेटा बैकअप के साथ एक कण डिटेक्टर का निर्माण कैसे किया जाता है। नेत्रहीन एक नियोपिक्सल रिंग डिस्प्ले हवा की गुणवत्ता को इंगित करता है।

2 वायु गुणवत्ता आज एक तेजी से महत्वपूर्ण चिंता का विषय है। धूल की दर को मापने के लिए सिस्टम हैं लेकिन वे बहुत महंगे हैं। बाजार पर कम लागत वाले, उच्च गुणवत्ता वाले कण डिटेक्टर हैं, जैसा कि कुछ अध्ययनों से पता चलता है।

उदाहरण के लिए:

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

3 इसलिए मैंने एक ऐसा उपकरण बनाने का फैसला किया जो आकार वर्गों (0.5μm से 10 µm) द्वारा कणों की संख्या को मापने में सक्षम हो, परिणाम के एक साधारण प्रदर्शन (नव पिक्सेल रिंग) के साथ, एक TFT स्क्रीन पर अधिक विस्तृत डिस्प्ले और एक एसडी कार्ड पर टाइम-स्टैम्प्ड बैकअप।

4 इसके अलावा मैंने एक एंड्रॉइड एप्लिकेशन के साथ संचार करने में सक्षम होने के लिए एक ब्लूटूथ संचार मॉड्यूल जोड़ा है और इस प्रकार एक आईओटी सर्वर पर परिणाम प्रकाशित करता है।

5 संपूर्ण की कुल लागत 60 €. से अधिक नहीं है

आपूर्ति

-Arduino uno R3

-अरुडिनो प्रोटो शील्ड

-टीएफटी स्क्रीन ST7735

-नियोपिक्सल रिंग 24 एलईडी

-प्लांटर PMS5003

-HC-06 ब्लूटूथ मॉड्यूल

चरण 1: घटकों को जोड़ना

घटकों को जोड़ना
घटकों को जोड़ना

विभिन्न घटक ऊपर दिए गए चित्र के अनुसार जुड़े हुए हैं

चरण 2: लाइब्रेरी और Arduino प्रोग्राम

१ पुस्तकालय

टीएफटी स्क्रीन के लिए

github.com/adafruit/Adafruit-GFX-Library

नियो पिक्सेल रिंग के लिए

github.com/adafruit/Adafruit_NeoPixel

एसडी कार्ड के लिए

github.com/arduino-libraries/SD

2 आर्डिनो स्केच

#include #include // Bibliothèque die l'I2C #include "RTClib.h" // Bibliothèque put le मॉड्यूल RTC RTC_DS1307 RTC; #शामिल

// Arduino पर कौन सा पिन NeoPixels से जुड़ा है?

#define PIN 6 // ट्रिंकेट या जेम्मा पर, इसे 1. में बदलने का सुझाव दें

// Arduino से कितने NeoPixels जुड़े हुए हैं?

#define NUMPIXELS 24 // लोकप्रिय NeoPixel रिंग साइज Adafruit_NeoPixel पिक्सल (NUMPIXELS, पिन, NEO_GRB + NEO_KHZ800); uint32_t लंबवत = पिक्सेल। रंग (0, 250, 0); uint32_t नारंगी = पिक्सेल। रंग (२५०, २५०, ०); uint32_t रूज = पिक्सेल। रंग (२५५, ०, ०);

SoftwareSerial pmsSerial(2, 3);

#define cs 10 #define dc 9 #define rst 8 // आप इसे Arduino रीसेट से भी जोड़ सकते हैं

#शामिल करें // कोर ग्राफिक्स लाइब्रेरी

#include // हार्डवेयर-विशिष्ट लाइब्रेरी #include #include const int cs_sd=4; इंट टेम्प्स; // टेम्प्स डी'एक्विजिशन डबल टेम्प्सइनिट; // इनिशियलाइज़ेशन डू टाइमर या डेमरेज डू लूप ()

#if परिभाषित (_SAM3X8E_)

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

// विकल्प 1: किसी भी पिन का उपयोग करें लेकिन थोड़ा धीमा

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

// विकल्प 2: हार्डवेयर SPI पिन का उपयोग करना चाहिए

// (UNO के लिए sclk = 13 और sid = 11) और पिन 10 होना चाहिए // एक आउटपुट। यह बहुत तेज़ है - यदि आप चाहते हैं कि // माइक्रोएसडी कार्ड का उपयोग करें (चित्र चित्र उदाहरण देखें) Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); फ्लोट nombre_leds=0; शून्य सेटअप () {Serial.begin (९६००); // इनिशियलाइज़ ला लाइजन I2C वायर.बेगिन (); // प्रारंभ करें ले मॉड्यूल RTC RTC.begin (); सीरियल.प्रिंट ("इनिट एसडी"); देरी (1000); if(!SD.begin(cs_sd)) // कंडीशन वेरिफिएंट सी ला कार्टे एसडी इस्ट प्रेजेंटे डांस ल'अपैरिल { सीरियल.प्रिंट ("डिफॉट एसडी"); वापसी; } सीरियल.प्रिंट ("कार्टे एसडी ओके");

फ़ाइल डेटा = SD.open ("donnees.txt", FILE_WRITE); // ऑवर ले फ़िशियर "donnees.txt"

डेटा.प्रिंट्लन (""); data.println ("डिमैरेज अधिग्रहण"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // एक ST7735S चिप को इनिशियलाइज़ करें, ब्लैक टैब Serial.println ("init"); // हमारा डिबगिंग आउटपुट tft.fillScreen (ST7735_BLACK); // सेंसर बॉड दर 9600 pmsSerial.begin (9600) है;

पिक्सल। शुरू (); // NeoPixel स्ट्रिप ऑब्जेक्ट को इनिशियलाइज़ करें (आवश्यक)

पिक्सल.सेटब्राइटनेस(2);

}

संरचना पीएमएस5003डेटा {

uint16_t फ्रेमलेन; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t कण_03um, कण_05um, कण_10um, कण_25um, कण_50um, कण_100um; uint16_t अप्रयुक्त; uint16_t चेकसम; };

संरचना pms5003डेटा डेटा; शून्य लूप () {पिक्सेल। स्पष्ट (); // सभी पिक्सेल रंगों को 'ऑफ' करने के लिए सेट करें डेटटाइम अभी = RTC.now (); // रिक्यूपेयर ल'हेउर एट ले डेट कोर्टेंट //affiche_date_heure(अब);

temps = ((मिली () - tempsInit))/1000; // डेमरेज डू क्रोनो

अगर (readPMSdata(&pmsSerial)) {// tft.fillScreen(ST7735_BLACK); tft.setCursor(१०, ५); tft.setTextColor (ST7735_WHITE); tft.println ("nbre भागों/0.1 l");

tft.setCursor(१०, १७); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize(1); tft.setCursor(१०, १७); 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(१०, ४१);

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

tft.setCursor(१०, ५३);

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

tft.setCursor(१०, ६५);

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(" माइक्रोग/एम3 ");

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(१०, ५);

tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize(1); tft.println ("nbre भागों/0.1 l");

// सीरियल.प्रिंट (अस्थायी);

// सीरियल.प्रिंट (""); सीरियल.प्रिंट ("#"); सीरियल.प्रिंट ("03μm"); सीरियल.प्रिंट (डेटा.कण_03um); सीरियल.प्रिंट (" "); सीरियल.प्रिंट ("05μm"); सीरियल.प्रिंट (डेटा.पार्टिकल्स_05um); सीरियल.प्रिंट (" "); सीरियल.प्रिंट ("1μm"); सीरियल.प्रिंट (डेटा.कण_10um); सीरियल.प्रिंट (" "); सीरियल.प्रिंट ("25μm"); सीरियल.प्रिंट (डेटा.पार्टिकल्स_25um); सीरियल.प्रिंट (" "); सीरियल.प्रिंट ("50μm"); सीरियल.प्रिंट (डेटा.पार्टिकल्स_50um); सीरियल.प्रिंट (" "); सीरियल.प्रिंट ("100μm"); सीरियल.प्रिंट (डेटा.कण_100um); Serial.println (" "); nombre_leds =int (((फ्लोट (data.particles_03um)/65535)*24)); // nombre_leds =(8); Serial.println (nombre_leds);

अगर ((nombre_leds=1)){

पिक्सल।फिल (लंबवत, 0, nombre_leds); } और अगर ((nombre_leds=8)) {पिक्सेल.फिल (वर्ट, 0, 8); पिक्सल।फिल (नारंगी, 8, ((nombre_leds) -8)); } और अगर (nombre_leds>16) {

पिक्सल।फिल (वर्ट, 0, 8); पिक्सल।फिल (नारंगी, 8, 8); पिक्सल.फिल (रूज, 16, ((nombre_leds)-16)); } और अगर (nombre_leds<=1) {px.fill(vert, 0, 1); } पिक्सल.शो (); // अपडेट किए गए पिक्सेल रंग हार्डवेयर को भेजें।

// परिभाषा स्ट्रिंग PM03 = स्ट्रिंग (data.particles_03um); स्ट्रिंग PM05 = स्ट्रिंग (data.particles_05um); स्ट्रिंग PM10 = स्ट्रिंग (data.particles_10um); स्ट्रिंग PM25 = स्ट्रिंग (data.particles_25um); स्ट्रिंग PM50 = स्ट्रिंग (data.particles_50um); स्ट्रिंग PM100 = स्ट्रिंग (data.particles_100um); स्ट्रिंग PMS10 = स्ट्रिंग (data.pm10_standard); स्ट्रिंग PMS25 = स्ट्रिंग (data.pm25_standard); स्ट्रिंग PMS100 = स्ट्रिंग (data.pm100_standard); स्ट्रिंग टेम्प्स = स्ट्रिंग (टेम्प्स);

//एक्रिचर डेस डोनीस डान्स ले फिचियर टेक्स्टे

फ़ाइल डेटा = SD.open ("donnees.txt", FILE_WRITE); data.println(Temps + "" + PM03+ "" + PM05 +" "+PM10+" "+PM25+" "+PM50+" "+PM100+" "+PMS10+" "+PMS25+" "+PMS100+" "); डेटा। बंद करें (); }

}

बूलियन रीडपीएमएसडेटा (स्ट्रीम * एस) {

अगर (! एस-> उपलब्ध ()) {झूठी वापसी; } // एक बार में एक बाइट पढ़ें जब तक कि हम विशेष '0x42' स्टार्ट-बाइट तक नहीं पहुंच जाते अगर (s->peek() != 0x42) { s->read(); विवरण झूठा है; }

// अब सभी 32 बाइट्स पढ़ें

अगर (एस-> उपलब्ध () रीडबाइट्स (बफर, 32);

// चेकसम तैयार करें

के लिए (uint8_t i=0; i<30; i++) {योग += बफ़र; }

/* डिबगिंग

के लिए (uint8_t i=2; i<32; i++) { Serial.print("0x"); सीरियल.प्रिंट (बफर , हेक्स); सीरियल.प्रिंट ("", "); } सीरियल.प्रिंट्लन (); *//डेटा एंडियन'ड में आता है, यह इसे हल करता है इसलिए यह सभी प्लेटफॉर्म uint16_t buffer_u16[15] पर काम करता है; के लिए (uint8_t i=0; i<15; i++) {बफर_u16 = बफर[2 + i*2 + 1]; बफर_यू16 + = (बफर [२ + आई * २] << ८); }

// इसे एक अच्छी संरचना में डालें:)

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

अगर (योग! = डेटा। चेकसम) {

Serial.println ("चेकसम विफलता"); विवरण झूठा है; } // सफलता! सच लौटना; }

//Converti le numéro de jour en jour /!\ la semaine start un dimanche

स्ट्रिंग donne_jour_semaine (uint8_t j) {स्विच (j) {केस 0: रिटर्न "डीआईएम"; केस 1: वापसी "लून"; केस 2: वापसी "मार्च"; केस 3: वापसी "एमईआर"; केस 4: वापसी "जेईयू"; केस 5: वापसी "वीएन"; केस 6: "एसएएम" लौटाएं; डिफ़ॉल्ट: वापसी ""; } }

// affiche ला डेट और l'heure sur l'écran

शून्य affiche_date_heure(DateTime datetime){// दिनांक स्ट्रिंग पत्रिकाएं = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + स्ट्रिंग (डेटाटाइम। वर्ष (), डीईसी); // हेउर स्ट्रिंग हेउर = ""; Heure = Vers2Chiffres(datetime.hour ())+ ":" + Vers2Chiffres(datetime.minute ())+ ":" + Vers2Chiffres(datetime.second());

सीरियल.प्रिंट (पत्रिका); सीरियल.प्रिंट (""); सीरियल.प्रिंट (हेउर); // सीरियल.प्रिंट (""); फ़ाइल डेटा = SD.open ("donnees.txt", FILE_WRITE); डेटा। प्रिंट (पत्रिकाएँ + "" + यहाँ + ""); डेटा.क्लोज़ ();

tft.setCursor(2, 120);

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

देरी (500);

}

// Permet d'afficher les nombres sur deux chiffres

String Vers2Chiffres(byte nombre) { String resultat = ""; अगर (नामांकित <10) परिणाम = "0"; वापसी परिणाम + = स्ट्रिंग (नामांकित, डीईसी); }

चरण 3: एमआईटी ऐप आविष्कारक 2 कार्यक्रम

एमआईटी ऐप आविष्कारक 2 कार्यक्रम
एमआईटी ऐप आविष्कारक 2 कार्यक्रम

यह एमआईटी ऐप आविष्कारक कोड ब्लॉक है

चरण 4: परिणाम

यहाँ परिणाम का वीडियो है

सिफारिश की: