一、项目设计思路
基于STEP Pico的嵌入式系统学习平台设计一个交通灯控制器,使用MicroPython进行编程。
具体要求:仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的灯模拟道路红绿灯状态的切换,行人按键时,具有优先功能
设计思路:
(1)利用板上的12个三色灯模拟交通信号灯,程序会轮流切换三个灯的状态,模拟交通信号灯红、黄、绿三种颜色等的交替。
(2)利用板上的按键模拟行人按键,且行人按键时,具有优先功能,但不对本轮造成影响,即在下一轮时,延长一定红灯的时间,并在OLED显示屏提示,同时延长时间内点亮红色LED灯用以区分延时红灯和正常红灯。
(3)利用OLED显示屏,显示倒计时,红灯延长时间不进行倒计时。
设计流程图:
二、硬件介绍:
基于树莓派Pico的嵌入式系统学习平台STEP Pico,专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用
树莓派Pico扩展板 x1
硬禾版本树莓派Pico核心模块 - STEP Pico x1
Type-C 数据线 x1
15节MicroPython配套课程 x1
板卡包括:
2个按键输入
4个单色LED
12个WS2812B RGB三色灯
1个姿态传感器
1个128*64 OLED显示屏
1个蜂鸣器
1个可调电位计(用于电压表)
1路音频信号输入(用于示波器)
8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
STEP Pico核心模块原理图:
环境配置:
1.编程软件:thonny平台
Thonny是专门针对python初学者量身打造的一款超级强大的编程学习类电脑软件,内置丰富的学习功能,该软件帮助用户通过简单的编程开发来学习到所有的Python编程语言,在短时间内完成入门学习。本次使用MicroPython进行编程。
2.项目发布平台:2023寒假一起练平台——基于STEP Pico的嵌入式系统学习平台
平台上详细介绍了项目基本信息,所使用板件的详细结构和功能,平台还包括免费提供学习的开源代码信息。平台的硬禾学堂还包括详细的15节MicroPython编程课程的学习,平台还有具体的项目开始和结束时间。
三.实现的功能及图片展示:
(1)利用板上的12个三色灯模拟交通信号灯,程序会轮流切换三个灯的状态,模拟交通信号灯红、黄、绿三种颜色等的交替。
如图板子上12颗灯可以显示出红、黄、绿三种颜色,并根据程序进行交替。
(2)利用板上的按键模拟行人按键,且行人按键时,具有优先功能,但不对本轮造成影响,即在下一轮时,延长一定红灯的时间,并在OLED显示屏提示,同时延长时间内点亮红色LED灯用以区分延时红灯和正常红灯。
如图,按下按键后,下一轮红灯之前会先进行红灯延时部分,OLED显示屏上有相关提示,同时延时时间内红色LED灯被用以区分延时红灯和正常红灯。
(3)利用OLED显示屏,显示倒计时,红灯延长时间不进行倒计时。
如上图所示,OLED显示屏成功显示倒计时,且红灯延长时间内仅提示不进行倒计时。
四、主要代码片段及说明
1.点亮红,黄,绿灯
#点亮红,黄,绿灯
def red():
ws2812b.on_all("#ff0000")
def yellow():
ws2812b.on_all("#ffff00")
def green():
ws2812b.on_all("#00ff00")
定义函数,具体分别实现点亮红,黄,绿灯的功能
2.屏幕显示
#屏幕显示
def print_a(a):
oled.text(a,0,30)
oled.show()
oled.fill(0)
定义函数,实现屏幕显示的功能。
3.屏幕显示倒计时
#屏幕显示倒计时
def loop(t):
for i in range(t):
print_a("0"+str(t-i))
time.sleep(1)
定义一个循环函数,每次运行持续时间为一秒并在屏幕显示循环剩余次数,从而达到倒计时的功能。
4.按键功能
if k1.value() == True: #判断行人是否按下按钮
r.on()
red()
print_a("red +8s")
time.sleep(8)
r.off()
首先判断是否按键,确认按键后首先点亮红色LED灯,同时将十二枚三色灯也点亮为红色,OLED显示屏同时给出延时提示,延时结束后关闭红色LED灯继续进行后续程序。按键功能只干涉下一轮循环,不会对当前循环造成影响。
5.红绿灯正常运行
red() #红绿灯正常运行
loop(8)
yellow()
loop(2)
green()
loop(8)
yellow()
loop(2)
此部分为红绿灯正常运行程序,依次点亮红黄绿黄灯。并进行倒计时。
6.整体代码:
import time
import ws2812b
from button import k1
from oled import oled
from board import pin_cfg
from led import r
#点亮红,黄,绿灯
def red():
ws2812b.on_all("#ff0000")
def yellow():
ws2812b.on_all("#ffff00")
def green():
ws2812b.on_all("#00ff00")
#屏幕显示
def print_a(a):
oled.text(a,0,30)
oled.show()
oled.fill(0)
#屏幕显示倒计时
def loop(t):
for i in range(t):
print_a("0"+str(t-i))
time.sleep(1)
while True:
if k1.value() == True: #判断行人是否按下按钮
r.on()
red()
print_a("red +8s")
time.sleep(8)
r.off()
red() #红绿灯正常运行
loop(8)
yellow()
loop(2)
green()
loop(8)
yellow()
loop(2)
四、遇到的主要难题及解决方法
实验项目的具体内容相关课程已经做了详细的介绍,这次遇到的难题是怎样利用OLED显示屏进行倒计时,开始不知道该怎样编写函数,最后利用单个小循环函数的方式,成功在OLED屏幕上显示了倒计时。
五、未来的计划或建议
就这次的板卡而言实现所需的功能已经绰绰有余,而且有更多功能等着我去学习利用。未来可能会利用平台学习更多相关且有趣的知识,希望平台能继续丰富硬件板卡以及相关课程,给我们带来更多丰富有趣的学习体验。