当晚上来临,光线变暗,这时我们需要开灯。能否做一个聪明一点的开关呢,无需我们手动开灯,天黑了自动会把灯打开。如果我们有一个光线传感器,我们就可以制作一个自动感应环境光线的开关灯装置。白天光线充足的时候不亮灯,晚上天黑了就会自动点亮。
# 部署
我们希望每个场景触发LED点亮的环境光亮度不一样,那就增加一个电位器来调节光线感应的阀值。可以调节电位器的值,让光线传感器的值来与之对比。当光线变化时,如果光线传感器的值小于电位器当前值,那LED就触发点亮程序。
1.LCD的接口RS-D7
分别连接到OSEPP UNO的2~7
号引脚。
2.光线传感器Light Sensor
的端子接到OSEPP UNO的A0
引脚。
3.LED4
的端子连接到OSEPP UNO的9
号引脚。
4.电位器POT1
接到OSEPP UNO的A1
引脚。
# 程序搭建
首先了解一下流程
如果光线传感器的值(A0)小于电位器的值(A1),9号引脚输出高电平,点亮LED。否则9号引脚输出低电平,LED熄灭。
- oseppBlock程序
- Arduino程序
#include <LiquidCrystal.h>
LiquidCrystal lcd1(2, 3, 4, 5, 6, 7); //定义LCD引脚
void setup()
{
//led1
pinMode(9, OUTPUT); //定义LED
//light1
pinMode(A0, INPUT); //定义光线传感器
//potentiometer1
pinMode(A1, INPUT); //定义电位器接到的引脚
lcd1.begin(16, 2); //LCD初始化
}
void loop()
{
if (analogRead(A0) < analogRead(A1)) //比较两个值,如果光线传感器的值小于电位器的值
{
digitalWrite(9, HIGH); //点亮LED
}
else //否则
{
digitalWrite(9, LOW); //LED熄灭
}
lcd1.clear(); //清屏
lcd1.setCursor(0, 0); //显示光标定位
lcd1.print("L:"); //显示字符,字符里的:要用半角
lcd1.print(analogRead(A0)); //显示光线传感器的值
lcd1.setCursor(0, 1); //显示光标定位
lcd1.print("P:"); //显示字符
lcd1.print(analogRead(A1)); //显示电位器的值
delay(1000); //延时1000毫秒
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 运行结果
LCD第一行L:xxx
显示的是光线传感器当前的值,第二行P:xxx
显示的是电位器的值,也就是我们需要设置触发的阈值。当环境光变暗时,传感器的值就会变小,只要传感器的值小于设定值,LED就会点亮。否则LED处于熄灭状态。调节电位器的值,就能设定LED在何种光线强度下触发。
# 解析
- 比较运算
比较是程序里面经常用到的一种数学运算。
运算符名称 | 运算符简写 | 描述 | 例子 |
---|---|---|---|
等于 | == | 检查两个操作数的值是否相等,如果相等,则条件为真(true)。 | (2 == 3)不为真 |
不等于 | != | 检查两个操作数的值是否相等,如果值不相等,则条件为真。 | (2 != 3)为真 |
小于 | < | 检查左操作数的值是否小于右操作数的值,如果是,则条件为真。 | (2 < 3)为真 |
大于 | > | 检查左操作数的值是否大于右操作数的值,如果是,则条件为真。 | (2 > 3)不为真 |
小于或等于 | <= | 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。 | (2 <= 3)为真 |
大于或等于 | >= | 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真。 | (2 >= 3)不为真 |
- 条件语句
如果条件为真就执行动作A,否则执行动作B。
if(条件) and ==, !=, <, > (比较运算符)
if,用于和比较运算符联合使用,测试某一条件是否成立。
if (i > 50) {
//执行动作
} else {
//执行...
}
2
3
4
5
该程序测试 i
是否大于50。如果是, 程序执行特定的动作。换句话说,如果圆括号中的语句为真,大括号中的语句就会运行。否则,程序跳过该代码。(else
意思是当上面条件不成立时,执行....代码)