Tasmota/lib/lib_i2c/DFRobot_MAX17043/python/micropython/DFRobot_MAX17043.py
Vincent de Groot bc41500d9c
MAX17043 sensor integration (#18788)
* Restart MAX17043 from the scratch

* revert change

* Changed battery capacity in charge (capacity is the Ah value of the battery, this degrades over time when battery ages)

* merge

* Changing xsns_109 to 110

* fix nr

* removed old xsns109

* Update I2CDEVICES.md

* clean-up usage of Interface
2023-07-22 13:33:47 +02:00

112 lines
2.7 KiB
Python

'''!
@file DFRobot_MAX17043.py
@copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
@license The MIT License (MIT)
@author [ouki.wang](ouki.wang@dfrobot.com)
@version V1.0
@date 2018-4-14
@url https://github.com/DFRobot/DFRobot_MAX17043
'''
import time
from machine import I2C, Pin
## Get I2C bus
i2c = I2C(scl = Pin(22), sda = Pin(21), freq=400000)
MAX17043_ADDR = 0x36
MAX17043_VCELL = 0x02
MAX17043_SOC = 0x04
MAX17043_MODE = 0x06
MAX17043_VERSION = 0x08
MAX17043_CONFIG = 0x0c
MAX17043_COMMAND = 0xfe
class DFRobot_MAX17043():
def __init__(self):
'''!
@brief create MAX17043 object
@return MAX17043 object
'''
pass
def begin(self):
'''!
@brief MAX17043 begin and test moudle
@return initialization result:
@retval 0 successful
@retval -1 faild
'''
self._write16(MAX17043_COMMAND, 0x5400)
time.sleep(0.01)
if self._read16(MAX17043_CONFIG) == 0x971c:
self._write16(MAX17043_MODE, 0x4000)
time.sleep(0.01)
self._write16(MAX17043_CONFIG, 0x9700)
return 0
else:
return -1
def read_voltage(self):
'''!
@brief read battery voltage in mV
@return voltage in mV
'''
return (1.25 * (self._read16(MAX17043_VCELL) >> 4))
def read_percentage(self):
'''!
@brief read battery remaining capacity in percentage
@return battery remaining capacity in percentage
'''
tmp = self._read16(MAX17043_SOC)
return ((tmp >> 8) + 0.003906 * (tmp & 0x00ff))
def set_Interrupt(self, per):
'''!
@brief set MAX17043 interrput threshold
@param per interrupt threshold as %1 - 32% (integer)
'''
if per > 32:
per = 32
elif per < 1:
per = 1
per = 32 - int(per)
self._write_reg_bits(MAX17043_CONFIG, per, 0x01f, 0)
def clear_interrupt(self):
'''!
@brief clear MAX17043 interrupt.
'''
self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 5)
def set_sleep(self):
'''!
@brief set MAX17043 in sleep mode.
'''
self._write_reg_bits(MAX17043_CONFIG, 1, 0x01, 7)
def set_wakeup(self):
'''!
@brief wake up MAX17043.
'''
self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 7)
def _write16(self, reg, dat):
buf = bytearray(2)
buf[0] = dat >> 8
buf[1] = dat & 0x00ff
i2c.writeto_mem(MAX17043_ADDR, reg, buf)
def _read16(self, reg):
buf = i2c.readfrom_mem(MAX17043_ADDR, reg, 2)
return ((buf[0] << 8) | buf[1])
def _write_reg_bits(self, reg, dat, bits, offset):
tmp = self._read16(reg)
tmp = (tmp & (~(bits << offset))) | (dat << offset)
self._write16(reg, tmp)