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

树莓派3读取INA219数据写CSV报NameError问题求助

树莓派3 INA219采集写入CSV报NameError: name 'ina' is not defined解决方案

这个报错和硬件、INA219驱动库没有任何关系——你单独跑读取逻辑能出数,已经排除了硬件连接、I2C识别、库安装的问题,根因100%出在变量作用域/初始化逻辑错误:你调用ina.voltage()等方法的时候,当前代码执行路径里根本没有创建过名为ina的传感器实例对象。

最常见的3种踩坑场景

  • 初始化代码写在了局部作用域,全局/其他作用域访问不到
    比如把ina = INA219(...)的初始化代码写在了某个自定义函数内部,没有把实例return出来,直接在函数外部调用ina的方法;或者把初始化写在了if/for等条件分支里,实际运行时分支没触发,根本没执行到初始化代码。
  • 初始化逻辑被吞错/拼写错误/被注释
    比如手滑把初始化的变量名写成ina_sensor,后面调用用ina;或者初始化代码被临时注释没放开;最常见的是给初始化套了无意义的try-except,初始化本身报错(比如地址写错、I2C权限不够)被直接pass跳过,实例根本没创建成功,后面调用直接报未定义。
  • 变量被意外覆盖/删除
    比如在采集循环里不小心写了del ina,或者给ina赋了其他类型的值,把传感器实例覆盖掉了。

可直接运行的正确实现

先安装依赖库:
pip3 install pi-ina219

完整采集+写CSV代码,注意观察ina实例的初始化位置:

import csv
import time
from ina219 import INA219
from ina219 import DeviceRangeError

# 按你实际硬件参数修改,常见模块采样电阻为0.1Ω
SHUNT_RESISTOR_OHM = 0.1
# 采样间隔,单位秒
SAMPLE_INTERVAL = 2
# CSV文件保存路径
CSV_SAVE_PATH = "./ina219_collect_data.csv"

def init_ina_sensor(sensor_addr=0x42):
    """初始化INA219传感器,返回实例对象"""
    sensor = INA219(SHUNT_RESISTOR_OHM, address=sensor_addr)
    sensor.configure()
    return sensor

def init_csv_file():
    """CSV文件不存在时写入表头"""
    try:
        with open(CSV_SAVE_PATH, "r", encoding="utf-8") as f:
            pass
    except FileNotFoundError:
        with open(CSV_SAVE_PATH, "w", newline="", encoding="utf-8") as f:
            csv_writer = csv.writer(f)
            csv_writer.writerow([
                "采集时间",
                "总线电压(V)",
                "总线电流(mA)",
                "功率(mW)",
                "分流电压(mV)"
            ])

if __name__ == "__main__":
    # 传感器初始化必须放在所有调用ina方法的代码之前,确保一定会执行
    ina = init_ina_sensor(sensor_addr=0x42)
    init_csv_file()
    print("采集启动,按Ctrl+C终止")
    try:
        while True:
            current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            try:
                # 读取四个测量值
                v_bus = ina.voltage()
                i_bus = ina.current()
                p_bus = ina.power()
                v_shunt = ina.shunt_voltage()
                # 追加写入CSV
                with open(CSV_SAVE_PATH, "a", newline="", encoding="utf-8") as f:
                    csv_writer = csv.writer(f)
                    csv_writer.writerow([
                        current_time,
                        round(v_bus, 3),
                        round(i_bus, 3),
                        round(p_bus, 3),
                        round(v_shunt, 3)
                    ])
                print(f"[{current_time}] 电压:{v_bus:.3f}V 电流:{i_bus:.3f}mA 功率:{p_bus:.3f}mW 分流电压:{v_shunt:.3f}mV")
            except DeviceRangeError:
                print(f"[{current_time}] 当前测量值超出传感器量程,跳过本次采样")
            time.sleep(SAMPLE_INTERVAL)
    except KeyboardInterrupt:
        print(f"\n采集终止,数据已保存至{CSV_SAVE_PATH}")

快速排查步骤

  1. 全局搜索你代码里的ina = 关键词,确认这行初始化代码的执行顺序在所有ina.xxx()调用之前,且不会被分支逻辑跳过。
  2. 删掉初始化代码外层无意义的try-except,先让初始化的错误正常抛出来,确认实例能创建成功。
  3. 如果初始化写在函数里,必须用变量接收函数return的实例对象,不要直接访问函数内部的局部变量。
  4. 检查代码里有没有给ina重复赋值、删除变量的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:15:39