Der liebe Fritzler hat mir was gelötet.
Ein Python Script welches auf einem Raspi-Zero läuft und den I2C Quark vom BQ77PL900 und BQ34Z100 mitliest und Decodiert.
an den Akku an der BMS Platine anstecken und mitlesen.
Allerdings kommt der I2C Bus gerne durcheinander, ist ja klar.
Code: Alles auswählen
#!/usr/bin/python
#
# Forumakku Script zur Diagnose des BQ77PL900
# und des BQ34Z100
#
# I2C Anschließen an Raspi_Zero Pin3 I2C DATA, Pin5 I2C Clock, Pin 9 GND
# Idee: Hightech
# Realisation: Fritzler
#
#
from smbus import SMBus
from bitstring import BitArray, BitStream
import time
import os
i2cbus = SMBus(1) # Create a new I2C bus
i2caddress = 0x10 # Address of BQ77PL900
i2caddress_fg = 0x55 # Address of BQ34z100
class bq77_register:
def __init__(self,nameReg,bitNameList):
self.nameReg = nameReg
self.bitNameList = bitNameList
regList=[]
regList.append(bq77_register('Status', ['Charge','Discharge','VGOOD','OverTemp','UnderVoltage','OverVoltage','OverLoad','ShortDischarge']))
regList.append(bq77_register('Output_Control', ['FS','ParityErrorEeprom','NULL','NULL','GPOD','ChargeHostModus','DischargeHostModus','Faultlatch']))
regList.append(bq77_register('State_Contol', ['IGAIN','VGAIN','NULL','NULL','NULL','NULL','HostMode','ShutDownEnable']))
regList.append(bq77_register('Function_Control', ['CBAL09','CBAL10','TOUT','BAT','PACK','IACAL','IAEN','VAEN']))
regList.append(bq77_register('Cell_Balance', ['CBAL08','CBAL07','CBAL06','CBAL05','CBAL04','CBAL03','CBAL02','CBAL01']))
regList.append(bq77_register('Cell_Sel', ['NULL','CAL2','CAL1','CAL0','CELL4','CELL3','CELL2','CELL1']))
regList.append(bq77_register('OverVoltage_Delay_Hysteresis', ['OVD2','OVD1','OVD0','OVH1','OVH0','OV2','OV1','OV0']))
regList.append(bq77_register('UnderVoltage_Delay_Hysteresis', ['UVFET_DIS','UVH1','UVH0','UV3','UV2','UV2','UV1','UV0']))
regList.append(bq77_register('OverCurrent_UnderVoltage_Delay', ['UVD3','UVD2','UVD1','UVD0','OCD3','OCD2','OCD1','OCD0']))
regList.append(bq77_register('OverCurrent_Discharge', ['CellBalEn','Zero_V_Charge','RecoverCondition','OCDD4','OCDD3','OCDD2','OCDD1','OCDD0']))
regList.append(bq77_register('Short_Discharge_Cfg', ['SCDD3','SCDD2','SCDD1','SCDD0','SCD3','SCD2','SCD1','SCD0']))
try:
while True:
os.system('cls' if os.name == 'nt' else 'clear')
print("---------- BQ77PL900--------------------")
print ("\n")
for registerAddr in range(len(regList)):
regByte = i2cbus.read_byte_data(i2caddress, registerAddr)
regBits = '{0:08b}'.format(regByte)
regObj = regList[registerAddr]
firstBlood = True
outStr = regObj.nameReg + ": "
for bitNum in range(8):
if regBits[bitNum] == "1":
if (False == firstBlood):
outStr += ", "
outStr += regObj.bitNameList[bitNum]
firstBlood = False
if (False == firstBlood):
outStr += " "
print(outStr)
print("\n")
if (i2cbus.read_word_data(i2caddress_fg, 0x02)):
print("---------- BQ34Z1000--------------------")
print("\n")
fg_Byte = i2cbus.read_word_data(i2caddress_fg, 0x02)
print ("Ladezustand "+str(fg_Byte)+" %")
fg_Byte = i2cbus.read_word_data(i2caddress_fg, 0x04)
print ("Restkapazität "+str(fg_Byte/100)+" Ah")
fg_Byte = i2cbus.read_word_data(i2caddress_fg, 0x06)
print ("Kapazität "+str(fg_Byte/100)+" Ah")
fg_Byte = i2cbus.read_word_data(i2caddress_fg, 0x08)
print ("Spannung "+str(fg_Byte/1000)+" Volt")
fg_Byte = i2cbus.read_word_data(i2caddress_fg, 0x0A)
print ("Durchschnitt Strom "+str(fg_Byte/10000)+" A")
fg_Byte = i2cbus.read_word_data(i2caddress_fg, 0x0C)
print ("Temperatur "+str(fg_Byte/100)+" °C")
fg_Byte = i2cbus.read_word_data(i2caddress_fg, 0x10)
time.sleep(1)
except KeyboardInterrupt:
print("Oh! you pressed CTRL + C.")
print("Program interrupted.")