Files
archery/I2C.py
2025-11-24 16:52:53 +08:00

89 lines
2.1 KiB
Python

from maix import i2c, pinmap, time
# 配置 I2C1 引脚(请根据实际连接修改)
pinmap.set_pin_function("P18", "I2C1_SCL")
pinmap.set_pin_function("P21", "I2C1_SDA")
bus = i2c.I2C(1, i2c.Mode.MASTER)
INA226_ADDR = 0x40
# 寄存器定义
REG_CONFIGURATION = 0x00
REG_BUS_VOLTAGE = 0x02
REG_CALIBRATION = 0x05
# 校准值(不读取电流/功率时也可以省略)
CALIBRATION_VALUE = 0x1400
def write_register(reg, value):
data = [(value >> 8) & 0xFF, value & 0xFF]
bus.writeto_mem(INA226_ADDR, reg, bytes(data))
def read_register(reg):
data = bus.readfrom_mem(INA226_ADDR, reg, 2)
return (data[0] << 8) | data[1]
def init_ina226():
write_register(REG_CONFIGURATION, 0x4527)
write_register(REG_CALIBRATION, CALIBRATION_VALUE)
def get_bus_voltage():
raw = read_register(REG_BUS_VOLTAGE)
return raw * 1.25 / 1000 # 单位 V
def voltage_to_percent(voltage):
if voltage >= 4.20:
return 100
elif voltage >= 4.15:
return 95
elif voltage >= 4.10:
return 90
elif voltage >= 4.05:
return 85
elif voltage >= 4.00:
return 80
elif voltage >= 3.95:
return 75
elif voltage >= 3.90:
return 70
elif voltage >= 3.85:
return 65
elif voltage >= 3.80:
return 60
elif voltage >= 3.75:
return 55
elif voltage >= 3.70:
return 50
elif voltage >= 3.65:
return 45
elif voltage >= 3.60:
return 40
elif voltage >= 3.55:
return 35
elif voltage >= 3.50:
return 30
elif voltage >= 3.45:
return 25
elif voltage >= 3.40:
return 20
elif voltage >= 3.35:
return 15
elif voltage >= 3.30:
return 10
elif voltage >= 3.20:
return 5
else:
return 0
# 初始化 INA226
init_ina226()
# 主循环,只显示电量百分比
while True:
voltage = get_bus_voltage()
battery_percent = voltage_to_percent(voltage)
print(f"当前电压: {voltage:.3f} V")
print(f"估算电池电量: {battery_percent} %\n")
time.sleep(2000)