课程导入

在我们初次尝试用某种语言进行编程时, Hello World 往往是我们编写的第一个程序,而能控制 LED 灯珠不断闪烁的 Blink 程序,就是电子硬件世界里的 Hello World 。这节课程我们就来尝试编写一个 Blink 程序,而要想完成该程序,需要使用程序三大基本结构中的循环结构。

知识锦囊

循环结构

与顺序结构不同,循环结构的程序会重复执行一个或多个指令。而根据重复执行的次数,循环结构又可以细分为有限循环结构和无限循环结构,有限循环结构的程序在执行时只会重复执行有限的次数,当其满足某个条件时,循环就会终止。而无限循环结构的程序会重复不断的一直循环下去。在 Python 中,我们常用的循环语句有 for 循环和 while 循环。

while 循环
我们先来看看利用 while 循环语句编写的程序:

  1. a = 0
  2. print("loop start")
  3. while a < 5:
  4. print(a)
  5. a = a + 1
  6. print("loop end")

程序先按照顺序结构进行执行,在程序的最开头,我们首先声明了一个变量 “a” ,并利用 print() 打印了一行字符 “loop start” 。

  1. a = 0
  2. print("loop start")
什么是变量?
变量,顾名思义,就是没有固定值,可以随时变化的量,我们可以用变量来储存数据,方便在之后的程序中调用。在程序中变量一般由两个属性:变量名和变量值组成。变量值可以方便我们存储数据,而当我们在同一程序中使用多个变量时,变量名能帮助我们区分和调用所需变量。
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。

而接下来,我们使用 while 语句创造了一个有限循环结构,并规定程序在变量 “a” 小于5时,会重复不断的执行 while 语句内的指令,即打印输出 a的值,并将 a 加一,直到 a 大于等于5为止。

  1. while a < 5:
  2. print(a)
  3. a = a + 1

程序的输出结果为:

  1. loop start
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. loop end

观察示例程序的执行结果可以发现,程序在执行完 while 语句内的多次循环后,才开始执行最后的 print() 语句。
那么,电脑是如何知道哪些语句是在 while 循环语句内需要被重复执行的语句,哪些语句又是在 while 循环语句外的呢?和其它编程语言(如 Java、C 语言)采用大括号 “{}” 分隔代码块不同,MicroPython 采用缩进和冒号( : )来区分代码块之间的层次,这样的改变,使得 MicroPython 编写出的代码层次分明,易于理解。

Python 对代码的缩进要求非常严格,同一级别的代码块缩进量必须一致。在一般情况下我们可以使用空格或者 Tab 键完成缩进,但无论是手动敲击多个空格,还是使用 Tab 键进行缩进,通常情况下我们都采用 4 个空格长度作为一个缩进量(默认情况下,一个 Tab 键就表示 4 个空格)。

for 循环
for 循环一般被用于遍历一个序列中的所有元素,例如:

  1. for i in range(10):
  2. print(i)

程序的执行结果为:

  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9

其中,range() 是 MicroPython 的一个内置函数,它可以创建一个整数列表,一般我们会在 for 循环中使用该函数。例如 range(10) ,就创建了一个包含从0到9共9个整数的整数列表。
在该程序中,我们使用 for 循环对其进行遍历,再使用 print() 打印,即可将其中所有的整数输出到交互区。

实践操作

项目一:for 循环控制灯的亮灭

在该项目中,我们尝试通过 for 循环来控制 LED 灯亮灭,实现闪烁的灯效。

硬件连接

在该项目中,我们需要使用的电子硬件有:

  • 树莓派 Pico
  • 树莓派 Pico 拓展板
  • Grove - LED 灯

同样,我们将 LED灯 接在D16接口。
页面_3.png
在上一节课程中,我们已经可以控制 LED灯 的打开和关闭了,要实现最终的 Blink 程序,我们只需要在上一节课程的程序上进行修改即可。

编写程序

