3108|6

291

帖子

5

TA的资源

纯净的硅(中级)

楼主
 

玩转RP2040之结项报告 [复制链接]

 

 

RP2040前面的几篇测试报告:

1 玩转RP2040之开箱测评与上电运行

2 玩转RP2040之Python开发环境搭建

3 玩转RP2040之LCD绘制基本形状测试

4 玩转RP2040之使用Python在LCD上显示图片

5 玩转RP2040之使用Python在LCD上显示多类型字体

6 玩转RP2040之设计一个表盘

 

本篇实现一个综合的功能:

  • 利用LCD显示一个运动表盘

  • 利用LCD显示运动手表中的其它功能显示,如天气信息、打开支付宝等

  • 利用IMU判断板子的翻转,实现表盘中功能的切换

程序编写

一些定义

import time
from machine import Pin, SPI
import gc9a01
import myimu
​
from prop_font import chango_16
from prop_font import chango_32
from prop_font import chango_64
​
from mono_font import inconsolata_16 
from mono_font import inconsolata_32
from mono_font import inconsolata_64
​
import NotoSans_32
import NotoSerif_32
import NotoSansMono_32
​
import vga1_bold_16x16
​
DC = 8
CS = 9
SCK = 10
MOSI = 11
RST = 12
​
BL = 25

表盘显示功能封装为一个类

class WatchPanel:
    def init(self):
        self.spi = SPI(1, baudrate=60000000, sck=Pin(SCK), mosi=Pin(MOSI))
        self.tft = gc9a01.GC9A01(
                self.spi,
                240,
                240,
                reset=Pin(RST, Pin.OUT),
                cs=Pin(CS, Pin.OUT),
                dc=Pin(DC, Pin.OUT),
                backlight=Pin(BL, Pin.OUT),
                rotation=0)
   
        #时分秒
        self.hour = 22
        self.minute = 08
        self.second = 55
        self.last_hour = -1
        self.last_minute = -1
        self.last_second = -1
        
        # enable display and clear screen
        self.tft.init()
    
    def display_inconsolata_font(self, font, data, column, row):
        for char in data:
            self.tft.bitmap(font, column, row, font.MAP.index(char))
            column += font.WIDTH
            
    def show_static_info(self):
        #蓝牙
        bl_x = 70
        bl_y = 17
        self.tft.vline(bl_x, bl_y, 20, gc9a01.BLUE)
        self.tft.line(bl_x - 5, bl_y + 3, bl_x + 5, bl_y + 20 - 6, gc9a01.BLUE)
        self.tft.line(bl_x - 5, bl_y + 20 - 3, bl_x + 5, bl_y + 6, gc9a01.BLUE)
        self.tft.line(bl_x, bl_y, bl_x + 5, bl_y + 6, gc9a01.BLUE)
        self.tft.line(bl_x, bl_y + 20, bl_x + 5, bl_y + 20 - 6, gc9a01.BLUE)
​
        #电量
        self.tft.text(vga1_bold_16x16, "80%", 95, 20, gc9a01.CYAN)
        bat_x = 145
        bat_y = 20
        bat_w = 30
        bat_h = 15
        self.tft.hline(bat_x, bat_y, bat_w, gc9a01.WHITE)
        self.tft.hline(bat_x, bat_y + bat_h, bat_w, gc9a01.WHITE)
        self.tft.vline(bat_x, bat_y, bat_h, gc9a01.WHITE)
        self.tft.vline(bat_x + bat_w, bat_y, bat_h, gc9a01.WHITE)
        self.tft.vline(bat_x + bat_w + 1, bat_y + 2, bat_h - 4, gc9a01.WHITE)
        self.tft.vline(bat_x + bat_w + 2, bat_y + 2, bat_h - 4, gc9a01.WHITE)
        self.tft.fill_rect(bat_x + 3, bat_y + 3, bat_w - 10, bat_h -5 , gc9a01.GREEN)
