当晚上来临,光线变暗,这时我们需要开灯。能否做一个聪明一点的开关呢,无需我们手动开灯,天黑了自动会把灯打开。如果我们有一个光线传感器,我们就可以制作一个自动感应环境光线的开关灯装置。白天光线充足的时候不亮灯,晚上天黑了就会自动点亮。

# 部署

我们希望每个场景触发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引脚。

# 程序搭建

首先了解一下流程

uml diagram

如果光线传感器的值(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毫秒
}
1
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 {
    //执行...
}
1
2
3
4
5

该程序测试 i 是否大于50。如果是, 程序执行特定的动作。换句话说,如果圆括号中的语句为真,大括号中的语句就会运行。否则,程序跳过该代码。(else意思是当上面条件不成立时,执行....代码)

# 操作视频