1. 项目概述:树莓派电流探针与数据记录系统
最近在折腾一个嵌入式数据采集项目,核心需求是长时间、高精度地监测电路中的电流变化,并且能把数据完整地记录下来,方便后续分析。手头正好有闲置的树莓派,这玩意儿接口丰富、编程灵活,是个绝佳的控制核心。但市面上的专业电流探头要么太贵,要么不方便集成到自己的系统中。于是,我就琢磨着能不能自己动手,打造一个基于树莓派的、带记录功能的电流探针。
简单来说,这个项目就是利用树莓派,配合一个高精度的电流传感器模块,构建一套从电流信号感知、模数转换、数据处理到本地存储的完整数据记录系统。它不仅能实时显示电流值,更重要的是能像“黑匣子”一样,把一段时间内的电流波形完整地记录下来,这对于分析设备的功耗特性、排查间歇性故障或者研究电路的动态行为特别有用。无论你是电子爱好者、嵌入式开发者,还是从事物联网或能源监控相关工作的工程师,这套方案都能提供一个低成本、高灵活性的解决方案。
2. 系统核心设计与方案选型
2.1 为什么选择树莓派作为核心?
首先得说说为什么是树莓派,而不是更简单的单片机(比如Arduino)。这个选择背后有几个关键考量:
强大的数据处理与存储能力:电流记录意味着要持续产生数据流。一个12位精度、1kHz采样率的传感器,每秒就会产生约2KB的原始数据。如果需要连续记录几个小时,数据量会非常可观。树莓派运行完整的Linux系统,拥有GB级别的内存和可扩展的大容量SD卡或USB存储,处理这种流式数据存储和简单的实时分析(比如计算平均值、峰值)游刃有余。而大多数单片机内存有限,存储大量数据需要外接SD卡模块,且文件系统管理相对复杂。
丰富的软件生态与网络功能:我们的目标是“记录”,而不仅仅是“显示”。树莓派上可以轻松运行Python、C++等高级语言编写的程序,利用成熟的库(如
csv、sqlite3、pandas)将数据保存为CSV、SQLite数据库甚至直接进行初步的可视化。此外,树莓派自带以太网和Wi-Fi,未来可以轻松扩展为将数据实时上传到服务器或云端,实现远程监控,这是纯单片机系统需要额外模块才能实现的。灵活的接口与实时性平衡:树莓派的GPIO虽然实时性不如单片机的硬件中断,但对于百赫兹到几千赫兹的电流采样需求,通过合理的编程优化(如使用
RPi.GPIO库的轮询或pigpio库的硬件定时器)完全可以满足。更重要的是,它提供了标准的I2C、SPI接口,可以方便地连接各种高精度的数字传感器,省去了自己设计模拟电路和ADC的麻烦。
注意:如果对实时性要求极高(微秒级响应),或者项目对成本、功耗极度敏感,那么基于STM32等ARM Cortex-M系列的单片机仍是更好选择。但对于兼顾开发效率、功能扩展和数据处理的通用型记录仪,树莓派是更平衡的选择。
2.2 电流传感方案深度解析
电流测量是项目的基石,方案选型直接决定了系统的精度、量程和成本。常见方案有以下几种,我们需要根据“记录”的需求来权衡:
分流器 + 专用放大器IC:
- 原理:在待测回路中串联一个已知阻值的小电阻(分流器),测量电阻两端的压降,根据欧姆定律(I = V/R)计算电流。为了测量微小压降并抑制共模噪声,需要后接一款高精度、低漂移的运算放大器或专用电流检测放大器(如TI的INA系列,ADI的AD8210等)。
- 优点:精度可以做到非常高(取决于电阻温漂和放大器性能),带宽宽,成本相对可控。
- 缺点:需要设计模拟电路,存在插入损耗(电阻会发热并产生压降),且电路布局要求高,容易受干扰。
- 适合场景:对精度和带宽要求极高,且有一定模拟电路设计能力的项目。
霍尔效应电流传感器模块:
- 原理:利用霍尔元件检测电流导线产生的磁场,从而间接测量电流。常见模块如ACS712(模拟输出)、ACS723(模拟/数字输出)。
- 优点:非接触式测量,电气隔离性好,几乎无插入损耗,使用简单(通常只需单电源供电,输出模拟电压)。
- 缺点:通常精度和线性度不如分流器方案,且存在零点漂移(无电流时输出不为零),对周边磁场敏感。
- 适合场景:需要电气隔离、测量较大电流(数安培到数十安培)、追求便捷性的应用。
集成式数字电流传感器模块:
- 原理:这类模块将分流器、放大器和ADC全部集成在一起,通过I2C或SPI等数字接口直接输出校准后的电流数值。例如,INA219(I2C接口,可测电压和电流)、INA3221(三通道)。
- 优点:“开箱即用”,精度有保证,自带校准,数字接口抗干扰能力强,与树莓派连接极其简单,编程方便。
- 缺点:成本稍高,量程和带宽通常由模块固定。
- 适合场景:快速原型开发、对开发效率要求高、希望减少模拟电路调试工作的大多数项目。
本项目的选择:考虑到“记录能力”要求系统稳定、可靠、易于复现,我们选择方案三:集成式数字电流传感器模块(以INA219为例)。它极大地简化了硬件设计,让我们能把精力集中在数据记录逻辑和软件优化上。INA219具备16位ADC,测量精度高,支持可编程增益,能适应不同的电流量程,并且通过I2C与树莓派通信,接线仅需四根线(VCC, GND, SDA, SCL)。
2.3 系统整体架构设计
确定了核心部件,整个系统的架构就清晰了:
[被测电路] ----(串联)----> [INA219电流传感器模块] ----(I2C总线)----> [树莓派] | |--- 实时显示 (终端/小屏幕) |--- 数据记录 (SD卡/外接硬盘) |--- 可选网络传输 (未来扩展)树莓派上运行一个主控程序,这个程序需要完成以下核心任务:
- 初始化:配置I2C接口,初始化INA219传感器(设置量程、校准值等)。
- 数据采集循环:以固定的时间间隔(如每秒100次)从INA219读取电流值。
- 实时处理与显示:将读取的原始值转换为实际电流值(安培),并可选地在终端或一个小型OLED屏幕上显示。
- 数据记录:将带时间戳的电流值写入文件。这是“record capability”的核心。
- 控制逻辑:实现开始记录、停止记录、分段记录、触发记录(如电流超过阈值时自动开始)等功能。
3. 硬件连接与配置详解
3.1 所需材料清单
在开始动手之前,请准备好以下材料:
- 树莓派:任何型号均可(3B+/4B/Zero 2 W等),确保已安装好操作系统(如Raspberry Pi OS)。
- 电流传感器模块:INA219模块(市面上很常见)。
- 连接线:母对母杜邦线若干。
- 被测设备:一个用于测试的电路,比如一个LED灯加电阻,或者一个小电机。
- 可选配件:
- OLED显示屏(I2C接口):用于本地实时显示,如0.96寸SSD1306。
- 外接USB硬盘或大容量U盘:如果需要超长时间(数天)记录高频率数据,树莓派自身的SD卡可能容量或寿命不足。
- 适当的散热片:如果树莓派需要长时间高负载运行。
3.2 INA219模块与树莓派连接
INA219模块通常有6个引脚:VCC, GND, SCL, SDA, Vin+, Vin-。连接方式如下:
电源连接:
- 将INA219模块的VCC引脚连接到树莓派的3.3V引脚(物理引脚1或17)。非常重要:必须接3.3V!因为INA219的I2C逻辑电平是3.3V,接5V可能会损坏树莓派的GPIO。
- 将INA219模块的GND引脚连接到树莓派的GND引脚(例如物理引脚6、9、14、20等任意一个)。
I2C通信连接:
- 将INA219模块的SCL(时钟线)连接到树莓派的GPIO3 (SCL1),物理引脚5。
- 将INA219模块的SDA(数据线)连接到树莓派的GPIO2 (SDA1),物理引脚3。
电流测量连接:
- Vin-:连接到被测电路的电源负端(GND端)。
- Vin+:连接到被测电路的负载负端。
- 关键理解:INA219测量的是流经连接在Vin+和Vin-之间内置分流电阻的电流。因此,你需要将模块串联进待测电路。例如,测量一个LED的电流:电源正极 -> LED正极 -> LED负极 ->INA219的Vin+->INA219的Vin--> 电阻 -> 电源负极。
实操心得:在连接被测电路前,先用万用表确认你的电路是通的,并且预估电流在INA219的量程内(常见模块是±3.2A)。第一次上电时,可以先不接大功率负载,避免意外。
3.3 树莓派系统配置
连接好硬件后,需要确保树莓派的I2C接口已启用。
- 在终端运行
sudo raspi-config。 - 选择
Interface Options->I2C->Yes来启用I2C驱动。 - 重启树莓派。
- 重启后,安装必要的工具和库:
sudo apt update sudo apt install -y i2c-tools python3-smbus python3-pip - 运行
sudo i2cdetect -y 1来扫描I2C总线。如果连接正确,你应该能看到INA219的地址(通常是0x40)出现在输出列表中。
4. 软件实现与数据记录核心
4.1 Python环境与库安装
我们将使用Python进行开发,因为它库丰富、编写快捷。首先安装针对INA219的Python库,这里推荐pi-ina219,它功能完善且文档清晰。
pip3 install pi-ina219如果需要使用OLED屏幕,则还需要安装相应的驱动库,例如对于SSD1306:
pip3 install luma.oled4.2 基础数据读取程序
我们先写一个最简单的脚本来测试传感器是否工作,并读取实时电流。
#!/usr/bin/env python3 import time from ina219 import INA219 from ina219 import DeviceRangeError SHUNT_OHMS = 0.1 # INA219模块上分流电阻的阻值,常见的是0.1欧姆,请以你的模块为准 def read_current(): ina = INA219(SHUNT_OHMS) ina.configure() try: while True: # 读取总线电压和电流 bus_voltage = ina.voltage() current_mA = ina.current() # 单位是毫安 power_mW = ina.power() # 单位是毫瓦 print(f"总线电压: {bus_voltage:.3f} V") print(f"电流: {current_mA:.2f} mA") print(f"功率: {power_mW:.2f} mW") print("-" * 20) time.sleep(1) # 每秒读取一次 except KeyboardInterrupt: print("\n程序被用户中断。") except DeviceRangeError as e: # 电流超出量程错误 print(f"错误:{e}") if __name__ == "__main__": read_current()运行这个脚本(python3 test_ina219.py),你应该能看到打印出来的电压和电流值。用手触碰或改变负载,观察数值变化。
4.3 实现“记录”功能:数据持久化
“记录能力”的本质是将时间序列数据保存下来。我们采用CSV格式,因为它简单通用,几乎任何数据分析软件(如Excel, Python pandas, MATLAB)都能直接打开。
#!/usr/bin/env python3 import time import csv from datetime import datetime from ina219 import INA219, DeviceRangeError SHUNT_OHMS = 0.1 SAMPLE_INTERVAL = 0.1 # 采样间隔,单位秒 (0.1秒即10Hz) LOG_FILENAME = f"current_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" def record_current(): ina = INA219(SHUNT_OHMS) ina.configure() # 创建并初始化CSV文件,写入表头 with open(LOG_FILENAME, 'w', newline='') as csvfile: csv_writer = csv.writer(csvfile) csv_writer.writerow(['Timestamp', 'Current_A', 'BusVoltage_V', 'Power_W']) print(f"开始记录,数据将保存至: {LOG_FILENAME}") print("按 Ctrl+C 停止记录...") try: while True: timestamp = datetime.now().isoformat(timespec='milliseconds') try: current_a = ina.current() / 1000.0 # 转换为安培 bus_voltage = ina.voltage() power_w = ina.power() / 1000.0 # 转换为瓦特 except DeviceRangeError: # 如果超量程,记录一个特殊值(如None或999) current_a = None bus_voltage = ina.voltage() power_w = None # 将数据写入CSV行 csv_writer.writerow([timestamp, current_a, bus_voltage, power_w]) csvfile.flush() # 立即写入磁盘,防止数据丢失 # 可选:在终端简单显示 print(f"{timestamp} | I={current_a:.3f}A, V={bus_voltage:.3f}V") time.sleep(SAMPLE_INTERVAL) except KeyboardInterrupt: print(f"\n记录停止。数据已保存到 {LOG_FILENAME}") if __name__ == "__main__": record_current()代码关键点解析:
- 带时间戳:使用
datetime生成ISO格式的精确时间戳,这是后期分析数据同步的基础。 - 文件命名:文件名包含开始记录的时间,避免覆盖旧文件。
- 单位转换:传感器库通常返回毫安、毫瓦,我们转换为标准的安培(A)和瓦特(W),便于理解。
- 即时刷新:
csvfile.flush()确保每次采样后数据立即写入磁盘。如果不这样做,数据可能会在程序缓冲区里,遇到突然断电或程序崩溃时丢失。 - 错误处理:捕获
DeviceRangeError,避免因瞬间过流导致程序崩溃,并用特殊值标记异常数据点。
4.4 高级记录功能扩展
基础记录已经实现,但一个实用的记录仪还需要更多控制功能。
功能一:可配置的采样率与量程
def configure_sensor(ina, max_expected_amps=3.2): """配置INA219的量程和增益""" # INA219的configure方法可以接受参数,但pi-ina219库的configure已自动选择最佳量程。 # 更精细的控制可以使用底层寄存器操作,但通常默认配置即可。 # 这里我们主要确保初始化的电流范围足够。 ina.configure(voltage_range=ina.RANGE_32V, gain=ina.GAIN_AUTO, bus_adc=ina.ADC_12BIT, shunt_adc=ina.ADC_12BIT) # 注意:pi-ina219库的configure参数可能与上述不同,请查阅其官方文档。 # 一个更通用的方法是创建INA219对象时传入预期的最大电流。 # ina = INA219(SHUNT_OHMS, max_expected_amps=max_expected_amps) # ina.configure()功能二:触发式记录只在电流超过某个阈值时才开始记录,节省存储空间。
TRIGGER_CURRENT_A = 0.5 # 触发阈值,0.5安培 PRE_TRIGGER_SAMPLES = 50 # 触发前保留的样本数(实现“预触发”) post_trigger_mode = False buffer = [] while True: data = read_single_sample(ina) # 假设这个函数返回一次采样的数据 buffer.append(data) if len(buffer) > PRE_TRIGGER_SAMPLES: buffer.pop(0) # 保持缓冲区大小 if not post_trigger_mode and data['current'] > TRIGGER_CURRENT_A: print("触发条件满足,开始记录!") post_trigger_mode = True # 将缓冲区的预触发数据先写入文件 write_buffer_to_file(buffer) buffer = [] if post_trigger_mode: write_sample_to_file(data) # 可以添加停止触发的条件,例如持续低于阈值一段时间后停止功能三:数据分块与滚动记录防止单个文件过大,或者实现固定时长(如每小时一个文件)的记录。
MAX_FILE_SIZE_MB = 50 MAX_SAMPLES_PER_FILE = 360000 # 例如,10Hz采样下记录10小时 current_file_samples = 0 def check_and_rotate_file(csv_writer, file_handle): global current_file_samples, LOG_FILENAME current_file_samples += 1 if current_file_samples >= MAX_SAMPLES_PER_FILE: file_handle.close() # 创建新文件 LOG_FILENAME = f"current_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" file_handle = open(LOG_FILENAME, 'w', newline='') csv_writer = csv.writer(file_handle) csv_writer.writerow(['Timestamp', 'Current_A', 'BusVoltage_V', 'Power_W']) current_file_samples = 0 print(f"切换到新文件: {LOG_FILENAME}") return csv_writer, file_handle在每次写入循环中调用这个函数检查是否需要切换文件。
5. 系统优化与稳定性保障
5.1 提高采样率与实时性
默认的Pythontime.sleep()和循环在采样率高于100Hz时可能变得不精确。为了获得更稳定、更高频率的采样,可以采用以下方法:
使用更高精度的定时器:
time.sleep()精度较差。可以使用time.perf_counter()或time.monotonic()来精确控制循环周期。import time SAMPLE_INTERVAL = 0.01 # 10ms, 100Hz next_sample_time = time.monotonic() while True: current_time = time.monotonic() if current_time >= next_sample_time: # 执行采样和记录 sample_data() next_sample_time += SAMPLE_INTERVAL # 可以在这里加入短暂的休眠,让出CPU,避免100%占用 time.sleep(0.001)使用硬件定时器或外部中断(高级):对于要求极其严格的定时采样(如>1kHz),Python可能不是最佳选择。可以考虑:
- 使用C语言编写核心采样模块,通过Python调用(如使用
ctypes库)。 - 使用专门的多线程/多进程库,并将高优先级赋予采样线程。
- 使用树莓派的GPIO硬件时钟(如
pigpio库的wave功能)来产生精确的中断信号。但这复杂度陡增。
- 使用C语言编写核心采样模块,通过Python调用(如使用
实操心得:对于大多数电流记录应用(如分析设备开关机功耗、工作周期),10Hz到100Hz的采样率已经足够。盲目追求过高采样率会导致数据文件巨大,增加处理负担,而Python循环的抖动对这类应用的影响微乎其微。应先明确分析需求再决定采样率。
5.2 数据完整性与存储可靠性
长时间记录最怕数据丢失或文件损坏。
定期关闭并重新打开文件:虽然
flush()能立即写入,但长时间保持文件打开状态,如果系统异常仍可能损坏。可以设置每记录N条数据或每隔M分钟,安全地关闭文件再重新以追加模式打开。WRITES_PER_FLUSH = 100 write_count = 0 def safe_write(csv_writer, row, file_handle): nonlocal write_count csv_writer.writerow(row) write_count += 1 if write_count >= WRITES_PER_FLUSH: file_handle.flush() os.fsync(file_handle.fileno()) # 强制操作系统将缓存写入磁盘 write_count = 0使用更健壮的文件格式:CSV简单,但损坏后不易恢复。可以考虑:
- SQLite数据库:将每个采样点作为一条记录插入数据库。SQLite是事务性的,即使程序崩溃,已提交的数据也能保存。查询和分析也更灵活。
import sqlite3 conn = sqlite3.connect('current_data.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS readings (timestamp TEXT, current REAL, voltage REAL)''') # 在采样循环中 c.execute("INSERT INTO readings VALUES (?, ?, ?)", (timestamp, current_a, bus_voltage)) if sample_count % 100 == 0: conn.commit() # 定期提交事务- 二进制格式:如使用
struct包将数据打包成二进制记录,写入文件。这种方式读写速度最快,文件体积小,但需要专门的解析程序。
存储介质选择:树莓派的SD卡有写入寿命。对于7x24小时不间断的高频记录,建议将存储目录挂载到外接USB硬盘或U盘上,或者使用网络存储(NFS)。
5.3 增加本地显示与用户界面
添加一个OLED屏幕可以让你在不连接电脑的情况下了解系统状态(如当前电流、记录状态、已存储数据量等)。
from luma.core.interface.serial import i2c from luma.oled.device import ssd1306 from PIL import Image, ImageDraw, ImageFont # 初始化OLED serial = i2c(port=1, address=0x3C) # I2C地址通常是0x3C或0x3D device = ssd1306(serial) font = ImageFont.load_default() def update_display(current, voltage, is_recording, filename): with canvas(device) as draw: draw.rectangle(device.bounding_box, outline="white", fill="black") draw.text((5, 5), f"I: {current:.3f}A", font=font, fill="white") draw.text((5, 20), f"V: {voltage:.3f}V", font=font, fill="white") status = "REC" if is_recording else "STOP" draw.text((5, 35), f"Status: {status}", font=font, fill="white") # 文件名太长可以滚动显示或缩写 draw.text((5, 50), f"File: {filename[-15:]}", font=font, fill="white")在主循环中,每次采样后调用update_display刷新屏幕即可。注意,屏幕刷新本身会消耗时间,可能会影响高采样率下的定时精度,需要权衡。
6. 常见问题与故障排查
在实际搭建和运行过程中,你可能会遇到以下问题:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
i2cdetect检测不到设备(地址为空) | 1. I2C未启用。 2. 接线错误(SDA/SCL接反、电源接错)。 3. 模块损坏。 4. 模块I2C地址不同。 | 1. 运行sudo raspi-config确认I2C已启用。2. 用万用表检查VCC(3.3V)和GND是否接通,检查SDA/SCL线是否连通。 3. 尝试更换模块或杜邦线。 4. 尝试扫描所有地址 sudo i2cdetect -y 1 0x00 0x7f。有些INA219模块地址可通过焊点选择。 |
| 能检测到设备,但读取的电流值始终为0或异常 | 1. 电流测量端(Vin+, Vin-)接反或未串联进电路。 2. 分流电阻值( SHUNT_OHMS)配置错误。3. 被测电流太小,低于传感器分辨率。 4. 电源电压不足或过高。 | 1.确保模块串联在电路中,电流流向是从Vin+流入,Vin-流出。用万用表电流档确认电路中有电流。 2.仔细查看模块规格书或PCB上的标识,确认分流电阻阻值(常见0.1Ω,也有0.01Ω或1Ω的)。 3. 尝试测量一个较大的、确定的电流(如100mA以上的LED电路)进行验证。 4. 确保模块供电为3.3V,被测总线电压在模块量程内(通常INA219支持0-26V)。 |
| 读取值不稳定,跳动大 | 1. 电源噪声。 2. 接线过长或接触不良,引入干扰。 3. 被测电路本身电流波动大(如开关电源)。 4. 没有对传感器进行校准或配置。 | 1. 在树莓派电源和传感器VCC-GND之间并联一个10uF和0.1uF的电容进行滤波。 2. 缩短连接线,确保接触牢固。I2C线上可以尝试加上拉电阻(通常模块已集成)。 3. 这是正常现象,记录功能正是为了捕捉这种波动。可以尝试在软件中做滑动平均滤波。 4. 有些库需要手动校准。确保 configure()方法被正确调用,或者尝试使用库提供的自动校准功能。 |
| 程序运行一段时间后卡死或树莓派死机 | 1. 电源供电不足。 2. SD卡因频繁写入而过热或损坏。 3. 程序内存泄漏或资源未释放。 4. CPU过热降频。 | 1. 为树莓派提供足额(5V/2.5A以上)、高质量的电源适配器。 2. 将数据记录到外接USB硬盘,或减少写入频率,增加 WRITES_PER_FLUSH。3. 检查代码,确保在异常退出时能正确关闭文件、数据库连接。使用 try...finally语句。4. 为树莓派加装散热片或风扇,避免因过热导致不稳定。 |
| CSV文件用Excel打开时间戳错乱 | CSV中的ISO时间戳包含“T”分隔符(如2023-10-27T14:30:00.123),Excel可能不识别为日期时间。 | 1. 在写入CSV时,将时间戳中的“T”替换为空格:timestamp.replace('T', ' ')。2. 或者,使用Excel的“数据”->“分列”功能,手动指定列格式为日期和时间。 3. 后期分析建议使用Python pandas,能完美处理ISO格式。 |
| 采样率达不到设定值 | 1. 每次循环中除采样外的操作(如显示、文件写入)耗时过长。 2. Python time.sleep()和循环本身的不精确性。3. 系统负载过高。 | 1.优化代码:将屏幕刷新改为每N次采样刷新一次;将文件flush操作改为定期进行。2.使用更精确的定时方法,如前文所述的 time.monotonic()循环。3. 关闭树莓派上不必要的后台进程。使用 htop命令查看CPU占用。 |
一个关键的避坑技巧:校准与验证在开始正式记录前,务必用一台可信的万用表(最好是四位半或以上精度的台式表)进行对比测量。找一个稳定的直流负载(如一个固定电阻),同时用你的树莓派电流探针和万用表测量电流,记录多个点的读数。计算两者之间的系统误差。如果误差是固定的偏移,可以在软件中增加一个校准系数进行补偿。这个步骤能极大提升你最终记录数据的可信度。
7. 数据可视化与初步分析
记录下来的数据只有通过分析才能产生价值。这里介绍几种快速可视化数据的方法。
使用Python pandas + matplotlib进行离线分析: 这是最灵活的方式。将记录好的CSV文件读入,即可进行各种分析。
import pandas as pd import matplotlib.pyplot as plt # 读取数据 df = pd.read_csv('current_log_20231027_143000.csv', parse_dates=['Timestamp']) df.set_index('Timestamp', inplace=True) # 绘制电流随时间变化的曲线 plt.figure(figsize=(12, 6)) plt.plot(df.index, df['Current_A'], label='Current (A)', linewidth=0.5) # 线宽调细适合高频数据 plt.xlabel('Time') plt.ylabel('Current (A)') plt.title('Current Consumption Over Time') plt.grid(True, alpha=0.3) plt.legend() plt.tight_layout() plt.show() # 计算统计信息 print(df['Current_A'].describe()) # 找出峰值 peak_current = df['Current_A'].max() peak_time = df['Current_A'].idxmax() print(f"峰值电流: {peak_current:.3f} A, 发生在: {peak_time}") # 计算一段时间内的平均功耗(假设电压基本稳定) avg_voltage = df['BusVoltage_V'].mean() avg_current = df['Current_A'].mean() avg_power = avg_voltage * avg_current print(f"平均电压: {avg_voltage:.3f} V, 平均电流: {avg_current:.3f} A, 平均功率: {avg_power:.3f} W")使用轻量级仪表盘进行实时监控(可选): 如果你希望远程查看实时电流,可以在树莓派上运行一个简单的Web服务器。
from flask import Flask, render_template_string, jsonify import threading import time app = Flask(__name__) current_value = 0.0 def background_sampling(): global current_value # 这里是你的采样循环,更新current_value while True: # ... 从INA219读取数据 ... current_value = read_current_from_sensor() time.sleep(0.5) @app.route('/') def index(): html = """ <!DOCTYPE html> <html> <head><title>Current Monitor</title> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> </head> <body> <h1>实时电流监控</h1> <canvas id="currentChart" width="800" height="400"></canvas> <div id="liveValue">当前电流: <span id="curr">0.000</span> A</div> <script> var ctx = document.getElementById('currentChart').getContext('2d'); var chart = new Chart(ctx, { type: 'line', data: { labels: [], datasets: [{ label: 'Current (A)', data: [], borderColor: 'blue' }] }, options: { responsive: false } }); function updateData() { fetch('/data') .then(response => response.json()) .then(data => { document.getElementById('curr').innerText = data.current.toFixed(3); chart.data.labels.push(new Date().toLocaleTimeString()); chart.data.datasets[0].data.push(data.current); if(chart.data.labels.length > 50) { chart.data.labels.shift(); chart.data.datasets[0].data.shift(); } chart.update(); }); } setInterval(updateData, 1000); </script> </body> </html> """ return render_template_string(html) @app.route('/data') def get_data(): return jsonify({'current': current_value}) if __name__ == '__main__': sampler_thread = threading.Thread(target=background_sampling, daemon=True) sampler_thread.start() app.run(host='0.0.0.0', port=8080, debug=False)运行后,在同一网络下的电脑或手机浏览器访问
http://[树莓派IP]:8080就能看到实时电流图表了。
通过以上步骤,你不仅拥有了一套可用的树莓派电流记录仪,更掌握了从硬件选型、系统设计、软件编程到数据处理的全流程知识。这套系统的魅力在于其极强的可扩展性,你可以轻松地修改代码来适应不同的传感器、增加更多的测量通道(使用多个INA219或INA3221这类多通道芯片)、或者将数据接入更复杂的物联网平台。动手试试看,用它来探索你身边电子设备的“能量脉搏”吧。