MicroPython 文件读写入门教程:树莓派 Pico 温度数据记录实战
在如下代码中,我们使用 MicroPython 中的 os 模块进行文件读写的例程,该代码从 ADC 内部温度传感器读取数据并将其写入文件,同时我们对文件中数据进行读取。
以下代码可以在我们提供的资料包中的 elegance-devkit v1\Demo\70 FileSys_WriteRead 文件夹找到。
示例代码如下所示:
# Python env : MicroPython v1.23.0
# -*- coding: utf-8 -*-
# @Time : 2024/9/16 上午11:58
# @Author : 李清水
# @File : main.py
# @Description : 文件系统类实验,使用os模块完成文件读写和终端重定向操作
# ======================================== 导入相关模块 =========================================
# 导入操作系统模块,提供文件操作功能
import os
# 导入硬件模块
from machine import ADC
# 导入时间相关模块
import time
# ======================================== 全局变量 ============================================
# 定义文件路径,用于存储温度传感器数据
file_path = "temperature_data.txt"
# ======================================== 功能函数 ============================================
def read_temperature() -> float:
"""
读取并转换ADC值为温度值(摄氏度),适用于Raspberry Pi Pico内部温度传感器。
实现过程:
1. 读取16位ADC原始值
2. 转换为0-3.3V电压值
3. 应用RP2040芯片内置温度传感器转换公式
4. 进行数值舍入处理
Args:
None
Returns:
float: 转换后的温度值,单位摄氏度,保留两位小数
Raises:
OSError: 当ADC读取失败时抛出
ValueError: 当计算得到无效温度值时抛出
"""
# 声明全局变量
global sensor_temp
# 读取ADC值,ADC范围是0~65535,供电电压假设为3.3V
adc_value = sensor_temp.read_u16()
# 将ADC值转为电压,ADC为16位分辨率
voltage = adc_value * 3.3 / 65535
# 使用Raspberry Pi Pico的温度公式将电压转为温度(这是Pico的内部温度传感器转换公式)
temperature = 27 - (voltage - 0.706) / 0.001721
# 保留两位小数
temperature = round(temperature, 2)
# 返回温度值
return temperature
# ======================================== 自定义类 ============================================
# ======================================== 初始化配置 ==========================================
# 上电延时
time.sleep(3)
# 打印调试信息
print("FreakStudio : Save temperature data to file system")
# 初始化内部温度传感器
sensor_temp = ADC(4)
# ======================================== 主程序 ===========================================
# 以写入模式打开文件,文件不存在则创建
file = open(file_path, "w")
# 获取程序开始运行的初始时间
start_time = time.ticks_ms()
# 打印调试信息
print("Start to record temperature data")
# 开始记录温度数据,并将其写入文件中
for i in range(10):
# 读取当前温度
temp = read_temperature()
# 记录当前运行时间
current_time = time.ticks_ms()
# 计算运行时间间隔
time_diff = time.ticks_diff(current_time, start_time)
# 打印调试信息,指示正在写入
print("File Writing...")
# 将记录的时间差(以毫秒为单位)和温度写入文件中
file.write("Time: {} ms, Temperature: {:.2f} °C\n".format(time_diff, temp))
# 每次写入后同步文件系统,确保数据被保存
os.sync()
# 休眠10ms
time.sleep_ms(10)
# 关闭文件
file.close()
# 打印调试信息
print("File Writing Finished")
# 为了验证文件内容,重新打开文件,读取并显示
# 以只读模式重新打开文件
file = open(file_path, "r")
# 打印调试信息
print("File Read Start :")
# 逐行读取文件内容
for line in file:
# 打印文件内容到控制台
print(line.strip())
# 关闭文件
file.close()
这里,我们首先使用 ADC 的通道 4 来访问内部温度传感器,并定义一个 read_temperature 函数,能够将 ADC 值转换为电压,并使用 Raspberry Pi Pico 提供的温度转换公式将电压转换为摄氏温度;然后使用创建一个名为 temperature_data.txt 的文件,并以写入模式操作。
在主程序部分,执行以下操作:
- 打开文件
temperature_data.txt以写入模式;通过time.ticks_ms()记录程序开始运行的初始时间,用于后续计算时间差。 - 循环执行 10 次,每次读取当前温度数据并记录时间差,将时间差和温度数据以文本格式写入文件中,并通过
os.sync()同步文件系统,确保数据安全。 - 完成数据写入后,关闭文件
file.close(),保证资源的正确释放。 - 以只读模式重新打开文件
temperature_data.txt,逐行读取文件内容,并通过print()将内容显示在控制台上进行验证,最后关闭文件,完成程序执行。
这里,需要注意的是,os.sync() 函数在 MicroPython 中用于同步文件系统的缓存数据,也就是将缓冲区中尚未写入磁盘的数据强制写入文件系统;通常,文件操作(如 write() 或 close())会将数据写入缓存,只有在特定条件下(例如关闭文件或缓存满时)才会将数据写入实际的存储介质。
在嵌入式系统中,特别是使用闪存、SD 卡等文件系统的设备,如果系统突然断电,未同步的文件数据可能会丢失或损坏,如果一个程序在执行长时间的文件写操作,出于数据安全性考虑,可以定期调用 os.sync(),确保即便程序中途被中断,之前写入的数据不会丢失。
烧录代码,打开终端,显示如下:


可以看到,我们将时间差和温度数据写入文件 temperature_data.txt 后,可以成功读取文件中的内容并将其打印到终端上。
在代码执行完毕后,我们使用函数 os.listdir() 列出当前目录,可以看到现在文件系统中已经存在文件 temperature_data.txt;我们还可以使用 os.statvfs() 函数,读取文件状态,这里返回了一个包含文件系统信息的元组:
-
f_bsize – 文件系统的块大小为 4096 字节。 -
f_frsize – 碎片大小也为 4096 字节。 -
f_blocks – 文件系统中的总块数为 352 个。 -
f_bfree – 当前文件系统中剩余的空闲块数为 349 。 -
f_bavail – 非特权用户可用的空闲块数也为 349。 -
f_files – 文件系统中的 inode 总数为 0,表示该文件系统可能不使用 inode。 -
f_ffree – 文件系统中剩余的空闲 inode 数为 0 。 -
f_favail – 非特权用户可用的空闲 inode 数也为 0 。 -
f_flag – 文件系统的挂载标志,通常表示文件系统的特定属性,如只读等,这里为 0,表示无特殊标志。 -
f_namemax – 该文件系统允许文件名最长为 255 个字符。这里,将
f_bsize和f_blocks相乘可以得到树莓派 Pico 内部文件系统大小为 1441792 字节,即 1.37 MB。

在如下代码中,我们使用 MicroPython 中的 `os` 模块进行文件读写的例程,该代码从 `ADC` 内部温度传感器读取数据并将其写入文件,同时我们对文件中数据进行读取。
浙公网安备 33010602011771号