|
| 1 | +# 开发一个夜灯 - 树莓派 |
| 2 | + |
| 3 | +在这个部分的课程中,你会把一个LED加到树莓派上并使用它来创建一个夜灯。 |
| 4 | + |
| 5 | +## 硬件 |
| 6 | + |
| 7 | +现在夜灯需要一个执行器。 |
| 8 | + |
| 9 | +这个执行器是**LED**,一个[发光二极管](https://wikipedia.org/wiki/Light-emitting_diode),当电流通过它时会发光。这是一个有两个打开或者关闭状态的数字执行器,发送一个1值把灯打开,发送0把灯关闭。这个LED是一个外部Grove执行器,而且需要被连接到树莓派上的Grove基础扩展板。 |
| 10 | + |
| 11 | +这个夜灯的逻辑用伪代码表示是: |
| 12 | + |
| 13 | +```output |
| 14 | +检查光照等级。 |
| 15 | +如果光照小于300 |
| 16 | + 打开LED |
| 17 | +否则 |
| 18 | + 关闭LED |
| 19 | +``` |
| 20 | + |
| 21 | +### 连接LED |
| 22 | + |
| 23 | +Grove LED 作为一个模块出现,以及一系列可供你选择颜色的LED。 |
| 24 | + |
| 25 | +#### 任务 - 连接LED |
| 26 | + |
| 27 | +连接LED。 |
| 28 | + |
| 29 | + |
| 30 | + |
| 31 | +1. 选择你最喜欢的LED然后把引脚插到LED模块的两个洞里面。 |
| 32 | + |
| 33 | + LED是发光二极管,而且二极管是只允许电流单个方向通过的电子设备。这意味LED需要被连接在正确的方向,不然就不会工作。 |
| 34 | + |
| 35 | + LED引脚中的一个是正极引脚,另一个是负极引脚。LED不是完全的圆形,而且在一边是有些平的。这略平的一边是负极引脚。当你连接LED到这个模块的时候,需要确保圆形这边的引脚是连接到模块上外边标着 **+** 的插孔,而扁平的这边是连接到靠近模块中间的插孔。 |
| 36 | + |
| 37 | +1. LED模块有一个允许你控制亮度的旋转按钮,用一个小十字螺丝起子逆时针旋转它拧到头来完全打开它。 |
| 38 | + |
| 39 | +1. 把Grove线缆的一端插到LED模块的插孔中,这个只能从一个方向插入。 |
| 40 | + |
| 41 | +1. 在树莓派断电的情况下,把Grove线缆的另一端连接到树莓派上插着的Grove基础扩展板标着 **D5** 的数字插孔。这个插孔在靠近GPIO引脚的一排,左数第二个。 |
| 42 | + |
| 43 | + |
| 44 | + |
| 45 | +## 编写夜灯程序 |
| 46 | + |
| 47 | +现在夜灯可以用Grove光照传感器和Grove LED来编码了。 |
| 48 | + |
| 49 | +### 任务 - 编写夜灯程序 |
| 50 | + |
| 51 | +编写夜灯程序 |
| 52 | + |
| 53 | +1. 打开树莓派并等待启动完成。 |
| 54 | + |
| 55 | +1. 直接在树莓派上或者通过远程SSH扩展,打开你在这个作业上一部分创建的VS Code中的夜灯项目。 |
| 56 | + |
| 57 | +1. 把下面的代码加到`app.py`文件中来导入一个需要的函数库。这一行需要加在文件顶部,在其他`import`代码行下面。 |
| 58 | + |
| 59 | + ```python |
| 60 | + from grove.grove_led import GroveLed |
| 61 | + ``` |
| 62 | + `from grove.grove_led import GroveLed`语句从Grove Python函数库中导入了`GroveLED`。这个函数库中有和Grove LED交互的代码。 |
| 63 | + |
| 64 | +1. 把下面的代码加到`light_sensor`声明之后来创建一个管理LED的类的实例: |
| 65 | + |
| 66 | + ```python |
| 67 | + led = GroveLed(5) |
| 68 | + ``` |
| 69 | + |
| 70 | + `led = GroveLed(5)`这一行创建了一个连接到 **D5** 引脚的`GroveLED`类的实例,**D5** 也就是LED连接的那个数字Grove引脚。 |
| 71 | + |
| 72 | + > 💁 所有的插孔都有唯一的引脚号,引脚0、2、4和6是模拟引脚,引脚5、16、18、22、24和26是数字引脚。 |
| 73 | + |
| 74 | +1. 在`while`循环中增加一个判断,在`time.sleep`之前来检查光照等级并控制LED打开或者关闭: |
| 75 | + |
| 76 | + ```python |
| 77 | + if light < 300: |
| 78 | + led.on() |
| 79 | + else: |
| 80 | + led.off() |
| 81 | + ``` |
| 82 | + |
| 83 | + 这块代码检查了`light`的值,如果小于300就调用`GroveLED`类的`on`方法,来发送一个数字值1到LED,把它点亮。如果`light`值大于或等于300,就调用`off`方法,发送一个数字值0给LED,把它关闭。 |
| 84 | + |
| 85 | + > 💁 这段代码需要放到while循环里面,缩进到和`print('Light level:', light)`行一个水平。 |
| 86 | + |
| 87 | + > 💁 当发送数字值到执行器的时候,0值就是0v,1值就是设备的最大电压。对于插着Grove传感器和执行器的树莓派而言,1的电压就是3.3V。 |
| 88 | + |
| 89 | +1. 从VS Code终端,运行下面的命令来运行你的Python应用: |
| 90 | + |
| 91 | + ```sh |
| 92 | + python3 app.py |
| 93 | + ``` |
| 94 | + |
| 95 | + 光照值在终端里输出。 |
| 96 | + |
| 97 | + ```output |
| 98 | + pi@raspberrypi:~/nightlight $ python3 app.py |
| 99 | + Light level: 634 |
| 100 | + Light level: 634 |
| 101 | + Light level: 634 |
| 102 | + Light level: 230 |
| 103 | + Light level: 104 |
| 104 | + Light level: 290 |
| 105 | + ``` |
| 106 | + |
| 107 | +1. 遮挡或者揭开光照传感器,会观察到光照等级等于300或更小时LED会点亮,如果光照等级比300大LED就会关闭。 |
| 108 | + |
| 109 | + > 💁 如果LED没有点亮,确保它是正确方向连接的,而且旋转按钮是设置成全开的。 |
| 110 | + |
| 111 | + |
| 112 | + |
| 113 | +> 💁 你可以在[code-actuator/pi](../code-actuator/pi)文件夹里找到这份代码。 |
| 114 | + |
| 115 | +😀 你的夜灯程序就成功了! |
0 commit comments