晓东
楼道中的声光双控灯是一种很常见的利用声音和光线信号来控制照明的电子装置,其应用场景是在光线昏暗时对一定强度的响声做出亮灯“回应”,持续十几秒钟后再关闭灯光照明,也就是必须要同时满足光线较暗和响声达到一定程度这两个条件才会“开灯”,否则一直处于“不工作”状态。在Arduino中,我们可以利用声音传感器和光线传感器来分别检测环境周围的声音与光线强弱,然后分别通过Arduino IDE代码编程、Python代码编程和Mind+图形化编程三种方式,实现“声光双控灯”功能。
实验器材:Arduino UNO主板一个,声音传感器一个,光线传感器一个,红色LED灯一支,面包板一块,各种颜色的杜邦线若干。
首先,将LED灯长腿插入13号引脚,短腿插入GND接地引脚;接着,将Arduino的5V和GND与面包板边缘插槽连接(红色与蓝色标注),再通过杜邦线将声音传感器和光线传感器的VCC正极和GND接地也插接至面包板;然后将声音传感器的OUT信号输出端连接至Arduino的2号数字引脚,光线传感器的AO模拟信号输出端连接至Arduino的A2模拟引脚;最后,通过数据线将Arduino与计算机USB接口连接(如图1)。
首先,在Arduino IDE中通过“int led = 13;”和“int SoundSensorPin = 2;”两个语句,分别对LED灯和声音传感器的连接引脚进行声明;接着,在setup()函数中通过“pinMode(led,OUTPUT);”和“pinMode(SoundSensorPin,INPUT);”两个语句,设置13号引脚为输出模式、2号引脚为输入模式。
在loop()函数中,先通过“int LightSensorValue
=analogRead(A2);”语句,建立变量LightSensorValue,其值是读取光线传感器通过A2模拟引脚的传输数据;再通过“int SoundSensorValue = digitalRead(SoundSensorPin);”语句,建立变量SoundSensorValue,其值是读取声音传感器通过2号数字引脚的传输数据。
经过实验测试后发现,正常室内光线时所测得的光线数据是220左右,用手捂住光线传感器(模拟低光照条件)时测得的光线数据是930左右,而用手电照射光线传感器时测得的光线数据是20左右,这说明光线越强,数据值越小,光线越弱,数据值越大。通过调节声音传感器上的电位器,使其处于一个比较合适的检测环境周围声音强度范围内,发现“没有声音”时的检测值是1(对应HIGH高电平),“有声音”时的检测值是0(对应LOW低电平)。因此在“if…else…”选择结构中将判断条件构建为“SoundSensorVal
ue == LOW and LightSensorValue >= 500”,也就是判断声音传感器的检测值是否为0、光线传感器的检测值是否在500以上,当这两个条件同时满足时,就应当去控制LED灯发光:“digitalWrite(led,HIGH);”,而且要让它持续发光3秒:“delay(3000);”。条件不成立的话,LED处于熄灭状态,在else分支中通过“digitalWrite(led,LOW);”语句来实现(如图2)。
将程序编译并上传Arduino,对声光双控灯进行测试:当室内光线处于正常照明状态时,音箱中音乐的强度再大,LED灯也不会亮;如果用手捂住光线传感器,此时再播放音乐的话,LED灯就会应声而亮(如图3)。同样,当光线传感器被捂住时,保持周围环境处于比较安静的状态,LED灯也不会发光。
借助pinpong库模块,在PythonIDLE编程环境中对Arduino进行代码编程。首先,通过“import time”和“from pinpong.board import Board,Pin”语句,导入time和pinpong库模块;“Board(“uno”).begin()”语句的作用是实现对Arduino UNO板型的初始化操作(包括连接主板端口号的自动识别);接着,分别建立led、SoundSensor和LightSensor三个变量,分别对应LED灯、声音传感器和光线传感器的声明设置,语句“led = Pin(Pin.D13, Pin.OUT)”的作用是设置连接在13号引脚的LED灯为信号输出端,语句“SoundSensor = Pin(Pin.D2, Pin.IN)”的作用是设置连接在2号数字引脚的声音传感器为信号输入端,语句“LightSensor = Pin(Pin.A2, Pin.ANALO
G)”的作用是设置连接在A2模拟引脚的光线传感器为模拟信号端。