فهرست مطالب:

سیستم نظارت بر کیفیت هوا برای آلودگی ذرات معلق: 4 مرحله
سیستم نظارت بر کیفیت هوا برای آلودگی ذرات معلق: 4 مرحله

تصویری: سیستم نظارت بر کیفیت هوا برای آلودگی ذرات معلق: 4 مرحله

تصویری: سیستم نظارت بر کیفیت هوا برای آلودگی ذرات معلق: 4 مرحله
تصویری: تیتراول با فرداد فرحزاد: آیا کار برجام تمام است؟ / حکمرانی شبکه‌های اجتماعی به چه معناست؟ 2024, نوامبر
Anonim
سیستم نظارت بر کیفیت هوا برای آلودگی ذرات معلق
سیستم نظارت بر کیفیت هوا برای آلودگی ذرات معلق
سیستم نظارت بر کیفیت هوا برای آلودگی ذرات معلق
سیستم نظارت بر کیفیت هوا برای آلودگی ذرات معلق

مقدمه:

1 در این پروژه نحوه ساخت یک آشکارساز ذرات با نمایش داده ها ، پشتیبان گیری داده ها بر روی کارت SD و IOT را نشان می دهم. از لحاظ بصری یک صفحه نمایش حلقه ای نئوپیکسلی کیفیت هوا را نشان می دهد.

2 کیفیت هوا امروزه به طور فزاینده ای مورد توجه قرار گرفته است. سیستم هایی برای اندازه گیری میزان گرد و غبار وجود دارد اما بسیار گران هستند. همانطور که در برخی از مطالعات نشان داده شده است ، آشکارسازهای ذرات ارزان قیمت و با کیفیت بالا در بازار وجود دارد.

مثلا:

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

3 بنابراین تصمیم گرفتم دستگاهی بسازم که بتواند تعداد ذرات را بر اساس کلاس های اندازه گیری (0.5 میکرومتر تا 10 میکرومتر) اندازه گیری کند ، از نظر بصری با نمایش ساده نتیجه (حلقه نئو پیکسل) ، نمایش دقیق تر بر روی صفحه TFT و پشتیبان گیری مهر و موم شده روی کارت SD

4 علاوه بر این من یک ماژول ارتباطی بلوتوث اضافه کرده ام تا بتوانم با یک برنامه اندرویدی ارتباط برقرار کرده و نتایج را در سرور IOT منتشر کنم.

5 هزینه کلی کل 60 یورو تجاوز نمی کند

تدارکات

-Arduino uno R3

-سپر اولیه آردوینو

صفحه نمایش TFT ST7735

حلقه Neopixel 24 led

-Plantower PMS5003

-HC-06 ماژول بلوتوث

مرحله 1: اتصال قطعات

اتصال قطعات
اتصال قطعات

اجزای مختلف مطابق نمودار بالا به هم متصل می شوند

مرحله 2: کتابخانه و برنامه آردوینو

1 کتابخانه

برای صفحه TFT

github.com/adafruit/Adafruit-GFX-Library

برای حلقه نئو پیکسل

github.com/adafruit/Adafruit_NeoPixel

برای کارت sd

github.com/arduino-libraries/SD

2 طرح آردوینو

#Include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC؛ #عبارتند از

// کدام پین در آردوینو به NeoPixels متصل است؟

#پین 6 را تعریف کنید // در Trinket یا Gemma ، پیشنهاد کنید این را به 1 تغییر دهید

// چند NeoPixel به آردوینو وصل شده است؟

#تعریف NUMPIXELS 24 // اندازه محبوب حلقه NeoPixel Adafruit_NeoPixel (NUMPIXELS ، PIN ، NEO_GRB + NEO_KHZ800) ؛ uint32_t vert = پیکسل. رنگ (0 ، 250 ، 0) ؛ uint32_t نارنجی = پیکسل. رنگ (250 ، 250 ، 0) ؛ uint32_t rouge = پیکسل. رنگ (255 ، 0 ، 0) ؛

نرم افزار سریال pms سریال (2 ، 3) ؛

#define cs 10 #define dc 9 #define rst 8 // همچنین می توانید این را به ریست آردوینو متصل کنید

#include // کتابخانه اصلی گرافیکی

#شامل // کتابخانه مخصوص سخت افزار #شامل #شامل const int cs_sd = 4؛ int temps ؛ // temps d'acquisition double tempsInit؛ // initialisation du timer au démarrage du loop ()

#if تعریف شده (_ SAM3X8E_)

#undef _FlashStringHelper:: F (string_literal) #تعریف 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 باید // خروجی باشد. این بسیار سریعتر است - همچنین در صورت تمایل // برای استفاده از کارت microSD (به مثال طراحی تصویر مراجعه کنید) 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") ؛ تاخیر (1000) ؛ if (! SD.begin (cs_sd)) // وضعیت vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD")؛ برگشت؛ } Serial.print ("Carte SD OK") ؛

