Merge pull request #6 from FlorianPoot/StickC

Add methods to axp192.py + Add rtc.py
This commit is contained in:
EeeeBin
2019-05-31 17:04:08 +08:00
committed by GitHub
3 changed files with 186 additions and 5 deletions
@@ -1,7 +1,7 @@
import machine
import ustruct
import i2c_bus
class Axp192:
def __init__(self):
self.addr = 0x34
@@ -19,6 +19,104 @@ class Axp192:
regchar(0x36, 0x5c)
regchar(0x90, 0x02)
def screenBreath(self, brightness):
self._regChar(0x28, ((brightness & 0x0f) << 4))
def enableCoulombCounter(self):
self._regChar(0xb8, 0x80)
def disableCoulombCounter(self):
self._regChar(0xb8, 0x00)
def stopCoulombCounter(self):
self._regChar(0xb8, 0xc0)
def clearCoulombCounter(self):
self._regChar(0xb8, 0xa0)
def getCoulombChargeData(self):
buf = self._regChar(0xb0)
buf1 = self._regChar(0xb1)
buf2 = self._regChar(0xb2)
buf3 = self._regChar(0xb3)
return (buf << 24) + (buf1 << 16) + (buf2 << 8) + buf3
def getCoulombDischargeData(self):
buf = self._regChar(0xb4)
buf1 = self._regChar(0xb5)
buf2 = self._regChar(0xb6)
buf3 = self._regChar(0xb7)
return (buf << 24) + (buf1 << 16) + (buf2 << 8) + buf3
def getCoulombData(self):
coin = self.getCoulombChargeData()
coout = self.getCoulombDischargeData()
return 65536 * 0.5 * (coin - coout) / 3600.0 / 25.0
def getVbatData(self):
buf = self._regChar(0x78)
buf1 = self._regChar(0x79)
return (buf << 4) + buf1
def getVinData(self):
buf = self._regChar(0x56)
buf1 = self._regChar(0x57)
return (buf << 4) + buf1
def getIinData(self):
buf = self._regChar(0x58)
buf1 = self._regChar(0x59)
return (buf << 4) + buf1
def getIChargeData(self):
buf = self._regChar(0x7a)
buf1 = self._regChar(0x7b)
return (buf << 5) + buf1
def getIDischargeData(self):
buf = self._regChar(0x7c)
buf1 = self._regChar(0x7d)
return (buf << 5) + buf1
def getTempData(self):
buf = self._regChar(0x5e)
buf1 = self._regChar(0x5f)
return (buf << 4) + buf1
def getPowerBatData(self):
buf = self._regChar(0x70)
buf1 = self._regChar(0x71)
buf2 = self._regChar(0x72)
return (buf << 16) + (buf1 << 8) + buf2
def getVapsData(self):
buf = self._regChar(0x7e)
buf1 = self._regChar(0x7f)
return (buf << 4) + buf1
def setSleep(self):
buf = self._regChar(0x31)
buf = (1 << 3) | buf
self._regChar(0x31, buf)
self._regChar(0x12, 0x41)
def getWarningLevel(self):
buf = self._regChar(0x47)
return buf & 0x01
def _regChar(self, reg, value=None, buf=bytearray(1)):
if value is None:
self.i2c.readfrom_mem_into(self.addr, reg, buf)
@@ -1,7 +1,9 @@
import uos as os
import utime as time
import display as lcd
import machine, ubinascii
import machine
import ubinascii
import axp192
import rtc
from ubutton import Button
from micropython import const
@@ -25,15 +27,17 @@ print('\nDevice ID:' + node_id)
print('LCD initializing...')
# pin Analog and digital
import axp192
axp = axp192.Axp192()
axp.powerAll()
# RTC
rtc = rtc.RTC()
# LCD
lcd = lcd.TFT()
lcd.init(lcd.M5STICK, speed=30000000, bgr=True, mosi=15, miso=36, clk=13, cs=5, dc=23, rst_pin=18, width=80, height=160)
#BUTTON
# BUTTON
m5button = Button()
buttonA = m5button.register(_BUTTON_A_PIN)
buttonB = m5button.register(_BUTTON_B_PIN)
@@ -0,0 +1,79 @@
import ustruct
import i2c_bus
class RTC:
def __init__(self):
self.addr = 0x51
self.i2c = i2c_bus.get(i2c_bus.M_BUS)
def getTime(self):
buf = self._regChar(0x02, buf=bytearray(3))
seconds = self.bcd2ToByte(buf[0] & 0x7f)
minutes = self.bcd2ToByte(buf[1] & 0x7f)
hours = self.bcd2ToByte(buf[2] & 0x3f)
return hours, minutes, seconds
def setTime(self, hours, minutes, seconds):
seconds = self.byteToBcd2(seconds)
minutes = self.byteToBcd2(minutes)
hours = self.byteToBcd2(hours)
self._regChar(0x02, (seconds, minutes, hours), buf=bytearray(3))
def getDate(self):
buf = self._regChar(0x05, buf=bytearray(4))
date = self.bcd2ToByte(buf[0] & 0x3f)
week_day = self.bcd2ToByte(buf[1] & 0x07)
month = self.bcd2ToByte(buf[2] & 0x1f)
if buf[2] & 0x80:
year = 1900 + self.bcd2ToByte(buf[3] & 0xff)
else:
year = 2000 + self.bcd2ToByte(buf[3] & 0xff)
return year, month, date, week_day
def setDate(self, year, month, date, week_day):
date = self.byteToBcd2(date)
week_day = self.byteToBcd2(week_day)
if year < 2000:
month = self.byteToBcd2(month | 0x80)
else:
month = self.byteToBcd2(month | 0x00)
year = self.byteToBcd2(year % 100)
self._regChar(0x05, (date, week_day, month, year), buf=bytearray(4))
def _regChar(self, reg, value=None, buf=bytearray(1)):
if value is None:
self.i2c.readfrom_mem_into(self.addr, reg, buf)
if len(buf) == 1:
return buf[0]
else:
return buf
if type(value) is int:
ustruct.pack_into('<b', buf, 0, value)
else:
ustruct.pack_into('<%db' % len(value), buf, 0, *value)
return self.i2c.writeto_mem(self.addr, reg, buf)
def bcd2ToByte(self, value):
tmp = ((value & 0xF0) >> 0x4) * 10
return tmp + (value & 0x0F)
def byteToBcd2(self, value):
bcdhigh = 0
while value >= 10:
bcdhigh += 1
value -= 10
return (bcdhigh << 4) | value