تصویر شاخص نوشته: مقاومت نوری (LDR) چیست و چطور نور را حس می‌کند؟

مقاومت نوری (LDR) چیست و چطور نور را حس می‌کند؟

۲۷ تیر ۱۴۰۵ سنسورها و ورودی‌ها

مقاومتِ نوری یا LDR (مخففِ Light Dependent Resistor) یک قطعهٔ کوچک است که مقدارِ مقاومتش با نور تغییر می‌کند: هرچه نورِ بیشتری به آن بتابد، مقاومتش کمتر می‌شود. همین خاصیتِ ساده، LDR را به چشمِ ارزان و کاربردیِ مدارها تبدیل کرده — از چراغ‌های خیابانی که خودشان شب روشن می‌شوند تا نورسنجِ دوربین.

چطور واقعاً کار می‌کند

سطحِ LDR از یک مادهٔ نیمه‌رسانا (معمولاً سولفیدِ کادمیوم) ساخته شده. وقتی نور به این ماده می‌تابد، انرژیِ نور الکترون‌ها را آزاد می‌کند و ماده راحت‌تر جریان را عبور می‌دهد؛ یعنی مقاومتش کم می‌شود. در تاریکی برعکس: الکترونِ آزادِ کمی هست، پس مقاومت خیلی زیاد می‌شود. خلاصه: نورِ بیشتر ← مقاومتِ کمتر، تاریکیِ بیشتر ← مقاومتِ بیشتر.

اما یک نکتهٔ مهم: میکروکنترلر نمی‌تواند مستقیم «مقاومت» را بخواند، فقط «ولتاژ» را می‌خواند. برای همین LDR را با یک مقاومتِ ثابت سری می‌کنیم تا یک تقسیم‌کنندهٔ ولتاژ بسازند. حالا با تغییرِ نور، مقاومتِ LDR و در نتیجه ولتاژِ نقطهٔ وسط تغییر می‌کند و همین ولتاژ را با ADC می‌خوانیم. این‌طوری «نور» به یک عدد تبدیل می‌شود.

پس LDR دقیقاً به همان دلیلی که مقاومتش با نور عوض می‌شود، وقتی در یک divider قرار بگیرد، یک سنسورِ نورِ ساده و ارزان می‌سازد.

کاربردهای واقعی

  • چراغ‌های خیابانیِ خودکار: هوا که تاریک می‌شود، مقاومتِ LDR بالا می‌رود و چراغ خودش روشن می‌شود؛ صبح برعکس.
  • چراغ‌خوابِ هوشمند: فقط وقتی اتاق تاریک است روشن می‌ماند.
  • نورسنجِ دوربین: برای اندازه‌گیریِ نورِ محیط و تنظیمِ روشناییِ عکس یا صفحه‌نمایش.

در عمل

سیم‌بندی: LDR بینِ 3V3 و نقطهٔ وسط، و یک مقاومتِ ثابت بینِ همان نقطه و GND (یا برعکس)؛ نقطهٔ وسط به یک پایهٔ آنالوگ مثلِ GPIO35. با ADC عددِ نور را می‌خوانیم و با یک آستانه (threshold) تصمیم می‌گیریم چراغ روشن شود یا نه:

from machine import Pin, ADC
import time

ldr = ADC(Pin(35))
ldr.atten(ADC.ATTN_11DB)
led = Pin(25, Pin.OUT)

THRESHOLD = 1800           # in adad ra ba calibration-e otagh peyda kon

while True:
    value = ldr.read()
    if value < THRESHOLD:
        led.value(1)       # tarik ast -> cheragh ROSHAN
    else:
        led.value(0)       # roshan ast -> cheragh KHAMUSH
    print("Light:", value)
    time.sleep_ms(200)

اشتباه‌های رایج

  • حذفِ مقاومتِ ثابت: بدونِ مقاومتِ سری، تقسیم‌کننده نداری و ولتاژِ ثابتی برای خواندن به‌وجود نمی‌آید؛ LDRِ تنها بی‌فایده است.
  • تنظیم‌نکردنِ آستانه: عددِ روشن/تاریک در هر اتاق فرق می‌کند؛ باید THRESHOLD را برای محیطِ خودت کالیبره کنی.
  • انتظارِ دقتِ بالا: LDR کند و تقریبی است؛ برای اندازه‌گیریِ دقیقِ نور مناسب نیست، ولی برای تشخیصِ روز/شب عالی است.

همین حالا امتحان کن

در همین مرورگر نورِ محیط را کم و زیاد کن و ببین عددِ LDR و چراغِ خودکار چطور واکنش نشان می‌دهد: آزمایشگاه: چراغ‌خوابِ خودکار با LDR. توضیحِ کاملش هم در فصلِ سنسورِ نور هست.