1204|2

274

帖子

8

TA的资源

纯净的硅(初级)

楼主
 

【得捷电子Follow me第1期】+ 提交帖:多功能游戏时钟 [复制链接]

  本帖最后由 manhuami2007 于 2023-6-26 16:02 编辑

今天完成了本期活动的全部内容,这次活动使用的是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的基本语法

  1. 【得捷电子Follow me第1期】第一帖 - 开发环境的搭建 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
  2. 【得捷电子Follow me第1期】第二帖 - Pico的Visual Studio Code环境配置 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
  3. 【得捷电子Follow me第1期】第十一帖 - Mu Editor的使用方法 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

任务2:驱动外设

  1. 【得捷电子Follow me第1期】第二帖 - Pico的Visual Studio Code环境配置 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
  2. 【得捷电子Follow me第1期】第三帖 - Pico的OLED驱动 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
  3. 【得捷电子Follow me第1期】第十帖 - 蜂鸣器 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

任务3:同步网络时间

  1. 【得捷电子Follow me第1期】第五帖 - 使用network和socket模块实现LED的远程控制 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
  2. 【得捷电子Follow me第1期】第六帖 - 通过命令行调用RTC模块时的奇怪现象 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
  3. 【得捷电子Follow me第1期】第七帖 - 通过NTP同步时间 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

任务4:实现定位功能

  1. 【得捷电子Follow me第1期】第八帖 - 获取定位数据 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

任务5:扩展任务

  1. 【得捷电子Follow me第1期】第九帖 - 贪吃蛇1 - Digi-Key得捷电子技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
  2. 本帖

7、总结

这次活动共发了12个帖子,包括开发软件、外设、模块的使用。这次活动挺有意义的,之前一直听说micropython,但是没有用过,通过这次活动深度体验了一次micropython编程。micropython编程也是很有趣的,编写速度快,能够第一时间的检查代码,在初期的原型验证阶段很方便。以后也尝试着在不同的场合使用micropython。最后感谢得捷电子和EEWORLD。

内容三:可编译下载的代码

 

 

打包后的代码

pico-w.rar (214.94 KB, 下载次数: 4)

最新回复

真厉害,这么多的报告帖   详情 回复 发表于 2023-6-26 20:42
点赞(1) 关注(1)
 
 

回复
举报

665

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

有内容,有数据,还有汇总总结。

楼主 厉害了

 
 
 

回复

4854

帖子

3

TA的资源

版主

板凳
 

真厉害,这么多的报告帖

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表