البرمجة
#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); }