首先,我们来试试这样修改程序:

  1. import machine
  2. LED = machine.Pin(16,machine.Pin.OUT)
  3. LED.value(1)
  4. LED.value(0)

点击运行按钮,观察 LED 灯我们可以发现,LED 灯只是极快的闪烁了一下,这是因为:

  1. 程序执行的速度非常快,导致闪烁效果并不明显
  2. 我们没有为程序设置循环结构,闪烁部分的程序只执行了一次

首先来解决第一个问题,既然问题是程序运行过快,那么我们在每次 LED 灯开关之间设置一个延迟即可。
在程序的开头,我们又引入了一个新的函数库: utime

utime函数库
utime 函数库是 MicroPython 的标准库之一,其中的函数为我们提供了获取时间和日期、测量时间间隔、设置延时等与时间相关的功能。
其中常用的函数有:
- 声明所使用的库 - import utime
- 休眠给定秒数的时间 - utime.sleep(seconds)
- 休眠给定毫秒数的时间 - utime.sleep_ms(ms)
- 将以秒数计数的时间转换为年月日形式 - utime.localtime([secs])
  1. import machine
  2. import utime

接着,我们需要使用 utime 中的 sleep 函数在每次对LED灯进行操作的程序后添加延时。

  1. LED.value(1)
  2. utime.sleep(1)
  3. LED.value(0)
  4. utime.sleep(1)

当你没有设置单位时, sleep 函数的默认单位是秒,通过修改程序,我们已经将每次亮灯和关闭的时间都设置为了1秒钟。
我们先来试试使用 for 循环简单的控制 LED灯 的亮灭,程序如下所示:

  1. import machine
  2. import utime
  3. LED = machine.Pin(16,machine.Pin.OUT)
  4. for i in range(10):
  5. LED.value(1)
  6. utime.sleep(1)
  7. LED.value(0)
  8. utime.sleep(1)

image.png
执行该程序,我们可以发现,LED 灯在循环亮灭10次后就停止了闪烁,这是因为我们使用 range() 函数创建的整数列表中只有 10 个整数,所以 for 循环只进行了 10 次循环,当我们将 range(10 )修改为 range(20) , LED 灯就会循环亮灭20次了。
当然,不管我们将这个数值设置为多少,该循环始终是一个有限循环,如果要让程序重复不停的一直执行下去,我们就需要使用无限循环结构来编写程序。

项目二:while 循环实现 Blink

在该项目中,我们尝试使用 while 循环实现 LED 灯一直闪烁的效果。

编写程序

使用 while 循环,我们能很容易的让程序无限循环重复执行下去。
我们只需要将程序中的 for i in range(10) 修改为 while True 即可:

  1. while True
  2. LED.value(1)
  3. utime.sleep(1)
  4. LED.value(0)
  5. utime.sleep(1)

while True 也是 while 循环语句的一种用法,与一般只有在满足某一条件时才执行循环的 while 循环语句不同,while True 属于无限循环语句,即代表除非人为的终止,否则程序会重复不断的一直循环执行下去。
这样程序就完成了,完整的代码如下:

  1. import machine
  2. import utime
  3. LED = machine.Pin(16,machine.Pin.OUT)
  4. while True:
  5. LED.value(1)
  6. utime.sleep(1)
  7. LED.value(0)
  8. utime.sleep(1)

image.png
同样点击运行按钮,连接到拓展板上的 LED灯 就会开始闪烁了,除非人为的终止这个进程(比如说断电),不然 LED 灯会一直闪烁下去。
while 循环实现 Blink.mp4

思维拓展

请尝试使用两种循环结构,以及 sleep() 函数,实现不同的灯光效果,比如可以减少延时的时间,灯光会闪烁的更快。

  1. import machine
  2. import utime
  3. LED = machine.Pin(16,machine.Pin.OUT)
  4. while True:
  5. LED.value(1)
  6. utime.sleep(0.1)
  7. LED.value(0)
  8. utime.sleep(0.1)
  9. LED.value(0)
  10. utime.sleep(0.1)

image.png