2569|1

291

帖子

5

TA的资源

纯净的硅(中级)

楼主
 

玩转RP2040之设计一个表盘 [复制链接]


上篇文章,介绍了使用Python在LCD上显示各种类型的文字。

 

本篇,就来使用字体显示功能,来实现一个表盘。最终效果如下:

表盘的内容包括:

  • 顶部的蓝牙连接图标和电量图标

    • 蓝牙图标通过画直线来完成

          #蓝牙
          bl_x = 70
          bl_y = 17
          tft.vline(bl_x, bl_y, 20, gc9a01.BLUE)
          tft.line(bl_x - 5, bl_y + 3, bl_x + 5, bl_y + 20 - 6, gc9a01.BLUE)
          tft.line(bl_x - 5, bl_y + 20 - 3, bl_x + 5, bl_y + 6, gc9a01.BLUE)
          tft.line(bl_x, bl_y, bl_x + 5, bl_y + 6, gc9a01.BLUE)
          tft.line(bl_x, bl_y + 20, bl_x + 5, bl_y + 20 - 6, gc9a01.BLUE)
    • 电量图标通过画直线和矩形来完成

          #电量
          tft.text(vga1_bold_16x16, "80%", 95, 20, gc9a01.CYAN)
          bat_x = 145
          bat_y = 20
          bat_w = 30
          bat_h = 15
          tft.hline(bat_x, bat_y, bat_w, gc9a01.WHITE)
          tft.hline(bat_x, bat_y + bat_h, bat_w, gc9a01.WHITE)
          tft.vline(bat_x, bat_y, bat_h, gc9a01.WHITE)
          tft.vline(bat_x + bat_w, bat_y, bat_h, gc9a01.WHITE)
          tft.vline(bat_x + bat_w + 1, bat_y + 2, bat_h - 4, gc9a01.WHITE)
          tft.vline(bat_x + bat_w + 2, bat_y + 2, bat_h - 4, gc9a01.WHITE)
          tft.fill_rect(bat_x + 3, bat_y + 3, bat_w - 10, bat_h -5 , gc9a01.GREEN)
  • 中间的是当前的时间(时、分、秒)、日期和星期

    日期目前的是一个固定值,后面可优化为动态的。时间设计的是动态的,每过一秒会更新秒值,每过一分钟会更新分钟值。

        #日期与星期
        display_inconsolata_font(inconsolata_16, "12/08", 150, 60)
        tft.text(vga1_bold_16x16, "Thur", 150, 90, gc9a01.YELLOW)
        
        #时分秒
        hour = 22
        minute = 08
        second = 55
        last_hour = -1
        last_minute = -1
        last_second = -1
        while True:
            second = second + 1
            if second >= 60:
                minute = minute + 1
                second = 0
            
            hour_str = "%02d" % hour
            minute_str = "%02d" % minute
            second_str = "%02d" % second
            
            if last_hour != hour:
                tft.fill_rect(25, 50, 115, 60, gc9a01.BLACK)
                tft.write(chango_64, hour_str, 25, 50, gc9a01.WHITE)
            if last_minute != minute:
                tft.fill_rect(60, 105, 115, 60, gc9a01.BLACK)
                tft.write(chango_64, minute_str, 60, 105, gc9a01.YELLOW)
            if last_second != second:
                tft.write(NotoSans_32, second_str, 180, 130, gc9a01.GREEN)
            
            last_hour = hour
            last_minute = minute
            last_second = second
            
            time.sleep(1)

     

  • 底部是运动步数的显示

        #运动步数
        tft.text(vga1_bold_16x16, "walk:4567", 50, 190, gc9a01.YELLOW)

演示视频:

VID_20221211_110813_x264

 

完整代码:

import time
from machine import Pin, SPI
import gc9a01
​
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
                
def main():
    
    def display_inconsolata_font(font, data, column, row):
        for char in data:
            tft.bitmap(font, column, row, font.MAP.index(char))
            column += font.WIDTH
​
    spi = SPI(1, baudrate=60000000, sck=Pin(SCK), mosi=Pin(MOSI))
    tft = gc9a01.GC9A01(
        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)
​
    # enable display and clear screen
    tft.init()
    tft.fill(gc9a01.BLACK)
    
    #蓝牙
    bl_x = 70
    bl_y = 17
    tft.vline(bl_x, bl_y, 20, gc9a01.BLUE)
    tft.line(bl_x - 5, bl_y + 3, bl_x + 5, bl_y + 20 - 6, gc9a01.BLUE)
    tft.line(bl_x - 5, bl_y + 20 - 3, bl_x + 5, bl_y + 6, gc9a01.BLUE)
    tft.line(bl_x, bl_y, bl_x + 5, bl_y + 6, gc9a01.BLUE)
    tft.line(bl_x, bl_y + 20, bl_x + 5, bl_y + 20 - 6, gc9a01.BLUE)
​
    #电量
    tft.text(vga1_bold_16x16, "80%", 95, 20, gc9a01.CYAN)
    bat_x = 145
    bat_y = 20
    bat_w = 30
    bat_h = 15
    tft.hline(bat_x, bat_y, bat_w, gc9a01.WHITE)
    tft.hline(bat_x, bat_y + bat_h, bat_w, gc9a01.WHITE)
    tft.vline(bat_x, bat_y, bat_h, gc9a01.WHITE)
    tft.vline(bat_x + bat_w, bat_y, bat_h, gc9a01.WHITE)
    tft.vline(bat_x + bat_w + 1, bat_y + 2, bat_h - 4, gc9a01.WHITE)
    tft.vline(bat_x + bat_w + 2, bat_y + 2, bat_h - 4, gc9a01.WHITE)
    tft.fill_rect(bat_x + 3, bat_y + 3, bat_w - 10, bat_h -5 , gc9a01.GREEN)
​
    #日期与星期
    display_inconsolata_font(inconsolata_16, "12/08", 150, 60)
    tft.text(vga1_bold_16x16, "Thur", 150, 90, gc9a01.YELLOW)
    
    #运动步数
    tft.text(vga1_bold_16x16, "walk:4567", 50, 190, gc9a01.YELLOW)
    
    #时分秒
    hour = 22
    minute = 08
    second = 55
    last_hour = -1
    last_minute = -1
    last_second = -1
    while True:
        second = second + 1
        if second >= 60:
            minute = minute + 1
            second = 0
        
        hour_str = "%02d" % hour
        minute_str = "%02d" % minute
        second_str = "%02d" % second
        
        if last_hour != hour:
            tft.fill_rect(25, 50, 115, 60, gc9a01.BLACK)
            tft.write(chango_64, hour_str, 25, 50, gc9a01.WHITE)
        if last_minute != minute:
            tft.fill_rect(60, 105, 115, 60, gc9a01.BLACK)
            tft.write(chango_64, minute_str, 60, 105, gc9a01.YELLOW)
        if last_second != second:
            tft.write(NotoSans_32, second_str, 180, 130, gc9a01.GREEN)
        
        last_hour = hour
        last_minute = minute
        last_second = second
        
        time.sleep(1)
​
main()

总结,本篇在RP2040上实现一个表盘,实现了蓝牙、电量图标,时间与日志显示,运动步数显示等。

此帖出自移动便携论坛

最新回复

用Python在LCD上显示看来可以做很多东西啦   详情 回复 发表于 2022-12-12 07:30
点赞 关注
 
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

用Python在LCD上显示看来可以做很多东西啦

此帖出自移动便携论坛
 
 
 

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

随便看看
查找数据手册?

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