树莓派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}")
快速排查步骤
- 全局搜索你代码里的
ina =关键词,确认这行初始化代码的执行顺序在所有ina.xxx()调用之前,且不会被分支逻辑跳过。 - 删掉初始化代码外层无意义的
try-except,先让初始化的错误正常抛出来,确认实例能创建成功。 - 如果初始化写在函数里,必须用变量接收函数return的实例对象,不要直接访问函数内部的局部变量。
- 检查代码里有没有给
ina重复赋值、删除变量的逻辑。
内容的提问来源于stack exchange,提问作者ZSupreme
相关产品推荐
相关产品推荐

