这一篇介绍一个简单的传感器——光照强度传感器模块,它基于光敏电阻制造。使用传感器或者复杂的输出器件时,首先我们应该阅读它的文档,看一下它是否支持Arduino,如何使用,与类似产品对比哪种能更好的满足我们的需求。性价比往往是一个重要的衡量标准。
之前一篇我们介绍了呼吸灯,知道使用PWM可以调节LED的亮度,实际上PWM也用于调节电动机的转速等其他用途。这一篇我们对硬件和程序进行一些修改,使得LED灯在较暗的情况下更亮,反之亦然。
一、硬件
1、光传感器模块(光敏电阻也可以)
2、LED灯泡
3、面包板
4、杜邦线
首先,观察这个光传感器模块的接线,分别有A0,D0,GND,VCC,A0为模拟信号输出,D0为数字信号输出。因为我们需要模拟信号,所以:
传感器 A0 接 arduino A0(其他模拟口A1,A2....都可以)
传感器 GND 接 arduino GND
传感器 VCC 接 arduino 5V(查看你的传感器的文档支持5V还是3.3V,若都支持做实验时使用3.3V可以让它活久些)
LED负极 接 arduino GND
LED正极 接 arduino 3#
因为这个电路非常简单,就不画电路图了。
二、编写代码
注意:我的光传感器模块是随着光照增加其模拟值减小的(测量点位置决定的)。
/*
Name: Sketch1.ino
Created: 2019/2/10 20:33:27
Author: Administrator
*/
uint8_t PinLed = 3; //led正极
uint8_t PinLightsensor = A0; //光传感模块模拟数据接收引脚
//注意:我是用的光传感器模块是随着光照增加输出减小的。
int MaxLight = 850; //光传感器模块完全遮蔽时的输出值(实际值比这个略小)
int MinLight = 300; //光传感模块在灯光下完全裸露时的输出值(实际值比这个值略大)
// the setup function runs once when you press reset or power the board
void setup() {
pinMode(PinLed, OUTPUT);
pinMode(PinLightsensor, INPUT);
}
// the loop function runs over and over again until power down or reset
void loop() {
int curLight = analogRead(PinLightsensor); //读取光传感器当前值
int outVal = map(curLight, MinLight, MaxLight, 0, 255); //把光传感器的值映射到0-255(PWM输出范围),需要注意的是Map函数不会强制结果在0-255范围内(当curLight超出map函数的第二三两参数的范围时出现超出0-255的情况)。
outVal = constrain(outVal, 0, 255); //强制映射后的值在0-255范围内
analogWrite(PinLed,outVal ); //输出亮度,当光传感器得到的光照越少,那么LED就越亮
delay(100); //延时
}
在代码中我进行了较详细的注释,简单的解释一下:
1、把传感器的值映射到PWM输出的范围,然后将这个值输出到LED的引脚,这样就达到了不同光照时LED亮度不同的目的。
2、map函数有5个形参,第一个是要映射的值,第二三个是要映射的值的范围,第四五个是要映射到的范围,两组范围可以是最大值在前最小值在后,并且映射后的值不被强制限定在第四五个参数所确定的区间之内。关于这些可以自行测试或者参考官方文档。
3、constrain是一个宏,它把一个值强制限定在一个范围内,省去了我们使用一组IF语句。用鼠标指向它可以看到代码,或者右键点击——转到定义查看其原始定义。
如果你手头恰好有人体传感器,可以尝试把这个小例子完善一下,当检测到人的时候才进行上面代码所进行的工作。同时需要注意,利用红外感应的人体传感器会受到可见光、发热体等的影响。