دمج الوحدات · الدرس 3.4
المقاومة الضوئية (Photoresistor)
العودة إلى الدروسقياس شدة الضوء
ستقيس الضوء بمدخل تناظري، وتستخدم مستواه للتحكم في عدد LEDs المضاءة، بناءً على 3.3.
المكونات المطلوبة
- لوحة أردوينو (ELEGOO UNO R3) ولوحة تجارب (Breadboard) 830 نقطة.
- ثمانية الصمام الباعث للضوء (LED) وثماني مقاومات (Resistor) 220Ω.
- مقاومة (Resistor) 1kΩ ومسجل الإزاحة (74HC595 IC) ومقاومة ضوئية (Photoresistor).
- ستة عشر سلكًا ذكر إلى ذكر (Male to Male Jumper Wires).

مبدأ LDR
تسمى مقاومة تعتمد على الضوء (LDR). تتغير مقاومتها بحسب الإضاءة؛ يقارب النوع المستخدم 50kΩ في الظلام و 500Ω في الضوء الساطع.
للقراءة من UNO نحول المقاومة المتغيرة (Pot) إلى جهد، وأبسط طريقة جمعها مع مقاومة ثابتة (Resistor). يعمل الاثنان بوصفهما مقسم جهد: في الضوء الساطع تكون مقاومة (LDR) صغيرة مقارنة بالثابتة، فتزداد قيمة الجهد المقروء؛ وفي الضوء الخافت تتجاوز 1kΩ الثابتة، فيقترب الجهد المقروء من جهد الأرضي.

بعد رفع المثال غطِّ الحساس بإصبعك ثم قربه من مصدر ضوء.
توصيل الدائرة


شرح البرنامج
افتح ملف البرنامج Photocell.ino من ملفات الدرس في بيئة Arduino IDE. بعد إتمام التوصيلات، وصّل لوحة أردوينو (UNO R3 Board) بالحاسوب بكابل توصيل (USB Cable)، ثم اضغط زر Upload (رفع) لنقل البرنامج إلى اللوحة وتشغيله عليها.
إذا تعذر نقل البرنامج إلى اللوحة، فراجع قسم «رفع البرنامج ومعالجة خطأ الاتصال» في الدرس 1.5 «وميض LED وإضافة المكتبات» للتحقق من اتصال USB واختيار نوع اللوحة والمنفذ التسلسلي في بيئة Arduino IDE.
تغير اسم المدخل التناظري من potPin إلى lightPin لأننا لم نعد نستخدم مقاومة متغيرة (Pot).
int numLEDSLit = reading / 57; // all LEDs lit at 1kالتغيير الآخر تقسيم القراءة على 57 بدل 114، أي على نصف المقسوم عليه السابق. يتيح تقسيمها إلى تسع مناطق من دون LEDs إلى إضاءة الثمانية. يعوض العامل الإضافي المقاومة الثابتة (Resistor) 1kΩ: عندما تكون LDR أيضًا 1kΩ، تكون القراءة الخام نحو 1023/2 = 511، ويصبح numLEDSLit مقدار 8 فتضاء المجموعة.
الكود
Photocell/Photocell.ino
//www.elegoo.com
//2016.12.9
int lightPin = 0;
int latchPin = 11;
int clockPin = 9;
int dataPin = 12;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
/* The most common method of using 74CH595
* lctchPin->LOW : Begin transmitting signals.
* shiftOut(dataPin, clockPin, bitOrder, value)
* dataPin: the pin on which to output each bit. Allowed data types: int.
* clockPin: the pin to toggle once the dataPin has been set to the correct value. Allowed data types: int.
* bitOrder: which order to shift out the bits; either MSBFIRST or LSBFIRST. (Most Significant Bit First, or, Least Significant Bit First).
* value: the data to shift out. Allowed data types: byte.
* lctchPin->HIch : The end of the transmission signal.
*/
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 57; //1023 / 9 / 2
if (numLEDSLit > 8) numLEDSLit = 8;
leds = 0; // no LEDs lit to start
for (int i = 0; i < numLEDSLit; i++)
{
leds = leds + (1 << i); // sets the i'th bit
}
updateShiftRegister();
}