如何通过JSON获取的数据为Adafruit MCP23017引脚对象设置属性?
问题核心原因
- 你JSON中存储的
pin字段值是字符串标识或数字编号,并非实际的MCP23017引脚实例对象,直接对dataJSON['pin']操作属性本质是修改字符串/数字的属性,自然不会生效。 setattr方法调用语法错误,完整语法为setattr(实例对象, 属性名, 要设置的属性值),你漏写了第三个参数的属性值,所以没有生效。
解决方案
步骤1:预创建引脚实例映射
先将所有需要用到的MCP23017引脚生成实例,存入映射字典,方便后续通过编号/标识快速取到实际引脚对象:
import time import board import busio import digitalio from adafruit_mcp230xx.mcp23017 import MCP23017 i2c = busio.I2C(board.SCL, board.SDA) mcp = MCP23017(i2c) # 生成引脚映射字典,key为引脚编号,value为实际引脚实例 pin_map = {} for pin_num in range(16): # MCP23017共16个引脚,可根据实际使用范围调整 pin = mcp.get_pin(pin_num) # 可在这里统一初始化引脚模式,也可以后续从JSON读配置再设置 pin.switch_to_output(value=False) pin_map[pin_num] = pin
如果你的JSON中pin字段存的是类似"pin0"的字符串标识,可调整映射的key格式:
pin_map[f"pin{pin_num}"] = pin
步骤2:从JSON读配置操作引脚
假设JSON中pin字段存储的是引脚数字编号,按如下方式操作即可:
# 从JSON取目标引脚编号 target_pin_num = dataJSON['pin'] # 从映射字典取实际引脚实例 target_pin = pin_map[target_pin_num] # 两种设置属性的方式都可以正常生效 # 方式1:直接赋值 target_pin.value = True # 方式2:setattr(适合动态指定属性名的场景) setattr(target_pin, 'value', True)
如果需要同时从JSON读取引脚模式、上拉下拉等其他配置,也可以按照同样的逻辑,从JSON取对应配置值后调用对应方法/设置对应属性即可。
内容的提问来源于stack exchange,提问作者Kagetaze
相关产品推荐
相关产品推荐

