المقدمة
قد يتسبب تلوث الهواء والأجواء الغابرة بمشاكل صحية على الإنسان وخصوصا الذين يعانون من ضيق تنفس أو مشاكل في الجهاز التنفسي لذلك يعد من الضروري قياس ومراقبة نقاوة الجو. نركز في هذا الدرس على تعلم كيفية توصيل حساس الغبار مع الاردوينو وعرض قراءة المستشعر على شاشة (OLED). كذلك تحديد مستوى الغبار و تشغيل ثنائي مشع للضوء يشير إلى كمية الغبار بالجو.
المواد والأدوات المطلوبة
1 X الثنائي المشع للضوء لون أحمر
1 X الثنائي المشع للضوء لون أخضر
1X مكثف (16v,220uf) متوفر مع الحساس
1X مقاومة (150 اوم ) متوفره مع الحساس
مجموعة أسلاك توصيل (ذكر/ ذكر )
حساس الغبار
يتكون حساس الغبار من صمام ثنائي ضوئي. يبعث الضوء ومستكشف ضوء (Photodiode) لتحديد انعكاسات الضوءـ ويتم وضعهما بشكل قطري بالقرب من مدخل الهواء.
عندما تعبر كمية من الهواء إلى المستشعر من خلال مدخل الهواء، تسقط الأشعة الضوئية بشكل متكرر على الهواء بداخل الحساس. يسقط الضوء على جزيئات الغبار الموجودة في الهواء ونتيجة لذلك، يتم إنتاج إشارة ضوئية مشتتة. ويتم الكشف عنها بواسطة مستكشف الضوء (Photodiode). يتم تضخيم خرج دائرة كاشف الضوء بواسطة دائرة مضخم الإشارة. بعد ذلك، تتم معالجة الإشارة الضوئية المضخمة للحصول على تركيز جزيئات الغبار في الهواء.
يحتوي حساس الغبار على 6 منافذ وظيفتها كالتالي
الجدول التالي يوضح وضيفة كل منفذ موجود بحساس الغبار
المنفذ | وظيفة منفذ حساس الغبار |
V-LED | لتزويد الصمام الثنائي الضوئي بالطاقة |
LED GND | الأرضي للصمام الثنائي الضوئي |
LED | للتحكم بتشغيل الضوء |
S-GND | المنفذ الأرضي للحساس |
Vo | ينتج نبضات جهد تناظرية وفقًا لتركيز جزيئات الغبار في الهواء. |
VCC | لتزويد الحساس بالطاقة مقدارها 5 فولت |
GND | GUN |
توصيل الدائرة
البرمجة
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif const int LED1 = 8; const int LED2 = 10; int measurePin = 0; int ledPower = 2; unsigned int samplingTime = 280; unsigned int deltaTime = 40; unsigned int sleepTime = 9680; float voMeasured = 0; float calcVoltage = 0; float dustDensity = 0; void setup(){ pinMode(ledPower,OUTPUT); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); // show splashscreen delay(2000); display.clearDisplay(); // clears the screen and buffer pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); } void loop(){ digitalWrite(ledPower,LOW);// power on the LED delayMicroseconds(samplingTime); voMeasured = analogRead(measurePin); // read the dust value delayMicroseconds(deltaTime); digitalWrite(ledPower,HIGH); // turn the LED off delayMicroseconds(sleepTime); calcVoltage = voMeasured * (5.0 / 1024.0); dustDensity = 0.17 * calcVoltage - 0.1; display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println("airquality="); display.print(dustDensity); display.display(); delay(100); if ( dustDensity < 0) { dustDensity = 0.00; } if(dustDensity < 0.12) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); } if(dustDensity >0.12 ) { digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH);} delay(100); }
شرح الشفرة البرمجية
نبدأ بتحميل المكتبات شرح طريقة تحميل المكتبات من خلال الرابط
ابحث عن مكتبتي (Adafruit_GFX) و (Adafruit_SSD1306) عن طريق النقر على sketch < include library < manage libraries ثم حمل المكتبات
من داخل ملف المكتبات على جهاز انقر على مكتبة (Adafruit_SSD1306) ثم على ملف (Adafruit_SSD1306.h) و قم بالتعديل التالي :
ازالة رمز التعليق () //عن سطر
#define SSD1306_128_64
اضافة رمز التعليق (//) إلى السطر
//#define SSD1306_128_32
بالبداية نقوم باستدعاء المكتبات المطلوبة
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif
نقوم بتعريف منافذ الثنائي المشع للضوء
const int LED1 = 8; const int LED2 = 10;
نقوم بتعريف المنافذ التي تم توصيلها مع حساس الغبار وهي A0 و المنفذ الرقمي 2
و حدد قيمة ابتدائية تساوي 0 للمتغيرات التالية (samplingTimeو deltaTime و int sleepTime)
int measurePin = 0; int ledPower = 2; int samplingTime = 280; int deltaTime = 40; int sleepTime = 9680;
نحدد قيمة ابتدائية لكل من (voMeasured و calcVoltage و dustDensity )
float voMeasured = 0; float calcVoltage = 0; float dustDensity = 0;
في دالة void setup نعرف نعرف منافذ الدخل و الخرج و تهيئة شاشة Oled
void setup(){ pinMode(ledPower,OUTPUT); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); delay(2000); display.clearDisplay(); pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); }
في دالة void loop نشغل و نطفئ الثنائي المشع للضوء الموجود في حساس الغبار و نقرأ البيانات من المنفذ التناظري A0
void loop(){ digitalWrite(ledPower,LOW); // power on the LED delayMicroseconds(samplingTime); voMeasured = analogRead(measurePin); // read the dust value delayMicroseconds(deltaTime); digitalWrite(ledPower,HIGH); // turn the LED off delayMicroseconds(sleepTime);
نقوم بعمل عملية حسابية لحساب تركيز ذرات الغبار بالجو بالميكروجرام (واحد على مليون من الجرام) لكل متر مكعب من الهواء أو ميكروغرام / م 3.
calcVoltage = voMeasured * (5.0 / 1024.0); dustDensity = 0.17* calcVoltage - 0.1;
بعد حساب تركيز الغبار نقوم بطباعة القيمة على الشاشة
display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println("airquality="); display.print(dustDensity); display.display(); delay(2000);
اذا كان تركيز الغبار عدد سالب يتم احتاسبه بقيمة صفر
if ( dustDensity < 0) { dustDensity = 0.00; }
اذا كان تركيز الغبارأصغر من (0.12 ) نعطي أمر بتشغيل الثنائي المشع للضوء الأول
if(dustDensity <= 0.12) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); }
اذا كان تركيز الغبار أكبر من قيمة (0.12) نعطي أمر بتشغيل الثنائي المشع للضوء الثاني
if(dustDensity > 0.12) { digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH);} delay(1000); }