【雕爷学编程】MicroPython手册之达芬奇 TKM32F499 触摸按钮GUI

发布于:2023-10-25 ⋅ 阅读:(181) ⋅ 点赞:(0)

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
达芬奇 TKM32F499是一款基于ARM Cortex-M4内核的微控制器,以下是其主要的参考技术参数:
1、内核和性能:
内核: ARM Cortex-M4
最高主频: 240 MHz
性能: 225 DMIPS / 608 CoreMark
2、存储器:
Flash存储器: 1 MB
RAM: 192 KB
存储器接口: 支持外部存储器扩展(例如,SD卡,NOR Flash等)
3、外设接口:
通用IO口(GPIO): 支持多达 101 个GPIO引脚,可用于数字输入/输出、中断等。
串行通信接口: 包括多个UART、SPI、I2C接口,用于与外部设备进行通信。
USB接口: 支持USB 2.0 FS(全速)。
定时器: 包括多个定时器/计数器,可用于定时、脉冲宽度调制(PWM)等应用。
ADC和DAC: 内置多个模数转换器(ADC)和数模转换器(DAC),用于模拟信号的采集和输出。
LCD控制器: 支持液晶显示器(LCD)的控制和驱动。
触摸控制器: 支持电容式触摸屏的控制和输入。
SD卡控制器: 支持SD卡的读写操作。
Ethernet控制器: 支持以太网通信。
4、电源管理:
电源供应: 支持广泛的电源电压范围,包括 3.0V 至 3.6V 的工作电压。
低功耗模式: 支持多种低功耗模式,以最小化功耗。
5、安全性:
安全特性: 支持硬件加密和解密、随机数生成器等安全功能,保护系统的数据和通信安全。
6、开发工具支持:
开发环境: 支持常见的开发环境,如Keil MDK、IAR Embedded Workbench等。
调试接口: 支持标准的SWD(Serial Wire Debug)调试接口。

在这里插入图片描述

MicroPython的达芬奇TKM32F499提供了对触摸按钮GUI的支持,下面将以专业的视角为您详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

触摸按钮支持:TKM32F499通过MicroPython环境为开发人员提供了触摸按钮GUI的能力。开发人员可以使用MicroPython编写代码来创建和控制触摸按钮,以实现交互式的图形用户界面。

多样化的按钮样式:触摸按钮GUI支持多种按钮样式,如矩形、圆形、图标等。开发人员可以根据应用需求选择合适的按钮样式,并自定义按钮的外观和交互效果。

事件驱动的交互:触摸按钮GUI采用事件驱动的交互方式。开发人员可以为按钮定义回调函数,当按钮被触摸或释放时,触发相应的事件并执行相应的操作。

灵活的布局和组合:触摸按钮GUI支持灵活的布局和组合方式,开发人员可以自由排列和组合多个按钮,以创建复杂的用户界面。这使得按钮的使用和展示更加灵活和可定制。

应用场景:

嵌入式设备控制面板:触摸按钮GUI适用于嵌入式设备的控制面板。通过触摸按钮,用户可以轻松控制设备的功能和参数,实现直观的操作和调整。

智能家居系统:触摸按钮GUI可用于智能家居系统的控制界面。用户可以通过触摸按钮来控制家居设备,如灯光、空调、窗帘等,实现智能化的家居控制。

工业监控和控制:触摸按钮GUI适用于工业监控和控制场景。通过触摸按钮,操作员可以方便地监控和控制工业设备的状态和参数,提高工作效率和安全性。

交互式展示和导航系统:触摸按钮GUI可用于交互式展示和导航系统。在展览、商场或导航系统中,触摸按钮可以作为用户与展示内容或导航功能进行交互的方式。

需要注意的事项:

触摸精度和灵敏度:在设计触摸按钮GUI时,需要注意触摸精度和灵敏度的设置。确保按钮的触摸操作准确可靠,提供良好的用户体验。

良好的可视性:在布局按钮时,需要考虑按钮的可视性。确保按钮的位置和大小适合屏幕尺寸和分辨率,以及用户的触摸操作习惯。

界面响应速度:触摸按钮GUI的界面响应速度对用户体验至关重要。开发人员需要优化代码和算法,确保按钮的响应速度快速流畅,避免用户等待和卡顿。

综上所述,MicroPython的达芬奇TKM32F499提供了对触摸按钮GUI的支持,具有多样化的按钮样式、事件驱动的交互、灵活的布局和组合等特点。它适用于嵌入式设备控制面板、智能家居系统、工业监控和控制、交互式展示和导航系统等应用场景。在设计触摸按钮GUI时,需要注意触摸精度和灵敏度、良好的可视性以及界面响应速度等方面,以提供优秀的用户体验。

