一、项目选择
本次选择项目2 - 制作一个交通灯控制器
项目具体要求:仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能
二、软硬件简介
软件部分:
本次项目根据教程使用的是官方推荐的开发软件thonny,目前使用感受:简洁,无需复杂配置,安装好即可开始使用,上手难度极低。
硬件简介:
1-扩展板硬件资料:
2个按键输入
4个单色LED
12个WS2812B RGB三色灯
1个姿态传感器
1个128*64 OLED显示屏
1个蜂鸣器
1个可调电位计(用于电压表)
1路音频信号输入(用于示波器)
8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
2-核心模块:
硬禾版本树莓派Pico (RP2040主控)
3-配套数据线(看到好多小伙伴数据线有问题,我还是直接使用硬禾平台官方认证版)
三、程序流程图:
四、实现部分:
首先将开发板和电脑连接,在thonny中选择对应串口。
根据笛子老师的入门课程,将编写好的库和类文件(bsp文件夹内容)复制到Pico中。
然后我们将需要用到的按键button, 时间 time,彩灯ws2812b,oled库文件导入。
from button import k1, k2
import time, ws2812b
from oled import spi,oled
参考例程中初始化先清除屏幕显示。
oled.fill(0)
接下来使用了三个自定义函数将主循环的代码进行了缩减,分别是stay_on_led_1和stay_on_led_2实现红绿灯长亮和红黄灯长亮、屏幕倒计时。使用flashing_led实现单向的绿灯闪烁、屏幕倒计时。
def flashing_led(rgb_1,rgb_2,color,flash_num):#
for i in range(flash_num+1,1,-1):
oled.fill(0)
ws2812b.off(rgb_1)
ws2812b.off(rgb_2)
oled.text(str(i),55,25)
oled.show()
time.sleep(0.5)
ws2812b.on(rgb_1,color)
ws2812b.on(rgb_2,color)
time.sleep(0.5)
def stay_on_led_2(rgb_1_1,rgb_1_2,color_1,stay_time,rgb_2_1,rgb_2_2,color_2):
x1 = 4
x2 = 4
if stay_time ==1:
x1 = 0
x2 = 0
else:
if k2.value() == True:
x1= x1 + 3
print("--k2 is pressed--")#k2检测到按下之后下一次竖向绿灯将延长3秒
print(x1)
for i in range(stay_time+x1, x2, -1):从大到小显示倒计时,显示闪烁前绿灯长亮和闪烁后黄灯亮的计时,staytime+x1默认为9,按下k2则变化,x2为相对固定值,绿灯长亮时为4,黄灯亮起时为0
oled.fill(0)
ws2812b.on(rgb_2_1,color_2)
ws2812b.on(rgb_2_2,color_2)
oled.text(str(i),55,25)
oled.show()
time.sleep(0.6)#纵向红灯亮起延迟0.6秒横向变绿
ws2812b.on(rgb_1_1,color_1)
ws2812b.on(rgb_1_2,color_1)
time.sleep(0.4)
def stay_on_led_1(rgb_1_1,rgb_1_2,color_1,stay_time,rgb_2_1,rgb_2_2,color_2):
x1 = 4
x2 =4
if stay_time ==1:
x1 = 0
x2 = 0
else:
if k1.value() == True:
x1= x1 - 2 #x的计算值不可小于0,否则会出现双向绿灯
print("==k1 is pressed==")#k1检测到按下之后下一次竖向绿灯将延长3秒
print(x1)
for i in range(stay_time+x1,x2,-1):
oled.fill(0)
ws2812b.on(rgb_1_1,color_1)
ws2812b.on(rgb_1_2,color_1)
oled.text(str(i),55,25)
oled.show()
time.sleep(0.6)#横向红灯亮起 延迟0.6秒纵向变绿
ws2812b.on(rgb_2_1,color_2)
ws2812b.on(rgb_2_2,color_2)
time.sleep(0.4)
长亮自定义函数中定义了x1和x2两个临时变量,x1主要为默认状态(按键无操作)下,倒计时开始的循环次数,x2主要用于确定倒计时结束时的循环次数。
主循环中采用自定义函数进行。
while True:
#ws2812b.on(12,"ffffff")#白色
#ws2812b.on(1,"00ff00")#绿色
#ws2812b.on(2,"0000ff")#深蓝
#ws2812b.on(3,"00ffff")#青色
#ws2812b.on(4,"ffff00")#黄色
#ws2812b.on(5,"ff00ff")#紫色
#ws2812b.on(5,"00ff00")#红色
stay_on_led_1(12,6,"ff0000",5,3,9,"00ff00")#纵红 横绿,参数依次为指定12、6号led,12、6的颜色,共同持续时间,指定3、9号led,3、9的颜色
flashing_led(3,9,"00ff00",3)#横绿 闪烁,参数依次为指定3、9号led,颜色,闪烁次数
stay_on_led_2(12,6,"ff0000",1,3,9,"ffff00")#纵红 横黄
stay_on_led_2(12,6,"00ff00",5,3,9,"ff0000")#纵绿 横红
flashing_led(12,6,"00ff00",3)#纵绿 闪烁
stay_on_led_1(12,6,"ffff00",1,3,9,"ff0000")#纵黄 横红
time.sleep(0.1)
演示过程示例:
五、遇到的主要难题(懒):
第一次学习使用MicroPython,感受最大的是pyhton对缩进的要求非常严格,刚开始遇到提示错误,找了一会才发现是空格导致缩进不齐。
之前主要是将各种功能全部写入到大循环中,这次尝试了自定义函数,发现自定义函数真的让代码会看起来整洁很多,但是涉及修改的话对于注释比较少的情况下还是比较麻烦的。
对于此次项目,目前存在时间延迟不是很准确,笛子老师演示过程中就存在使用for循环点亮12个led时候,代码执行产生的延迟很明显。虽然本次项目观察实际运行效果,延迟不是很明显,但自我感觉优化和提升空间还是比较大的。
此次Pico的双核双线程并没有体现出来,还需要再根据课程实践学习。
六、未来计划:
通过学习MicroPython编程,发现入门还是比较简单的,尤其对于新手来说,从各种应用和示例中修改可以很快实现自己的项目,但是要写出效率较高的代码还是需要经验的积累。未来还是多多抓住机会,督促自己主动学习,再实践一下更有趣的项目。
七、项目学习资料