光线传感器

原理简介

光线传感器检测环境光强弱,常用光敏电阻(LDR):光越强电阻越小,光越弱电阻越大。

  • 工作原理:光敏电阻 + 一只固定电阻组成分压电路,中间点电压随光照变化,用 ADC 读出来
  • 分压接法:光敏电阻一端接 3V3,另一端接 ADC 脚并串联一只 10kΩ 到 GND
  • 接口:ADC 模拟输入,只能用 GP26 / GP27 / GP28
  • 读出的是相对亮度,不是标准照度(lux),数值越大通常越亮

典型应用

  • 自动亮度调节
  • 光控开关(天黑开灯)
  • 环境光监测
  • 智能窗帘控制
  • 小夜灯 / 路灯感应

接线图

[接线图占位,后续添加]

文字说明(具体接法见下方代码注释):

  • 光敏电阻(LDR)一端 → Pico 3V3
  • 光敏电阻(LDR)另一端 → Pico GP26(ADC0),并与 10kΩ 电阻一端相连(这是分压中点)
  • 10kΩ 电阻另一端 → Pico GND
  • ADC 只能用 GP26 / GP27 / GP28

示例代码

基础示例:读取光线强度

# ============ 接线 ============
# 光敏电阻 LDR 一端 → Pico 3V3
# 光敏电阻 LDR 另一端 → Pico GP26(ADC0),并接 10kΩ 电阻一端
# 10kΩ 电阻另一端 → Pico GND
# (LDR 与 10kΩ 的连接点就是分压中点,接 GP26)
# =============================
from machine import ADC, Pin
import time

adc = ADC(Pin(26))      # GP26 即 ADC0

print('开始读取光线强度...')

while True:
    value = adc.read_u16()
    # 光越强 → LDR 电阻越小 → 中点电压越高 → ADC 值越大
    light_level = value / 65535 * 100

    print(f'ADC 值: {value:5d}, 光线强度: {light_level:.1f}%')
    time.sleep(1)

进阶示例:光控开关(继电器模块控制灯)

# ============ 接线 ============
# 光线部分:LDR 一端 → 3V3,另一端 → GP26 并接 10kΩ → GND
# 继电器模块(已带驱动,GPIO 只给信号):
#   继电器模块 IN  → Pico GP15
#   继电器模块 VCC → Pico 3V3
#   继电器模块 GND → Pico GND
#   继电器模块的 COM / NO 接灯和电源(强电部分由模块隔离,别碰强电)
# =============================
from machine import ADC, Pin
import time

adc = ADC(Pin(26))
relay = Pin(15, Pin.OUT)         # 继电器模块信号脚

light_threshold = 30            # 低于 30% 视为天黑,开灯

print('光控开关示例')
print(f'光线强度低于 {light_threshold}% 时开灯')

while True:
    value = adc.read_u16()
    light_level = value / 65535 * 100

    if light_level < light_threshold:
        relay.on()               # 模块 IN 给高 → 吸合,开灯
        print(f'光线弱 ({light_level:.1f}%),开灯')
    else:
        relay.off()
        print(f'光线强 ({light_level:.1f}%),关灯')

    time.sleep(2)

应用示例:自动亮度调节(板载 LED)

# ============ 接线 ============
# 光线部分:LDR 一端 → 3V3,另一端 → GP26 并接 10kΩ → GND
# 板载 LED 在 GP25,用 PWM 调亮度(不用外接)
# =============================
from machine import ADC, Pin, PWM
import time

adc = ADC(Pin(26))
pwm = PWM(Pin(25))      # GP25 = 板载 LED
pwm.freq(1000)

print('自动亮度调节(光越暗灯越亮)')

while True:
    value = adc.read_u16()
    # 光线越强,LED 越暗;光线越弱,LED 越亮
    brightness = 65535 - value
    pwm.duty_u16(brightness)

    light_level = value / 65535 * 100
    led_brightness = brightness / 65535 * 100

    print(f'光线强度: {light_level:.1f}%, LED 亮度: {led_brightness:.1f}%')
    time.sleep(0.5)

注意事项

  • 分压电阻要接:光敏电阻不能单独一头接 3V3 一头接 GPIO,必须和 10kΩ 串联分压,中点才接 ADC
  • ADC 脚有限:光线、电位器、温度模拟量都只能用 GP26 / GP27 / GP28
  • 亮暗方向相反:本接法光越强 ADC 值越大;想要「光越强越亮」就用原始值,想要「光越暗越亮」就用 65535 - value
  • 阈值要现场调:不同 LDR、不同环境,30% 只是参考,实际在串口里看数值再定
  • 强电隔离:继电器控制灯/电器时,强电部分由继电器模块隔离,接线时手别碰 COM/NO 那侧

常见问题

Q: 读数一直是 65535(满值)上不去? A: 多半 10kΩ 那个接地没接好,或 LDR 两脚接反(变成下拉)。确认 LDR→3V3、10kΩ→GND、中点→GP26。

Q: 数值和环境光对不上 / 反了? A: LDR 两端对调即可翻转方向;阈值在串口读数基础上重新设定。

Q: 读数抖动大? A: 加多次平均(参考电位器平滑滤波示例),或在中点并一个小电容(0.1µF)到地。