You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Python代码实现INA219参数采样次数统计与频率控制

树莓派INA219采集代码采样率统计与控制实现

现有代码问题

当前代码可正常采集总线电压、总线电流、功率、分流电压四项参数并写入CSV文件,但存在两个功能缺失:

  • 无采样频率统计能力,无法向用户反馈实际每秒记录次数
  • 无采样频率控制逻辑,会以硬件支持的最高速率无限制写入数据,无法按需调整记录密度
    原始代码如下:
#Importing libraries
import csv

from ina219 import INA219
from ina219 import DeviceRangeError


SHUNT_OHMS = 0.1

read_ina = INA219(SHUNT_OHMS) 
read_ina.configure()

  
def read_all():
    
    data = {}
    data['Bus Voltage'] = read_ina.voltage()
    data['Bus Current'] = read_ina.current()
    data['Power'] = read_ina.power()
    data['Shunt Voltage'] = read_ina.shunt_voltage()
    return data

    
with open('SensorData.csv', 'w') as f:
    data = read_all()
    writer = csv.DictWriter(f,
                            fieldnames = list (data.keys()))
    writer.writeheader()


    exit = False

    while not exit:
        try:
            writer.writerow(data)
            data = read_all()
            
        except KeyboardInterrupt:
            exit = True

实现逻辑

两个功能的实现不需要额外依赖,仅用Python标准库time模块即可完成:

  • 采样率控制:根据设定的目标每秒采样次数计算单轮循环的标准间隔,每轮采集写入完成后补足等待时间,保证采样间隔稳定
  • 采样率统计:以1秒为时间窗口,统计窗口内成功写入CSV的记录条数,窗口结束时直接输出实际采样值,真实反映当前采样性能,若设定采样率超出硬件上限会直接显示实际能达到的最高值

修改后完整代码

# Importing libraries
import csv
import time
from ina219 import INA219
from ina219 import DeviceRangeError


SHUNT_OHMS = 0.1
# 目标每秒采样次数,可根据需求自行修改
TARGET_SPS = 10

read_ina = INA219(SHUNT_OHMS) 
read_ina.configure()

  
def read_all():
    data = {}
    data['Bus Voltage'] = read_ina.voltage()
    data['Bus Current'] = read_ina.current()
    data['Power'] = read_ina.power()
    data['Shunt Voltage'] = read_ina.shunt_voltage()
    return data

    
with open('SensorData.csv', 'w', newline='') as f:
    data = read_all()
    writer = csv.DictWriter(f, fieldnames=list(data.keys()))
    writer.writeheader()

    # 初始化采样统计与控制变量
    sample_count = 0
    window_start_time = time.time()
    loop_interval = 1 / TARGET_SPS
    exit_flag = False

    while not exit_flag:
        loop_start = time.time()
        try:
            # 写入数据并计数
            writer.writerow(data)
            sample_count += 1
            data = read_all()

            # 每秒统计并输出实际采样率
            current_time = time.time()
            if current_time - window_start_time >= 1:
                print(f"实际每秒采样次数: {sample_count} 次/秒")
                # 重置统计窗口
                sample_count = 0
                window_start_time = current_time

            # 控制采样间隔
            process_cost = time.time() - loop_start
            sleep_time = loop_interval - process_cost
            if sleep_time > 0:
                time.sleep(sleep_time)
            
        except KeyboardInterrupt:
            exit_flag = True

使用说明

  • 调整代码中TARGET_SPS的赋值即可修改目标采样频率:设为1代表每秒记录1次,设为20代表每秒记录20次。INA219默认12位采样精度下最高稳定采样率约为60-80次/秒,不建议设置超过100避免数据丢点
  • 程序运行后每秒会在终端打印当前实际达成的采样次数,可直接确认采样频率是否符合预期
  • 代码新增了CSV文件打开的newline=''参数,解决Windows系统下CSV写入空行的兼容问题,树莓派Linux环境下也可正常运行
  • 按Ctrl+C终止程序时会自动完成文件写入退出,不会损坏已存储的CSV数据

内容的提问来源于stack exchange,提问作者ZSupreme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:33:15