جدول المحتويات:

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

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

فيديو: نظام مراقبة جودة الهواء لتلوث الجسيمات: 4 خطوات
فيديو: جهاز إختبار جودة الهواء في المنازل وبيئات العمل 2024, يوليو
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: النتيجة

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

موصى به: