今天完成了本期活动的全部内容,这次活动使用的是raspberry pico w开发板。使用的Mu Editor开发工具通过microPython编写代码,完成了开发工具的学习,LED、蜂鸣器、I2C接口的OLED、ADC接口的操作杆和UART接口的GPS模块的驱动。
内容一:演示视频
这次实现的是多功能游戏时钟,多功能体现在:NTP校时、参数的显示、天气信息的获取,游戏体现在能够玩贪吃蛇。
上述不同功能对应的是不同的界面。首先进入的是欢迎界面,在这个界面需要按下操作杆来切换到下一个界面。其它不同界面是通过操作杆的上下拨动进行切换。
内容二:项目总结报告
扩展任务则是设计了一个多功能时钟,时钟实现的功能包括:欢迎界面的显示,时间的NTP校时和显示,显示IP地址,获取当地的天气信息,以及贪吃蛇游戏。
1、欢迎界面
欢迎界面是一个图片,通过取模软件获得16进制的数据,然后转换为bytearray格式,byterarray其实就是一个十六进制数据的数组。然后通过framebuf显示到OLED上。
需要用到的库包括:ssd1306、framebuf。代码如下。
def show_welcome_page():
oled.fill(0)
imagebuf = framebuf.FrameBuffer(pic,128,64,framebuf.MONO_VLSB)
oled.blit(imagebuf,0,0)
oled.show()
2、NTP校时和显示
当用户按下操作杆之后,将会进入当前界面,在进入当前界面前,会连接wifi,然后通过ntp进行校时,并显示到OLED上。
用到的库包括:network、socket、ntptime、time、ufont。通过network库,连接wifi;socket库则允许建立TCP连接;ntptime库实现了ntp时间的获取,ntp时间的获取返回的是格里维治时间的秒数,咱们是东8区,因此需要在返回的秒数基础上增加8*3600秒;最后调用ufont库,将时间显示到OLED上。代码如下:
def show_time_page():
#init_oled()
oled.fill(0)
font.text(oled, "Welcome", 0, 0, font_size=16,show=False)
font.text(oled, "Connecting...", 0, 16, font_size=16,show=False)
font.text(oled, "SSID:", 0, 32, font_size=16,show=False)
font.text(oled, ssid, 0, 48, font_size=16,show=False)
oled.show()
def show_time(t):
if page_num == 1:
oled.fill(0)
font.text(oled, ' -----TIME----- ', 0, 0, font_size=16,show=False)
year,month,day,weekday,hour,minute,sec,msec = machine.RTC().datetime()
str_time = str('| {:0>2d}:{:0>2d}:{:0>2d} |'.format(hour,minute,sec))
font.text(oled, str_time, 0, 16, font_size=16,show=False)
str_day = str('| {:0>4d}.{:0>2d}.{:0>2d} |'.format(year,month,day))
font.text(oled, str_day, 0, 32, font_size=16,show=False)
font.text(oled, ' -------------- ', 0, 48, font_size=16,show=False)
oled.show()
不同页面的切换是通过操作杆的上下拨杆,在代码中建立了一个100ms为周期的定时任务,去读取操作杆的数据,如果检测到上下的拨动,则进行页面的切换,代码如下。
def check_button(t):
global pressed_btn
pressed_btn = joystick.read_btn()
if pressed_btn != '':
print(pressed_btn)
def change_page_num():
global page_num,pressed_btn
last_page_num = page_num
if pressed_btn != '':
if pressed_btn == 'down':
page_num = page_num + 1
if page_num >= MAX_PAGE_NUM:
page_num = MAX_PAGE_NUM
elif pressed_btn == 'up':
page_num = page_num - 1
if page_num <= MIN_PAGE_NUM:
page_num = MIN_PAGE_NUM
while joystick.read_btn() != '':
time.sleep(0.1)
pass
pressed_btn = ''
print('page num:{}'.format(page_num))
return (last_page_num,page_num)
3、参数界面
在这个界面获取当前的IP地址,通过调用network库的ifconfig方法获取ip地址等数据,代码如下。
def show_ip_page():
oled.fill(0)
ip,subnet,gateway,dns = nic.ifconfig()
font.text(oled, "------参数------", 0, 8, font_size=16,show=False)
font.text(oled, "IP:", 0, 24, font_size=16,show=False)
font.text(oled, ip, 0, 40, font_size=16,show=False)
oled.show()
4、天气界面
使用urequests和ujson模块,调用心知天气的API,获取当地的天气数据。
def show_weather_page():
oled.fill(0)
font.text(oled, "获取天气 ...", 0, 0, font_size=16,show=False)
oled.show()
city,weather,temp = get_weather()
oled.fill(0)
font.text(oled, "------天气------", 0, 0, font_size=16,show=False)
font.text(oled, weather, 0, 16, font_size=16,show=False)
font.text(oled, '{} C'.format(temp), 0, 32, font_size=16,show=False)
oled.show()
5、贪吃蛇游戏
在编写贪吃蛇的游戏的时候,尝试着用面向对象的方式写的代码。在这里实现了蜂鸣器播放音乐,操纵杆的读取,Timer实现的定时程序,OLED绘制矩形等功能。
代码比较多,我就不贴代码了,后面的附件里提供了完整的代码。
6、汇总帖
任务1:熟悉micropython的基本语法
- 【得捷电子Follow me第1期】第一帖 - 开发环境的搭建 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
- 【得捷电子Follow me第1期】第二帖 - Pico的Visual Studio Code环境配置 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
- 【得捷电子Follow me第1期】第十一帖 - Mu Editor的使用方法 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
任务2:驱动外设
- 【得捷电子Follow me第1期】第二帖 - Pico的Visual Studio Code环境配置 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
- 【得捷电子Follow me第1期】第三帖 - Pico的OLED驱动 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
- 【得捷电子Follow me第1期】第十帖 - 蜂鸣器 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
任务3:同步网络时间
- 【得捷电子Follow me第1期】第五帖 - 使用network和socket模块实现LED的远程控制 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
- 【得捷电子Follow me第1期】第六帖 - 通过命令行调用RTC模块时的奇怪现象 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
- 【得捷电子Follow me第1期】第七帖 - 通过NTP同步时间 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
任务4:实现定位功能
任务5:扩展任务
7、总结
这次活动共发了12个帖子,包括开发软件、外设、模块的使用。这次活动挺有意义的,之前一直听说micropython,但是没有用过,通过这次活动深度体验了一次micropython编程。micropython编程也是很有趣的,编写速度快,能够第一时间的检查代码,在初期的原型验证阶段很方便。以后也尝试着在不同的场合使用micropython。最后感谢得捷电子和EEWORLD。
内容三:可编译下载的代码
打包后的代码