CanMV K230开发板体验五、实现基础功能2

接下来,我们一同体验k230的定时器

RTC(定时器)

代码

'''
实验名称:RTC实时时钟
说明:实时时钟使用
教程:wiki.01studio.cc
'''

# 导入相关模块
from machine import RTC
import time

# 构建RTC对象
rtc = RTC()

# 首次上电设置RTC日期和时间。(2024, 1, 1, 0, 0, 0, 0, 0)按顺序分别表示(年,月,日,星期,时,分,秒,微妙),
# 其中星期使用0-6表示星期一到星期日。
if rtc.datetime()[0] != 2024:
    rtc.datetime((2024, 1, 1, 0, 0, 0, 0, 0))

while True:

    print(rtc.datetime()) #打印时间

    time.sleep(1) #延时1秒

运行结果

在这里插入图片描述

知识储备

  1. RTC对象
    RTC构造函数
    rtc = machine.RTC()
    构建RTC对象,RTC对象位于machine模块下。
    RTC使用方法
    rtc.datetime((2024, 1, 1, 0, 0, 0, 0, 0))
    设置RTC日期和时间。(2024, 1, 1, 0, 0, 0, 0, 0)按顺序分别表示(年,月,日,星期,时,分,秒,微妙),其中星期使用0-6表示星期一到星期日。
    rtc.datetime()
    获取当前RTC时间。返回元组:(年,月,日,星期,时,分,秒,微妙),其中星期使用0-6表示星期一到星期日。
    2.代码使用流程图
Created with Raphaël 2.3.0 导入RTC相关模块 首次时间设置 周期性打印当前RTC时间

ADC(电压测量)

代码

'''
实验名称:ADC(电压测量)
版本:v1.0
作者:01Studio
实验平台:01Studio CanMV K230
说明:ADC共4个通道,其中通道0、1实际量程为0-3.6V,通道2、3量程为0-1.8V。
    (请勿超出测量量程, 可能导致主控芯片烧坏!)
'''

from machine import ADC
import time

'''
构建ADC对象:
ADC0(排针32引脚,量程0-3.6V), ADC1(排针36引脚,量程0-3.6V),
ADC2(排针38引脚,量程0-1.8V), ADC3(排针40引脚,量程0-1.8V)。
'''
adc = ADC(0) #通道0

while True:

    print(adc.read_u16()) # 获取ADC通道采样值

    # 获取ADC通道电压值,保留2为小数。通道0、1实际量程为0-3.6V,返回值x2。
    print('%.2f'%(adc.read_uv()/1000000*2), "V")

    time.sleep(1) #延时1秒

运行结果

使用杜邦线将ADC0通道(gpio32引脚)连接GND;
在这里插入图片描述在这里插入图片描述将杜邦线连接3.3V引脚
在这里插入图片描述在这里插入图片描述成功实现ADC电压测量。

知识储备

  1. ADC对象
    构造函数
    adc = machine.ADC(channel)
    构建ADC对象,ADC通道如下:
    channel :通道选择1-3,如:ADC(0)。
    0: ADC0(排针32引脚,量程0-3.6V)
    1: ADC1(排针36引脚,量程0-3.6V)
    2: ADC2(排针38引脚,量程0-1.8V)
    3: ADC3(排针40引脚,量程0-1.8V)

使用方法
adc.read_u16()
获取ADC值,测量精度是12位,返回0-4095。其中通道0、1量程为0-3.6V,通道2、3量程为0-1.8V。

adc.read_uv()

获取ADC电压值,返回0-1.8,单位V。其中通道0、1实际量程为0-3.6V,通道2、3量程为0-1.8V。

  1. 代码使用流程图如下:
Created with Raphaël 2.3.0 导入ADC相关模块 获取ADC原始值 获取ADC实际电压值

thread(线程)

代码

'''
实验名称:线程
版本: v1.0
作者:01Studio
实验平台:01Studio CanMV K230
说明:通过编程实现多线程。
'''

import _thread #导入线程模块
import time

#线程函数
def func(name):
    while True:
        print("hello {}".format(name))
        time.sleep(1)

_thread.start_new_thread(func,("1",)) #开启线程1,参数必须是元组
_thread.start_new_thread(func,("2",)) #开启线程2,参数必须是元组

while True:
    
    time.sleep(0.01) #防止CPU满跑

运行结果

在这里插入图片描述

知识储备

对于以上代码,解析如下

  1. 导入模块
import _thread  # 导入线程模块
import time
  • _thread 是 Python 的低级线程模块,用于创建和管理线程。
  • time 模块提供了时间相关的功能,比如 time.sleep(),用于暂停程序的执行。
  1. 定义线程函数
def func(name):
    while True:
        print("hello {}".format(name))
        time.sleep(1)
  • func 是一个线程函数,它接收一个参数 name
  • 在函数内部,使用了一个无限循环 while True,表示线程会一直运行。
  • 每次循环中,打印一条消息 hello {name},其中 {name} 是传入的参数。
  • 使用 time.sleep(1) 暂停线程 1 秒,避免线程运行过快占用过多 CPU 资源。
  1. 创建线程