案例1:使用MicroPython的TFT模块显示一个简单的GUI界面

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time

# 初始化I2C接口和TFT模块
i2c = I2C(scl=Pin(5), sda=Pin(4))
tft = SSD1306_I2C(128, 64, i2c)

# 清除屏幕
tft.fill(0)
tft.show()

# 在屏幕上显示文本
tft.text("Hello World!", 0, 0)
tft.show()

# 延时
time.sleep(2)

# 清除屏幕
tft.fill(0)
tft.show()

要点解读:
导入所需的库和模块,如machine、SSD1306等。
初始化I2C接口和TFT模块。
清除屏幕并显示文本。
延时一段时间。
再次清除屏幕。

案例2:使用MicroPython的Touch模块实现触摸按钮功能

from machine import Pin, I2C
from touch import Touch
import time

# 初始化I2C接口和Touch模块
i2c = I2C(scl=Pin(5), sda=Pin(4))
touch = Touch(i2c)

while True:
    # 检测是否有触摸事件
    if touch.is_pressed():
        # 获取触摸点的坐标
        x, y = touch.get_position()
        print("Touch at ({}, {})".format(x, y))
        break
    time.sleep(0.01)

要点解读:
导入所需的库和模块,如machine、Touch等。
初始化I2C接口和Touch模块。
循环检测是否有触摸事件,如果有则获取触摸点的坐标并打印。

案例3:使用MicroPython的GPIO模块控制LED灯闪烁

from machine import Pin
import time

# 初始化LED引脚
led = Pin(2, Pin.OUT)

while True:
    # 点亮LED灯
    led.on()
    time.sleep(1)
    # 熄灭LED灯
    led.off()
    time.sleep(1)

要点解读:
导入所需的库和模块,如machine。
初始化LED引脚为输出模式。
循环控制LED灯的亮灭,每次亮1秒后熄灭1秒。

案例4:简单的触摸按钮

from machine import Pin  
import utime  
  
# 设置GPIO18为输入模式  
btn = Pin(18, Pin.IN, pull=Pin.PULL_UP)  
  
while True:  
    # 检测GPIO18状态  
    if btn.value() == 0:  
        # 按钮被按下,执行相应操作  
        print("Button pressed!")  
        # 在这里可以添加其他的操作,比如控制LED灯的亮度等  
    else:  
        # 按钮未被按下,继续循环检测  
        pass

要点解读:
我们首先导入了machine模块中的Pin类。
将GPIO18设置为输入模式,并将其赋值给btn变量。
进入一个无限循环,不断检测GPIO18的状态。
如果检测到GPIO18的值为0,说明按钮被按下,执行相应的操作。
在这个例子中,我们只是简单地打印了一条消息。在实际应用中,你可以在这里添加其他的操作,比如控制LED灯的亮度、切换音乐等。
如果GPIO18的值不为0,说明按钮未被按下,继续循环检测。

案例5:触摸按钮控制LED灯亮度

from machine import Pin  
import utime  
  
# 设置GPIO18为输入模式,并连接LED灯的GPIO为输出模式  
btn = Pin(18, Pin.IN, pull=Pin.PULL_UP)  
led = Pin(2, Pin.OUT)  
  
# 设置LED初始亮度为50%0x80)  
led.value(0x80)  
  
while True:  
    # 检测GPIO18状态  
    if btn.value() == 0:  
        # 按钮被按下,调整LED亮度并等待一段时间  
        led.value(0x80 if led.value() == 0 else led.value() - 1)  # 如果亮度为0则恢复初始亮度,否则降低亮度级别  
        utime.sleep(0.1)  # 等待0.1else:  
        # 按钮未被按下,继续循环检测  
        pass

要点解读:
我们首先导入了machine模块中的Pin类。
将GPIO18设置为输入模式,并将其赋值给btn变量。同时将LED灯的GPIO设置为输出模式,并将其赋值给led变量。
设置LED初始亮度为50%(0x80)。
进入一个无限循环,不断检测GPIO18的状态。
如果检测到GPIO18的值为0,说明按钮被按下,调整LED亮度并等待一段时间。
通过判断led.value()的值来决定LED亮度的变化方向,如果亮度为0则恢复初始亮度(0x80),否则降低亮度级别。这里使用了led.value()函数来设置LED亮度。
在调整完亮度后,使用utime.sleep()函数等待一段时间(这里是0.1秒),以避免过于频繁的操作导致性能问题。
如果GPIO18的值不为0,说明按钮未被按下,继续循环检测。

案例6:创建按钮并响应点击事件

import lcd
import touch

# 初始化显示屏(与之前的案例相同)
# 初始化触摸屏(与之前的案例相同)