​
        #日期与星期
        self.display_inconsolata_font(inconsolata_16, "12/08", 150, 60)
        self.tft.text(vga1_bold_16x16, "Thur", 150, 90, gc9a01.YELLOW)
        
        #运动步数
        self.tft.text(vga1_bold_16x16, "walk:4567", 50, 190, gc9a01.YELLOW)
​
    def show_time_info(self):
        self.second = self.second + 1
        if self.second >= 60:
            self.minute = self.minute + 1
            self.second = 0
        
        hour_str = "%02d" % self.hour
        minute_str = "%02d" % self.minute
        second_str = "%02d" % self.second
        
        self.tft.fill_rect(25, 50, 115, 60, gc9a01.BLACK)
        self.tft.write(chango_64, hour_str, 25, 50, gc9a01.WHITE)
        self.tft.fill_rect(60, 105, 115, 60, gc9a01.BLACK)
        self.tft.write(chango_64, minute_str, 60, 105, gc9a01.YELLOW)
        self.tft.write(NotoSans_32, second_str, 180, 130, gc9a01.GREEN)
        
        self.last_hour = self.hour
        self.last_minute = self.minute
        self.last_second = self.second
        
    def show_img(self, img):
        self.tft.jpg(img, 0, 0, gc9a01.SLOW)
        
    def show_watch(self):
        self.tft.fill(gc9a01.BLACK)
        self.show_static_info()
        self.show_time_info()

主函数

def main():
    #IMU
    qmi8658=myimu.IMU_QMI8658C()
    
    watchPanel=WatchPanel()
    watchPanel.init()
    
    idx = 1
    while True:
        #read QMI8658
        xyz=qmi8658.Read_XYZ()
        print("accz:%f" % xyz[2])
        if xyz[2] > -1:
            idx = idx+1
            if (idx == 4):
                idx = 1
        
        if (idx == 1):
            watchPanel.show_watch()
        elif (idx == 2):
            watchPanel.show_img("weather.jpg")
        elif (idx == 3):
            watchPanel.show_img("pay.jpg")
        time.sleep(1)
​
​
main()

测试

显示时间界面

显示天气界面

显示支付宝界面

演示视频

VID_20230102_215443_x264

 

总结

本篇利用RP2040实现了一个综合功能:运动表盘的显示与功能的切换,切换功能只利用IMU检测Z轴加速度的变化,后续可考虑结合6轴的数据解算出姿态角,从而可以使姿态检测更加准确。

此帖出自消费电子论坛

最新回复

这个温度条做的漂亮   详情 回复 发表于 2023-1-10 09:19
点赞 关注
 
 

回复
举报

6561

帖子

9

TA的资源

版主

沙发
 

6轴的数据解算出姿态角解析速度如何?能达到多快的频率

此帖出自消费电子论坛

点评

目前还没有做姿态解算,只是用来单一Z轴的加速度简单的实现姿态变化检测  详情 回复 发表于 2023-1-3 22:11
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

7244

帖子

2

TA的资源

版主

板凳
 

这个界面切换采用加速度传感器的角度变化的想法不错!!!好像有手表就可以这样,无接触式控制。

此帖出自消费电子论坛
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

4
 
秦天qintian0303 发表于 2023-1-3 08:55 6轴的数据解算出姿态角解析速度如何?能达到多快的频率

目前还没有做姿态解算,只是用来单一Z轴的加速度简单的实现姿态变化检测

此帖出自消费电子论坛
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

5
 

很想也买一个模块,自己亲自设计体验一下。

此帖出自消费电子论坛
 
 
 

回复

282

帖子

7

TA的资源

一粒金砂(高级)

6
 

这个温度条做的漂亮

此帖出自消费电子论坛

点评

这个只是个图片,哈哈  详情 回复 发表于 2023-1-11 23:30
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

7
 
sipower 发表于 2023-1-10 09:19 这个温度条做的漂亮

这个只是个图片,哈哈

此帖出自消费电子论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表