_thread.start_new_thread(func,("1",))  # 开启线程1,参数必须是元组
_thread.start_new_thread(func,("2",))  # 开启线程2,参数必须是元组
  • _thread.start_new_thread()_thread 模块中用于创建新线程的函数。
  • 它的第一个参数是线程函数 func,第二个参数是一个元组,包含传递给线程函数的参数。
  • 这里创建了两个线程:
    • 第一个线程调用 func("1"),线程会打印 hello 1
    • 第二个线程调用 func("2"),线程会打印 hello 2
  1. 主线程的循环
while True:
    time.sleep(0.01)  # 防止CPU满跑
  • 主线程(即运行这段代码的线程)也进入了一个无限循环。
  • 使用 time.sleep(0.01) 暂停主线程 0.01 秒,避免主线程占用过多 CPU 资源。
  • 这个循环的主要作用是保持程序运行,防止主线程退出,从而让其他线程能够继续运行。
  1. 程序运行结果

    • 当程序运行时,会同时启动两个线程:
      • 线程1每隔1秒打印 hello 1
      • 线程2每隔1秒打印 hello 2
    • 主线程会持续运行,但不会做其他工作,只是通过 time.sleep(0.01) 防止退出。
  2. 注意事项

    1. _thread 模块是低级线程模块,通常推荐使用 threading 模块,因为它提供了更高级的功能和更好的可读性。
    2. 程序中使用了无限循环,线程和主线程都不会自然退出,需要手动中断程序(例如按 Ctrl+C)。
    3. 在多线程程序中,线程的执行顺序和时间是不确定的,取决于操作系统的调度策略。
      7.代码使用流程图如下:
Created with Raphaël 2.3.0 导入_thread线程模块 初始化线程函数 新建线程1,线程2 无限循环

看门狗

看门狗的用途是在应用程序崩溃并最终进入不可恢复状态时自动重新启动系统。一旦启动,就无法以任何方式停止或重新配置。启用后,应用程序必须定期“喂食”看门狗,以防止其过期并重置系统。

代码

'''
实验名称:看门狗
版本: v1.0
作者:01Studio
实验平台:01Studio CanMV K230
说明:看门狗测试。
'''

from machine import WDT #导入线程模块
import time

#构建看门狗对象。
wdt = WDT(1,3) #看门狗编号1,超时时间3秒。


#每隔1秒喂一次狗,执行3次。
for i in range(4):

    time.sleep(1)
    print(i)

    wdt.feed() #喂狗

#停止喂狗,系统会重启。
while True:

    time.sleep(0.01) #防止CPU满跑

运行结果

在这里插入图片描述应用程序没有崩溃时,喂狗命令可以执行,如果喂狗命令无法执行时,系统崩溃,看门狗程序断开连接,重置系统。

知识储备

  1. WDT对象
    构造函数
from machine import WDT

wdt = WDT(id, timeout)

创建看门狗对象。K230有2个看门狗,CPU0(小核800M)使用看门狗0,CPU1(大核1.6G)使用看门狗1,由于CanMV RTOS只使用CPU1,所以只有看门狗1能用。

id :看门狗编号。
    1: 看门狗1。

timeout :超时时间,单位秒。

使用方法

wdt.feed()
2. 代码使用流程图如下:

Created with Raphaël 2.3.0 导入看门狗模块 初始化看门狗对象 喂狗 停止喂狗模拟死机系统自动重启

文件读写

代码

'''
实验名称:文件读写
版本: v1.0
作者:01Studio
实验平台:01Studio CanMV K230
说明:文件读写,将字符“01Studio”写入文件后再读取出来。
'''

###########
## 写文件
###########
f = open('/sdcard/1.txt', 'w') #以写的方式打开一个文件,没有该文件就自动新建
f.write('01Studio') #写入数据
f.close() #每次操作完记得关闭文件

###########
## 读文件
###########
f = open('/sdcard/1.txt', 'r') #以读方式打开一个文件
text = f.read()
print(text) #读取数据并在终端打印
f.close() #每次操作完记得关闭文件

运行结果

完成写入
在这里插入图片描述完成读文件
在这里插入图片描述

知识储备

  1. CanMV K230 MicroPython自带文件系统,我们只需要将数据直接用文件方式保存即可。micropython的文件操作大部分指令兼容CPython。因此我们可以直接使用Python编程来实现文件读写。CanMV K230盘符对应的目录为/sdcard/路径下。
  2. 代码使用流程图如下:
Created with Raphaël 2.3.0 新建1个文件并写入数据 读取刚刚保存文件的内容

3.代码解析:

  • open(‘/sdcard/1.txt’, ‘w’):
    使用 open() 函数以写入模式(‘w’)打开文件 /sdcard/1.txt。
    如果文件不存在,Python 会自动创建该文件。
    如果文件已经存在,写入模式会清空文件内容,然后开始新的写入操作。

  • f.write(‘01Studio’):
    使用文件对象的 write() 方法将字符串 ‘01Studio’ 写入文件。
    注意:write() 方法不会自动添加换行符,如果需要换行,需要手动添加 \n。

  • f.close():
    使用 close() 方法关闭文件,释放文件资源。
    这是一个很重要的步骤,如果不关闭文件,可能会导致文件内容没有正确保存,或者文件被锁定无法再次访问。

  • f.read():

    使用文件对象的 read() 方法读取文件的全部内容,并将其存储到变量 text 中。
    read() 方法会读取文件的全部内容,直到文件末尾。

注意:代码中没有显示关闭文件的操作。虽然 Python 在文件对象被销毁时会自动关闭文件,但为了确保文件资源被正确释放,建议在读取文件后也调用 f.close()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值