课程导入
在我们初次尝试用某种语言进行编程时, Hello World 往往是我们编写的第一个程序,而能控制 LED 灯珠不断闪烁的 Blink 程序,就是电子硬件世界里的 Hello World 。这节课程我们就来尝试编写一个 Blink 程序,而要想完成该程序,需要使用程序三大基本结构中的循环结构。
知识锦囊
循环结构
与顺序结构不同,循环结构的程序会重复执行一个或多个指令。而根据重复执行的次数,循环结构又可以细分为有限循环结构和无限循环结构,有限循环结构的程序在执行时只会重复执行有限的次数,当其满足某个条件时,循环就会终止。而无限循环结构的程序会重复不断的一直循环下去。在 Python 中,我们常用的循环语句有 for 循环和 while 循环。
while 循环
我们先来看看利用 while 循环语句编写的程序:
a = 0
print("loop start")
while a < 5:
print(a)
a = a + 1
print("loop end")
程序先按照顺序结构进行执行,在程序的最开头,我们首先声明了一个变量 “a” ,并利用 print() 打印了一行字符 “loop start” 。
a = 0
print("loop start")
什么是变量? 变量,顾名思义,就是没有固定值,可以随时变化的量,我们可以用变量来储存数据,方便在之后的程序中调用。在程序中变量一般由两个属性:变量名和变量值组成。变量值可以方便我们存储数据,而当我们在同一程序中使用多个变量时,变量名能帮助我们区分和调用所需变量。 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 |
---|
而接下来,我们使用 while 语句创造了一个有限循环结构,并规定程序在变量 “a” 小于5时,会重复不断的执行 while 语句内的指令,即打印输出 a的值,并将 a 加一,直到 a 大于等于5为止。
while a < 5:
print(a)
a = a + 1
程序的输出结果为:
loop start
0
1
2
3
4
loop end
观察示例程序的执行结果可以发现,程序在执行完 while 语句内的多次循环后,才开始执行最后的 print() 语句。
那么,电脑是如何知道哪些语句是在 while 循环语句内需要被重复执行的语句,哪些语句又是在 while 循环语句外的呢?和其它编程语言(如 Java、C 语言)采用大括号 “{}” 分隔代码块不同,MicroPython 采用缩进和冒号( : )来区分代码块之间的层次,这样的改变,使得 MicroPython 编写出的代码层次分明,易于理解。
Python 对代码的缩进要求非常严格,同一级别的代码块缩进量必须一致。在一般情况下我们可以使用空格或者 Tab 键完成缩进,但无论是手动敲击多个空格,还是使用 Tab 键进行缩进,通常情况下我们都采用 4 个空格长度作为一个缩进量(默认情况下,一个 Tab 键就表示 4 个空格)。 |
---|
for 循环
for 循环一般被用于遍历一个序列中的所有元素,例如:
for i in range(10):
print(i)
程序的执行结果为:
0
1
2
3
4
5
6
7
8
9
其中,range() 是 MicroPython 的一个内置函数,它可以创建一个整数列表,一般我们会在 for 循环中使用该函数。例如 range(10) ,就创建了一个包含从0到9共9个整数的整数列表。
在该程序中,我们使用 for 循环对其进行遍历,再使用 print() 打印,即可将其中所有的整数输出到交互区。
实践操作
项目一:for 循环控制灯的亮灭
在该项目中,我们尝试通过 for 循环来控制 LED 灯亮灭,实现闪烁的灯效。
硬件连接
在该项目中,我们需要使用的电子硬件有:
- 树莓派 Pico
- 树莓派 Pico 拓展板
- Grove - LED 灯
同样,我们将 LED灯 接在D16接口。
在上一节课程中,我们已经可以控制 LED灯 的打开和关闭了,要实现最终的 Blink 程序,我们只需要在上一节课程的程序上进行修改即可。
编写程序
首先,我们来试试这样修改程序:
import machine
LED = machine.Pin(16,machine.Pin.OUT)
LED.value(1)
LED.value(0)
点击运行按钮,观察 LED 灯我们可以发现,LED 灯只是极快的闪烁了一下,这是因为:
- 程序执行的速度非常快,导致闪烁效果并不明显
- 我们没有为程序设置循环结构,闪烁部分的程序只执行了一次
首先来解决第一个问题,既然问题是程序运行过快,那么我们在每次 LED 灯开关之间设置一个延迟即可。
在程序的开头,我们又引入了一个新的函数库: utime
utime函数库 utime 函数库是 MicroPython 的标准库之一,其中的函数为我们提供了获取时间和日期、测量时间间隔、设置延时等与时间相关的功能。 其中常用的函数有: - 声明所使用的库 - import utime - 休眠给定秒数的时间 - utime.sleep(seconds) - 休眠给定毫秒数的时间 - utime.sleep_ms(ms) - 将以秒数计数的时间转换为年月日形式 - utime.localtime([secs]) |
---|
import machine
import utime
接着,我们需要使用 utime 中的 sleep 函数在每次对LED灯进行操作的程序后添加延时。
LED.value(1)
utime.sleep(1)
LED.value(0)
utime.sleep(1)
当你没有设置单位时, sleep 函数的默认单位是秒,通过修改程序,我们已经将每次亮灯和关闭的时间都设置为了1秒钟。
我们先来试试使用 for 循环简单的控制 LED灯 的亮灭,程序如下所示:
import machine
import utime
LED = machine.Pin(16,machine.Pin.OUT)
for i in range(10):
LED.value(1)
utime.sleep(1)
LED.value(0)
utime.sleep(1)
执行该程序,我们可以发现,LED 灯在循环亮灭10次后就停止了闪烁,这是因为我们使用 range() 函数创建的整数列表中只有 10 个整数,所以 for 循环只进行了 10 次循环,当我们将 range(10 )修改为 range(20) , LED 灯就会循环亮灭20次了。
当然,不管我们将这个数值设置为多少,该循环始终是一个有限循环,如果要让程序重复不停的一直执行下去,我们就需要使用无限循环结构来编写程序。
项目二:while 循环实现 Blink
在该项目中,我们尝试使用 while 循环实现 LED 灯一直闪烁的效果。
编写程序
使用 while 循环,我们能很容易的让程序无限循环重复执行下去。
我们只需要将程序中的 for i in range(10) 修改为 while True 即可:
while True:
LED.value(1)
utime.sleep(1)
LED.value(0)
utime.sleep(1)
while True 也是 while 循环语句的一种用法,与一般只有在满足某一条件时才执行循环的 while 循环语句不同,while True 属于无限循环语句,即代表除非人为的终止,否则程序会重复不断的一直循环执行下去。
这样程序就完成了,完整的代码如下:
import machine
import utime
LED = machine.Pin(16,machine.Pin.OUT)
while True:
LED.value(1)
utime.sleep(1)
LED.value(0)
utime.sleep(1)
同样点击运行按钮,连接到拓展板上的 LED灯 就会开始闪烁了,除非人为的终止这个进程(比如说断电),不然 LED 灯会一直闪烁下去。
while 循环实现 Blink.mp4
思维拓展
请尝试使用两种循环结构,以及 sleep() 函数,实现不同的灯光效果,比如可以减少延时的时间,灯光会闪烁的更快。
import machine
import utime
LED = machine.Pin(16,machine.Pin.OUT)
while True:
LED.value(1)
utime.sleep(0.1)
LED.value(0)
utime.sleep(0.1)
LED.value(0)
utime.sleep(0.1)