جدول المحتويات:
- اللوازم
- الخطوة 1: توصيل المكونات
- الخطوة 2: برنامج المكتبة والاردوينو
- الخطوة 3: برنامج MIT App Inventor 2
- الخطوة 4: النتيجة
فيديو: نظام مراقبة جودة الهواء لتلوث الجسيمات: 4 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:38
مقدمة:
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
الخطوة 4: النتيجة
هنا فيديو النتيجة
موصى به:
Airduino: جهاز مراقبة جودة الهواء المحمول: 5 خطوات
Airduino: مراقب جودة الهواء المحمول: مرحبًا بكم في مشروعي ، Airduino. اسمي روبي برينز. أدرس الوسائط المتعددة وتكنولوجيا الاتصالات في Howest في Kortrijk ، بلجيكا. في نهاية الفصل الدراسي الثاني ، يتعين علينا صنع جهاز إنترنت الأشياء ، وهو طريقة رائعة لجلب كل
مراقبة جودة الهواء مع MQ135 ومستشعر درجة الحرارة والرطوبة الخارجية على MQTT: 4 خطوات
مراقب جودة الهواء مع MQ135 ومستشعر درجة الحرارة والرطوبة الخارجية فوق MQTT: هذا لأغراض الاختبار
مراقبة جودة الهواء مع DSM501A مع Nokia LCD: 7 خطوات
مراقبة جودة الهواء باستخدام DSM501A مع شاشة Nokia LCD: مرحبًا أيها الأصدقاء ، سأوضح لك في هذه التعليمات القصيرة كيفية مراقبة جودة الهواء في منزلك أو في أي مكان
جهاز مراقبة جودة الهواء IoT منخفض التكلفة يعتمد على RaspberryPi 4: 15 خطوات (مع صور)
مراقب جودة هواء إنترنت الأشياء منخفض التكلفة استنادًا إلى RaspberryPi 4: تتمتع سانتياغو ، تشيلي خلال حالة الطوارئ البيئية الشتوية بامتياز العيش في واحدة من أجمل البلدان في العالم ، ولكن لسوء الحظ ، ليس كل الورود. تشيلي خلال فصل الشتاء تعاني كثيرًا من تلوث الهواء ، وماي
مراقبة جودة الهواء باستخدام الفوتون الجزيئي: 11 خطوة (بالصور)
مراقبة جودة الهواء باستخدام الفوتون الجزيئي: في هذا المشروع ، يتم استخدام مستشعر الجسيمات PPD42NJ لقياس جودة الهواء (PM 2.5) الموجودة في الهواء باستخدام الفوتون الجسيمي. فهو لا يعرض البيانات على وحدة التحكم في الجسيمات و dweet.io فحسب ، بل يشير أيضًا إلى جودة الهواء باستخدام RGB LED عن طريق تغييره