光敏电阻

罗大富 BigRich大约 3 分钟ESP32Python

本节课我们来学习如何通过光敏电阻控制 LED。

实验原理

光敏电阻(photoresistor/light-dependent resistor,缩写为 LDR)是一种基于内光电效应的模拟传感器,一般用于光的测量、控制以及光电转换。常见应用有:

  1. 光控开关;
  2. 环境检测系统中的日光追踪。

它包含两个电极引线,一片陶瓷基体,用硫化镉或者是硒化镉等材料制成,核心部分是光电导体。光敏电阻的工作原理基于光电效应,利用光照下半导体材料的电导率发生改变的特性。有光照时产生载流子参与导电,在外加电场的作用下做漂移运动,电子向正极,空穴向负极,电阻值减小;光照消失后,电子空穴对复合,阻值也恢复原值,就像是一个自动的滑动变阻器,能随着光照强度的不同改变阻值。

简单来说,光照越强,光敏电阻的阻值越小;光照越弱,阻值越大。

光敏电阻的电路非常简单,分为以下两种方法:

  1. 光敏电阻与一个电阻串联,电阻接 +5V,光敏电阻接 GND。光照越强,光敏电阻的阻值越小,分配到的电压越小,ADC 读取到的值就越小;
  2. 光敏电阻与一个电阻串联,电阻接 GND,光敏电阻接 +5V。光照越强,光敏电阻的阻值越小,分配到的电压越小,ADC 读取到的是固定电阻的电压,因此,ADC 读取到的值越大。
202504111055344

硬件电路设计

物料清单(BOM 表):

材料名称数量
光敏电阻1
LED2
10KΩ 电阻1
1kΩ 电阻2
杜邦线(跳线)若干

将材料按照下图相连:

软件程序设计

1. 在串口监视器中显示

我们可以先把读取到的光敏电阻的值打印在串口监视器中,代码如下:

from machine import Pin, ADC
import time


# 定义光敏电阻引脚
ldr_pin = ADC(Pin(27), atten=ADC.ATTN_11DB)

# 串口打印读取到的 ldr 的值
while True:
    print(f'ldr: {ldr_pin.read()}')
    time.sleep(0.1)

2. 根据光亮控制 LED

我们可以使用光敏电阻来控制 LED 的亮灭,这里需要准备 2 个 LED,其中一个 LED 负责接受 ADC 值,输出 PWM,光照越高,亮度越小;另一个 LED 则模拟日常生活中常见的楼梯间的光控灯,当光照强度过低时点亮,强度过高时熄灭。代码如下:

from machine import Pin, ADC, PWM
import time


# 定义不同功能的引脚
ldr_pin = ADC(Pin(27), atten=ADC.ATTN_11DB)
# 使 ADC 的采样宽度与 PWM 的占空比保持一致
ldr_pin.width(10)
pwm_pin = PWM(Pin(4), freq=2000)
led_pin = Pin(2, Pin.OUT)

# 串口打印读取到的 ldr 的值
while True:
    ldr_value = ldr_pin.read()
    # 打印读取到的 ldr 的值
    print(f'ldr: {ldr_value}')
    
    # 将 adc 值转换成 pwm
    pwm_pin.duty(ldr_value)
    
    # 控制 LED 的亮灭
    if ldr_value > 600:
        led_pin.value(1)
    else:
        led_pin.value(0)
    
    time.sleep(0.1)

注意

如果你在搭建搭建光敏电阻电路的时候,使用的是第二种方法(固定电阻接 GND,光敏电阻接 VCC),那么你使用以上程序获取到的值是完全相反的,实现的效果也是相反的。

上次编辑于:
贡献者: 罗大富BigRich