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 的文件,并以写入模式操作。

在主程序部分,执行以下操作:

  1. 打开文件 temperature_data.txt 以写入模式;通过 time.ticks_ms() 记录程序开始运行的初始时间,用于后续计算时间差。
  2. 循环执行 10 次,每次读取当前温度数据并记录时间差,将时间差和温度数据以文本格式写入文件中,并通过 os.sync() 同步文件系统,确保数据安全。
  3. 完成数据写入后,关闭文件 file.close(),保证资源的正确释放。
  4. 以只读模式重新打开文件 temperature_data.txt,逐行读取文件内容,并通过 print() 将内容显示在控制台上进行验证,最后关闭文件,完成程序执行。

这里,需要注意的是,os.sync() 函数在 MicroPython 中用于同步文件系统的缓存数据,也就是将缓冲区中尚未写入磁盘的数据强制写入文件系统;通常,文件操作(如 write()close())会将数据写入缓存,只有在特定条件下(例如关闭文件或缓存满时)才会将数据写入实际的存储介质。

在嵌入式系统中,特别是使用闪存、SD 卡等文件系统的设备,如果系统突然断电,未同步的文件数据可能会丢失或损坏,如果一个程序在执行长时间的文件写操作,出于数据安全性考虑,可以定期调用 os.sync(),确保即便程序中途被中断,之前写入的数据不会丢失。

烧录代码,打开终端,显示如下:

1.png

2.gif

可以看到,我们将时间差和温度数据写入文件 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_bsizef_blocks 相乘可以得到树莓派 Pico 内部文件系统大小为 1441792 字节,即 1.37 MB。

posted @ 2026-09-03 17:08  FreakStudio  阅读(6)  评论(0)    收藏  举报