如何修改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
相关产品推荐
相关产品推荐

