الأردوينو و مستشعر الضوء


.
arduino-1128227_1920

مقدمة :

في هذه التدوينة سنتعلم سويا كيفية قراءة شدة الضوء بإستخدام مستشعر الضوء ( أو ما يعرف بالمقاومة الضوئية) وطباعتها على شاشة الحاسب بعد ذلك سنقوم بالتحكم في إضاءة مصباح اعتمادا
على قراءة المستشعر

كيف يعمل مستشعر الضوء ؟

  • المستشعر هو جهاز يقوم بتحويل شكل من أشكال الطاقة (حرارة , ضوء , حركة ) إلى نبضات كهربائية  يمكن قياسها .
  • مستشعر الضوء (Photo Cell) هو عبارة عن مقاومة تصنع من نوع خاص من السيليكون المعالج, تتغير قيمتها بتغير كمية الضوء الساقطة عليها .
  • من الأمثلة الشائعة لهذا  المستشعر استخدامه في ضبط سطوع شاشة الهواتف الذكية .. حيث يقوم النظام بتعديل سطوع الشاشة اعتمادا على شدة الإضاءة في البيئة المحيطة .

المتطلبات :

  • أردوينو  Arduino
  • حساس الضوء  Photo Cell (Photo Resistor)
  • مقاومة 220 أو 330
  • مقاومة 10KΩ
  • لوح تجارب Bread Board
  • أسلاك توصيل  Wire Jumpers

الدائرة :

LDR sensor_bb

قمنا بتوصيل الدايود الضوئي إلى Pin رقم 11 , لأنه أحد المداخل التي تدعم ما يسمى بال PWM   اختصار ل Pulse Width Modulation . وهي طريقة للتحايل على عدم قدرة الأردوينو على إنتاج نبضات تماثلية , عن طريق انتاج موجات مربعة تنتقل بين حالتي ال 0 و 1  بسرعة .. و على حسب هذه السرعة تظهر لنا كإشارة تماثلية .. يمكن معرفة المداخل التي تدعم هذه الخاصية بوجود علامة ' ~ ' أمامها . أما المقاومة الضوئية فقد قمنا بتوصيلها إلى المدخل التماثلي A0 لأنها تنتج اشارة تماثلية .. و هذه المداخل تحتوي على ADC  (Analog to Digital Converter)وهو ما يقوم بتحويل هذه الإشارة إلى رقمية .. مع العلم بإمكانية استخدام هذه المداخل للإشارات الرقمية أيضا ..

الكود :

const int LEDpin = 11; //LED will be connected to pin 11;
int LEDvalue;  //The value that wil be assigned to the LED;
int sensorValue; // The value read by the sensor;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); //Start Serial Communication with the computer 
  pinMode(LEDpin, OUTPUT); //Setting the LED pin as output;

}

void loop() {
  // put your main code here, to run repeatedly:
  sensorValue = analogRead(A0); //read the value at the sensor pin
  LEDvalue = map(sensorValue, 0, 1023, 0, 255);//mapping the value from the sensor to be valid
  analogWrite(LEDpin, LEDvalue);  //Writing the value to the LED
  Serial.print(sensorValue); //printing the value to the screen
  delay(100); //put a delay
  
}

الآن لنقم بشرح الكود :

const int LEDpin = 11;
int LEDvalue;
int sensorValue;
في الأسطر الأولى قمنا بتعريف ثابت LEDpin و الذي سيحمل القيمة 11 و هو المدخل الذي سيوصل به الدايود المضئ  .. و المتغير LEDvalue و الذي سيخزن القيمة التي سترسل إلى الدايود .. و أخيرا المتغير sensorValue و الذي سنستقبل فيه قراءة المستشعر ..
Serial.begin(9600);
pinMode(LEDpin, OUTPUT); 
 
داخل دالة setup و هي الدالة التي تنفذ مرة واحدة فقط لذلك تستخدكم في تهيأة المداخل و المخارج .. الأمر  Serial.begin(9600) هو المسؤول عن بداية التخاطب بين الأردوينو و الحاسب عن طريق وصلة الUSB و سيمكننا من طباعة شدة الإضاءة على ما يعرف بال Serial Monitor في بيئة الأردوينو .. أما الأمر pinMode(LEDpin, OUTPUT) فهو الذي يقوم بتعريف وظيفة الPin كمخرج أو مدخل .. و تستقبل الدالة pinMode عنصرين .. الأول هو رقم المدخل أو اسمه اذا سبق و قمنا بتعريف اسم له كما فعلنا مع الPin رقم 11 .. و العنصر الثاني هو وظيفة هذا الPin وهي اما OUTPUT أو INPUT ..

sensorValue = analogRead(A0);
LEDvalue = map(sensorValue, 0, 1023, 0, 255);

analogWrite(LEDpin, LEDvalue);
Serial.print(sensorValue);

delay(100);
أما دالة loop   فهي الدالة التي سيتم تكرارها لذلك سنقوم بكتابة ما على الأردوينو أن تفعله بداخلها .. الأمر analogRead(A0) هو المسؤول عن قراءة قيمة المستشعر التماثلية و تحويلها إلى قيمة رقمية بين 0 - 1023 .. وتستقبل الدالة عنصر واحد فقط و هو رقم المدخل التماثلي .. بعد ذلك سيتم تخزين الناتج في المتغير sensorValue  .. الدالة map(sensorValue, 0, 1023, 0, 255) .. تقوم هذه الدالة بتحويل القيمة المستقبلة في المدى 0 - 1023 إلى المدى 0 - 255 (الشرح غير واضح أليس كذلك :)  ) .. الدالة التي بعدها analogWrite(LEDpin, LEDvalue) هي المسؤولة عن توليد الخرج التماثلي بإستخدام خاصية ال PWM التي تحدثنا عنها .. و هي تستقبل عنصرين .. الأول هو اسم أو رقم الPin و الثاني هو القيمة المراد اخراجها و يجب أن تكون بين 0 - 255  (لذلك احتجنا  دالة الmap ) حيث تعني القيمة 0 صفر فولت و القيمة 255 تعني 5 فولت .. Serial.print(sensorValue) تستقبل عنصر واحد و تقوم بطباعة قيمة هذا العنصر على شاشة الحاسب .. delay(100) تقوم هذه الدالة بإيقاف الأردوينو لمدة 100 ملي ثانية .. قبل أن تبدأ بتنفيذ دالة loop مجددا و السبب هو أن الأردوينو سريع جدا و لسنا بحاجة إلى قراءات بتلك السرعة .. الآن قم بتحميل الكود على الأردوينو و افتح شاشة الSerial Monitor  الموجودة في أعلى الجهة اليمنى في بيئة الأردوينو IDE  لتشاهد قراءة المستشعر .. رابط الكود في حسابي على Github : أتمنى أن أكون قد وفقت في الشرح .. " سبحانك اللهم و بحمدك .. أشهد أن لا إله إلا أنت أستغفرك و أتوب إليك  "

المصادر :

تعليقات

المشاركات الشائعة من هذه المدونة

مع الناس

فشرب النبي حتى رضيت