首页
登录 | 注册

【Arduino和高中通用技术】——三、使用光照强度传感器

        这一篇介绍一个简单的传感器——光照强度传感器模块,它基于光敏电阻制造。使用传感器或者复杂的输出器件时,首先我们应该阅读它的文档,看一下它是否支持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语句。用鼠标指向它可以看到代码,或者右键点击——转到定义查看其原始定义。

        如果你手头恰好有人体传感器,可以尝试把这个小例子完善一下,当检测到人的时候才进行上面代码所进行的工作。同时需要注意,利用红外感应的人体传感器会受到可见光、发热体等的影响。



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号