داده های فایل = SD.open ("donnees.txt"، FILE_WRITE)؛ // Ouvre le fichier "donnees.txt"

data.println ("")؛ data.println ("کسب Démarrage") ؛ // Ecrit dans ce fichier data.close ()؛ tft.initR (INITR_GREENTAB) ؛ // مقداردهی اولیه تراشه ST7735S ، تب سیاه Serial.println ("init") ؛ // خروجی اشکال زدایی ما tft.fillScreen (ST7735_BLACK) ؛ // نرخ باود سنسور 9600 pmsSerial.begin (9600) است ؛

pixels.begin ()؛ // INITIALIZE شیء نوار NeoPixel (مورد نیاز)

pixels.setBrightness (2)؛

}

struct pms5003data {

uint16_t framelen؛ 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 checksum؛ }؛

ساختار داده pms5003 داده ها ؛ حلقه خالی () {pixels.clear ()؛ // همه رنگهای پیکسل را روی "off" DateTime now = RTC.now () تنظیم کنید. // Récupère l'heure et le date courante // affiche_date_heure (در حال حاضر) ؛

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 ("قطعات nbre/ 0.1 لیتر") ؛

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.pt 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/ 0.1 لیتر") ؛

// 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)) {

pixels.fill (vert، 0، nombre_leds)؛ } else if ((nombre_leds = 8)) {pixels.fill (vert، 0، 8)؛ pixels.fill (نارنجی ، 8 ، ((nombre_leds) -8)) ؛ } else if (nombre_leds> 16) {

pixels.fill (vert، 0، 8)؛ pixels.fill (نارنجی ، 8 ، 8) ؛ pixels.fill (روژ ، 16 ، ((nombre_leds) -16))) ؛ } else if (nombre_leds <= 1) {pixels.fill (vert، 0، 1)؛ } pixels.show ()؛ // ارسال رنگ پیکسل به روز شده به سخت افزار.

// تعریف données String PM03 = String (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) ؛ String Temps = String (temps)؛

// Ecriture des données dans le fichier texte

داده های فایل = SD.open ("donnees.txt"، FILE_WRITE)؛ data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+"") ؛ data.close ()؛ }

}

boolean readPMSdata (جریان *ها) {

if (! s-> available ()) {return false؛ } // یک بایت را در یک زمان بخوانید تا زمانی که به بایت اولیه "0x42" if (s-> peek ()! = 0x42) {s-> read () برسیم. false false؛ }

// حالا همه 32 بایت را بخوانید

if (s-> available () readBytes (بافر ، 32) ؛

// چک چک را آماده کنید

برای (uint8_t i = 0 ؛ i <30؛ i ++) {sum+= بافر ؛ }

/* اشکال زدایی

برای (uint8_t i = 2؛ i <32؛ i ++) {Serial.print ("0x")؛ Serial.print (بافر ، HEX) ؛ Serial.print ("،") ؛ } Serial.println ()؛ */ // داده ها به صورت endian'd می آیند ، این مسئله آن را حل می کند بنابراین در همه سیستم عامل ها uint16_t buffer_u16 کار می کند [15] ؛ برای (uint8_t i = 0 ؛ i <15؛ i ++) {buffer_u16 = بافر [2 + i*2 + 1] ؛ buffer_u16 + = (بافر [2 + i*2] << 8) ؛ }

// آن را در یک ساختار زیبا قرار دهید:)

memcpy ((void *) & data، (void *) buffer_u16، 30)؛

if (sum! = data.checksum) {

Serial.println ("شکست چک") ؛ false false؛ } // موفقیت! بازگشت واقعی ؛ }

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

رشته donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"؛ مورد 1: بازگشت "LUN" ؛ مورد 2: بازگشت "MAR" ؛ مورد 3: بازگشت "MER" ؛ مورد 4: بازگشت "JEU" ؛ مورد 5: بازگشت "VEN" ؛ مورد 6: بازگشت "SAM" ؛ پیش فرض: return ""؛ }}

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

void affiche_date_heure (DateTime datetime) {// Date String jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + رشته (datetime.year () ، DEC) ؛ // heure String heure = ""؛ heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ())؛

Serial.print (jour)؛ Serial.print ("")؛ Serial.print (heure) ؛ //Serial.print ("")؛ داده های فایل = 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 ("تاریخ") ؛ 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) ؛

تأخیر (500) ؛

}

// permet d'afficher les nombres sur deux chiffres

String Vers2Chiffres (byte nombre) {String resultat = ""؛ if (nombre <10) resultat = "0"؛ return resultat += String (nombre، DEC)؛ }

مرحله 3: برنامه MIT App Inventor 2

برنامه MIT App Inventor 2
برنامه MIT App Inventor 2

این بلوک کد مخترع برنامه MIT است

مرحله 4: نتیجه

در اینجا فیلم نتیجه است

توصیه شده: