نظام مراقبة جودة الهواء لتلوث الجسيمات: 4 خطوات
نظام مراقبة جودة الهواء لتلوث الجسيمات: 4 خطوات
Anonim
نظام مراقبة جودة الهواء لتلوث الجسيمات
نظام مراقبة جودة الهواء لتلوث الجسيمات
نظام مراقبة جودة الهواء لتلوث الجسيمات
نظام مراقبة جودة الهواء لتلوث الجسيمات

مقدمة:

1 في هذا المشروع ، أعرض كيفية بناء كاشف للجسيمات مع عرض البيانات ، ونسخ احتياطي للبيانات على بطاقة SD و IOT. بصريًا ، تشير شاشة حلقة neopixels إلى جودة الهواء.

2 تعتبر جودة الهواء مصدر قلق متزايد الأهمية اليوم. توجد أنظمة لقياس معدل الغبار لكنها باهظة الثمن. هناك أجهزة الكشف عن الجسيمات منخفضة التكلفة وعالية الجودة في السوق ، كما هو موضح في بعض الدراسات.

على سبيل المثال:

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

3 لذلك قررت إنشاء جهاز قادر على قياس عدد الجسيمات حسب فئات الحجم (0.5 ميكرومتر إلى 10 ميكرومتر) ، بصريًا مع عرض بسيط للنتيجة (حلقة بكسل جديدة) ، وشاشة أكثر تفصيلاً على شاشة TFT و نسخ احتياطي مختوم زمنيًا على بطاقة SD.

4 بالإضافة إلى ذلك ، أضفت وحدة اتصال بلوتوث لأتمكن من التواصل مع تطبيق android وبالتالي نشر النتائج على خادم IOT.

5 لا تتجاوز التكلفة الإجمالية الكلية 60 يورو

اللوازم

-أردوينو أونو R3

-درع اردوينو بروتو

-شاشة TFT ST7735

- حلقة نيوبكسل 24 ليد

- بلانتور 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 رسم اردوينو

# تتضمن # تتضمن // Bibliothèque pour l'I2C # include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC؛ #يشمل

// أي دبوس على Arduino متصل بـ NeoPixels؟

#define PIN 6 // On Trinket أو Gemma ، اقترح تغيير هذا إلى 1

// كم عدد NeoPixels المتصلة بـ Arduino؟

#define NUMPIXELS 24 // حجم حلقة NeoPixel الشهيرة Adafruit_NeoPixel pixels (NUMPIXELS، PIN، NEO_GRB + NEO_KHZ800) ؛ uint32_t vert = بكسل. اللون (0، 250، 0) ؛ uint32_t orange = بكسل ، لون (250 ، 250 ، 0) ؛ uint32_t rouge = pixels. Color (255 ، 0 ، 0) ؛

SoftwareSerial pmsSerial (2 ، 3) ؛

#define cs 10 #define dc 9 #define rst 8 // يمكنك أيضًا توصيل هذا بإعادة تعيين Arduino

# تضمين // مكتبة الرسومات الأساسية

# تضمين // مكتبة خاصة بالأجهزة #include #include const int cs_sd = 4 ؛ درجة الحرارة الدولية // temps d'acquisition double tempsInit؛ // تهيئة du timer au démarrage du loop ()

# إذا تم تعريفها (_ 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 thats sclk = 13 و sid = 11) ويجب أن يكون الدبوس 10 // ناتجًا. هذا أسرع بكثير - مطلوب أيضًا إذا كنت تريد // استخدام بطاقة microSD (انظر مثال رسم الصورة) Adafruit_ST7735 tft = Adafruit_ST7735 (cs ، dc ، rst) ؛ تعويم nombre_leds = 0 ؛ إعداد باطل () {Serial.begin (9600) ؛ // Initialise la liaison I2C Wire.begin () ؛ // تهيئة وحدة RTC RTC.begin () ؛ Serial.print ("init SD") ؛ تأخير (1000) ؛ if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD") ؛ إرجاع؛ } Serial.print ("كارت SD موافق") ؛

