接下来,我们一同体验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秒
运行结果
知识储备
- 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.代码使用流程图
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电压测量。
知识储备
- 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。
- 代码使用流程图如下:
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满跑
运行结果
知识储备
对于以上代码,解析如下
- 导入模块
import _thread # 导入线程模块
import time
_thread
是 Python 的低级线程模块,用于创建和管理线程。time
模块提供了时间相关的功能,比如time.sleep()
,用于暂停程序的执行。
- 定义线程函数
def func(name):
while True:
print("hello {}".format(name))
time.sleep(1)
func
是一个线程函数,它接收一个参数name
。- 在函数内部,使用了一个无限循环
while True
,表示线程会一直运行。 - 每次循环中,打印一条消息
hello {name}
,其中{name}
是传入的参数。 - 使用
time.sleep(1)
暂停线程 1 秒,避免线程运行过快占用过多 CPU 资源。
- 创建线程
_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
。
- 第一个线程调用
- 主线程的循环
while True:
time.sleep(0.01) # 防止CPU满跑
- 主线程(即运行这段代码的线程)也进入了一个无限循环。
- 使用
time.sleep(0.01)
暂停主线程 0.01 秒,避免主线程占用过多 CPU 资源。 - 这个循环的主要作用是保持程序运行,防止主线程退出,从而让其他线程能够继续运行。
-
程序运行结果
- 当程序运行时,会同时启动两个线程:
- 线程1每隔1秒打印
hello 1
。 - 线程2每隔1秒打印
hello 2
。
- 线程1每隔1秒打印
- 主线程会持续运行,但不会做其他工作,只是通过
time.sleep(0.01)
防止退出。
- 当程序运行时,会同时启动两个线程:
-
注意事项
_thread
模块是低级线程模块,通常推荐使用threading
模块,因为它提供了更高级的功能和更好的可读性。- 程序中使用了无限循环,线程和主线程都不会自然退出,需要手动中断程序(例如按
Ctrl+C
)。 - 在多线程程序中,线程的执行顺序和时间是不确定的,取决于操作系统的调度策略。
7.代码使用流程图如下:
看门狗
看门狗的用途是在应用程序崩溃并最终进入不可恢复状态时自动重新启动系统。一旦启动,就无法以任何方式停止或重新配置。启用后,应用程序必须定期“喂食”看门狗,以防止其过期并重置系统。
代码
'''
实验名称:看门狗
版本: 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满跑
运行结果
应用程序没有崩溃时,喂狗命令可以执行,如果喂狗命令无法执行时,系统崩溃,看门狗程序断开连接,重置系统。
知识储备
- 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. 代码使用流程图如下:
文件读写
代码
'''
实验名称:文件读写
版本: 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() #每次操作完记得关闭文件
运行结果
完成写入
完成读文件
知识储备
- CanMV K230 MicroPython自带文件系统,我们只需要将数据直接用文件方式保存即可。micropython的文件操作大部分指令兼容CPython。因此我们可以直接使用Python编程来实现文件读写。CanMV K230盘符对应的目录为/sdcard/路径下。
- 代码使用流程图如下:
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()。