差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
mp_traffic_light [2022/02/24 16:47] gongyusu |
mp_traffic_light [2022/02/24 21:26] (当前版本) gongyusu |
||
---|---|---|---|
行 1: | 行 1: | ||
## 交通灯的控制 | ## 交通灯的控制 | ||
微控制器在日常所有的电子产品中用到,包括交通灯。交通灯控制器是一种特殊的系统,它可以定时改变信号灯,观察行人是否要过马路,以及根据交通流量调整信号灯的时间,与附近的交通灯系统通话,以确保整个交通网络保持顺畅运行。虽然构建一个大规模的交通管理系统是一个相当先进的项目,但构建一个由树莓派[[rpi_pico|Pico]]驱动的微型模拟器就比较简单。在这个项目中,你将看到如何控制多个[[LED]],设置不同的时间,以及当程序的其余部分使用一种称为“线程”的技术继续运行时如何监测一个按键的输入。 | 微控制器在日常所有的电子产品中用到,包括交通灯。交通灯控制器是一种特殊的系统,它可以定时改变信号灯,观察行人是否要过马路,以及根据交通流量调整信号灯的时间,与附近的交通灯系统通话,以确保整个交通网络保持顺畅运行。虽然构建一个大规模的交通管理系统是一个相当先进的项目,但构建一个由树莓派[[rpi_pico|Pico]]驱动的微型模拟器就比较简单。在这个项目中,你将看到如何控制多个[[LED]],设置不同的时间,以及当程序的其余部分使用一种称为“线程”的技术继续运行时如何监测一个按键的输入。 | ||
+ | {{ :traffic_light.jpg |}}<WRAP centeralign> 交通灯的控制 </WRAP> | ||
### 1. 实现一个简单的交通灯 | ### 1. 实现一个简单的交通灯 | ||
行 8: | 行 9: | ||
* 绿色LED亮表示可以再次通行 | * 绿色LED亮表示可以再次通行 | ||
- | 要给你的交通灯编程,把你的Pico连接到你的树莓派或其它电脑,并加载[[thonny_ide|Thonny]]。创建一个新程序,并从导入machine库开始,这样你就可以控制你的Pico的GPIO引脚: | + | 要给我们的交通灯编程,先把我们的Pico连接到树莓派或其它电脑,并加载[[thonny_ide|Thonny]]。创建一个新程序,并从导入machine库开始,这样我们就可以控制[[rpi_pico|Pico]]的[[GPIO]]引脚: |
<code python> | <code python> | ||
行 75: | 行 76: | ||
</code> | </code> | ||
- | 此设置引脚GP12上的按钮用作行人的按键输入,引脚GP22上的蜂鸣器作为声音输出。因为树莓派Pico有内置的可编程输入电阻,我们将其设置为上拉模式。这意味着引脚的电压被拉到3.3V(它的逻辑电平是1),除非它连接到GND(在这种情况下,它的逻辑电平将是0)。 | + | 此设置引脚GP12上的按钮用作行人的按键输入,引脚GP22上的[[buzzer|蜂鸣器]]作为声音输出。因为树莓派[[rpi_pico|Pico]]有内置的可编程输入电阻,我们将其设置为上拉模式。这意味着引脚的电压被拉到3.3V(它的逻辑电平是1),除非它连接到GND(在这种情况下,它的逻辑电平将是0)。 |
接下来,您需要一种方法让您的程序不断监视按键的值。以前,你所有的程序都是通过一系列的指令一步一步地工作的,一次只做一件事。红绿灯程序也没有什么不同:当它运行时,[[MicroPython]]会一步一步地完成指令,打开和关闭led。 | 接下来,您需要一种方法让您的程序不断监视按键的值。以前,你所有的程序都是通过一系列的指令一步一步地工作的,一次只做一件事。红绿灯程序也没有什么不同:当它运行时,[[MicroPython]]会一步一步地完成指令,打开和关闭led。 | ||
行 131: | 行 132: | ||
现在单击Run按钮,我们会看到交通灯和以前一模一样,没有任何延误或停顿,这时候如果我们按下按钮,什么也不会发生,因为我们还没有添加对按钮作出实际反应的代码。 | 现在单击Run按钮,我们会看到交通灯和以前一模一样,没有任何延误或停顿,这时候如果我们按下按钮,什么也不会发生,因为我们还没有添加对按钮作出实际反应的代码。 | ||
- | 到主循环的开始部分,就在一行的正下方(while True:),并添加以下代码,记住要注意嵌套缩进,并在不再需要时删除[[Thonny_ide|Thonny]]添加的缩进: | + | 到主循环的开始部分,就在(while True:)这一行的后面添加以下代码,记住要注意嵌套缩进,并在不再需要时删除[[Thonny_ide|Thonny]]添加的缩进: |
<code python> | <code python> | ||
if button_pressed == True: | if button_pressed == True: | ||
行 170: | 行 171: | ||
button_pressed = True | button_pressed = True | ||
utime.sleep(0.01) | utime.sleep(0.01) | ||
+ | |||
_thread.start_new_thread(button_reader_thread, ()) | _thread.start_new_thread(button_reader_thread, ()) | ||
行 200: | 行 202: | ||
一开始的时候,程序按照正常模式运行 - 交通灯将以通常的模式开或关。 | 一开始的时候,程序按照正常模式运行 - 交通灯将以通常的模式开或关。 | ||
- | 按下按钮开关,如果程序目前处于循环的中间,什么也不会发生,直到它到达终点并再次循环, 这时红灯会变红,蜂鸣器会发出哔哔声,让你知道可以安全通过马路了。 | + | 按下按钮开关,如果程序目前处于循环的中间,什么也不会发生,直到它到达终点并再次循环, 这时红灯会变红,[[buzzer|蜂鸣器]]会发出哔哔声,让你知道可以安全通过马路了。 |
- | 检测过马路的条件部分的代码,是在我们刚才编写的在循环模式中打开、关闭灯的代码之前运行:完成之后, 模式将恢复到像往常一样 - 红色LED在原来点亮的基础上再亮五秒的时间,蜂鸣器也一直在响。 | + | 检测过马路的条件部分的代码,是在我们刚才编写的在循环模式中打开/关闭灯的代码之前运行,它完成之后, 模式将恢复到像往常一样 - 红色LED在原来点亮的基础上再亮五秒的时间,蜂鸣器也一直在响。 |
这是在模拟真正的过马路的方式, 即使蜂鸣器停止鸣叫,红灯仍然亮着,所以在蜂鸣器响着的时候开始过马路的人有时间在车辆允许通行之前到达另一边。 | 这是在模拟真正的过马路的方式, 即使蜂鸣器停止鸣叫,红灯仍然亮着,所以在蜂鸣器响着的时候开始过马路的人有时间在车辆允许通行之前到达另一边。 |