بيانات الملف = 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 strip object (مطلوب)

pixels.setBrightness (2) ،

}

هيكل 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 ، جزيئات_50 ميكرومتر ، جزيئات_100um ؛ uint16_t غير مستخدم ؛ uint16_t المجموع الاختباري ؛ } ؛

بيانات هيكل pms5003data ؛ حلقة باطلة () {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

إذا (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.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 ("ميكروغ / م 3") ؛

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 ("ميكروغ / م 3") ؛

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 ميكرومتر") ؛ Serial.print (data.particles_03um) ؛ Serial.print ("") ؛ Serial.print ("05µm") ؛ Serial.print (data.particles_05um) ؛ Serial.print ("") ؛ Serial.print ("1 ميكرومتر") ؛ Serial.print (data.particles_10um) ؛ Serial.print ("") ؛ Serial.print ("25 ميكرومتر") ؛ Serial.print (data.particles_25um) ؛ Serial.print ("") ؛ Serial.print ("50 ميكرومتر") ؛ Serial.print (data.particles_50um) ؛ Serial.print ("") ؛ Serial.print ("100 ميكرومتر") ؛ Serial.print (data.particles_100um) ؛ Serial.println ("") ؛ nombre_leds = int (((float (data.particles_03um) / 65535) * 24)) ؛ // nombre_leds = (8) ؛ Serial.println (nombre_leds) ؛

إذا ((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) {

بكسل ملء (فير ، 0 ، 8) ؛ ملء البكسل (برتقالي ، 8 ، 8) ؛ pixels.fill (شفتين ، 16 ، ((nombre_leds] -16)) ؛ } else if (nombre_leds <= 1) {pixels.fill (vert، 0، 1)؛ } pixels.show ()؛ // أرسل ألوان البكسل المحدثة إلى الجهاز.

// Définition données String PM03 = سلسلة (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 = سلسلة (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 () ؛ }

}

البيانات المنطقية readPMSdata (Stream * s) {

if (! s-> available ()) {return false؛ } // اقرأ بايت في المرة الواحدة حتى نصل إلى بايت البداية الخاص '0x42' إذا (s-> peek ()! = 0x42) {s-> read () ؛ عودة كاذبة؛ }

// الآن اقرأ كل 32 بايت

if (s-> available () readBytes (المخزن المؤقت ، 32) ؛

// احصل على المجموع الاختباري جاهزًا

لـ (uint8_t i = 0 ؛ i <30 ؛ i ++) {sum + = buffer ؛ }

/ * التصحيح

لـ (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) ؛

إذا (sum! = data.checksum) {

Serial.println ("فشل اختباري") ؛ عودة كاذبة؛ } // النجاح! العودة صحيح }

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

String donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"؛ الحالة 1: إرجاع "LUN" ؛ الحالة 2: إرجاع "MAR" ؛ الحالة 3: إرجاع "MER" ؛ الحالة 4: إرجاع "JEU" ؛ الحالة 5: إرجاع "VEN" ؛ الحالة 6: إرجاع "SAM" ؛ الافتراضي: إرجاع "" ؛ }}

// 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 () ، ديسمبر) ؛ // heure String heure = "" ؛ heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ()) ؛

Serial.print (جور) ؛ 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 ("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) ؛

تأخير (500) ؛

}

// permet d'afficher les nombres sur deux chiffres

String Vers2Chiffres (بايت nombre) {String resultat = ""؛ إذا (nombre <10) resultat = "0" ؛ نتيجة إرجاع + = سلسلة (nombre ، DEC) ؛ }

الخطوة 3: برنامج MIT App Inventor 2

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

هذا هو رمز مخترع تطبيق MIT

الخطوة 4: النتيجة

هنا فيديو النتيجة