感光灯
使用光敏电阻控制LED明灭
这个示例中将介绍光敏电阻。在黑暗的环境中,光敏电阻具有非常高阻值的电阻。光线越强,电阻值反而越低。通过读取这个电阻值,就可以检查光线的亮暗了。我们这里选用的是光敏二极管,光敏二极管其实就是光敏电阻中的一种,只是它还具有正负极性。
当环境黑暗的时候,光敏电阻的阻值提高,LED变亮;当环境明亮的时候,LED变暗。
硬件要求
- Arduino板卡
- 光敏电阻
- 10k电阻
可选
- 220欧电阻
- LED灯
- 手电筒
电路
用三根线连接倾斜开关,其中红线通过10k欧姆电阻连接到5V电源,黑色连接到地线GND,且接电源的引脚也接到模拟引脚3。这里我们使用内置LED。如果需要使用外接LED,可以用220欧姆电阻和LED串联接通。注意,光敏二极管一般是反向使用的。长脚为正极,短脚为负极。
当光照变强的时候,光照电流变大,电压降低,输出的数值变小,当低于一个阈值的时候,灯就熄灭了。反之,光电流变小,电压提升,输出的数值变大,当高于一个阈值时,灯被点亮。
电路图
代码
编译并运行示例
cargo build
cargo run
使用VS Code的串行监视器,你会在终端看到一个读数,当你用手电筒等强光光源照射光敏原件时,读数会变低。当读数高于阈值,本例是1000时,LED灯会被点亮;而当读数低于1000时,LED灯熄灭。
在本示例中,连接10k电阻后,在黑暗环境里,读数为1023
,在普通日光灯环境下,读数为850-870
,在手机手电筒近距离照射下,读数为10-30
。如果数值变化不敏感,请检查下光敏二极管是否正确连接。
完整代码如下:
src/main.rs
/*!
* Photosensive Light
*
* When the environment goes dark, the resistance of the photoresistor increases and the LED becomes brighter;
* when the environment goes bright, the LED becomes darker.
*/
#![no_std]
#![no_main]
use arduino_hal::{
default_serial, delay_ms, entry, pins, prelude::_unwrap_infallible_UnwrapInfallible, Adc,
Peripherals,
};
use panic_halt as _;
#[entry]
fn main() -> ! {
let dp = Peripherals::take().unwrap();
let pins = pins!(dp);
let mut serial = default_serial!(dp, pins, 57600);
let mut adc = Adc::new(dp.ADC, Default::default());
let mut led = pins.d13.into_output();
let sensor = pins.a0.into_analog_input(&mut adc);
loop {
let sensor_value = sensor.analog_read(&mut adc);
ufmt::uwriteln!(&mut serial, "sensor value:{}", sensor_value).unwrap_infallible();
if sensor_value >1000 {
led.set_high();
} else {
led.set_low();
}
delay_ms(500);
}
}