# 创建按钮
button = lcd.RectButton(100, 100, 200, 100, lcd.BLUE, lcd.WHITE, "Click Me")

while True:
    # 获取触摸屏输入(与之前的案例相同)

    if touch_pos:
        # 检查按钮是否被点击
        if button.collidepoint(touch_pos):
            # 清除屏幕
            lcd.clear(lcd.BLACK)

            # 显示按钮被点击的提示信息
            lcd.print("Button Clicked!", 50, 50, lcd.WHITE, lcd.BLACK)

            # 刷新屏幕
            lcd.flush()

要点解读:
导入lcd模块和touch模块。
初始化显示屏和触摸屏(与之前的案例相同)。
使用lcd.RectButton()函数创建一个矩形按钮对象。参数依次为按钮的位置和大小、背景颜色、文本颜色和文本内容。
在一个无限循环中,获取触摸屏的输入。
如果触摸屏有输入(即非空),则执行以下操作:
检查按钮是否被点击,使用button.collidepoint(touch_pos)函数判断触摸点是否在按钮区域内。
如果按钮被点击,执行以下操作:
清除屏幕内容,使用lcd.clear()函数。
使用lcd.print()函数显示按钮被点击的提示信息。
使用lcd.flush()函数刷新屏幕,将提示信息显示在屏幕上。

案例7:创建多个按钮并响应点击事件

import lcd
import touch

# 初始化显示屏(与之前的案例相同)
# 初始化触摸屏(与之前的案例相同)

# 创建按钮
button1 = lcd.RectButton(100, 100, 200, 100, lcd.BLUE, lcd.WHITE, "Button 1")
button2 = lcd.RectButton(100, 300, 200, 100, lcd.GREEN, lcd.WHITE, "Button 2")

while True:
    # 获取触摸屏输入(与之前的案例相同)

    if touch_pos:
        # 检查按钮是否被点击
        if button1.collidepoint(touch_pos):
            # 清除屏幕
            lcd.clear(lcd.BLACK)

            # 显示按钮1被点击的提示信息
            lcd.print("Button 1 Clicked!", 50, 50, lcd.WHITE, lcd.BLACK)

            # 刷新屏幕
            lcd.flush()
        elif button2.collidepoint(touch_pos):
            # 清除屏幕
            lcd.clear(lcd.BLACK)

            # 显示按钮2被点击的提示信息
            lcd.print("Button 2 Clicked!", 50, 50, lcd.WHITE, lcd.BLACK)

            # 刷新屏幕
            lcd.flush()

要点解读:
导入lcd模块和touch模块。
初始化显示屏和触摸屏(与之前的案例相同)。
使用lcd.RectButton()函数创建两个矩形按钮对象,分别是button1和button2。
在一个无限循环中,获取触摸屏的输入。
如果触摸屏有输入(即非空),则执行以下操作:
检查按钮是否被点击,使用button1.collidepoint(touch_pos)和button2.collidepoint(touch_pos)函数判断触摸点是否在按钮区域内。
如果按钮1被点击,执行以下操作:
清除屏幕内容,使用lcd.clear()函数。
使用lcd.print()函数显示按钮1被点击的提示信息。
使用lcd.flush()函数刷新屏幕,将提示信息显示在屏幕上。
如果按钮2被点击,执行以下操作:
清除屏幕内容,使用lcd.clear()函数。
使用lcd.print()函数显示按钮2被点击的提示信息。
使用lcd.flush()函数刷新屏幕,将提示信息显示在屏幕上。

案例8:创建可拖动的按钮

import lcd
import touch

# 初始化显示屏(与之前的案例相同)
# 初始化触摸屏(与之前的案例相同)

# 创建可拖动的按钮
button = lcd.DragButton(100, 100, 200, 100, lcd.BLUE, lcd.WHITE, "Drag Me")

while True:
    # 获取触摸屏输入(与之前的案例相同)

    if touch_pos:
        # 处理按钮的拖动
        button.handle_event(touch_pos)

    # 清除屏幕
    lcd.clear(lcd.BLACK)

    # 绘制按钮
    button.draw()

    # 刷新屏幕
    lcd.flush()

要点解读:
导入lcd模块和touch模块。
初始化显示屏和触摸屏(与之前的案例相同)。
使用lcd.DragButton()函数创建一个可拖动的按钮对象。参数依次为按钮的位置和大小、背景颜色、文本颜色和文本内容。
在一个无限循环中,获取触摸屏的输入。
如果触摸屏有输入(即非空),则执行以下操作:
处理按钮的拖动,使用button.handle_event(touch_pos)函数。
清除屏幕内容,使用lcd.clear()函数。
绘制按钮,使用button.draw()函数。
使用lcd.flush()函数刷新屏幕,将按钮显示在屏幕上。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述