Fix: 修复MicroPython MixGoAI和Microbit下一些py异常同时格式化代码

This commit is contained in:
王立帮
2024-12-03 10:36:49 +08:00
parent e6c9a30bdc
commit ee04dadb66
71 changed files with 3265 additions and 2382 deletions

View File

@@ -3,13 +3,14 @@ import time
import ustruct import ustruct
DATA_FORMAT = 0x31 DATA_FORMAT = 0x31
BW_RATE = 0x2c BW_RATE = 0x2C
POWER_CTL = 0x2d POWER_CTL = 0x2D
INT_ENABLE = 0x2E INT_ENABLE = 0x2E
OFSX = 0x1e OFSX = 0x1E
OFSY =0x1f OFSY = 0x1F
OFSZ = 0x20 OFSZ = 0x20
class ADXL345: class ADXL345:
def __init__(self, i2c): def __init__(self, i2c):
self.i2c = i2c self.i2c = i2c
@@ -18,9 +19,9 @@ class ADXL345:
for s in slv: for s in slv:
buf = self.i2c.readfrom_mem(s, 0, 1) buf = self.i2c.readfrom_mem(s, 0, 1)
print(buf) print(buf)
if(buf[0] == 0xe5): if buf[0] == 0xE5:
self.slvAddr = s self.slvAddr = s
print('adxl345 found') print("adxl345 found")
break break
# self.writeByte(POWER_CTL,0x00) #sleep # self.writeByte(POWER_CTL,0x00) #sleep
# time.sleep(0.001) # time.sleep(0.001)
@@ -39,25 +40,25 @@ class ADXL345:
time.sleep(1) time.sleep(1)
def readXYZ(self): def readXYZ(self):
fmt = '<h' #little-endian fmt = "<h" # little-endian
buf1 = self.readByte(0x32) buf1 = self.readByte(0x32)
buf2 = self.readByte(0x33) buf2 = self.readByte(0x33)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
x, = ustruct.unpack(fmt, buf) (x,) = ustruct.unpack(fmt, buf)
x = x * 3.9 x = x * 3.9
# print('x:',x) # print('x:',x)
buf1 = self.readByte(0x34) buf1 = self.readByte(0x34)
buf2 = self.readByte(0x35) buf2 = self.readByte(0x35)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
y, = ustruct.unpack(fmt, buf) (y,) = ustruct.unpack(fmt, buf)
y = y * 3.9 y = y * 3.9
# print('y:',y) # print('y:',y)
buf1 = self.readByte(0x36) buf1 = self.readByte(0x36)
buf2 = self.readByte(0x37) buf2 = self.readByte(0x37)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
z, = ustruct.unpack(fmt, buf) (z,) = ustruct.unpack(fmt, buf)
z = z * 3.9 z = z * 3.9
# print('z:',z) # print('z:',z)
# print('************************') # print('************************')
@@ -76,10 +77,12 @@ class ADXL345:
def writeByte(self, addr, data): def writeByte(self, addr, data):
d = bytearray([data]) d = bytearray([data])
self.i2c.writeto_mem(self.slvAddr, addr, d) self.i2c.writeto_mem(self.slvAddr, addr, d)
def readByte(self, addr): def readByte(self, addr):
return self.i2c.readfrom_mem(self.slvAddr, addr, 1) return self.i2c.readfrom_mem(self.slvAddr, addr, 1)
if __name__ == '__main__':
if __name__ == "__main__":
# 初始化 # 初始化
sensor = ADXL345(i2c) sensor = ADXL345(i2c)

View File

@@ -31,6 +31,7 @@ task_fe=None
info = None info = None
bb = 1 bb = 1
def set_key_state(*_): def set_key_state(*_):
global start_processing global start_processing
global tim2 global tim2
@@ -55,7 +56,18 @@ def init(FD,LD,FE):
key_gpio = board.pin(9, board.GPIO.IN, board.GPIO.PULL_UP) key_gpio = board.pin(9, board.GPIO.IN, board.GPIO.PULL_UP)
key_gpio.irq(set_key_state, board.GPIO.IRQ_RISING, board.GPIO.WAKEUP_NOT_SUPPORT) key_gpio.irq(set_key_state, board.GPIO.IRQ_RISING, board.GPIO.WAKEUP_NOT_SUPPORT)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437,6.92275, 6.718375, 9.01025) # anchor for face detect anchor = (
1.889,
2.5245,
2.9465,
3.94056,
3.99987,
5.3658,
5.155437,
6.92275,
6.718375,
9.01025,
) # anchor for face detect
kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor) kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor)
@@ -85,7 +97,7 @@ def train(img,names,threshold):
T = image.get_affine_transform(src_point, dst_point) T = image.get_affine_transform(src_point, dst_point)
a = image.warp_affine_ai(img, img_face, T) a = image.warp_affine_ai(img, img_face, T)
a = img_face.ai_to_pix() a = img_face.ai_to_pix()
del(face_cut_128) del face_cut_128
fmap = kpu.forward(task_fe, img_face) fmap = kpu.forward(task_fe, img_face)
feature = kpu.face_encode(fmap[:]) feature = kpu.face_encode(fmap[:])
reg_flag = False reg_flag = False
@@ -118,16 +130,19 @@ def train(img,names,threshold):
return False return False
gc.collect() gc.collect()
def info_name(): def info_name():
gc.collect() gc.collect()
return info[0] return info[0]
def info_score(): def info_score():
return info[1] return info[1]
def info_face(): def info_face():
return info[2] return info[2]
def info_organs(): def info_organs():
return info[3] return info[3]

View File

@@ -5,10 +5,12 @@ wifi_en=board.pin(19,board.GPIO.OUT)
board.register(18, board.FPIOA.UART2_TX) board.register(18, board.FPIOA.UART2_TX)
board.register(17, board.FPIOA.UART2_RX) board.register(17, board.FPIOA.UART2_RX)
def wifi_enable(en): def wifi_enable(en):
global wifi_en global wifi_en
wifi_en.value(en) wifi_en.value(en)
def wifi_reset(): def wifi_reset():
global uart global uart
wifi_enable(0) wifi_enable(0)
@@ -19,7 +21,9 @@ def wifi_reset():
tmp = uart.read() tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n") uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read()) print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data uart = UART(
UART.UART2, 921600, timeout=1000, read_buf_len=10240
) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n") uart.write("AT\r\n")
tmp = uart.read() tmp = uart.read()
print(tmp) print(tmp)
@@ -32,6 +36,7 @@ def wifi_reset():
return None return None
return nic return nic
def nic_init(account, password): def nic_init(account, password):
nic = wifi_reset() nic = wifi_reset()
if not nic: if not nic:
@@ -41,7 +46,7 @@ def nic_init(account,password):
nic.ifconfig() nic.ifconfig()
class SimpleEncode(): class SimpleEncode:
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|" keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|"
keyLength = len(keyStr) keyLength = len(keyStr)
encryptionA = 17 encryptionA = 17
@@ -63,8 +68,8 @@ class SimpleEncode():
def base64Encode(self, sourceStr): def base64Encode(self, sourceStr):
encode = "" encode = ""
for ch in base64.b64encode(sourceStr.encode()).decode(): for ch in base64.b64encode(sourceStr.encode()).decode():
if ch == '=': if ch == "=":
encode += '=' encode += "="
else: else:
for i in range(64): for i in range(64):
if ch == self.STANDARD[i]: if ch == self.STANDARD[i]:
@@ -74,7 +79,9 @@ class SimpleEncode():
def encrpyt(self, sourceStr): def encrpyt(self, sourceStr):
srcLength = len(sourceStr) srcLength = len(sourceStr)
# 先加入干扰字符的数量 # 先加入干扰字符的数量
addCharCount = random.randint(1,self.preCountMax) if srcLength < self.preCountMax else 0 addCharCount = (
random.randint(1, self.preCountMax) if srcLength < self.preCountMax else 0
)
# 随机字符 # 随机字符
sb = str(addCharCount) + "|" sb = str(addCharCount) + "|"
for i in range(addCharCount): for i in range(addCharCount):
@@ -88,7 +95,7 @@ class SimpleEncode():
# base64 加密 # base64 加密
base64Str = self.base64Encode(sb) base64Str = self.base64Encode(sb)
destStr = '' destStr = ""
for i in range(len(base64Str)): for i in range(len(base64Str)):
# 找到字符所在位置 # 找到字符所在位置
position = self.keyStr.find(base64Str[i]) position = self.keyStr.find(base64Str[i])
@@ -102,36 +109,34 @@ class SimpleEncode():
return destStr return destStr
def token(account, password): def token(account, password):
url = 'http://ai.heclouds.com:9090/v1/user/oneNetLogin' url = "http://ai.heclouds.com:9090/v1/user/oneNetLogin"
headers = { headers = {
'Content-Type': 'application/json', "Content-Type": "application/json",
} }
simpleencode = SimpleEncode() simpleencode = SimpleEncode()
data = {'account': account, 'password': simpleencode.encrpyt(password)} data = {"account": account, "password": simpleencode.encrpyt(password)}
req = request.post(url, data=json.dumps(data), headers=headers) req = request.post(url, data=json.dumps(data), headers=headers)
# print(req.text) # print(req.text)
try: try:
return eval(req.text)['data']['loginToken'] return eval(req.text)["data"]["loginToken"]
except: except:
raise ValueError("[Cool.AI]:Wrong account or password ") raise ValueError("[Cool.AI]:Wrong account or password ")
def post_ai(img, urlx, Token): def post_ai(img, urlx, Token):
ur = 'http://183.230.40.32:9090/v1/aiApi/picture/MixPY' ur = "http://183.230.40.32:9090/v1/aiApi/picture/MixPY"
url = ur.replace("MixPY", urlx) url = ur.replace("MixPY", urlx)
headers ={ headers = {"Content-Type": "application/json", "Login-Token": "Token"}
'Content-Type':'application/json',
'Login-Token':'Token'
}
headers['Login-Token']=Token headers["Login-Token"] = Token
imge = img.compressed(quality=50) imge = img.compressed(quality=50)
file = imge.to_bytes() file = imge.to_bytes()
str = base64.b64encode(file).decode() str = base64.b64encode(file).decode()
data = {'picture':[str]} data = {"picture": [str]}
req = request.post(url, data=json.dumps(data), headers=headers) req = request.post(url, data=json.dumps(data), headers=headers)
return json.loads(req.text) return json.loads(req.text)
# return eval(req.text) # return eval(req.text)

View File

@@ -3,25 +3,38 @@ import struct
import binascii import binascii
__all__ = [ __all__ = [
'encode', 'decode', 'encodebytes', 'decodebytes', "encode",
'b64encode', 'b64decode', 'b32encode', 'b32decode', "decode",
'b16encode', 'b16decode', "encodebytes",
'standard_b64encode', 'standard_b64decode', "decodebytes",
'urlsafe_b64encode', 'urlsafe_b64decode', "b64encode",
"b64decode",
"b32encode",
"b32decode",
"b16encode",
"b16decode",
"standard_b64encode",
"standard_b64decode",
"urlsafe_b64encode",
"urlsafe_b64decode",
] ]
bytes_types = (bytes, bytearray) bytes_types = (bytes, bytearray)
def _bytes_from_decode_data(s): def _bytes_from_decode_data(s):
if isinstance(s, str): if isinstance(s, str):
try: try:
return s.encode('ascii') return s.encode("ascii")
except: except:
raise ValueError('string argument should contain only ASCII characters') raise ValueError("string argument should contain only ASCII characters")
elif isinstance(s, bytes_types): elif isinstance(s, bytes_types):
return s return s
else: else:
raise TypeError("argument should be bytes or ASCII string, not %s" % s.__class__.__name__) raise TypeError(
"argument should be bytes or ASCII string, not %s" % s.__class__.__name__
)
def b64encode(s, altchars=None): def b64encode(s, altchars=None):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
@@ -29,44 +42,72 @@ def b64encode(s, altchars=None):
encoded = binascii.b2a_base64(s)[:-1] encoded = binascii.b2a_base64(s)[:-1]
if altchars is not None: if altchars is not None:
if not isinstance(altchars, bytes_types): if not isinstance(altchars, bytes_types):
raise TypeError("expected bytes, not %s" raise TypeError("expected bytes, not %s" % altchars.__class__.__name__)
% altchars.__class__.__name__)
assert len(altchars) == 2, repr(altchars) assert len(altchars) == 2, repr(altchars)
return encoded.translate(bytes.maketrans(b'+/', altchars)) return encoded.translate(bytes.maketrans(b"+/", altchars))
return encoded return encoded
def b64decode(s, altchars=None, validate=False): def b64decode(s, altchars=None, validate=False):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
if altchars is not None: if altchars is not None:
altchars = _bytes_from_decode_data(altchars) altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars) assert len(altchars) == 2, repr(altchars)
s = s.translate(bytes.maketrans(altchars, b'+/')) s = s.translate(bytes.maketrans(altchars, b"+/"))
if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): if validate and not re.match(b"^[A-Za-z0-9+/]*={0,2}$", s):
raise binascii.Error('Non-base64 digit found') raise binascii.Error("Non-base64 digit found")
return binascii.a2b_base64(s) return binascii.a2b_base64(s)
def standard_b64encode(s): def standard_b64encode(s):
return b64encode(s) return b64encode(s)
def standard_b64decode(s): def standard_b64decode(s):
return b64decode(s) return b64decode(s)
def urlsafe_b64encode(s): def urlsafe_b64encode(s):
raise NotImplementedError() raise NotImplementedError()
def urlsafe_b64decode(s): def urlsafe_b64decode(s):
raise NotImplementedError() raise NotImplementedError()
_b32alphabet = { _b32alphabet = {
0: b'A', 9: b'J', 18: b'S', 27: b'3', 0: b"A",
1: b'B', 10: b'K', 19: b'T', 28: b'4', 9: b"J",
2: b'C', 11: b'L', 20: b'U', 29: b'5', 18: b"S",
3: b'D', 12: b'M', 21: b'V', 30: b'6', 27: b"3",
4: b'E', 13: b'N', 22: b'W', 31: b'7', 1: b"B",
5: b'F', 14: b'O', 23: b'X', 10: b"K",
6: b'G', 15: b'P', 24: b'Y', 19: b"T",
7: b'H', 16: b'Q', 25: b'Z', 28: b"4",
8: b'I', 17: b'R', 26: b'2', 2: b"C",
11: b"L",
20: b"U",
29: b"5",
3: b"D",
12: b"M",
21: b"V",
30: b"6",
4: b"E",
13: b"N",
22: b"W",
31: b"7",
5: b"F",
14: b"O",
23: b"X",
6: b"G",
15: b"P",
24: b"Y",
7: b"H",
16: b"Q",
25: b"Z",
8: b"I",
17: b"R",
26: b"2",
} }
_b32tab = [v[0] for k, v in sorted(_b32alphabet.items())] _b32tab = [v[0] for k, v in sorted(_b32alphabet.items())]
@@ -82,26 +123,29 @@ def b32encode(s):
quanta += 1 quanta += 1
encoded = bytearray() encoded = bytearray()
for i in range(quanta): for i in range(quanta):
c1, c2, c3 = struct.unpack('!HHB', s[i*5:(i+1)*5]) c1, c2, c3 = struct.unpack("!HHB", s[i * 5 : (i + 1) * 5])
c2 += (c1 & 1) << 16 c2 += (c1 & 1) << 16
c3 += (c2 & 3) << 8 c3 += (c2 & 3) << 8
encoded += bytes([_b32tab[c1 >> 11], encoded += bytes(
_b32tab[(c1 >> 6) & 0x1f], [
_b32tab[(c1 >> 1) & 0x1f], _b32tab[c1 >> 11],
_b32tab[(c1 >> 6) & 0x1F],
_b32tab[(c1 >> 1) & 0x1F],
_b32tab[c2 >> 12], _b32tab[c2 >> 12],
_b32tab[(c2 >> 7) & 0x1f], _b32tab[(c2 >> 7) & 0x1F],
_b32tab[(c2 >> 2) & 0x1f], _b32tab[(c2 >> 2) & 0x1F],
_b32tab[c3 >> 5], _b32tab[c3 >> 5],
_b32tab[c3 & 0x1f], _b32tab[c3 & 0x1F],
]) ]
)
if leftover == 1: if leftover == 1:
encoded = encoded[:-6] + b'======' encoded = encoded[:-6] + b"======"
elif leftover == 2: elif leftover == 2:
encoded = encoded[:-4] + b'====' encoded = encoded[:-4] + b"===="
elif leftover == 3: elif leftover == 3:
encoded = encoded[:-3] + b'===' encoded = encoded[:-3] + b"==="
elif leftover == 4: elif leftover == 4:
encoded = encoded[:-1] + b'=' encoded = encoded[:-1] + b"="
return bytes(encoded) return bytes(encoded)
@@ -109,14 +153,14 @@ def b32decode(s, casefold=False, map01=None):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
quanta, leftover = divmod(len(s), 8) quanta, leftover = divmod(len(s), 8)
if leftover: if leftover:
raise binascii.Error('Incorrect padding') raise binascii.Error("Incorrect padding")
if map01 is not None: if map01 is not None:
map01 = _bytes_from_decode_data(map01) map01 = _bytes_from_decode_data(map01)
assert len(map01) == 1, repr(map01) assert len(map01) == 1, repr(map01)
s = s.translate(bytes.maketrans(b'01', b'O' + map01)) s = s.translate(bytes.maketrans(b"01", b"O" + map01))
if casefold: if casefold:
s = s.upper() s = s.upper()
padchars = s.find(b'=') padchars = s.find(b"=")
if padchars > 0: if padchars > 0:
padchars = len(s) - padchars padchars = len(s) - padchars
s = s[:-padchars] s = s[:-padchars]
@@ -129,16 +173,16 @@ def b32decode(s, casefold=False, map01=None):
for c in s: for c in s:
val = _b32rev.get(c) val = _b32rev.get(c)
if val is None: if val is None:
raise binascii.Error('Non-base32 digit found') raise binascii.Error("Non-base32 digit found")
acc += _b32rev[c] << shift acc += _b32rev[c] << shift
shift -= 5 shift -= 5
if shift < 0: if shift < 0:
parts.append(binascii.unhexlify(bytes('%010x' % acc, "ascii"))) parts.append(binascii.unhexlify(bytes("%010x" % acc, "ascii")))
acc = 0 acc = 0
shift = 35 shift = 35
last = binascii.unhexlify(bytes('%010x' % acc, "ascii")) last = binascii.unhexlify(bytes("%010x" % acc, "ascii"))
if padchars == 0: if padchars == 0:
last = b'' last = b""
elif padchars == 1: elif padchars == 1:
last = last[:-1] last = last[:-1]
elif padchars == 3: elif padchars == 3:
@@ -148,9 +192,10 @@ def b32decode(s, casefold=False, map01=None):
elif padchars == 6: elif padchars == 6:
last = last[:-4] last = last[:-4]
else: else:
raise binascii.Error('Incorrect padding') raise binascii.Error("Incorrect padding")
parts.append(last) parts.append(last)
return b''.join(parts) return b"".join(parts)
def b16encode(s): def b16encode(s):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
@@ -162,13 +207,15 @@ def b16decode(s, casefold=False):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
if casefold: if casefold:
s = s.upper() s = s.upper()
if re.search(b'[^0-9A-F]', s): if re.search(b"[^0-9A-F]", s):
raise binascii.Error('Non-base16 digit found') raise binascii.Error("Non-base16 digit found")
return binascii.unhexlify(s) return binascii.unhexlify(s)
MAXLINESIZE = 76 MAXLINESIZE = 76
MAXBINSIZE = (MAXLINESIZE // 4) * 3 MAXBINSIZE = (MAXLINESIZE // 4) * 3
def encode(input, output): def encode(input, output):
while True: while True:
s = input.read(MAXBINSIZE) s = input.read(MAXBINSIZE)
@@ -191,6 +238,7 @@ def decode(input, output):
s = binascii.a2b_base64(line) s = binascii.a2b_base64(line)
output.write(s) output.write(s)
def encodebytes(s): def encodebytes(s):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__) raise TypeError("expected bytes, not %s" % s.__class__.__name__)
@@ -200,10 +248,13 @@ def encodebytes(s):
pieces.append(binascii.b2a_base64(chunk)) pieces.append(binascii.b2a_base64(chunk))
return b"".join(pieces) return b"".join(pieces)
def encodestring(s): def encodestring(s):
import warnings import warnings
warnings.warn("encodestring() is a deprecated alias, use encodebytes()",
DeprecationWarning, 2) warnings.warn(
"encodestring() is a deprecated alias, use encodebytes()", DeprecationWarning, 2
)
return encodebytes(s) return encodebytes(s)
@@ -212,36 +263,50 @@ def decodebytes(s):
raise TypeError("expected bytes, not %s" % s.__class__.__name__) raise TypeError("expected bytes, not %s" % s.__class__.__name__)
return binascii.a2b_base64(s) return binascii.a2b_base64(s)
def decodestring(s): def decodestring(s):
import warnings import warnings
warnings.warn("decodestring() is a deprecated alias, use decodebytes()",
DeprecationWarning, 2) warnings.warn(
"decodestring() is a deprecated alias, use decodebytes()", DeprecationWarning, 2
)
return decodebytes(s) return decodebytes(s)
def main(): def main():
import sys, getopt import sys, getopt
try: try:
opts, args = getopt.getopt(sys.argv[1:], 'deut') opts, args = getopt.getopt(sys.argv[1:], "deut")
except getopt.error as msg: except getopt.error as msg:
sys.stdout = sys.stderr sys.stdout = sys.stderr
print(msg) print(msg)
print("""usage: %s [-d|-e|-u|-t] [file|-] print(
"""usage: %s [-d|-e|-u|-t] [file|-]
-d, -u: decode -d, -u: decode
-e: encode (default) -e: encode (default)
-t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0]) -t: encode and decode string 'Aladdin:open sesame'"""
% sys.argv[0]
)
sys.exit(2) sys.exit(2)
func = encode func = encode
for o, a in opts: for o, a in opts:
if o == '-e': func = encode if o == "-e":
if o == '-d': func = decode func = encode
if o == '-u': func = decode if o == "-d":
if o == '-t': test(); return func = decode
if args and args[0] != '-': if o == "-u":
with open(args[0], 'rb') as f: func = decode
if o == "-t":
test()
return
if args and args[0] != "-":
with open(args[0], "rb") as f:
func(f, sys.stdout.buffer) func(f, sys.stdout.buffer)
else: else:
func(sys.stdin.buffer, sys.stdout.buffer) func(sys.stdin.buffer, sys.stdout.buffer)
def test(): def test():
s0 = b"Aladdin:open sesame" s0 = b"Aladdin:open sesame"
print(repr(s0)) print(repr(s0))
@@ -252,5 +317,5 @@ def test():
assert s0 == s2 assert s0 == s2
if __name__ == '__main__': if __name__ == "__main__":
main() main()

View File

@@ -1,6 +1,7 @@
from ustruct import unpack as unp from ustruct import unpack as unp
import utime import utime
from machine import I2C from machine import I2C
# Author David Wahlund david@dafnet.se # Author David Wahlund david@dafnet.se
# Power Modes # Power Modes
@@ -49,21 +50,20 @@ class BMP280:
self._bmp_i2c = i2c_bus self._bmp_i2c = i2c_bus
self._i2c_addr = addr self._i2c_addr = addr
self.chip_id = self._read(BMP280_REGISTER_ID, 2) self.chip_id = self._read(BMP280_REGISTER_ID, 2)
self._T1 = unp('<H', self._read(BMP280_REGISTER_DIG_T1, 2))[0] self._T1 = unp("<H", self._read(BMP280_REGISTER_DIG_T1, 2))[0]
self._T2 = unp('<h', self._read(BMP280_REGISTER_DIG_T2, 2))[0] self._T2 = unp("<h", self._read(BMP280_REGISTER_DIG_T2, 2))[0]
self._T3 = unp('<h', self._read(BMP280_REGISTER_DIG_T3, 2))[0] self._T3 = unp("<h", self._read(BMP280_REGISTER_DIG_T3, 2))[0]
self._P1 = unp('<H', self._read(BMP280_REGISTER_DIG_P1, 2))[0] self._P1 = unp("<H", self._read(BMP280_REGISTER_DIG_P1, 2))[0]
self._P2 = unp('<h', self._read(BMP280_REGISTER_DIG_P2, 2))[0] self._P2 = unp("<h", self._read(BMP280_REGISTER_DIG_P2, 2))[0]
self._P3 = unp('<h', self._read(BMP280_REGISTER_DIG_P3, 2))[0] self._P3 = unp("<h", self._read(BMP280_REGISTER_DIG_P3, 2))[0]
self._P4 = unp('<h', self._read(BMP280_REGISTER_DIG_P4, 2))[0] self._P4 = unp("<h", self._read(BMP280_REGISTER_DIG_P4, 2))[0]
self._P5 = unp('<h', self._read(BMP280_REGISTER_DIG_P5, 2))[0] self._P5 = unp("<h", self._read(BMP280_REGISTER_DIG_P5, 2))[0]
self._P6 = unp('<h', self._read(BMP280_REGISTER_DIG_P6, 2))[0] self._P6 = unp("<h", self._read(BMP280_REGISTER_DIG_P6, 2))[0]
self._P7 = unp('<h', self._read(BMP280_REGISTER_DIG_P7, 2))[0] self._P7 = unp("<h", self._read(BMP280_REGISTER_DIG_P7, 2))[0]
self._P8 = unp('<h', self._read(BMP280_REGISTER_DIG_P8, 2))[0] self._P8 = unp("<h", self._read(BMP280_REGISTER_DIG_P8, 2))[0]
self._P9 = unp('<h', self._read(BMP280_REGISTER_DIG_P9, 2))[0] self._P9 = unp("<h", self._read(BMP280_REGISTER_DIG_P9, 2))[0]
self._t_os = BMP280_TEMP_OS_2 # temperature oversampling self._t_os = BMP280_TEMP_OS_2 # temperature oversampling
self._p_os = BMP280_PRES_OS_16 # pressure oversampling self._p_os = BMP280_PRES_OS_16 # pressure oversampling
@@ -96,7 +96,9 @@ class BMP280:
r = self._t_os + (self._p_os << 3) + (1 << 6) r = self._t_os + (self._p_os << 3) + (1 << 6)
self._write(BMP280_REGISTER_CONTROL, r) self._write(BMP280_REGISTER_CONTROL, r)
utime.sleep_ms(100) # TODO calc sleep utime.sleep_ms(100) # TODO calc sleep
d = self._read(BMP280_REGISTER_DATA, 6) # read all data at once (as by spec) d = self._read(
BMP280_REGISTER_DATA, 6
) # read all data at once (as by spec)
self._p_raw = (d[0] << 12) + (d[1] << 4) + (d[2] >> 4) self._p_raw = (d[0] << 12) + (d[1] << 4) + (d[2] >> 4)
self._t_raw = (d[3] << 12) + (d[4] << 4) + (d[5] >> 4) self._t_raw = (d[3] << 12) + (d[4] << 4) + (d[5] >> 4)
@@ -142,14 +144,20 @@ class BMP280:
self._gauge() self._gauge()
if self._t_fine == 0: if self._t_fine == 0:
var1 = (((self._t_raw >> 3) - (self._T1 << 1)) * self._T2) >> 11 var1 = (((self._t_raw >> 3) - (self._T1 << 1)) * self._T2) >> 11
var2 = (((((self._t_raw >> 4) - self._T1) * ((self._t_raw >> 4) - self._T1)) >> 12) * self._T3) >> 14 var2 = (
(
(((self._t_raw >> 4) - self._T1) * ((self._t_raw >> 4) - self._T1))
>> 12
)
* self._T3
) >> 14
self._t_fine = var1 + var2 self._t_fine = var1 + var2
# @property # @property
def get_BMP_temperature(self): def get_BMP_temperature(self):
self._calc_t_fine() self._calc_t_fine()
if self._t == 0: if self._t == 0:
self._t = ((self._t_fine * 5 + 128) >> 8) / 100. self._t = ((self._t_fine * 5 + 128) >> 8) / 100.0
return self._t return self._t
# @property # @property
@@ -175,4 +183,3 @@ class BMP280:
p = ((p + var1 + var2) >> 8) + (self._P7 << 4) p = ((p + var1 + var2) >> 8) + (self._P7 << 4)
self._p = p / 256.0 self._p = p / 256.0
return self._p return self._p

View File

@@ -6,17 +6,20 @@ MicroPython library for the MxiGo AI
20211213 20211213
mixly mixly
""" """
data_a = None data_a = None
def uart_tx(uart, data, repeat=True): def uart_tx(uart, data, repeat=True):
global data_a global data_a
data_b = data data_b = data
if data_b != data_a: if data_b != data_a:
uart.write((str(data)+'\n')) uart.write((str(data) + "\n"))
# print(data) # print(data)
if not repeat: if not repeat:
data_a = data_b data_a = data_b
def uart_rx(uart): def uart_rx(uart):
data = uart.readline() data = uart.readline()
if data: if data:
@@ -26,4 +29,3 @@ def uart_rx(uart):
return eval(data_str) return eval(data_str)
except: except:
return data_str return data_str

View File

@@ -1,5 +1,6 @@
import time, board import time, board
def read_data(pin_name): def read_data(pin_name):
data = [] data = []
j = 0 j = 0
@@ -25,7 +26,8 @@ def read_data(pin_name):
continue continue
while N1.value() == 1: while N1.value() == 1:
k += 1 k += 1
if k>100:break if k > 100:
break
if k < 15: if k < 15:
data.append(0) data.append(0)
else: else:

View File

@@ -1,5 +1,6 @@
import time, board import time, board
def Sonar(trig1, echo1): def Sonar(trig1, echo1):
trig = board.pin(trig1, board.GPIO.OUT) trig = board.pin(trig1, board.GPIO.OUT)
@@ -9,14 +10,14 @@ def Sonar(trig1, echo1):
time.sleep_us(10) time.sleep_us(10)
trig.value(0) trig.value(0)
n1 = time.ticks_us() n1 = time.ticks_us()
while(echo.value()==0): while echo.value() == 0:
n2 = time.ticks_us() n2 = time.ticks_us()
if time.ticks_diff(n2, n1) > 200000: if time.ticks_diff(n2, n1) > 200000:
# raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
pass pass
t1 = time.ticks_us() t1 = time.ticks_us()
while(echo.value()==1): while echo.value() == 1:
n3 = time.ticks_us() n3 = time.ticks_us()
if time.ticks_diff(n3, t1) > 200000: if time.ticks_diff(n3, t1) > 200000:
# raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")

View File

@@ -1,5 +1,6 @@
import time, board import time, board
def read_id(pin): def read_id(pin):
L1 = board.pin(pin, board.GPIO.IN, board.GPIO.PULL_UP) L1 = board.pin(pin, board.GPIO.IN, board.GPIO.PULL_UP)

View File

@@ -1,6 +1,7 @@
import usocket as socket import usocket as socket
import ustruct as struct import ustruct as struct
import network, time, board import network, time, board
# from ubinascii import hexlify # from ubinascii import hexlify
import ujson as json import ujson as json
from machine import UART from machine import UART
@@ -9,10 +10,12 @@ wifi_en=board.pin(19,board.GPIO.OUT)
board.register(18, board.FPIOA.UART2_TX) board.register(18, board.FPIOA.UART2_TX)
board.register(17, board.FPIOA.UART2_RX) board.register(17, board.FPIOA.UART2_RX)
def wifi_enable(en): def wifi_enable(en):
global wifi_en global wifi_en
wifi_en.value(en) wifi_en.value(en)
def wifi_reset(): def wifi_reset():
global uart global uart
wifi_enable(0) wifi_enable(0)
@@ -23,7 +26,9 @@ def wifi_reset():
tmp = uart.read() tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n") uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read()) print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data uart = UART(
UART.UART2, 921600, timeout=1000, read_buf_len=10240
) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n") uart.write("AT\r\n")
tmp = uart.read() tmp = uart.read()
print(tmp) print(tmp)
@@ -36,12 +41,14 @@ def wifi_reset():
return None return None
return nic return nic
def get_data_dict(d): def get_data_dict(d):
result = {"datastreams": []} result = {"datastreams": []}
for x in d: for x in d:
result["datastreams"].append({"id": x, "datapoints": [{"value": d[x]}]}) result["datastreams"].append({"id": x, "datapoints": [{"value": d[x]}]})
return result return result
def pubData(value, state): def pubData(value, state):
value = get_data_dict(value) value = get_data_dict(value)
jdata = json.dumps(value) jdata = json.dumps(value)
@@ -50,12 +57,13 @@ def pubData(value, state):
bdata[0] = 1 # publish data in type of json bdata[0] = 1 # publish data in type of json
bdata[1] = int(jlen / 256) # data lenght bdata[1] = int(jlen / 256) # data lenght
bdata[2] = jlen % 256 # data lenght bdata[2] = jlen % 256 # data lenght
bdata[3:jlen+4] = jdata.encode('ascii') # json data bdata[3 : jlen + 4] = jdata.encode("ascii") # json data
if state: if state:
print(value) print(value)
print(bdata) print(bdata)
return bdata return bdata
def do_connect(account, password): def do_connect(account, password):
nic = wifi_reset() nic = wifi_reset()
if not nic: if not nic:
@@ -64,18 +72,31 @@ def do_connect(account,password):
nic.connect(account, password) nic.connect(account, password)
nic.ifconfig() nic.ifconfig()
def init_MQTT_client(sid, address, cid, api, topic, callback): def init_MQTT_client(sid, address, cid, api, topic, callback):
client = MQTTClient(sid, address, 6002, cid, api) client = MQTTClient(sid, address, 6002, cid, api)
client.set_callback(callback) client.set_callback(callback)
client.connect() client.connect()
client.subscribe(bytes(topic, 'utf-8')) client.subscribe(bytes(topic, "utf-8"))
return client return client
class MQTTException(Exception): class MQTTException(Exception):
pass pass
class MQTTClient: class MQTTClient:
def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0,ssl=False, ssl_params={}): def __init__(
self,
client_id,
server,
port=0,
user=None,
password=None,
keepalive=0,
ssl=False,
ssl_params={},
):
if port == 0: if port == 0:
port = 8883 if ssl else 1883 port = 8883 if ssl else 1883
self.client_id = client_id self.client_id = client_id
@@ -102,7 +123,7 @@ class MQTTClient:
sh = 0 sh = 0
while 1: while 1:
b = self.sock.read(1)[0] b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh n |= (b & 0x7F) << sh
if not b & 0x80: if not b & 0x80:
return n return n
sh += 7 sh += 7
@@ -124,6 +145,7 @@ class MQTTClient:
print(self.addr) print(self.addr)
if self.ssl: if self.ssl:
import ussl import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0") msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0")
msg[1] = 10 + 2 + len(self.client_id) msg[1] = 10 + 2 + len(self.client_id)
@@ -161,7 +183,7 @@ class MQTTClient:
def ping(self): def ping(self):
self.sock.write(b"\xc0\0") self.sock.write(b"\xc0\0")
def publish(self, msg, is_print=True, topic='$dp', retain=False, qos=0): def publish(self, msg, is_print=True, topic="$dp", retain=False, qos=0):
msg = pubData(msg, is_print) msg = pubData(msg, is_print)
pkt = bytearray(b"\x30\0\0\0") pkt = bytearray(b"\x30\0\0\0")
pkt[0] |= qos << 1 | retain pkt[0] |= qos << 1 | retain
@@ -170,8 +192,8 @@ class MQTTClient:
sz += 2 sz += 2
assert sz < 2097152 assert sz < 2097152
i = 1 i = 1
while sz > 0x7f: while sz > 0x7F:
pkt[i] = (sz & 0x7f) | 0x80 pkt[i] = (sz & 0x7F) | 0x80
sz >>= 7 sz >>= 7
i += 1 i += 1
pkt[i] = sz pkt[i] = sz
@@ -232,7 +254,7 @@ class MQTTClient:
assert sz == 0 assert sz == 0
return None return None
op = res[0] op = res[0]
if op & 0xf0 != 0x30: if op & 0xF0 != 0x30:
return op return op
sz = self._recv_len() sz = self._recv_len()
topic_len = self.sock.read(2) topic_len = self.sock.read(2)

View File

@@ -7,8 +7,8 @@ import ujson as json
from matcher import MQTTMatcher from matcher import MQTTMatcher
from machine import Timer from machine import Timer
ADDITIONAL_TOPIC = 'b640a0ce465fa2a4150c36b305c1c11b' ADDITIONAL_TOPIC = "b640a0ce465fa2a4150c36b305c1c11b"
WILL_TOPIC = '9d634e1a156dc0c1611eb4c3cff57276' WILL_TOPIC = "9d634e1a156dc0c1611eb4c3cff57276"
def init_MQTT_client(address, username, password, MQTT_USR_PRJ): def init_MQTT_client(address, username, password, MQTT_USR_PRJ):
@@ -16,24 +16,46 @@ def init_MQTT_client(address, username, password,MQTT_USR_PRJ):
client.set_last_will(topic=MQTT_USR_PRJ + WILL_TOPIC, msg=client.client_id, qos=2) client.set_last_will(topic=MQTT_USR_PRJ + WILL_TOPIC, msg=client.client_id, qos=2)
if client.connect() == 0: if client.connect() == 0:
client.publish(MQTT_USR_PRJ + ADDITIONAL_TOPIC, client.client_id, qos=1) client.publish(MQTT_USR_PRJ + ADDITIONAL_TOPIC, client.client_id, qos=1)
Timer(Timer.TIMER2,Timer.CHANNEL3,mode=Timer.MODE_PERIODIC,period = 10000, callback = lambda x : client.ping()) Timer(
Timer.TIMER2,
Timer.CHANNEL3,
mode=Timer.MODE_PERIODIC,
period=10000,
callback=lambda x: client.ping(),
)
return client return client
len_overrided = len len_overrided = len
# Add by Mixly Team # Add by Mixly Team
def len(object): def len(object):
if isinstance(object, str): if isinstance(object, str):
return len_overrided(object.encode('utf-8')) return len_overrided(object.encode("utf-8"))
else: else:
return len_overrided(object) return len_overrided(object)
##################################################### #####################################################
class MQTTException(Exception): class MQTTException(Exception):
pass pass
class MQTTClient: class MQTTClient:
def __init__(self, client_id, server, port=0, username=None, password=None, keepalive=60, ssl=False, ssl_params={}): def __init__(
self,
client_id,
server,
port=0,
username=None,
password=None,
keepalive=60,
ssl=False,
ssl_params={},
):
if port == 0: if port == 0:
port = 8883 if ssl else 1883 port = 8883 if ssl else 1883
self.client_id = client_id self.client_id = client_id
@@ -63,7 +85,7 @@ class MQTTClient:
sh = 0 sh = 0
while 1: while 1:
b = self.sock.read(1)[0] b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh n |= (b & 0x7F) << sh
if not b & 0x80: if not b & 0x80:
return n return n
sh += 7 sh += 7
@@ -131,6 +153,7 @@ class MQTTClient:
print(self.addr) print(self.addr)
if self.ssl: if self.ssl:
import ussl import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg_header = bytearray([0x10]) msg_header = bytearray([0x10])
msg = bytearray(b"\x04MQTT\x04\x02\0\0") msg = bytearray(b"\x04MQTT\x04\x02\0\0")
@@ -177,7 +200,6 @@ class MQTTClient:
raise MQTTException(resp[3]) raise MQTTException(resp[3])
return resp[2] & 1 return resp[2] & 1
def disconnect(self, MQTT_USR_PRJ): def disconnect(self, MQTT_USR_PRJ):
# MQTT_USR_PRJ = "{}/{}/".format(self.username,self.project) # MQTT_USR_PRJ = "{}/{}/".format(self.username,self.project)
self.publish(MQTT_USR_PRJ + WILL_TOPIC, self.client_id, qos=1) self.publish(MQTT_USR_PRJ + WILL_TOPIC, self.client_id, qos=1)
@@ -219,8 +241,8 @@ class MQTTClient:
sz += 2 sz += 2
assert sz < 2097152 assert sz < 2097152
i = 1 i = 1
while sz > 0x7f: while sz > 0x7F:
pkt[i] = (sz & 0x7f) | 0x80 pkt[i] = (sz & 0x7F) | 0x80
sz >>= 7 sz >>= 7
i += 1 i += 1
pkt[i] = sz pkt[i] = sz
@@ -283,7 +305,7 @@ class MQTTClient:
assert sz == 0 assert sz == 0
return "PINGRESP" return "PINGRESP"
op = res[0] op = res[0]
if op & 0xf0 != 0x30: if op & 0xF0 != 0x30:
return op return op
sz = self._recv_len() sz = self._recv_len()
topic_len = self.sock.read(2) topic_len = self.sock.read(2)

View File

@@ -1,25 +1,27 @@
import hashlib import hashlib
import os import os
def sha_file(f): def sha_file(f):
if f not in set(os.listdir(".")): if f not in set(os.listdir(".")):
return 'None:::sha_file_end' return "None:::sha_file_end"
else: else:
sha = hashlib.sha256() sha = hashlib.sha256()
with open(f, encoding='utf-8') as fd: with open(f, encoding="utf-8") as fd:
file_buffer = fd.read(128).encode("utf-8") file_buffer = fd.read(128).encode("utf-8")
while len(file_buffer) > 0: while len(file_buffer) > 0:
sha.update(file_buffer) sha.update(file_buffer)
file_buffer = fd.read(128).encode("utf-8") file_buffer = fd.read(128).encode("utf-8")
h = sha.digest() h = sha.digest()
return ''.join(['%.2x' % i for i in h]) + ":::sha_file_end" return "".join(["%.2x" % i for i in h]) + ":::sha_file_end"
def reload(mod): def reload(mod):
import sys import sys
mod_name = mod.__name__ mod_name = mod.__name__
try: try:
del sys.modules[mod_name] del sys.modules[mod_name]
__import__(mod_name) __import__(mod_name)
except: except:
pass pass

View File

@@ -1,6 +1,7 @@
# coding=utf-8 # coding=utf-8
import math import math
def math_map(v, al, ah, bl, bh): def math_map(v, al, ah, bl, bh):
if al == ah: if al == ah:
return bl return bl
@@ -12,19 +13,26 @@ def math_map(v, al, ah, bl, bh):
v = al v = al
return bl + (bh - bl) * (v - al) / (ah - al) return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList): def math_mean(myList):
localList = [e for e in myList if type(e) == int or type(e) == float] localList = [e for e in myList if type(e) == int or type(e) == float]
if not localList: return if not localList:
return
return float(sum(localList)) / len(localList) return float(sum(localList)) / len(localList)
def math_median(myList): def math_median(myList):
localList = sorted([e for e in myList if type(e) == int or type(e) == float]) localList = sorted([e for e in myList if type(e) == int or type(e) == float])
if not localList: return if not localList:
return
if len(localList) % 2 == 0: if len(localList) % 2 == 0:
return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0 return (
localList[len(localList) // 2 - 1] + localList[len(localList) // 2]
) / 2.0
else: else:
return localList[(len(localList) - 1) // 2] return localList[(len(localList) - 1) // 2]
def math_modes(some_list): def math_modes(some_list):
modes = [] modes = []
# Using a lists of [item, count] to keep count rather than dict # Using a lists of [item, count] to keep count rather than dict
@@ -45,40 +53,48 @@ def math_modes(some_list):
modes.append(counted_item) modes.append(counted_item)
return modes return modes
def math_standard_deviation(numbers): def math_standard_deviation(numbers):
n = len(numbers) n = len(numbers)
if n == 0: return if n == 0:
return
mean = float(sum(numbers)) / n mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance) return math.sqrt(variance)
def lists_sort(my_list, type, reverse): def lists_sort(my_list, type, reverse):
def try_float(s): def try_float(s):
try: try:
return float(s) return float(s)
except: except:
return 0 return 0
key_funcs = { key_funcs = {
"NUMERIC": try_float, "NUMERIC": try_float,
"TEXT": str, "TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower() "IGNORE_CASE": lambda s: str(s).lower(),
} }
key_func = key_funcs[type] key_func = key_funcs[type]
list_cpy = list(my_list) list_cpy = list(my_list)
return sorted(list_cpy, key=key_func, reverse=reverse) return sorted(list_cpy, key=key_func, reverse=reverse)
def format_content(mydict, cid): def format_content(mydict, cid):
if 'lat' in mydict and 'long' in mydict: if "lat" in mydict and "long" in mydict:
res = '{'+'"lat": "{}", "long": "{}", "clientid": "{}"'.format(mydict.pop('lat'),mydict.pop('long'),cid) res = "{" + '"lat": "{}", "long": "{}", "clientid": "{}"'.format(
mydict.pop("lat"), mydict.pop("long"), cid
)
if len(mydict) > 0: if len(mydict) > 0:
res += ', "message": [' res += ', "message": ['
for d in mydict: for d in mydict:
res += '{{"label": "{}", "value": "{}"}},'.format(d, mydict[d]) res += '{{"label": "{}", "value": "{}"}},'.format(d, mydict[d])
res = res[:-1] + "]" res = res[:-1] + "]"
res += '}' res += "}"
return res return res
else: else:
print('Invalid Input') print("Invalid Input")
def format_str(d): def format_str(d):
return str(d).replace("'", '"') return str(d).replace("'", '"')

View File

@@ -19,21 +19,22 @@ import ustruct
import utime import utime
import time import time
import math import math
# from machine import I2C, Pin # from machine import I2C, Pin
# pylint: enable=import-error # pylint: enable=import-error
__version__ = "0.2.0" __version__ = "0.2.0"
# pylint: disable=import-error # pylint: disable=import-error
# pylint: enable=import-error # pylint: enable=import-error
_GYRO_CONFIG = const(0x1b) _GYRO_CONFIG = const(0x1B)
_ACCEL_CONFIG = const(0x1c) _ACCEL_CONFIG = const(0x1C)
_ACCEL_CONFIG2 = const(0x1d) _ACCEL_CONFIG2 = const(0x1D)
_INT_PIN_CFG = const(0x37) _INT_PIN_CFG = const(0x37)
_ACCEL_XOUT_H = const(0x3b) _ACCEL_XOUT_H = const(0x3B)
_ACCEL_XOUT_L = const(0x3c) _ACCEL_XOUT_L = const(0x3C)
_ACCEL_YOUT_H = const(0x3d) _ACCEL_YOUT_H = const(0x3D)
_ACCEL_YOUT_L = const(0x3e) _ACCEL_YOUT_L = const(0x3E)
_ACCEL_ZOUT_H = const(0x3f) _ACCEL_ZOUT_H = const(0x3F)
_ACCEL_ZOUT_L = const(0x40) _ACCEL_ZOUT_L = const(0x40)
_TEMP_OUT_H = const(0x41) _TEMP_OUT_H = const(0x41)
_TEMP_OUT_L = const(0x42) _TEMP_OUT_L = const(0x42)
@@ -86,7 +87,7 @@ _HYH = const(0x06)
_HZL = const(0x07) _HZL = const(0x07)
_HZH = const(0x08) _HZH = const(0x08)
_ST2 = const(0x09) _ST2 = const(0x09)
_CNTL1 = const(0x0a) _CNTL1 = const(0x0A)
_ASAX = const(0x10) _ASAX = const(0x10)
_ASAY = const(0x11) _ASAY = const(0x11)
_ASAZ = const(0x12) _ASAZ = const(0x12)
@@ -105,12 +106,18 @@ OUTPUT_16_BIT = 0b00010000
_SO_14BIT = 0.6 # 渭T per digit when 14bit mode _SO_14BIT = 0.6 # 渭T per digit when 14bit mode
_SO_16BIT = 0.15 # 渭T per digit when 16bit mode _SO_16BIT = 0.15 # 渭T per digit when 16bit mode
class MPU6500: class MPU6500:
"""Class which provides interface to MPU6500 6-axis motion tracking device.""" """Class which provides interface to MPU6500 6-axis motion tracking device."""
def __init__( def __init__(
self, i2c, address=0x68, self,
accel_fs=ACCEL_FS_SEL_2G, gyro_fs=GYRO_FS_SEL_250DPS, i2c,
accel_sf=SF_M_S2, gyro_sf=SF_RAD_S address=0x68,
accel_fs=ACCEL_FS_SEL_2G,
gyro_fs=GYRO_FS_SEL_250DPS,
accel_sf=SF_M_S2,
gyro_sf=SF_RAD_S,
): ):
self.i2c = i2c self.i2c = i2c
self.address = address self.address = address
@@ -216,12 +223,18 @@ class MPU6500:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class AK8963: class AK8963:
"""Class which provides interface to AK8963 magnetometer.""" """Class which provides interface to AK8963 magnetometer."""
def __init__( def __init__(
self, i2c, address=0x0c, self,
mode=MODE_CONTINOUS_MEASURE_1, output=OUTPUT_16_BIT, i2c,
offset=(0, 0, 0), scale=(1, 1, 1) address=0x0C,
mode=MODE_CONTINOUS_MEASURE_1,
output=OUTPUT_16_BIT,
offset=(0, 0, 0),
scale=(1, 1, 1),
): ):
self.i2c = i2c self.i2c = i2c
self.address = address self.address = address
@@ -242,7 +255,7 @@ class AK8963:
self._adjustement = ( self._adjustement = (
(0.5 * (asax - 128)) / 128 + 1, (0.5 * (asax - 128)) / 128 + 1,
(0.5 * (asay - 128)) / 128 + 1, (0.5 * (asay - 128)) / 128 + 1,
(0.5 * (asaz - 128)) / 128 + 1 (0.5 * (asaz - 128)) / 128 + 1,
) )
# Power on # Power on
@@ -253,7 +266,6 @@ class AK8963:
else: else:
self._so = _SO_14BIT self._so = _SO_14BIT
@property @property
def magnetic(self): def magnetic(self):
""" """
@@ -314,7 +326,6 @@ class AK8963:
maxz = max(maxz, reading[2]) maxz = max(maxz, reading[2])
count -= 1 count -= 1
# Hard iron correction # Hard iron correction
offset_x = (maxx + minx) / 2 offset_x = (maxx + minx) / 2
offset_y = (maxy + miny) / 2 offset_y = (maxy + miny) / 2
@@ -366,6 +377,7 @@ class AK8963:
class MPU9250: class MPU9250:
"""Class which provides interface to MPU9250 9-axis motion tracking device.""" """Class which provides interface to MPU9250 9-axis motion tracking device."""
def __init__(self, i2c, mpu6500=None, ak8963=None): def __init__(self, i2c, mpu6500=None, ak8963=None):
if mpu6500 is None: if mpu6500 is None:
self.mpu6500 = MPU6500(i2c) self.mpu6500 = MPU6500(i2c)
@@ -422,39 +434,41 @@ class MPU9250:
""" """
return round(self.mpu6500.acceleration()[2] / 9.8, 2) return round(self.mpu6500.acceleration()[2] / 9.8, 2)
def mpu9250_is_gesture(self, choice): def mpu9250_is_gesture(self, choice):
if choice == 'face up': if choice == "face up":
if self.mpu6500.acceleration()[2] <= -9: if self.mpu6500.acceleration()[2] <= -9:
return True return True
else: else:
return False return False
if choice == 'face down': if choice == "face down":
if self.mpu6500.acceleration()[2] >= 9: if self.mpu6500.acceleration()[2] >= 9:
return True return True
else: else:
return False return False
if choice == 'shake': if choice == "shake":
if abs(self.mpu6500.acceleration()[0]) >= 9 and abs(self.mpu6500.acceleration()[1]) >= 9 : if (
abs(self.mpu6500.acceleration()[0]) >= 9
and abs(self.mpu6500.acceleration()[1]) >= 9
):
return True return True
else: else:
return False return False
if choice == 'up': if choice == "up":
if self.mpu6500.acceleration()[1] >= 9: if self.mpu6500.acceleration()[1] >= 9:
return True return True
else: else:
return False return False
if choice == 'down': if choice == "down":
if self.mpu6500.acceleration()[1] <= -9: if self.mpu6500.acceleration()[1] <= -9:
return True return True
else: else:
return False return False
if choice == 'right': if choice == "right":
if self.mpu6500.acceleration()[0] <= -9: if self.mpu6500.acceleration()[0] <= -9:
return True return True
else: else:
return False return False
if choice == 'left': if choice == "left":
if self.mpu6500.acceleration()[0] >= 9: if self.mpu6500.acceleration()[0] >= 9:
return True return True
else: else:
@@ -513,7 +527,11 @@ class MPU9250:
z = self.mpu9250_magnetic[2] z = self.mpu9250_magnetic[2]
a = math.atan(z / x) a = math.atan(z / x)
b = math.atan(z / y) b = math.atan(z / y)
xr=x*math.cos(a)+y*math.sin(a)*math.sin(b)-z*math.cos(b)*math.sin(a) xr = (
x * math.cos(a)
+ y * math.sin(a) * math.sin(b)
- z * math.cos(b) * math.sin(a)
)
yr = x * math.cos(b) + z * math.sin(b) yr = x * math.cos(b) + z * math.sin(b)
return 60 * math.atan(yr / xr) return 60 * math.atan(yr / xr)
@@ -527,6 +545,7 @@ class MPU9250:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class Compass: class Compass:
RAD_TO_DEG = 57.295779513082320876798154814105 RAD_TO_DEG = 57.295779513082320876798154814105
@@ -547,20 +566,23 @@ class Compass:
def heading(self): def heading(self):
from math import atan2 from math import atan2
xyz = self.sensor.mpu9250_magnetic xyz = self.sensor.mpu9250_magnetic
return int(((atan2(xyz[1], xyz[0]) * Compass.RAD_TO_DEG) + 180) % 360) return int(((atan2(xyz[1], xyz[0]) * Compass.RAD_TO_DEG) + 180) % 360)
def is_calibrate(self): def is_calibrate(self):
try: try:
import compass_cfg import compass_cfg
return True return True
except Exception as e: except Exception as e:
return False return False
def reset_calibrate(self): def reset_calibrate(self):
import os import os
os.remove("compass_cfg.py") os.remove("compass_cfg.py")
# compass = mpu # compass = mpu
# accelerometer = mpu # accelerometer = mpu

View File

@@ -8,12 +8,15 @@ Micropython library for the MS32006 step diever
dahanzimin From the Mixly Team dahanzimin From the Mixly Team
""" """
import time import time
from micropython import const from micropython import const
MS32006_REG_RESET = const(0x00) # 复位 MS32006_REG_RESET = const(0x00) # 复位
MS32006_FCLK = const(25000000) #芯片输入时钟选择,此参数与运动速度有关。 范围是5-30MHZ MS32006_FCLK = const(
25000000
) # 芯片输入时钟选择,此参数与运动速度有关。 范围是5-30MHZ
ADDRESS_A = 0x10 ADDRESS_A = 0x10
ADDRESS_B = 0x18 ADDRESS_B = 0x18
@@ -25,6 +28,8 @@ MOT_N = 0
MOT_CW = 1 MOT_CW = 1
MOT_CCW = 2 MOT_CCW = 2
MOT_P = 3 MOT_P = 3
class MS32006: class MS32006:
_buffer = bytearray(2) _buffer = bytearray(2)
@@ -35,7 +40,6 @@ class MS32006:
self.reset() self.reset()
self.mode = mode self.mode = mode
def _read_u8(self, address): def _read_u8(self, address):
self._buffer[0] = address & 0xFF self._buffer[0] = address & 0xFF
self._device.writeto(self._address, self._buffer) self._device.writeto(self._address, self._buffer)
@@ -62,18 +66,18 @@ class MS32006:
elif speed_data > 16383: elif speed_data > 16383:
speed_data = 16383 speed_data = 16383
mot_speed_l=speed_data&0x00ff #取低8位 mot_speed_l = speed_data & 0x00FF # 取低8位
mot_speed_h = speed_data // 0x100 # 取高6位 mot_speed_h = speed_data // 0x100 # 取高6位
if self.mode == MOT_FULL: # 设置整步、半步驱动模式 if self.mode == MOT_FULL: # 设置整步、半步驱动模式
mot_speed_h |= 0x80 mot_speed_h |= 0x80
else: else:
mot_speed_h&=0x7f mot_speed_h &= 0x7F
if mot_step > 2047: if mot_step > 2047:
raise AttributeError("Reach the set upper limit, up to 2047 step") raise AttributeError("Reach the set upper limit, up to 2047 step")
mot_step_l=mot_step&0x00ff mot_step_l = mot_step & 0x00FF
mot_step_h = mot_step // 0x100 mot_step_h = mot_step // 0x100
mot_step_h |= 0x80 mot_step_h |= 0x80
@@ -87,10 +91,10 @@ class MS32006:
self._write_u8(0x04 + moto, mot_step_h) self._write_u8(0x04 + moto, mot_step_h)
if moto == MOT_A: if moto == MOT_A:
self._write_u8(0x00, readstate_0H&0xfb) self._write_u8(0x00, readstate_0H & 0xFB)
self._write_u8(0x09, readstate_9H | 0x80) self._write_u8(0x09, readstate_9H | 0x80)
else: else:
self._write_u8(0x00, readstate_0H&0xfd) self._write_u8(0x00, readstate_0H & 0xFD)
self._write_u8(0x09, readstate_9H | 0x40) self._write_u8(0x09, readstate_9H | 0x40)
def close(self, moto): # 停止并关闭输出 def close(self, moto): # 停止并关闭输出
@@ -108,25 +112,25 @@ class MS32006:
def readstep(self, moto): # 读取电机运动步数 def readstep(self, moto): # 读取电机运动步数
if moto == MOT_A: if moto == MOT_A:
rdb =self._read_u8(0x0b) rdb = self._read_u8(0x0B)
rdc =self._read_u8(0x0c) rdc = self._read_u8(0x0C)
else: else:
rdb =self._read_u8(0x0d) rdb = self._read_u8(0x0D)
rdc =self._read_u8(0x0e) rdc = self._read_u8(0x0E)
return (rdb*0x100+rdc)&0xfff return (rdb * 0x100 + rdc) & 0xFFF
def readbusy(self, moto): # 读取电机缓存是否有数据 def readbusy(self, moto): # 读取电机缓存是否有数据
if moto == MOT_A: if moto == MOT_A:
busy =(self._read_u8(0x0b)>>6)&1 busy = (self._read_u8(0x0B) >> 6) & 1
else: else:
busy =(self._read_u8(0x0d)>>6)&1 busy = (self._read_u8(0x0D) >> 6) & 1
return bool(busy) return bool(busy)
def readwork(self, moto): # 读取电机是否在运行 def readwork(self, moto): # 读取电机是否在运行
if moto == MOT_A: if moto == MOT_A:
busy =(self._read_u8(0x0b)>>4)&1 busy = (self._read_u8(0x0B) >> 4) & 1
else: else:
busy =(self._read_u8(0x0d)>>4)&1 busy = (self._read_u8(0x0D) >> 4) & 1
return bool(busy) return bool(busy)
def dc_motor(self, state, speed): # 直流电机驱动 def dc_motor(self, state, speed): # 直流电机驱动
@@ -135,8 +139,5 @@ class MS32006:
self._write_u8(0x0A, speed_st) self._write_u8(0x0A, speed_st)
readstate = self._read_u8(0x09) & 0xA0 readstate = self._read_u8(0x09) & 0xA0
state_st=(state<<2) | 0X03 | readstate state_st = (state << 2) | 0x03 | readstate
self._write_u8(0x09, state_st) self._write_u8(0x09, state_st)

View File

@@ -2,6 +2,7 @@ import network,time,board
from machine import UART from machine import UART
import time import time
def wifi_init(RX_Pin, TX_Pin): def wifi_init(RX_Pin, TX_Pin):
board.register(TX_Pin, board.FPIOA.UART2_TX) board.register(TX_Pin, board.FPIOA.UART2_TX)
board.register(RX_Pin, board.FPIOA.UART2_RX) board.register(RX_Pin, board.FPIOA.UART2_RX)
@@ -40,9 +41,9 @@ def wifi_deal_ap_info(info):
res.append(info_one) res.append(info_one)
return res return res
def scans(nic): def scans(nic):
ap_info = nic.scan() ap_info = nic.scan()
ap_info = wifi_deal_ap_info(ap_info) ap_info = wifi_deal_ap_info(ap_info)
ap_info.sort(key=lambda x: x[2], reverse=True) ap_info.sort(key=lambda x: x[2], reverse=True)
return ap_info return ap_info

View File

@@ -1,16 +1,18 @@
import time import time
from math import pi, isnan from math import pi, isnan
class PID: class PID:
_kp = _ki = _kd = _integrator = _imax = 0 _kp = _ki = _kd = _integrator = _imax = 0
_last_error = _last_derivative = _last_t = 0 _last_error = _last_derivative = _last_t = 0
_RC = 1 / (2 * pi * 20) _RC = 1 / (2 * pi * 20)
def __init__(self, p=0, i=0, d=0, imax=0): def __init__(self, p=0, i=0, d=0, imax=0):
self._kp = float(p) self._kp = float(p)
self._ki = float(i) self._ki = float(i)
self._kd = float(d) self._kd = float(d)
self._imax = abs(imax) self._imax = abs(imax)
self._last_derivative = float('nan') self._last_derivative = float("nan")
def get_pid(self, error, scaler): def get_pid(self, error, scaler):
tnow = time.ticks_ms() tnow = time.ticks_ms()
@@ -28,19 +30,23 @@ class PID:
self._last_derivative = 0 self._last_derivative = 0
else: else:
derivative = (error - self._last_error) / delta_time derivative = (error - self._last_error) / delta_time
derivative = self._last_derivative + \ derivative = self._last_derivative + (
((delta_time / (self._RC + delta_time)) * \ (delta_time / (self._RC + delta_time))
(derivative - self._last_derivative)) * (derivative - self._last_derivative)
)
self._last_error = error self._last_error = error
self._last_derivative = derivative self._last_derivative = derivative
output += self._kd * derivative output += self._kd * derivative
output *= scaler output *= scaler
if abs(self._ki) > 0 and dt > 0: if abs(self._ki) > 0 and dt > 0:
self._integrator += (error * self._ki) * scaler * delta_time self._integrator += (error * self._ki) * scaler * delta_time
if self._integrator < -self._imax: self._integrator = -self._imax if self._integrator < -self._imax:
elif self._integrator > self._imax: self._integrator = self._imax self._integrator = -self._imax
elif self._integrator > self._imax:
self._integrator = self._imax
output += self._integrator output += self._integrator
return output return output
def reset_I(self): def reset_I(self):
self._integrator = 0 self._integrator = 0
self._last_derivative = float('nan') self._last_derivative = float("nan")

View File

@@ -7,6 +7,7 @@ spk_b=None
spk_d = None spk_d = None
spk_w = None spk_w = None
def spk_init(BLK=8, WS=9, DAT=10, sample_rate=16000): def spk_init(BLK=8, WS=9, DAT=10, sample_rate=16000):
global spk_b global spk_b
global spk_d global spk_d
@@ -18,17 +19,30 @@ def spk_init(BLK=8,WS=9,DAT=10,sample_rate=16000):
board.register(BLK, board.FPIOA.I2S0_SCLK) board.register(BLK, board.FPIOA.I2S0_SCLK)
board.register(WS, board.FPIOA.I2S0_WS) board.register(WS, board.FPIOA.I2S0_WS)
wav_dev = I2S(I2S.DEVICE_0) wav_dev = I2S(I2S.DEVICE_0)
wav_dev.channel_config(I2S.CHANNEL_1, I2S.TRANSMITTER,resolution = I2S.RESOLUTION_16_BIT, cycles = I2S.SCLK_CYCLES_32, align_mode = I2S.STANDARD_MODE) wav_dev.channel_config(
I2S.CHANNEL_1,
I2S.TRANSMITTER,
resolution=I2S.RESOLUTION_16_BIT,
cycles=I2S.SCLK_CYCLES_32,
align_mode=I2S.STANDARD_MODE,
)
wav_dev.set_sample_rate(sample_rate) wav_dev.set_sample_rate(sample_rate)
spk_rep = wav_dev spk_rep = wav_dev
return wav_dev return wav_dev
def mic_init(BLK=35, WS=33, DAT=34, sample_rate=16000): def mic_init(BLK=35, WS=33, DAT=34, sample_rate=16000):
board.register(DAT, board.FPIOA.I2S2_IN_D0) board.register(DAT, board.FPIOA.I2S2_IN_D0)
board.register(BLK, board.FPIOA.I2S2_SCLK) board.register(BLK, board.FPIOA.I2S2_SCLK)
board.register(WS, board.FPIOA.I2S2_WS) board.register(WS, board.FPIOA.I2S2_WS)
wav_dev = I2S(I2S.DEVICE_2) wav_dev = I2S(I2S.DEVICE_2)
wav_dev.channel_config(I2S.CHANNEL_0, I2S.RECEIVER, resolution = I2S.RESOLUTION_16_BIT, cycles = I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE) wav_dev.channel_config(
I2S.CHANNEL_0,
I2S.RECEIVER,
resolution=I2S.RESOLUTION_16_BIT,
cycles=I2S.SCLK_CYCLES_32,
align_mode=I2S.STANDARD_MODE,
)
wav_dev.set_sample_rate(sample_rate) wav_dev.set_sample_rate(sample_rate)
return wav_dev return wav_dev
@@ -53,6 +67,7 @@ def audio_play(I2S,path,num=80):
player.__deinit__() player.__deinit__()
gc.collect() gc.collect()
def audio_record(I2S, path, record_time, sample_rate=16000): def audio_record(I2S, path, record_time, sample_rate=16000):
try: try:
recorder = audio.Audio(path=path, is_create=True, samplerate=sample_rate) recorder = audio.Audio(path=path, is_create=True, samplerate=sample_rate)
@@ -81,6 +96,7 @@ def video_play(I2S1,path,num=80):
global spk_d global spk_d
global spk_w global spk_w
import lcd import lcd
lcd.init() lcd.init()
I2S = spk_init(spk_b, spk_w, spk_d) I2S = spk_init(spk_b, spk_w, spk_d)
vide = video.open(path) vide = video.open(path)
@@ -106,9 +122,18 @@ def video_play(I2S1,path,num=80):
def video_record(I2S, path, record_time): def video_record(I2S, path, record_time):
import sensor, lcd import sensor, lcd
lcd.init() lcd.init()
try: try:
v = video.open(path, audio=False, record=True, interval=200000, quality=80,width=240, height=240) v = video.open(
path,
audio=False,
record=True,
interval=200000,
quality=80,
width=240,
height=240,
)
except Exception as e: except Exception as e:
raise NameError("Need video storage location or {}".format(e)) raise NameError("Need video storage location or {}".format(e))
record_time = record_time * 5 record_time = record_time * 5
@@ -124,5 +149,3 @@ def video_record(I2S,path,record_time):
print("Video record finish \n") print("Video record finish \n")
v.__del__() v.__del__()
gc.collect() gc.collect()

View File

@@ -1,5 +1,6 @@
try: try:
import image import image
image.font_free() image.font_free()
except: except:
pass pass
@@ -30,4 +31,5 @@ try:
finally: finally:
import gc import gc
gc.collect() gc.collect()

View File

@@ -2,6 +2,8 @@
import math import math
import ustruct import ustruct
import time import time
class PCA9685: class PCA9685:
def __init__(self, i2c, address=0x40): def __init__(self, i2c, address=0x40):
self.i2c = i2c self.i2c = i2c
@@ -19,20 +21,20 @@ class PCA9685:
def freq(self, freq=None): def freq(self, freq=None):
if freq is None: if freq is None:
return int(25000000.0 / 4096 / (self._read(0xfe) - 0.5)) return int(25000000.0 / 4096 / (self._read(0xFE) - 0.5))
prescale = int(25000000.0 / 4096.0 / freq + 0.5) prescale = int(25000000.0 / 4096.0 / freq + 0.5)
old_mode = self._read(0x00) # Mode 1 old_mode = self._read(0x00) # Mode 1
self._write(0x00, (old_mode & 0x7F) | 0x10) # Mode 1, sleep self._write(0x00, (old_mode & 0x7F) | 0x10) # Mode 1, sleep
self._write(0xfe, prescale) # Prescale self._write(0xFE, prescale) # Prescale
self._write(0x00, old_mode) # Mode 1 self._write(0x00, old_mode) # Mode 1
time.sleep_us(5) time.sleep_us(5)
self._write(0x00, old_mode | 0xa1) # Mode 1, autoincrement on self._write(0x00, old_mode | 0xA1) # Mode 1, autoincrement on
def pwm(self, index, on=None, off=None): def pwm(self, index, on=None, off=None):
if on is None or off is None: if on is None or off is None:
data = self.i2c.readfrom_mem(self.address, 0x06 + 4 * index, 4) data = self.i2c.readfrom_mem(self.address, 0x06 + 4 * index, 4)
return ustruct.unpack('<HH', data) return ustruct.unpack("<HH", data)
data = ustruct.pack('<HH', on, off) data = ustruct.pack("<HH", on, off)
self.i2c.writeto_mem(self.address, 0x06 + 4 * index, data) self.i2c.writeto_mem(self.address, 0x06 + 4 * index, data)
def duty(self, index, value=None, invert=False): def duty(self, index, value=None, invert=False):
@@ -57,9 +59,11 @@ class PCA9685:
else: else:
self.pwm(index, 0, value) self.pwm(index, 0, value)
class Servos: class Servos:
def __init__(self, i2c, address=0x55, freq=50, min_us=600, max_us=2400, def __init__(
degrees=180): self, i2c, address=0x55, freq=50, min_us=600, max_us=2400, degrees=180
):
self.period = 1000000 / freq self.period = 1000000 / freq
self.min_duty = self._us2duty(min_us) self.min_duty = self._us2duty(min_us)
self.max_duty = self._us2duty(max_us) self.max_duty = self._us2duty(max_us)

View File

@@ -5,12 +5,11 @@ from time import sleep_ms
SHT20_I2CADDR = 64 SHT20_I2CADDR = 64
# SHT20 Command # SHT20 Command
TRI_T_MEASURE_NO_HOLD = b'\xf3' TRI_T_MEASURE_NO_HOLD = b"\xf3"
TRI_RH_MEASURE_NO_HOLD = b'\xf5' TRI_RH_MEASURE_NO_HOLD = b"\xf5"
READ_USER_REG = b'\xe7' READ_USER_REG = b"\xe7"
WRITE_USER_REG = b'\xe6' WRITE_USER_REG = b"\xe6"
SOFT_RESET = b'\xfe' SOFT_RESET = b"\xfe"
class SHT20(object): class SHT20(object):
@@ -23,7 +22,7 @@ class SHT20(object):
self._bus.writeto(self._address, TRI_T_MEASURE_NO_HOLD) self._bus.writeto(self._address, TRI_T_MEASURE_NO_HOLD)
sleep_ms(150) sleep_ms(150)
origin_data = self._bus.readfrom(self._address, 2) origin_data = self._bus.readfrom(self._address, 2)
origin_value = unp('>h', origin_data)[0] origin_value = unp(">h", origin_data)[0]
value = -46.85 + 175.72 * (origin_value / 65536) value = -46.85 + 175.72 * (origin_value / 65536)
return value return value
@@ -31,8 +30,9 @@ class SHT20(object):
self._bus.writeto(self._address, TRI_RH_MEASURE_NO_HOLD) self._bus.writeto(self._address, TRI_RH_MEASURE_NO_HOLD)
sleep_ms(150) sleep_ms(150)
origin_data = self._bus.readfrom(self._address, 2) origin_data = self._bus.readfrom(self._address, 2)
origin_value = unp('>H', origin_data)[0] origin_value = unp(">H", origin_data)[0]
value = -6 + 125 * (origin_value / 65536) value = -6 + 125 * (origin_value / 65536)
return value return value
# sht=SHT20(I2C(scl = Pin(22), sda = Pin(21), freq = 100000)) # sht=SHT20(I2C(scl = Pin(22), sda = Pin(21), freq = 100000))

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
class QJ00X_MP3: class QJ00X_MP3:
def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01): def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01):
uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600) uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600)
@@ -9,14 +10,14 @@ class QJ00X_MP3:
self.pause() self.pause()
def _send_cmd(self, length, cmd, data_high=None, data_low=None): def _send_cmd(self, length, cmd, data_high=None, data_low=None):
uart.write(b'\x7E') uart.write(b"\x7E")
uart.write(bytes([length])) uart.write(bytes([length]))
uart.write(bytes([cmd])) uart.write(bytes([cmd]))
if data_high != None: if data_high != None:
uart.write(bytes([data_high])) uart.write(bytes([data_high]))
if data_low != None: if data_low != None:
uart.write(bytes([data_low])) uart.write(bytes([data_low]))
uart.write(b'\xEF') uart.write(b"\xEF")
sleep(200) sleep(200)
# 下一曲 # 下一曲

View File

@@ -1,16 +1,18 @@
from microbit import * from microbit import *
DS1307_I2C_ADDRESS = (104) DS1307_I2C_ADDRESS = 104
DS1307_REG_SECOND = (0) DS1307_REG_SECOND = 0
DS1307_REG_MINUTE = (1) DS1307_REG_MINUTE = 1
DS1307_REG_HOUR = (2) DS1307_REG_HOUR = 2
DS1307_REG_WEEKDAY = (3) DS1307_REG_WEEKDAY = 3
DS1307_REG_DAY = (4) DS1307_REG_DAY = 4
DS1307_REG_MONTH = (5) DS1307_REG_MONTH = 5
DS1307_REG_YEAR = (6) DS1307_REG_YEAR = 6
DS1307_REG_CTRL = (7) DS1307_REG_CTRL = 7
DS1307_REG_RAM = (8) DS1307_REG_RAM = 8
class DS1307():
class DS1307:
# set reg # set reg
def setReg(self, reg, dat): def setReg(self, reg, dat):
i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat])) i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat]))
@@ -125,4 +127,5 @@ class DS1307():
self.Month(month) self.Month(month)
self.Day(day) self.Day(day)
ds = DS1307() ds = DS1307()

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
def angle(pin, angle): def angle(pin, angle):
pin.set_analog_period(round((1 / 50) * 1000)) pin.set_analog_period(round((1 / 50) * 1000))
duty = 26 + (angle * 102) / 180 duty = 26 + (angle * 102) / 180

View File

@@ -1,6 +1,7 @@
from microbit import * from microbit import *
class TCS34725():
class TCS34725:
TCS34725_ADDRESS = 0x29 TCS34725_ADDRESS = 0x29
@@ -10,7 +11,9 @@ class TCS34725():
TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer
TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it
TCS34725_ENABLE_PON = 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it TCS34725_ENABLE_PON = (
0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it
)
TCS34725_ATIME = 0x01 # Integration time TCS34725_ATIME = 0x01 # Integration time
TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted
TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
@@ -20,30 +23,66 @@ class TCS34725():
TCS34725_AILTH = 0x05 TCS34725_AILTH = 0x05
TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
TCS34725_AIHTH = 0x07 TCS34725_AIHTH = 0x07
TCS34725_PERS = 0x0C # Persistence register - basic SW filtering mechanism for interrupts TCS34725_PERS = (
0x0C # Persistence register - basic SW filtering mechanism for interrupts
)
TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt
TCS34725_PERS_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt TCS34725_PERS_1_CYCLE = (
TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values outside threshold range generates an interrupt 0b0001 # 1 clean channel value outside threshold range generates an interrupt
TCS34725_PERS_3_CYCLE = 0b0011 # 3 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_5_CYCLE = 0b0100 # 5 clean channel values outside threshold range generates an interrupt TCS34725_PERS_2_CYCLE = (
TCS34725_PERS_10_CYCLE = 0b0101 # 10 clean channel values outside threshold range generates an interrupt 0b0010 # 2 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_15_CYCLE = 0b0110 # 15 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_20_CYCLE = 0b0111 # 20 clean channel values outside threshold range generates an interrupt TCS34725_PERS_3_CYCLE = (
TCS34725_PERS_25_CYCLE = 0b1000 # 25 clean channel values outside threshold range generates an interrupt 0b0011 # 3 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_30_CYCLE = 0b1001 # 30 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_35_CYCLE = 0b1010 # 35 clean channel values outside threshold range generates an interrupt TCS34725_PERS_5_CYCLE = (
TCS34725_PERS_40_CYCLE = 0b1011 # 40 clean channel values outside threshold range generates an interrupt 0b0100 # 5 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_45_CYCLE = 0b1100 # 45 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_50_CYCLE = 0b1101 # 50 clean channel values outside threshold range generates an interrupt TCS34725_PERS_10_CYCLE = (
TCS34725_PERS_55_CYCLE = 0b1110 # 55 clean channel values outside threshold range generates an interrupt 0b0101 # 10 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_60_CYCLE = 0b1111 # 60 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_15_CYCLE = (
0b0110 # 15 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_20_CYCLE = (
0b0111 # 20 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_25_CYCLE = (
0b1000 # 25 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_30_CYCLE = (
0b1001 # 30 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_35_CYCLE = (
0b1010 # 35 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_40_CYCLE = (
0b1011 # 40 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_45_CYCLE = (
0b1100 # 45 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_50_CYCLE = (
0b1101 # 50 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_55_CYCLE = (
0b1110 # 55 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_60_CYCLE = (
0b1111 # 60 clean channel values outside threshold range generates an interrupt
)
TCS34725_CONFIG = 0x0D TCS34725_CONFIG = 0x0D
TCS34725_CONFIG_WLONG = 0x02 # Choose between short and long (12x wait times via TCS34725_WTIME TCS34725_CONFIG_WLONG = (
0x02 # Choose between short and long (12x wait times via TCS34725_WTIME
)
TCS34725_CONTROL = 0x0F # Set the gain level for the sensor TCS34725_CONTROL = 0x0F # Set the gain level for the sensor
TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
TCS34725_STATUS = 0x13 TCS34725_STATUS = 0x13
TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt
TCS34725_STATUS_AVALID = 0x01 # Indicates that the RGBC channels have completed an integration cycle TCS34725_STATUS_AVALID = (
0x01 # Indicates that the RGBC channels have completed an integration cycle
)
TCS34725_CDATAL = 0x14 # Clear channel data TCS34725_CDATAL = 0x14 # Clear channel data
TCS34725_CDATAH = 0x15 TCS34725_CDATAH = 0x15
TCS34725_RDATAL = 0x16 # Red channel data TCS34725_RDATAL = 0x16 # Red channel data
@@ -69,24 +108,31 @@ class TCS34725():
# pass # pass
def write8(self, reg, val): def write8(self, reg, val):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF])) self.i2c.write(
self.TCS34725_ADDRESS,
bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF]),
)
def read16(self, reg): def read16(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])) self.i2c.write(
self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])
)
list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2) list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2)
bytes = list_bytes[1] << 8 | list_bytes[0] bytes = list_bytes[1] << 8 | list_bytes[0]
# return [ hex(x) for x in bytes ][0] # return [ hex(x) for x in bytes ][0]
return bytes return bytes
def read8(self, reg): def read8(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])) self.i2c.write(
self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])
)
return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0 return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0
def begin(self): def begin(self):
x = self.read8(self.TCS34725_ID) x = self.read8(self.TCS34725_ID)
# print(x) # print(x)
if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12 if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12
print('did not get the expected response from sensor: ', x) print("did not get the expected response from sensor: ", x)
return False return False
self._tcs34725Initialised = True self._tcs34725Initialised = True
self.setIntegrationTime(self._tcs34725IntegrationTime) self.setIntegrationTime(self._tcs34725IntegrationTime)
@@ -96,7 +142,7 @@ class TCS34725():
def setIntegrationTime(self, theTime): def setIntegrationTime(self, theTime):
if theTime not in [0xFF, 0xF6, 0xEB, 0xD5, 0xC0, 0x00]: if theTime not in [0xFF, 0xF6, 0xEB, 0xD5, 0xC0, 0x00]:
print('setting integration time to 0x00, %s is illegal' % theTime) print("setting integration time to 0x00, %s is illegal" % theTime)
theTime = 0x00 theTime = 0x00
self.write8(self.TCS34725_ATIME, theTime) self.write8(self.TCS34725_ATIME, theTime)
# self.i2c.write8(self.TCS34725_ATIME, theTime) # self.i2c.write8(self.TCS34725_ATIME, theTime)
@@ -108,7 +154,7 @@ class TCS34725():
# TCS34725_GAIN_16X = 0x02, /**< 16x gain # TCS34725_GAIN_16X = 0x02, /**< 16x gain
# TCS34725_GAIN_60X = 0x03 /**< 60x gain # TCS34725_GAIN_60X = 0x03 /**< 60x gain
if gain not in [0, 1, 2, 3]: if gain not in [0, 1, 2, 3]:
print('setting gain to 0, %s is illegal' % gain) print("setting gain to 0, %s is illegal" % gain)
gain = 0 gain = 0
self.write8(self.TCS34725_CONTROL, gain) self.write8(self.TCS34725_CONTROL, gain)
self._tcs34725Gain = gain self._tcs34725Gain = gain
@@ -116,7 +162,9 @@ class TCS34725():
def enable(self): def enable(self):
self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON) self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON)
sleep(0.003) sleep(0.003)
self.write8(self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN)) self.write8(
self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN)
)
def getRawRGBData(self, type): def getRawRGBData(self, type):
if not self._tcs34725Initialised: if not self._tcs34725Initialised:
@@ -145,4 +193,5 @@ class TCS34725():
else: else:
return b return b
tcs = TCS34725(i2c) tcs = TCS34725(i2c)

View File

@@ -1,6 +1,7 @@
from microbit import * from microbit import *
class LCD1602():
class LCD1602:
def __init__(self, lcd_i2c_addr): def __init__(self, lcd_i2c_addr):
self.buf = bytearray(1) self.buf = bytearray(1)
self.BK = 0x08 self.BK = 0x08
@@ -16,7 +17,7 @@ class LCD1602():
self.setcmd(0x0C) self.setcmd(0x0C)
self.setcmd(0x06) self.setcmd(0x06)
self.setcmd(0x01) self.setcmd(0x01)
self.version='1.0' self.version = "1.0"
self.lcd_i2c_addr = lcd_i2c_addr self.lcd_i2c_addr = lcd_i2c_addr
def setReg(self, dat): def setReg(self, dat):

View File

@@ -1,21 +1,29 @@
import math import math
def math_map(v, al, ah, bl, bh): def math_map(v, al, ah, bl, bh):
return bl + (bh - bl) * (v - al) / (ah - al) return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList): def math_mean(myList):
localList = [e for e in myList if type(e) == int or type(e) == float] localList = [e for e in myList if type(e) == int or type(e) == float]
if not localList: return if not localList:
return
return float(sum(localList)) / len(localList) return float(sum(localList)) / len(localList)
def math_median(myList): def math_median(myList):
localList = sorted([e for e in myList if type(e) == int or type(e) == float]) localList = sorted([e for e in myList if type(e) == int or type(e) == float])
if not localList: return if not localList:
return
if len(localList) % 2 == 0: if len(localList) % 2 == 0:
return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0 return (
localList[len(localList) // 2 - 1] + localList[len(localList) // 2]
) / 2.0
else: else:
return localList[(len(localList) - 1) // 2] return localList[(len(localList) - 1) // 2]
def math_modes(some_list): def math_modes(some_list):
modes = [] modes = []
# Using a lists of [item, count] to keep count rather than dict # Using a lists of [item, count] to keep count rather than dict
@@ -36,23 +44,27 @@ def math_modes(some_list):
modes.append(counted_item) modes.append(counted_item)
return modes return modes
def math_standard_deviation(numbers): def math_standard_deviation(numbers):
n = len(numbers) n = len(numbers)
if n == 0: return if n == 0:
return
mean = float(sum(numbers)) / n mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance) return math.sqrt(variance)
def lists_sort(my_list, type, reverse): def lists_sort(my_list, type, reverse):
def try_float(s): def try_float(s):
try: try:
return float(s) return float(s)
except: except:
return 0 return 0
key_funcs = { key_funcs = {
"NUMERIC": try_float, "NUMERIC": try_float,
"TEXT": str, "TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower() "IGNORE_CASE": lambda s: str(s).lower(),
} }
key_func = key_funcs[type] key_func = key_funcs[type]
list_cpy = list(my_list) list_cpy = list(my_list)

View File

@@ -1,48 +1,67 @@
from microbit import * from microbit import *
def initPCA9685(): def initPCA9685():
i2c.write(0x40, bytearray([0x00, 0x00])) i2c.write(0x40, bytearray([0x00, 0x00]))
setFreq(50) setFreq(50)
for idx in range(0, 16, 1): for idx in range(0, 16, 1):
setPwm(idx, 0, 0) setPwm(idx, 0, 0)
def MotorRun(Motors, speed): def MotorRun(Motors, speed):
speed = speed * 16 speed = speed * 16
if (speed >= 4096): if speed >= 4096:
speed = 4095 speed = 4095
if (speed <= -4096): if speed <= -4096:
speed = -4095 speed = -4095
if (Motors <= 4 and Motors > 0): if Motors <= 4 and Motors > 0:
pp = (Motors - 1) * 2 pp = (Motors - 1) * 2
pn = (Motors - 1) * 2 + 1 pn = (Motors - 1) * 2 + 1
if (speed >= 0): if speed >= 0:
setPwm(pp, 0, speed) setPwm(pp, 0, speed)
setPwm(pn, 0, 0) setPwm(pn, 0, 0)
else: else:
setPwm(pp, 0, 0) setPwm(pp, 0, 0)
setPwm(pn, 0, -speed) setPwm(pn, 0, -speed)
def Servo(Servos, degree): def Servo(Servos, degree):
v_us = (degree * 1800 / 180 + 600) v_us = degree * 1800 / 180 + 600
value = int(v_us * 4096 / 20000) value = int(v_us * 4096 / 20000)
setPwm(Servos + 7, 0, value) setPwm(Servos + 7, 0, value)
def setFreq(freq): def setFreq(freq):
prescaleval = int(25000000 / (4096 * freq)) - 1 prescaleval = int(25000000 / (4096 * freq)) - 1
i2c.write(0x40, bytearray([0x00])) i2c.write(0x40, bytearray([0x00]))
oldmode = i2c.read(0x40, 1) oldmode = i2c.read(0x40, 1)
newmode = (oldmode[0] & 0x7F) | 0x10 newmode = (oldmode[0] & 0x7F) | 0x10
i2c.write(0x40, bytearray([0x00, newmode])) i2c.write(0x40, bytearray([0x00, newmode]))
i2c.write(0x40, bytearray([0xfe, prescaleval])) i2c.write(0x40, bytearray([0xFE, prescaleval]))
i2c.write(0x40, bytearray([0x00, oldmode[0]])) i2c.write(0x40, bytearray([0x00, oldmode[0]]))
sleep(4) sleep(4)
i2c.write(0x40, bytearray([0x00, oldmode[0] | 0xa1])) i2c.write(0x40, bytearray([0x00, oldmode[0] | 0xA1]))
def setPwm(channel, on, off): def setPwm(channel, on, off):
if (channel >= 0 and channel <= 15): if channel >= 0 and channel <= 15:
buf = bytearray([0X06 + 4 * channel, on & 0xff, (on >> 8) & 0xff, off & 0xff, (off >> 8) & 0xff]) buf = bytearray(
[
0x06 + 4 * channel,
on & 0xFF,
(on >> 8) & 0xFF,
off & 0xFF,
(off >> 8) & 0xFF,
]
)
i2c.write(0x40, buf) i2c.write(0x40, buf)
def setStepper(stpMotors, dir, speed): def setStepper(stpMotors, dir, speed):
spd = speed spd = speed
setFreq(spd) setFreq(spd)
if (stpMotors == 1): if stpMotors == 1:
if (dir): if dir:
setPwm(0, 2047, 4095) setPwm(0, 2047, 4095)
setPwm(1, 1, 2047) setPwm(1, 1, 2047)
setPwm(2, 1023, 3071) setPwm(2, 1023, 3071)
@@ -52,8 +71,8 @@ def setStepper(stpMotors, dir, speed):
setPwm(2, 1, 2047) setPwm(2, 1, 2047)
setPwm(1, 1023, 3071) setPwm(1, 1023, 3071)
setPwm(0, 3071, 1023) setPwm(0, 3071, 1023)
elif (stpMotors == 2): elif stpMotors == 2:
if (dir): if dir:
setPwm(4, 2047, 4095) setPwm(4, 2047, 4095)
setPwm(5, 1, 2047) setPwm(5, 1, 2047)
setPwm(6, 1023, 3071) setPwm(6, 1023, 3071)

View File

@@ -7,6 +7,7 @@ _B = 3950
_T1 = 273.15 + 25 _T1 = 273.15 + 25
_R1 = 100 _R1 = 100
def read(pin, r1, b, rs): def read(pin, r1, b, rs):
r1 = r1 / 1000 r1 = r1 / 1000
rs = rs / 1000 rs = rs / 1000
@@ -22,6 +23,6 @@ def read(pin, r1, b, rs):
# print("rt:" + str(_rt)) # print("rt:" + str(_rt))
_tempValue = (((_T1 * b) / (b + _T1 * math.log(_rt / r1))) - 273.15) _tempValue = ((_T1 * b) / (b + _T1 * math.log(_rt / r1))) - 273.15
return _tempValue return _tempValue

View File

@@ -32,7 +32,7 @@ class OLED12864_I2C():
self.screen[0] = 0x40 self.screen[0] = 0x40
def command(self, c): def command(self, c):
i2c.write(self.ADDR, b'·' + bytearray(c)) i2c.write(self.ADDR, b'\xb7' + bytearray(c))
def set_pos(self, col=0, page=0): def set_pos(self, col=0, page=0):
self.command([0xb0 | page]) # page number self.command([0xb0 | page]) # page number

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
def show(object, led, r, g, b): def show(object, led, r, g, b):
object[led] = (r, g, b) object[led] = (r, g, b)
object.show() object.show()

View File

@@ -1,8 +1,8 @@
from microbit import * from microbit import *
def distance_mm(tpin=pin16, epin=pin15): def distance_mm(tpin=pin16, epin=pin15):
spi.init(baudrate=125000, sclk=pin13, spi.init(baudrate=125000, sclk=pin13, mosi=tpin, miso=epin)
mosi=tpin, miso=epin)
pre = 0 pre = 0
post = 0 post = 0
k = -1 k = -1
@@ -19,14 +19,18 @@ def distance_mm(tpin=pin16, epin=pin15):
pre = bin(value).count("1") pre = bin(value).count("1")
# find first non full high value afterwards # find first non full high value afterwards
try: try:
k, value = next((ind, v) k, value = next(
for ind, v in enumerate(resp[i:length - 2]) if resp[i + ind + 1] == 0) (ind, v)
for ind, v in enumerate(resp[i : length - 2])
if resp[i + ind + 1] == 0
)
post = bin(value).count("1") if k else 0 post = bin(value).count("1") if k else 0
k = k + i k = k + i
except StopIteration: except StopIteration:
i = -1 i = -1
dist= -1 if i < 0 else round((pre + (k - i) * 8. + post) * 8 * 0.172) dist = -1 if i < 0 else round((pre + (k - i) * 8.0 + post) * 8 * 0.172)
return dist return dist
def distance_cm(t_pin=pin16, e_pin=pin15): def distance_cm(t_pin=pin16, e_pin=pin15):
return distance_mm(tpin=t_pin, epin=e_pin) / 10.0 return distance_mm(tpin=t_pin, epin=e_pin) / 10.0

View File

@@ -1,21 +1,29 @@
import math import math
def math_map(v, al, ah, bl, bh): def math_map(v, al, ah, bl, bh):
return bl + (bh - bl) * (v - al) / (ah - al) return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList): def math_mean(myList):
localList = [e for e in myList if type(e) == int or type(e) == float] localList = [e for e in myList if type(e) == int or type(e) == float]
if not localList: return if not localList:
return
return float(sum(localList)) / len(localList) return float(sum(localList)) / len(localList)
def math_median(myList): def math_median(myList):
localList = sorted([e for e in myList if type(e) == int or type(e) == float]) localList = sorted([e for e in myList if type(e) == int or type(e) == float])
if not localList: return if not localList:
return
if len(localList) % 2 == 0: if len(localList) % 2 == 0:
return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0 return (
localList[len(localList) // 2 - 1] + localList[len(localList) // 2]
) / 2.0
else: else:
return localList[(len(localList) - 1) // 2] return localList[(len(localList) - 1) // 2]
def math_modes(some_list): def math_modes(some_list):
modes = [] modes = []
# Using a lists of [item, count] to keep count rather than dict # Using a lists of [item, count] to keep count rather than dict
@@ -36,23 +44,27 @@ def math_modes(some_list):
modes.append(counted_item) modes.append(counted_item)
return modes return modes
def math_standard_deviation(numbers): def math_standard_deviation(numbers):
n = len(numbers) n = len(numbers)
if n == 0: return if n == 0:
return
mean = float(sum(numbers)) / n mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance) return math.sqrt(variance)
def lists_sort(my_list, type, reverse): def lists_sort(my_list, type, reverse):
def try_float(s): def try_float(s):
try: try:
return float(s) return float(s)
except: except:
return 0 return 0
key_funcs = { key_funcs = {
"NUMERIC": try_float, "NUMERIC": try_float,
"TEXT": str, "TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower() "IGNORE_CASE": lambda s: str(s).lower(),
} }
key_func = key_funcs[type] key_func = key_funcs[type]
list_cpy = list(my_list) list_cpy = list(my_list)

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
def motor1(v, d=1): def motor1(v, d=1):
v = min(12, max(0, v)) v = min(12, max(0, v))
if v == 0: if v == 0:
@@ -12,6 +13,7 @@ def motor1(v,d=1):
pin8.write_analog(0) pin8.write_analog(0)
pin16.write_analog(int(v / 12 * 1023)) pin16.write_analog(int(v / 12 * 1023))
def motor2(v, d=1): def motor2(v, d=1):
v = min(12, max(0, v)) v = min(12, max(0, v))
if v == 0: if v == 0:
@@ -24,6 +26,7 @@ def motor2(v,d=1):
pin14.write_analog(0) pin14.write_analog(0)
pin13.write_analog(int(v / 12 * 1023)) pin13.write_analog(int(v / 12 * 1023))
def motor3(v, d=1): def motor3(v, d=1):
v = min(12, max(0, v)) v = min(12, max(0, v))
if v == 0: if v == 0:

View File

@@ -3,11 +3,13 @@ import neopixel
np = neopixel.NeoPixel(pin12, 4) np = neopixel.NeoPixel(pin12, 4)
def mixly_rgb_show_all(r, g, b): def mixly_rgb_show_all(r, g, b):
for led in range(4): for led in range(4):
np[led] = (r, g, b) np[led] = (r, g, b)
np.show() np.show()
def mixly_rgb_show(led, r, g, b): def mixly_rgb_show(led, r, g, b):
np[led] = (r, g, b) np[led] = (r, g, b)
np.show() np.show()

View File

@@ -3,13 +3,14 @@ import time
import ustruct import ustruct
DATA_FORMAT = 0x31 DATA_FORMAT = 0x31
BW_RATE = 0x2c BW_RATE = 0x2C
POWER_CTL = 0x2d POWER_CTL = 0x2D
INT_ENABLE = 0x2E INT_ENABLE = 0x2E
OFSX = 0x1e OFSX = 0x1E
OFSY =0x1f OFSY = 0x1F
OFSZ = 0x20 OFSZ = 0x20
class ADXL345: class ADXL345:
def __init__(self, i2c): def __init__(self, i2c):
self.i2c = i2c self.i2c = i2c
@@ -18,9 +19,9 @@ class ADXL345:
for s in slv: for s in slv:
buf = self.i2c.readfrom_mem(s, 0, 1) buf = self.i2c.readfrom_mem(s, 0, 1)
print(buf) print(buf)
if(buf[0] == 0xe5): if buf[0] == 0xE5:
self.slvAddr = s self.slvAddr = s
print('adxl345 found') print("adxl345 found")
break break
# self.writeByte(POWER_CTL,0x00) #sleep # self.writeByte(POWER_CTL,0x00) #sleep
# time.sleep(0.001) # time.sleep(0.001)
@@ -39,25 +40,25 @@ class ADXL345:
time.sleep(1) time.sleep(1)
def readXYZ(self): def readXYZ(self):
fmt = '<h' #little-endian fmt = "<h" # little-endian
buf1 = self.readByte(0x32) buf1 = self.readByte(0x32)
buf2 = self.readByte(0x33) buf2 = self.readByte(0x33)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
x, = ustruct.unpack(fmt, buf) (x,) = ustruct.unpack(fmt, buf)
x = x * 3.9 x = x * 3.9
# print('x:',x) # print('x:',x)
buf1 = self.readByte(0x34) buf1 = self.readByte(0x34)
buf2 = self.readByte(0x35) buf2 = self.readByte(0x35)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
y, = ustruct.unpack(fmt, buf) (y,) = ustruct.unpack(fmt, buf)
y = y * 3.9 y = y * 3.9
# print('y:',y) # print('y:',y)
buf1 = self.readByte(0x36) buf1 = self.readByte(0x36)
buf2 = self.readByte(0x37) buf2 = self.readByte(0x37)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
z, = ustruct.unpack(fmt, buf) (z,) = ustruct.unpack(fmt, buf)
z = z * 3.9 z = z * 3.9
# print('z:',z) # print('z:',z)
# print('************************') # print('************************')
@@ -76,10 +77,12 @@ class ADXL345:
def writeByte(self, addr, data): def writeByte(self, addr, data):
d = bytearray([data]) d = bytearray([data])
self.i2c.writeto_mem(self.slvAddr, addr, d) self.i2c.writeto_mem(self.slvAddr, addr, d)
def readByte(self, addr): def readByte(self, addr):
return self.i2c.readfrom_mem(self.slvAddr, addr, 1) return self.i2c.readfrom_mem(self.slvAddr, addr, 1)
if __name__ == '__main__':
if __name__ == "__main__":
# 初始化 # 初始化
sensor = ADXL345(i2c) sensor = ADXL345(i2c)

View File

@@ -31,6 +31,7 @@ task_fe=None
info = None info = None
bb = 1 bb = 1
def set_key_state(*_): def set_key_state(*_):
global start_processing global start_processing
global tim2 global tim2
@@ -55,7 +56,18 @@ def init(FD,LD,FE):
key_gpio = board.pin(9, board.GPIO.IN, board.GPIO.PULL_UP) key_gpio = board.pin(9, board.GPIO.IN, board.GPIO.PULL_UP)
key_gpio.irq(set_key_state, board.GPIO.IRQ_RISING, board.GPIO.WAKEUP_NOT_SUPPORT) key_gpio.irq(set_key_state, board.GPIO.IRQ_RISING, board.GPIO.WAKEUP_NOT_SUPPORT)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437,6.92275, 6.718375, 9.01025) # anchor for face detect anchor = (
1.889,
2.5245,
2.9465,
3.94056,
3.99987,
5.3658,
5.155437,
6.92275,
6.718375,
9.01025,
) # anchor for face detect
kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor) kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor)
@@ -85,7 +97,7 @@ def train(img,names,threshold):
T = image.get_affine_transform(src_point, dst_point) T = image.get_affine_transform(src_point, dst_point)
a = image.warp_affine_ai(img, img_face, T) a = image.warp_affine_ai(img, img_face, T)
a = img_face.ai_to_pix() a = img_face.ai_to_pix()
del(face_cut_128) del face_cut_128
fmap = kpu.forward(task_fe, img_face) fmap = kpu.forward(task_fe, img_face)
feature = kpu.face_encode(fmap[:]) feature = kpu.face_encode(fmap[:])
reg_flag = False reg_flag = False
@@ -118,16 +130,19 @@ def train(img,names,threshold):
return False return False
gc.collect() gc.collect()
def info_name(): def info_name():
gc.collect() gc.collect()
return info[0] return info[0]
def info_score(): def info_score():
return info[1] return info[1]
def info_face(): def info_face():
return info[2] return info[2]
def info_organs(): def info_organs():
return info[3] return info[3]

View File

@@ -5,10 +5,12 @@ wifi_en=board.pin(19,board.GPIO.OUT)
board.register(18, board.FPIOA.UART2_TX) board.register(18, board.FPIOA.UART2_TX)
board.register(17, board.FPIOA.UART2_RX) board.register(17, board.FPIOA.UART2_RX)
def wifi_enable(en): def wifi_enable(en):
global wifi_en global wifi_en
wifi_en.value(en) wifi_en.value(en)
def wifi_reset(): def wifi_reset():
global uart global uart
wifi_enable(0) wifi_enable(0)
@@ -19,7 +21,9 @@ def wifi_reset():
tmp = uart.read() tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n") uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read()) print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data uart = UART(
UART.UART2, 921600, timeout=1000, read_buf_len=10240
) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n") uart.write("AT\r\n")
tmp = uart.read() tmp = uart.read()
print(tmp) print(tmp)
@@ -32,6 +36,7 @@ def wifi_reset():
return None return None
return nic return nic
def nic_init(account, password): def nic_init(account, password):
nic = wifi_reset() nic = wifi_reset()
if not nic: if not nic:
@@ -41,7 +46,7 @@ def nic_init(account,password):
nic.ifconfig() nic.ifconfig()
class SimpleEncode(): class SimpleEncode:
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|" keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|"
keyLength = len(keyStr) keyLength = len(keyStr)
encryptionA = 17 encryptionA = 17
@@ -63,8 +68,8 @@ class SimpleEncode():
def base64Encode(self, sourceStr): def base64Encode(self, sourceStr):
encode = "" encode = ""
for ch in base64.b64encode(sourceStr.encode()).decode(): for ch in base64.b64encode(sourceStr.encode()).decode():
if ch == '=': if ch == "=":
encode += '=' encode += "="
else: else:
for i in range(64): for i in range(64):
if ch == self.STANDARD[i]: if ch == self.STANDARD[i]:
@@ -74,7 +79,9 @@ class SimpleEncode():
def encrpyt(self, sourceStr): def encrpyt(self, sourceStr):
srcLength = len(sourceStr) srcLength = len(sourceStr)
# 先加入干扰字符的数量 # 先加入干扰字符的数量
addCharCount = random.randint(1,self.preCountMax) if srcLength < self.preCountMax else 0 addCharCount = (
random.randint(1, self.preCountMax) if srcLength < self.preCountMax else 0
)
# 随机字符 # 随机字符
sb = str(addCharCount) + "|" sb = str(addCharCount) + "|"
for i in range(addCharCount): for i in range(addCharCount):
@@ -88,7 +95,7 @@ class SimpleEncode():
# base64 加密 # base64 加密
base64Str = self.base64Encode(sb) base64Str = self.base64Encode(sb)
destStr = '' destStr = ""
for i in range(len(base64Str)): for i in range(len(base64Str)):
# 找到字符所在位置 # 找到字符所在位置
position = self.keyStr.find(base64Str[i]) position = self.keyStr.find(base64Str[i])
@@ -102,36 +109,34 @@ class SimpleEncode():
return destStr return destStr
def token(account, password): def token(account, password):
url = 'http://ai.heclouds.com:9090/v1/user/oneNetLogin' url = "http://ai.heclouds.com:9090/v1/user/oneNetLogin"
headers = { headers = {
'Content-Type': 'application/json', "Content-Type": "application/json",
} }
simpleencode = SimpleEncode() simpleencode = SimpleEncode()
data = {'account': account, 'password': simpleencode.encrpyt(password)} data = {"account": account, "password": simpleencode.encrpyt(password)}
req = request.post(url, data=json.dumps(data), headers=headers) req = request.post(url, data=json.dumps(data), headers=headers)
# print(req.text) # print(req.text)
try: try:
return eval(req.text)['data']['loginToken'] return eval(req.text)["data"]["loginToken"]
except: except:
raise ValueError("[Cool.AI]:Wrong account or password ") raise ValueError("[Cool.AI]:Wrong account or password ")
def post_ai(img, urlx, Token): def post_ai(img, urlx, Token):
ur = 'http://183.230.40.32:9090/v1/aiApi/picture/MixPY' ur = "http://183.230.40.32:9090/v1/aiApi/picture/MixPY"
url = ur.replace("MixPY", urlx) url = ur.replace("MixPY", urlx)
headers ={ headers = {"Content-Type": "application/json", "Login-Token": "Token"}
'Content-Type':'application/json',
'Login-Token':'Token'
}
headers['Login-Token']=Token headers["Login-Token"] = Token
imge = img.compressed(quality=50) imge = img.compressed(quality=50)
file = imge.to_bytes() file = imge.to_bytes()
str = base64.b64encode(file).decode() str = base64.b64encode(file).decode()
data = {'picture':[str]} data = {"picture": [str]}
req = request.post(url, data=json.dumps(data), headers=headers) req = request.post(url, data=json.dumps(data), headers=headers)
return json.loads(req.text) return json.loads(req.text)
# return eval(req.text) # return eval(req.text)

View File

@@ -3,25 +3,38 @@ import struct
import binascii import binascii
__all__ = [ __all__ = [
'encode', 'decode', 'encodebytes', 'decodebytes', "encode",
'b64encode', 'b64decode', 'b32encode', 'b32decode', "decode",
'b16encode', 'b16decode', "encodebytes",
'standard_b64encode', 'standard_b64decode', "decodebytes",
'urlsafe_b64encode', 'urlsafe_b64decode', "b64encode",
"b64decode",
"b32encode",
"b32decode",
"b16encode",
"b16decode",
"standard_b64encode",
"standard_b64decode",
"urlsafe_b64encode",
"urlsafe_b64decode",
] ]
bytes_types = (bytes, bytearray) bytes_types = (bytes, bytearray)
def _bytes_from_decode_data(s): def _bytes_from_decode_data(s):
if isinstance(s, str): if isinstance(s, str):
try: try:
return s.encode('ascii') return s.encode("ascii")
except: except:
raise ValueError('string argument should contain only ASCII characters') raise ValueError("string argument should contain only ASCII characters")
elif isinstance(s, bytes_types): elif isinstance(s, bytes_types):
return s return s
else: else:
raise TypeError("argument should be bytes or ASCII string, not %s" % s.__class__.__name__) raise TypeError(
"argument should be bytes or ASCII string, not %s" % s.__class__.__name__
)
def b64encode(s, altchars=None): def b64encode(s, altchars=None):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
@@ -29,44 +42,72 @@ def b64encode(s, altchars=None):
encoded = binascii.b2a_base64(s)[:-1] encoded = binascii.b2a_base64(s)[:-1]
if altchars is not None: if altchars is not None:
if not isinstance(altchars, bytes_types): if not isinstance(altchars, bytes_types):
raise TypeError("expected bytes, not %s" raise TypeError("expected bytes, not %s" % altchars.__class__.__name__)
% altchars.__class__.__name__)
assert len(altchars) == 2, repr(altchars) assert len(altchars) == 2, repr(altchars)
return encoded.translate(bytes.maketrans(b'+/', altchars)) return encoded.translate(bytes.maketrans(b"+/", altchars))
return encoded return encoded
def b64decode(s, altchars=None, validate=False): def b64decode(s, altchars=None, validate=False):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
if altchars is not None: if altchars is not None:
altchars = _bytes_from_decode_data(altchars) altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars) assert len(altchars) == 2, repr(altchars)
s = s.translate(bytes.maketrans(altchars, b'+/')) s = s.translate(bytes.maketrans(altchars, b"+/"))
if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): if validate and not re.match(b"^[A-Za-z0-9+/]*={0,2}$", s):
raise binascii.Error('Non-base64 digit found') raise binascii.Error("Non-base64 digit found")
return binascii.a2b_base64(s) return binascii.a2b_base64(s)
def standard_b64encode(s): def standard_b64encode(s):
return b64encode(s) return b64encode(s)
def standard_b64decode(s): def standard_b64decode(s):
return b64decode(s) return b64decode(s)
def urlsafe_b64encode(s): def urlsafe_b64encode(s):
raise NotImplementedError() raise NotImplementedError()
def urlsafe_b64decode(s): def urlsafe_b64decode(s):
raise NotImplementedError() raise NotImplementedError()
_b32alphabet = { _b32alphabet = {
0: b'A', 9: b'J', 18: b'S', 27: b'3', 0: b"A",
1: b'B', 10: b'K', 19: b'T', 28: b'4', 9: b"J",
2: b'C', 11: b'L', 20: b'U', 29: b'5', 18: b"S",
3: b'D', 12: b'M', 21: b'V', 30: b'6', 27: b"3",
4: b'E', 13: b'N', 22: b'W', 31: b'7', 1: b"B",
5: b'F', 14: b'O', 23: b'X', 10: b"K",
6: b'G', 15: b'P', 24: b'Y', 19: b"T",
7: b'H', 16: b'Q', 25: b'Z', 28: b"4",
8: b'I', 17: b'R', 26: b'2', 2: b"C",
11: b"L",
20: b"U",
29: b"5",
3: b"D",
12: b"M",
21: b"V",
30: b"6",
4: b"E",
13: b"N",
22: b"W",
31: b"7",
5: b"F",
14: b"O",
23: b"X",
6: b"G",
15: b"P",
24: b"Y",
7: b"H",
16: b"Q",
25: b"Z",
8: b"I",
17: b"R",
26: b"2",
} }
_b32tab = [v[0] for k, v in sorted(_b32alphabet.items())] _b32tab = [v[0] for k, v in sorted(_b32alphabet.items())]
@@ -82,26 +123,29 @@ def b32encode(s):
quanta += 1 quanta += 1
encoded = bytearray() encoded = bytearray()
for i in range(quanta): for i in range(quanta):
c1, c2, c3 = struct.unpack('!HHB', s[i*5:(i+1)*5]) c1, c2, c3 = struct.unpack("!HHB", s[i * 5 : (i + 1) * 5])
c2 += (c1 & 1) << 16 c2 += (c1 & 1) << 16
c3 += (c2 & 3) << 8 c3 += (c2 & 3) << 8
encoded += bytes([_b32tab[c1 >> 11], encoded += bytes(
_b32tab[(c1 >> 6) & 0x1f], [
_b32tab[(c1 >> 1) & 0x1f], _b32tab[c1 >> 11],
_b32tab[(c1 >> 6) & 0x1F],
_b32tab[(c1 >> 1) & 0x1F],
_b32tab[c2 >> 12], _b32tab[c2 >> 12],
_b32tab[(c2 >> 7) & 0x1f], _b32tab[(c2 >> 7) & 0x1F],
_b32tab[(c2 >> 2) & 0x1f], _b32tab[(c2 >> 2) & 0x1F],
_b32tab[c3 >> 5], _b32tab[c3 >> 5],
_b32tab[c3 & 0x1f], _b32tab[c3 & 0x1F],
]) ]
)
if leftover == 1: if leftover == 1:
encoded = encoded[:-6] + b'======' encoded = encoded[:-6] + b"======"
elif leftover == 2: elif leftover == 2:
encoded = encoded[:-4] + b'====' encoded = encoded[:-4] + b"===="
elif leftover == 3: elif leftover == 3:
encoded = encoded[:-3] + b'===' encoded = encoded[:-3] + b"==="
elif leftover == 4: elif leftover == 4:
encoded = encoded[:-1] + b'=' encoded = encoded[:-1] + b"="
return bytes(encoded) return bytes(encoded)
@@ -109,14 +153,14 @@ def b32decode(s, casefold=False, map01=None):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
quanta, leftover = divmod(len(s), 8) quanta, leftover = divmod(len(s), 8)
if leftover: if leftover:
raise binascii.Error('Incorrect padding') raise binascii.Error("Incorrect padding")
if map01 is not None: if map01 is not None:
map01 = _bytes_from_decode_data(map01) map01 = _bytes_from_decode_data(map01)
assert len(map01) == 1, repr(map01) assert len(map01) == 1, repr(map01)
s = s.translate(bytes.maketrans(b'01', b'O' + map01)) s = s.translate(bytes.maketrans(b"01", b"O" + map01))
if casefold: if casefold:
s = s.upper() s = s.upper()
padchars = s.find(b'=') padchars = s.find(b"=")
if padchars > 0: if padchars > 0:
padchars = len(s) - padchars padchars = len(s) - padchars
s = s[:-padchars] s = s[:-padchars]
@@ -129,16 +173,16 @@ def b32decode(s, casefold=False, map01=None):
for c in s: for c in s:
val = _b32rev.get(c) val = _b32rev.get(c)
if val is None: if val is None:
raise binascii.Error('Non-base32 digit found') raise binascii.Error("Non-base32 digit found")
acc += _b32rev[c] << shift acc += _b32rev[c] << shift
shift -= 5 shift -= 5
if shift < 0: if shift < 0:
parts.append(binascii.unhexlify(bytes('%010x' % acc, "ascii"))) parts.append(binascii.unhexlify(bytes("%010x" % acc, "ascii")))
acc = 0 acc = 0
shift = 35 shift = 35
last = binascii.unhexlify(bytes('%010x' % acc, "ascii")) last = binascii.unhexlify(bytes("%010x" % acc, "ascii"))
if padchars == 0: if padchars == 0:
last = b'' last = b""
elif padchars == 1: elif padchars == 1:
last = last[:-1] last = last[:-1]
elif padchars == 3: elif padchars == 3:
@@ -148,9 +192,10 @@ def b32decode(s, casefold=False, map01=None):
elif padchars == 6: elif padchars == 6:
last = last[:-4] last = last[:-4]
else: else:
raise binascii.Error('Incorrect padding') raise binascii.Error("Incorrect padding")
parts.append(last) parts.append(last)
return b''.join(parts) return b"".join(parts)
def b16encode(s): def b16encode(s):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
@@ -162,13 +207,15 @@ def b16decode(s, casefold=False):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
if casefold: if casefold:
s = s.upper() s = s.upper()
if re.search(b'[^0-9A-F]', s): if re.search(b"[^0-9A-F]", s):
raise binascii.Error('Non-base16 digit found') raise binascii.Error("Non-base16 digit found")
return binascii.unhexlify(s) return binascii.unhexlify(s)
MAXLINESIZE = 76 MAXLINESIZE = 76
MAXBINSIZE = (MAXLINESIZE // 4) * 3 MAXBINSIZE = (MAXLINESIZE // 4) * 3
def encode(input, output): def encode(input, output):
while True: while True:
s = input.read(MAXBINSIZE) s = input.read(MAXBINSIZE)
@@ -191,6 +238,7 @@ def decode(input, output):
s = binascii.a2b_base64(line) s = binascii.a2b_base64(line)
output.write(s) output.write(s)
def encodebytes(s): def encodebytes(s):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__) raise TypeError("expected bytes, not %s" % s.__class__.__name__)
@@ -200,10 +248,13 @@ def encodebytes(s):
pieces.append(binascii.b2a_base64(chunk)) pieces.append(binascii.b2a_base64(chunk))
return b"".join(pieces) return b"".join(pieces)
def encodestring(s): def encodestring(s):
import warnings import warnings
warnings.warn("encodestring() is a deprecated alias, use encodebytes()",
DeprecationWarning, 2) warnings.warn(
"encodestring() is a deprecated alias, use encodebytes()", DeprecationWarning, 2
)
return encodebytes(s) return encodebytes(s)
@@ -212,36 +263,50 @@ def decodebytes(s):
raise TypeError("expected bytes, not %s" % s.__class__.__name__) raise TypeError("expected bytes, not %s" % s.__class__.__name__)
return binascii.a2b_base64(s) return binascii.a2b_base64(s)
def decodestring(s): def decodestring(s):
import warnings import warnings
warnings.warn("decodestring() is a deprecated alias, use decodebytes()",
DeprecationWarning, 2) warnings.warn(
"decodestring() is a deprecated alias, use decodebytes()", DeprecationWarning, 2
)
return decodebytes(s) return decodebytes(s)
def main(): def main():
import sys, getopt import sys, getopt
try: try:
opts, args = getopt.getopt(sys.argv[1:], 'deut') opts, args = getopt.getopt(sys.argv[1:], "deut")
except getopt.error as msg: except getopt.error as msg:
sys.stdout = sys.stderr sys.stdout = sys.stderr
print(msg) print(msg)
print("""usage: %s [-d|-e|-u|-t] [file|-] print(
"""usage: %s [-d|-e|-u|-t] [file|-]
-d, -u: decode -d, -u: decode
-e: encode (default) -e: encode (default)
-t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0]) -t: encode and decode string 'Aladdin:open sesame'"""
% sys.argv[0]
)
sys.exit(2) sys.exit(2)
func = encode func = encode
for o, a in opts: for o, a in opts:
if o == '-e': func = encode if o == "-e":
if o == '-d': func = decode func = encode
if o == '-u': func = decode if o == "-d":
if o == '-t': test(); return func = decode
if args and args[0] != '-': if o == "-u":
with open(args[0], 'rb') as f: func = decode
if o == "-t":
test()
return
if args and args[0] != "-":
with open(args[0], "rb") as f:
func(f, sys.stdout.buffer) func(f, sys.stdout.buffer)
else: else:
func(sys.stdin.buffer, sys.stdout.buffer) func(sys.stdin.buffer, sys.stdout.buffer)
def test(): def test():
s0 = b"Aladdin:open sesame" s0 = b"Aladdin:open sesame"
print(repr(s0)) print(repr(s0))
@@ -252,5 +317,5 @@ def test():
assert s0 == s2 assert s0 == s2
if __name__ == '__main__': if __name__ == "__main__":
main() main()

View File

@@ -1,6 +1,7 @@
from ustruct import unpack as unp from ustruct import unpack as unp
import utime import utime
from machine import I2C from machine import I2C
# Author David Wahlund david@dafnet.se # Author David Wahlund david@dafnet.se
# Power Modes # Power Modes
@@ -49,21 +50,20 @@ class BMP280:
self._bmp_i2c = i2c_bus self._bmp_i2c = i2c_bus
self._i2c_addr = addr self._i2c_addr = addr
self.chip_id = self._read(BMP280_REGISTER_ID, 2) self.chip_id = self._read(BMP280_REGISTER_ID, 2)
self._T1 = unp('<H', self._read(BMP280_REGISTER_DIG_T1, 2))[0] self._T1 = unp("<H", self._read(BMP280_REGISTER_DIG_T1, 2))[0]
self._T2 = unp('<h', self._read(BMP280_REGISTER_DIG_T2, 2))[0] self._T2 = unp("<h", self._read(BMP280_REGISTER_DIG_T2, 2))[0]
self._T3 = unp('<h', self._read(BMP280_REGISTER_DIG_T3, 2))[0] self._T3 = unp("<h", self._read(BMP280_REGISTER_DIG_T3, 2))[0]
self._P1 = unp('<H', self._read(BMP280_REGISTER_DIG_P1, 2))[0] self._P1 = unp("<H", self._read(BMP280_REGISTER_DIG_P1, 2))[0]
self._P2 = unp('<h', self._read(BMP280_REGISTER_DIG_P2, 2))[0] self._P2 = unp("<h", self._read(BMP280_REGISTER_DIG_P2, 2))[0]
self._P3 = unp('<h', self._read(BMP280_REGISTER_DIG_P3, 2))[0] self._P3 = unp("<h", self._read(BMP280_REGISTER_DIG_P3, 2))[0]
self._P4 = unp('<h', self._read(BMP280_REGISTER_DIG_P4, 2))[0] self._P4 = unp("<h", self._read(BMP280_REGISTER_DIG_P4, 2))[0]
self._P5 = unp('<h', self._read(BMP280_REGISTER_DIG_P5, 2))[0] self._P5 = unp("<h", self._read(BMP280_REGISTER_DIG_P5, 2))[0]
self._P6 = unp('<h', self._read(BMP280_REGISTER_DIG_P6, 2))[0] self._P6 = unp("<h", self._read(BMP280_REGISTER_DIG_P6, 2))[0]
self._P7 = unp('<h', self._read(BMP280_REGISTER_DIG_P7, 2))[0] self._P7 = unp("<h", self._read(BMP280_REGISTER_DIG_P7, 2))[0]
self._P8 = unp('<h', self._read(BMP280_REGISTER_DIG_P8, 2))[0] self._P8 = unp("<h", self._read(BMP280_REGISTER_DIG_P8, 2))[0]
self._P9 = unp('<h', self._read(BMP280_REGISTER_DIG_P9, 2))[0] self._P9 = unp("<h", self._read(BMP280_REGISTER_DIG_P9, 2))[0]
self._t_os = BMP280_TEMP_OS_2 # temperature oversampling self._t_os = BMP280_TEMP_OS_2 # temperature oversampling
self._p_os = BMP280_PRES_OS_16 # pressure oversampling self._p_os = BMP280_PRES_OS_16 # pressure oversampling
@@ -96,7 +96,9 @@ class BMP280:
r = self._t_os + (self._p_os << 3) + (1 << 6) r = self._t_os + (self._p_os << 3) + (1 << 6)
self._write(BMP280_REGISTER_CONTROL, r) self._write(BMP280_REGISTER_CONTROL, r)
utime.sleep_ms(100) # TODO calc sleep utime.sleep_ms(100) # TODO calc sleep
d = self._read(BMP280_REGISTER_DATA, 6) # read all data at once (as by spec) d = self._read(
BMP280_REGISTER_DATA, 6
) # read all data at once (as by spec)
self._p_raw = (d[0] << 12) + (d[1] << 4) + (d[2] >> 4) self._p_raw = (d[0] << 12) + (d[1] << 4) + (d[2] >> 4)
self._t_raw = (d[3] << 12) + (d[4] << 4) + (d[5] >> 4) self._t_raw = (d[3] << 12) + (d[4] << 4) + (d[5] >> 4)
@@ -142,14 +144,20 @@ class BMP280:
self._gauge() self._gauge()
if self._t_fine == 0: if self._t_fine == 0:
var1 = (((self._t_raw >> 3) - (self._T1 << 1)) * self._T2) >> 11 var1 = (((self._t_raw >> 3) - (self._T1 << 1)) * self._T2) >> 11
var2 = (((((self._t_raw >> 4) - self._T1) * ((self._t_raw >> 4) - self._T1)) >> 12) * self._T3) >> 14 var2 = (
(
(((self._t_raw >> 4) - self._T1) * ((self._t_raw >> 4) - self._T1))
>> 12
)
* self._T3
) >> 14
self._t_fine = var1 + var2 self._t_fine = var1 + var2
# @property # @property
def get_BMP_temperature(self): def get_BMP_temperature(self):
self._calc_t_fine() self._calc_t_fine()
if self._t == 0: if self._t == 0:
self._t = ((self._t_fine * 5 + 128) >> 8) / 100. self._t = ((self._t_fine * 5 + 128) >> 8) / 100.0
return self._t return self._t
# @property # @property
@@ -175,4 +183,3 @@ class BMP280:
p = ((p + var1 + var2) >> 8) + (self._P7 << 4) p = ((p + var1 + var2) >> 8) + (self._P7 << 4)
self._p = p / 256.0 self._p = p / 256.0
return self._p return self._p

View File

@@ -6,17 +6,20 @@ MicroPython library for the MxiGo AI
20211213 20211213
mixly mixly
""" """
data_a = None data_a = None
def uart_tx(uart, data, repeat=True): def uart_tx(uart, data, repeat=True):
global data_a global data_a
data_b = data data_b = data
if data_b != data_a: if data_b != data_a:
uart.write((str(data)+'\n')) uart.write((str(data) + "\n"))
# print(data) # print(data)
if not repeat: if not repeat:
data_a = data_b data_a = data_b
def uart_rx(uart): def uart_rx(uart):
data = uart.readline() data = uart.readline()
if data: if data:
@@ -26,4 +29,3 @@ def uart_rx(uart):
return eval(data_str) return eval(data_str)
except: except:
return data_str return data_str

View File

@@ -1,5 +1,6 @@
import time, board import time, board
def read_data(pin_name): def read_data(pin_name):
data = [] data = []
j = 0 j = 0
@@ -25,7 +26,8 @@ def read_data(pin_name):
continue continue
while N1.value() == 1: while N1.value() == 1:
k += 1 k += 1
if k>100:break if k > 100:
break
if k < 15: if k < 15:
data.append(0) data.append(0)
else: else:

View File

@@ -1,5 +1,6 @@
import time, board import time, board
def Sonar(trig1, echo1): def Sonar(trig1, echo1):
trig = board.pin(trig1, board.GPIO.OUT) trig = board.pin(trig1, board.GPIO.OUT)
@@ -9,14 +10,14 @@ def Sonar(trig1, echo1):
time.sleep_us(10) time.sleep_us(10)
trig.value(0) trig.value(0)
n1 = time.ticks_us() n1 = time.ticks_us()
while(echo.value()==0): while echo.value() == 0:
n2 = time.ticks_us() n2 = time.ticks_us()
if time.ticks_diff(n2, n1) > 200000: if time.ticks_diff(n2, n1) > 200000:
# raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
pass pass
t1 = time.ticks_us() t1 = time.ticks_us()
while(echo.value()==1): while echo.value() == 1:
n3 = time.ticks_us() n3 = time.ticks_us()
if time.ticks_diff(n3, t1) > 200000: if time.ticks_diff(n3, t1) > 200000:
# raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")

View File

@@ -1,5 +1,6 @@
import time, board import time, board
def read_id(pin): def read_id(pin):
L1 = board.pin(pin, board.GPIO.IN, board.GPIO.PULL_UP) L1 = board.pin(pin, board.GPIO.IN, board.GPIO.PULL_UP)

View File

@@ -0,0 +1,221 @@
{
"adxl345": {
"__require__": [
"machine",
"time",
"ustruct"
],
"__file__": true,
"__name__": "adxl345.py"
},
"aionenet": {
"__require__": [
"network",
"time",
"random",
"request",
"base64",
"json",
"board",
"machine"
],
"__file__": true,
"__name__": "aionenet.py"
},
"ai_face": {
"__require__": [
"KPU",
"gc",
"image",
"time",
"board"
],
"__file__": true,
"__name__": "ai_face.py"
},
"base64": {
"__require__": [
"re",
"struct",
"binascii",
"warnings",
"warnings",
"sys",
"getopt"
],
"__file__": true,
"__name__": "base64.py"
},
"bmp280": {
"__require__": [
"ustruct",
"utime",
"machine"
],
"__file__": true,
"__name__": "bmp280.py"
},
"ce_com": {
"__require__": [],
"__file__": true,
"__name__": "ce_com.py"
},
"dht11": {
"__require__": [
"time",
"board"
],
"__file__": true,
"__name__": "dht11.py"
},
"hcr04": {
"__require__": [
"time",
"board"
],
"__file__": true,
"__name__": "hcr04.py"
},
"irremote": {
"__require__": [
"time",
"board"
],
"__file__": true,
"__name__": "irremote.py"
},
"matcher": {
"__require__": [],
"__file__": true,
"__name__": "matcher.py"
},
"miot_no": {
"__require__": [
"usocket",
"ustruct",
"network",
"time",
"board",
"ujson",
"machine",
"ussl"
],
"__file__": true,
"__name__": "miot_no.py"
},
"mixiot": {
"__require__": [
"usocket",
"ustruct",
"time",
"machine",
"ubinascii",
"ujson",
"matcher",
"machine",
"ussl"
],
"__file__": true,
"__name__": "mixiot.py"
},
"mixly_tool": {
"__require__": [
"hashlib",
"os",
"sys"
],
"__file__": true,
"__name__": "mixly_tool.py"
},
"mixpy": {
"__require__": [
"math"
],
"__file__": true,
"__name__": "mixpy.py"
},
"mpu9250": {
"__require__": [
"micropython",
"ustruct",
"utime",
"time",
"math",
"math",
"os",
"compass_cfg"
],
"__file__": true,
"__name__": "mpu9250.py"
},
"ms32006": {
"__require__": [
"time",
"micropython"
],
"__file__": true,
"__name__": "ms32006.py"
},
"net_espat": {
"__require__": [
"network",
"time",
"board",
"machine",
"time"
],
"__file__": true,
"__name__": "net_espat.py"
},
"pid": {
"__require__": [
"time",
"math"
],
"__file__": true,
"__name__": "pid.py"
},
"player": {
"__require__": [
"board",
"audio",
"video",
"Maix",
"gc",
"sensor",
"lcd",
"lcd"
],
"__file__": true,
"__name__": "player.py"
},
"reset": {
"__require__": [
"image",
"lcd",
"time",
"gc",
"machine",
"gc"
],
"__file__": true,
"__name__": "reset.py"
},
"servo": {
"__require__": [
"math",
"ustruct",
"time"
],
"__file__": true,
"__name__": "servo.py"
},
"sht20": {
"__require__": [
"struct",
"time"
],
"__file__": true,
"__name__": "sht20.py"
}
}

View File

@@ -1,6 +1,7 @@
import usocket as socket import usocket as socket
import ustruct as struct import ustruct as struct
import network, time, board import network, time, board
# from ubinascii import hexlify # from ubinascii import hexlify
import ujson as json import ujson as json
from machine import UART from machine import UART
@@ -9,10 +10,12 @@ wifi_en=board.pin(19,board.GPIO.OUT)
board.register(18, board.FPIOA.UART2_TX) board.register(18, board.FPIOA.UART2_TX)
board.register(17, board.FPIOA.UART2_RX) board.register(17, board.FPIOA.UART2_RX)
def wifi_enable(en): def wifi_enable(en):
global wifi_en global wifi_en
wifi_en.value(en) wifi_en.value(en)
def wifi_reset(): def wifi_reset():
global uart global uart
wifi_enable(0) wifi_enable(0)
@@ -23,7 +26,9 @@ def wifi_reset():
tmp = uart.read() tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n") uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read()) print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data uart = UART(
UART.UART2, 921600, timeout=1000, read_buf_len=10240
) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n") uart.write("AT\r\n")
tmp = uart.read() tmp = uart.read()
print(tmp) print(tmp)
@@ -36,12 +41,14 @@ def wifi_reset():
return None return None
return nic return nic
def get_data_dict(d): def get_data_dict(d):
result = {"datastreams": []} result = {"datastreams": []}
for x in d: for x in d:
result["datastreams"].append({"id": x, "datapoints": [{"value": d[x]}]}) result["datastreams"].append({"id": x, "datapoints": [{"value": d[x]}]})
return result return result
def pubData(value, state): def pubData(value, state):
value = get_data_dict(value) value = get_data_dict(value)
jdata = json.dumps(value) jdata = json.dumps(value)
@@ -50,12 +57,13 @@ def pubData(value, state):
bdata[0] = 1 # publish data in type of json bdata[0] = 1 # publish data in type of json
bdata[1] = int(jlen / 256) # data lenght bdata[1] = int(jlen / 256) # data lenght
bdata[2] = jlen % 256 # data lenght bdata[2] = jlen % 256 # data lenght
bdata[3:jlen+4] = jdata.encode('ascii') # json data bdata[3 : jlen + 4] = jdata.encode("ascii") # json data
if state: if state:
print(value) print(value)
print(bdata) print(bdata)
return bdata return bdata
def do_connect(account, password): def do_connect(account, password):
nic = wifi_reset() nic = wifi_reset()
if not nic: if not nic:
@@ -64,18 +72,31 @@ def do_connect(account,password):
nic.connect(account, password) nic.connect(account, password)
nic.ifconfig() nic.ifconfig()
def init_MQTT_client(sid, address, cid, api, topic, callback): def init_MQTT_client(sid, address, cid, api, topic, callback):
client = MQTTClient(sid, address, 6002, cid, api) client = MQTTClient(sid, address, 6002, cid, api)
client.set_callback(callback) client.set_callback(callback)
client.connect() client.connect()
client.subscribe(bytes(topic, 'utf-8')) client.subscribe(bytes(topic, "utf-8"))
return client return client
class MQTTException(Exception): class MQTTException(Exception):
pass pass
class MQTTClient: class MQTTClient:
def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0,ssl=False, ssl_params={}): def __init__(
self,
client_id,
server,
port=0,
user=None,
password=None,
keepalive=0,
ssl=False,
ssl_params={},
):
if port == 0: if port == 0:
port = 8883 if ssl else 1883 port = 8883 if ssl else 1883
self.client_id = client_id self.client_id = client_id
@@ -102,7 +123,7 @@ class MQTTClient:
sh = 0 sh = 0
while 1: while 1:
b = self.sock.read(1)[0] b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh n |= (b & 0x7F) << sh
if not b & 0x80: if not b & 0x80:
return n return n
sh += 7 sh += 7
@@ -124,6 +145,7 @@ class MQTTClient:
print(self.addr) print(self.addr)
if self.ssl: if self.ssl:
import ussl import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0") msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0")
msg[1] = 10 + 2 + len(self.client_id) msg[1] = 10 + 2 + len(self.client_id)
@@ -161,7 +183,7 @@ class MQTTClient:
def ping(self): def ping(self):
self.sock.write(b"\xc0\0") self.sock.write(b"\xc0\0")
def publish(self, msg, is_print=True, topic='$dp', retain=False, qos=0): def publish(self, msg, is_print=True, topic="$dp", retain=False, qos=0):
msg = pubData(msg, is_print) msg = pubData(msg, is_print)
pkt = bytearray(b"\x30\0\0\0") pkt = bytearray(b"\x30\0\0\0")
pkt[0] |= qos << 1 | retain pkt[0] |= qos << 1 | retain
@@ -170,8 +192,8 @@ class MQTTClient:
sz += 2 sz += 2
assert sz < 2097152 assert sz < 2097152
i = 1 i = 1
while sz > 0x7f: while sz > 0x7F:
pkt[i] = (sz & 0x7f) | 0x80 pkt[i] = (sz & 0x7F) | 0x80
sz >>= 7 sz >>= 7
i += 1 i += 1
pkt[i] = sz pkt[i] = sz
@@ -232,7 +254,7 @@ class MQTTClient:
assert sz == 0 assert sz == 0
return None return None
op = res[0] op = res[0]
if op & 0xf0 != 0x30: if op & 0xF0 != 0x30:
return op return op
sz = self._recv_len() sz = self._recv_len()
topic_len = self.sock.read(2) topic_len = self.sock.read(2)

View File

@@ -7,8 +7,8 @@ import ujson as json
from matcher import MQTTMatcher from matcher import MQTTMatcher
from machine import Timer from machine import Timer
ADDITIONAL_TOPIC = 'b640a0ce465fa2a4150c36b305c1c11b' ADDITIONAL_TOPIC = "b640a0ce465fa2a4150c36b305c1c11b"
WILL_TOPIC = '9d634e1a156dc0c1611eb4c3cff57276' WILL_TOPIC = "9d634e1a156dc0c1611eb4c3cff57276"
def init_MQTT_client(address, username, password, MQTT_USR_PRJ): def init_MQTT_client(address, username, password, MQTT_USR_PRJ):
@@ -16,24 +16,46 @@ def init_MQTT_client(address, username, password,MQTT_USR_PRJ):
client.set_last_will(topic=MQTT_USR_PRJ + WILL_TOPIC, msg=client.client_id, qos=2) client.set_last_will(topic=MQTT_USR_PRJ + WILL_TOPIC, msg=client.client_id, qos=2)
if client.connect() == 0: if client.connect() == 0:
client.publish(MQTT_USR_PRJ + ADDITIONAL_TOPIC, client.client_id, qos=1) client.publish(MQTT_USR_PRJ + ADDITIONAL_TOPIC, client.client_id, qos=1)
Timer(Timer.TIMER2,Timer.CHANNEL3,mode=Timer.MODE_PERIODIC,period = 10000, callback = lambda x : client.ping()) Timer(
Timer.TIMER2,
Timer.CHANNEL3,
mode=Timer.MODE_PERIODIC,
period=10000,
callback=lambda x: client.ping(),
)
return client return client
len_overrided = len len_overrided = len
# Add by Mixly Team # Add by Mixly Team
def len(object): def len(object):
if isinstance(object, str): if isinstance(object, str):
return len_overrided(object.encode('utf-8')) return len_overrided(object.encode("utf-8"))
else: else:
return len_overrided(object) return len_overrided(object)
##################################################### #####################################################
class MQTTException(Exception): class MQTTException(Exception):
pass pass
class MQTTClient: class MQTTClient:
def __init__(self, client_id, server, port=0, username=None, password=None, keepalive=60, ssl=False, ssl_params={}): def __init__(
self,
client_id,
server,
port=0,
username=None,
password=None,
keepalive=60,
ssl=False,
ssl_params={},
):
if port == 0: if port == 0:
port = 8883 if ssl else 1883 port = 8883 if ssl else 1883
self.client_id = client_id self.client_id = client_id
@@ -63,7 +85,7 @@ class MQTTClient:
sh = 0 sh = 0
while 1: while 1:
b = self.sock.read(1)[0] b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh n |= (b & 0x7F) << sh
if not b & 0x80: if not b & 0x80:
return n return n
sh += 7 sh += 7
@@ -131,6 +153,7 @@ class MQTTClient:
print(self.addr) print(self.addr)
if self.ssl: if self.ssl:
import ussl import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg_header = bytearray([0x10]) msg_header = bytearray([0x10])
msg = bytearray(b"\x04MQTT\x04\x02\0\0") msg = bytearray(b"\x04MQTT\x04\x02\0\0")
@@ -177,7 +200,6 @@ class MQTTClient:
raise MQTTException(resp[3]) raise MQTTException(resp[3])
return resp[2] & 1 return resp[2] & 1
def disconnect(self, MQTT_USR_PRJ): def disconnect(self, MQTT_USR_PRJ):
# MQTT_USR_PRJ = "{}/{}/".format(self.username,self.project) # MQTT_USR_PRJ = "{}/{}/".format(self.username,self.project)
self.publish(MQTT_USR_PRJ + WILL_TOPIC, self.client_id, qos=1) self.publish(MQTT_USR_PRJ + WILL_TOPIC, self.client_id, qos=1)
@@ -219,8 +241,8 @@ class MQTTClient:
sz += 2 sz += 2
assert sz < 2097152 assert sz < 2097152
i = 1 i = 1
while sz > 0x7f: while sz > 0x7F:
pkt[i] = (sz & 0x7f) | 0x80 pkt[i] = (sz & 0x7F) | 0x80
sz >>= 7 sz >>= 7
i += 1 i += 1
pkt[i] = sz pkt[i] = sz
@@ -283,7 +305,7 @@ class MQTTClient:
assert sz == 0 assert sz == 0
return "PINGRESP" return "PINGRESP"
op = res[0] op = res[0]
if op & 0xf0 != 0x30: if op & 0xF0 != 0x30:
return op return op
sz = self._recv_len() sz = self._recv_len()
topic_len = self.sock.read(2) topic_len = self.sock.read(2)

View File

@@ -1,25 +1,27 @@
import hashlib import hashlib
import os import os
def sha_file(f): def sha_file(f):
if f not in set(os.listdir(".")): if f not in set(os.listdir(".")):
return 'None:::sha_file_end' return "None:::sha_file_end"
else: else:
sha = hashlib.sha256() sha = hashlib.sha256()
with open(f, encoding='utf-8') as fd: with open(f, encoding="utf-8") as fd:
file_buffer = fd.read(128).encode("utf-8") file_buffer = fd.read(128).encode("utf-8")
while len(file_buffer) > 0: while len(file_buffer) > 0:
sha.update(file_buffer) sha.update(file_buffer)
file_buffer = fd.read(128).encode("utf-8") file_buffer = fd.read(128).encode("utf-8")
h = sha.digest() h = sha.digest()
return ''.join(['%.2x' % i for i in h]) + ":::sha_file_end" return "".join(["%.2x" % i for i in h]) + ":::sha_file_end"
def reload(mod): def reload(mod):
import sys import sys
mod_name = mod.__name__ mod_name = mod.__name__
try: try:
del sys.modules[mod_name] del sys.modules[mod_name]
__import__(mod_name) __import__(mod_name)
except: except:
pass pass

View File

@@ -1,6 +1,7 @@
# coding=utf-8 # coding=utf-8
import math import math
def math_map(v, al, ah, bl, bh): def math_map(v, al, ah, bl, bh):
if al == ah: if al == ah:
return bl return bl
@@ -12,19 +13,26 @@ def math_map(v, al, ah, bl, bh):
v = al v = al
return bl + (bh - bl) * (v - al) / (ah - al) return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList): def math_mean(myList):
localList = [e for e in myList if type(e) == int or type(e) == float] localList = [e for e in myList if type(e) == int or type(e) == float]
if not localList: return if not localList:
return
return float(sum(localList)) / len(localList) return float(sum(localList)) / len(localList)
def math_median(myList): def math_median(myList):
localList = sorted([e for e in myList if type(e) == int or type(e) == float]) localList = sorted([e for e in myList if type(e) == int or type(e) == float])
if not localList: return if not localList:
return
if len(localList) % 2 == 0: if len(localList) % 2 == 0:
return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0 return (
localList[len(localList) // 2 - 1] + localList[len(localList) // 2]
) / 2.0
else: else:
return localList[(len(localList) - 1) // 2] return localList[(len(localList) - 1) // 2]
def math_modes(some_list): def math_modes(some_list):
modes = [] modes = []
# Using a lists of [item, count] to keep count rather than dict # Using a lists of [item, count] to keep count rather than dict
@@ -45,40 +53,48 @@ def math_modes(some_list):
modes.append(counted_item) modes.append(counted_item)
return modes return modes
def math_standard_deviation(numbers): def math_standard_deviation(numbers):
n = len(numbers) n = len(numbers)
if n == 0: return if n == 0:
return
mean = float(sum(numbers)) / n mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance) return math.sqrt(variance)
def lists_sort(my_list, type, reverse): def lists_sort(my_list, type, reverse):
def try_float(s): def try_float(s):
try: try:
return float(s) return float(s)
except: except:
return 0 return 0
key_funcs = { key_funcs = {
"NUMERIC": try_float, "NUMERIC": try_float,
"TEXT": str, "TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower() "IGNORE_CASE": lambda s: str(s).lower(),
} }
key_func = key_funcs[type] key_func = key_funcs[type]
list_cpy = list(my_list) list_cpy = list(my_list)
return sorted(list_cpy, key=key_func, reverse=reverse) return sorted(list_cpy, key=key_func, reverse=reverse)
def format_content(mydict, cid): def format_content(mydict, cid):
if 'lat' in mydict and 'long' in mydict: if "lat" in mydict and "long" in mydict:
res = '{'+'"lat": "{}", "long": "{}", "clientid": "{}"'.format(mydict.pop('lat'),mydict.pop('long'),cid) res = "{" + '"lat": "{}", "long": "{}", "clientid": "{}"'.format(
mydict.pop("lat"), mydict.pop("long"), cid
)
if len(mydict) > 0: if len(mydict) > 0:
res += ', "message": [' res += ', "message": ['
for d in mydict: for d in mydict:
res += '{{"label": "{}", "value": "{}"}},'.format(d, mydict[d]) res += '{{"label": "{}", "value": "{}"}},'.format(d, mydict[d])
res = res[:-1] + "]" res = res[:-1] + "]"
res += '}' res += "}"
return res return res
else: else:
print('Invalid Input') print("Invalid Input")
def format_str(d): def format_str(d):
return str(d).replace("'", '"') return str(d).replace("'", '"')

View File

@@ -19,21 +19,22 @@ import ustruct
import utime import utime
import time import time
import math import math
# from machine import I2C, Pin # from machine import I2C, Pin
# pylint: enable=import-error # pylint: enable=import-error
__version__ = "0.2.0" __version__ = "0.2.0"
# pylint: disable=import-error # pylint: disable=import-error
# pylint: enable=import-error # pylint: enable=import-error
_GYRO_CONFIG = const(0x1b) _GYRO_CONFIG = const(0x1B)
_ACCEL_CONFIG = const(0x1c) _ACCEL_CONFIG = const(0x1C)
_ACCEL_CONFIG2 = const(0x1d) _ACCEL_CONFIG2 = const(0x1D)
_INT_PIN_CFG = const(0x37) _INT_PIN_CFG = const(0x37)
_ACCEL_XOUT_H = const(0x3b) _ACCEL_XOUT_H = const(0x3B)
_ACCEL_XOUT_L = const(0x3c) _ACCEL_XOUT_L = const(0x3C)
_ACCEL_YOUT_H = const(0x3d) _ACCEL_YOUT_H = const(0x3D)
_ACCEL_YOUT_L = const(0x3e) _ACCEL_YOUT_L = const(0x3E)
_ACCEL_ZOUT_H = const(0x3f) _ACCEL_ZOUT_H = const(0x3F)
_ACCEL_ZOUT_L = const(0x40) _ACCEL_ZOUT_L = const(0x40)
_TEMP_OUT_H = const(0x41) _TEMP_OUT_H = const(0x41)
_TEMP_OUT_L = const(0x42) _TEMP_OUT_L = const(0x42)
@@ -86,7 +87,7 @@ _HYH = const(0x06)
_HZL = const(0x07) _HZL = const(0x07)
_HZH = const(0x08) _HZH = const(0x08)
_ST2 = const(0x09) _ST2 = const(0x09)
_CNTL1 = const(0x0a) _CNTL1 = const(0x0A)
_ASAX = const(0x10) _ASAX = const(0x10)
_ASAY = const(0x11) _ASAY = const(0x11)
_ASAZ = const(0x12) _ASAZ = const(0x12)
@@ -105,12 +106,18 @@ OUTPUT_16_BIT = 0b00010000
_SO_14BIT = 0.6 # 渭T per digit when 14bit mode _SO_14BIT = 0.6 # 渭T per digit when 14bit mode
_SO_16BIT = 0.15 # 渭T per digit when 16bit mode _SO_16BIT = 0.15 # 渭T per digit when 16bit mode
class MPU6500: class MPU6500:
"""Class which provides interface to MPU6500 6-axis motion tracking device.""" """Class which provides interface to MPU6500 6-axis motion tracking device."""
def __init__( def __init__(
self, i2c, address=0x68, self,
accel_fs=ACCEL_FS_SEL_2G, gyro_fs=GYRO_FS_SEL_250DPS, i2c,
accel_sf=SF_M_S2, gyro_sf=SF_RAD_S address=0x68,
accel_fs=ACCEL_FS_SEL_2G,
gyro_fs=GYRO_FS_SEL_250DPS,
accel_sf=SF_M_S2,
gyro_sf=SF_RAD_S,
): ):
self.i2c = i2c self.i2c = i2c
self.address = address self.address = address
@@ -216,12 +223,18 @@ class MPU6500:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class AK8963: class AK8963:
"""Class which provides interface to AK8963 magnetometer.""" """Class which provides interface to AK8963 magnetometer."""
def __init__( def __init__(
self, i2c, address=0x0c, self,
mode=MODE_CONTINOUS_MEASURE_1, output=OUTPUT_16_BIT, i2c,
offset=(0, 0, 0), scale=(1, 1, 1) address=0x0C,
mode=MODE_CONTINOUS_MEASURE_1,
output=OUTPUT_16_BIT,
offset=(0, 0, 0),
scale=(1, 1, 1),
): ):
self.i2c = i2c self.i2c = i2c
self.address = address self.address = address
@@ -242,7 +255,7 @@ class AK8963:
self._adjustement = ( self._adjustement = (
(0.5 * (asax - 128)) / 128 + 1, (0.5 * (asax - 128)) / 128 + 1,
(0.5 * (asay - 128)) / 128 + 1, (0.5 * (asay - 128)) / 128 + 1,
(0.5 * (asaz - 128)) / 128 + 1 (0.5 * (asaz - 128)) / 128 + 1,
) )
# Power on # Power on
@@ -253,7 +266,6 @@ class AK8963:
else: else:
self._so = _SO_14BIT self._so = _SO_14BIT
@property @property
def magnetic(self): def magnetic(self):
""" """
@@ -314,7 +326,6 @@ class AK8963:
maxz = max(maxz, reading[2]) maxz = max(maxz, reading[2])
count -= 1 count -= 1
# Hard iron correction # Hard iron correction
offset_x = (maxx + minx) / 2 offset_x = (maxx + minx) / 2
offset_y = (maxy + miny) / 2 offset_y = (maxy + miny) / 2
@@ -366,6 +377,7 @@ class AK8963:
class MPU9250: class MPU9250:
"""Class which provides interface to MPU9250 9-axis motion tracking device.""" """Class which provides interface to MPU9250 9-axis motion tracking device."""
def __init__(self, i2c, mpu6500=None, ak8963=None): def __init__(self, i2c, mpu6500=None, ak8963=None):
if mpu6500 is None: if mpu6500 is None:
self.mpu6500 = MPU6500(i2c) self.mpu6500 = MPU6500(i2c)
@@ -422,39 +434,41 @@ class MPU9250:
""" """
return round(self.mpu6500.acceleration()[2] / 9.8, 2) return round(self.mpu6500.acceleration()[2] / 9.8, 2)
def mpu9250_is_gesture(self, choice): def mpu9250_is_gesture(self, choice):
if choice == 'face up': if choice == "face up":
if self.mpu6500.acceleration()[2] <= -9: if self.mpu6500.acceleration()[2] <= -9:
return True return True
else: else:
return False return False
if choice == 'face down': if choice == "face down":
if self.mpu6500.acceleration()[2] >= 9: if self.mpu6500.acceleration()[2] >= 9:
return True return True
else: else:
return False return False
if choice == 'shake': if choice == "shake":
if abs(self.mpu6500.acceleration()[0]) >= 9 and abs(self.mpu6500.acceleration()[1]) >= 9 : if (
abs(self.mpu6500.acceleration()[0]) >= 9
and abs(self.mpu6500.acceleration()[1]) >= 9
):
return True return True
else: else:
return False return False
if choice == 'up': if choice == "up":
if self.mpu6500.acceleration()[1] >= 9: if self.mpu6500.acceleration()[1] >= 9:
return True return True
else: else:
return False return False
if choice == 'down': if choice == "down":
if self.mpu6500.acceleration()[1] <= -9: if self.mpu6500.acceleration()[1] <= -9:
return True return True
else: else:
return False return False
if choice == 'right': if choice == "right":
if self.mpu6500.acceleration()[0] <= -9: if self.mpu6500.acceleration()[0] <= -9:
return True return True
else: else:
return False return False
if choice == 'left': if choice == "left":
if self.mpu6500.acceleration()[0] >= 9: if self.mpu6500.acceleration()[0] >= 9:
return True return True
else: else:
@@ -513,7 +527,11 @@ class MPU9250:
z = self.mpu9250_magnetic[2] z = self.mpu9250_magnetic[2]
a = math.atan(z / x) a = math.atan(z / x)
b = math.atan(z / y) b = math.atan(z / y)
xr=x*math.cos(a)+y*math.sin(a)*math.sin(b)-z*math.cos(b)*math.sin(a) xr = (
x * math.cos(a)
+ y * math.sin(a) * math.sin(b)
- z * math.cos(b) * math.sin(a)
)
yr = x * math.cos(b) + z * math.sin(b) yr = x * math.cos(b) + z * math.sin(b)
return 60 * math.atan(yr / xr) return 60 * math.atan(yr / xr)
@@ -527,6 +545,7 @@ class MPU9250:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class Compass: class Compass:
RAD_TO_DEG = 57.295779513082320876798154814105 RAD_TO_DEG = 57.295779513082320876798154814105
@@ -547,20 +566,23 @@ class Compass:
def heading(self): def heading(self):
from math import atan2 from math import atan2
xyz = self.sensor.mpu9250_magnetic xyz = self.sensor.mpu9250_magnetic
return int(((atan2(xyz[1], xyz[0]) * Compass.RAD_TO_DEG) + 180) % 360) return int(((atan2(xyz[1], xyz[0]) * Compass.RAD_TO_DEG) + 180) % 360)
def is_calibrate(self): def is_calibrate(self):
try: try:
import compass_cfg import compass_cfg
return True return True
except Exception as e: except Exception as e:
return False return False
def reset_calibrate(self): def reset_calibrate(self):
import os import os
os.remove("compass_cfg.py") os.remove("compass_cfg.py")
# compass = mpu # compass = mpu
# accelerometer = mpu # accelerometer = mpu

View File

@@ -8,12 +8,15 @@ Micropython library for the MS32006 step diever
dahanzimin From the Mixly Team dahanzimin From the Mixly Team
""" """
import time import time
from micropython import const from micropython import const
MS32006_REG_RESET = const(0x00) # 复位 MS32006_REG_RESET = const(0x00) # 复位
MS32006_FCLK = const(25000000) #芯片输入时钟选择,此参数与运动速度有关。 范围是5-30MHZ MS32006_FCLK = const(
25000000
) # 芯片输入时钟选择,此参数与运动速度有关。 范围是5-30MHZ
ADDRESS_A = 0x10 ADDRESS_A = 0x10
ADDRESS_B = 0x18 ADDRESS_B = 0x18
@@ -25,6 +28,8 @@ MOT_N = 0
MOT_CW = 1 MOT_CW = 1
MOT_CCW = 2 MOT_CCW = 2
MOT_P = 3 MOT_P = 3
class MS32006: class MS32006:
_buffer = bytearray(2) _buffer = bytearray(2)
@@ -35,7 +40,6 @@ class MS32006:
self.reset() self.reset()
self.mode = mode self.mode = mode
def _read_u8(self, address): def _read_u8(self, address):
self._buffer[0] = address & 0xFF self._buffer[0] = address & 0xFF
self._device.writeto(self._address, self._buffer) self._device.writeto(self._address, self._buffer)
@@ -62,18 +66,18 @@ class MS32006:
elif speed_data > 16383: elif speed_data > 16383:
speed_data = 16383 speed_data = 16383
mot_speed_l=speed_data&0x00ff #取低8位 mot_speed_l = speed_data & 0x00FF # 取低8位
mot_speed_h = speed_data // 0x100 # 取高6位 mot_speed_h = speed_data // 0x100 # 取高6位
if self.mode == MOT_FULL: # 设置整步、半步驱动模式 if self.mode == MOT_FULL: # 设置整步、半步驱动模式
mot_speed_h |= 0x80 mot_speed_h |= 0x80
else: else:
mot_speed_h&=0x7f mot_speed_h &= 0x7F
if mot_step > 2047: if mot_step > 2047:
raise AttributeError("Reach the set upper limit, up to 2047 step") raise AttributeError("Reach the set upper limit, up to 2047 step")
mot_step_l=mot_step&0x00ff mot_step_l = mot_step & 0x00FF
mot_step_h = mot_step // 0x100 mot_step_h = mot_step // 0x100
mot_step_h |= 0x80 mot_step_h |= 0x80
@@ -87,10 +91,10 @@ class MS32006:
self._write_u8(0x04 + moto, mot_step_h) self._write_u8(0x04 + moto, mot_step_h)
if moto == MOT_A: if moto == MOT_A:
self._write_u8(0x00, readstate_0H&0xfb) self._write_u8(0x00, readstate_0H & 0xFB)
self._write_u8(0x09, readstate_9H | 0x80) self._write_u8(0x09, readstate_9H | 0x80)
else: else:
self._write_u8(0x00, readstate_0H&0xfd) self._write_u8(0x00, readstate_0H & 0xFD)
self._write_u8(0x09, readstate_9H | 0x40) self._write_u8(0x09, readstate_9H | 0x40)
def close(self, moto): # 停止并关闭输出 def close(self, moto): # 停止并关闭输出
@@ -108,25 +112,25 @@ class MS32006:
def readstep(self, moto): # 读取电机运动步数 def readstep(self, moto): # 读取电机运动步数
if moto == MOT_A: if moto == MOT_A:
rdb =self._read_u8(0x0b) rdb = self._read_u8(0x0B)
rdc =self._read_u8(0x0c) rdc = self._read_u8(0x0C)
else: else:
rdb =self._read_u8(0x0d) rdb = self._read_u8(0x0D)
rdc =self._read_u8(0x0e) rdc = self._read_u8(0x0E)
return (rdb*0x100+rdc)&0xfff return (rdb * 0x100 + rdc) & 0xFFF
def readbusy(self, moto): # 读取电机缓存是否有数据 def readbusy(self, moto): # 读取电机缓存是否有数据
if moto == MOT_A: if moto == MOT_A:
busy =(self._read_u8(0x0b)>>6)&1 busy = (self._read_u8(0x0B) >> 6) & 1
else: else:
busy =(self._read_u8(0x0d)>>6)&1 busy = (self._read_u8(0x0D) >> 6) & 1
return bool(busy) return bool(busy)
def readwork(self, moto): # 读取电机是否在运行 def readwork(self, moto): # 读取电机是否在运行
if moto == MOT_A: if moto == MOT_A:
busy =(self._read_u8(0x0b)>>4)&1 busy = (self._read_u8(0x0B) >> 4) & 1
else: else:
busy =(self._read_u8(0x0d)>>4)&1 busy = (self._read_u8(0x0D) >> 4) & 1
return bool(busy) return bool(busy)
def dc_motor(self, state, speed): # 直流电机驱动 def dc_motor(self, state, speed): # 直流电机驱动
@@ -135,8 +139,5 @@ class MS32006:
self._write_u8(0x0A, speed_st) self._write_u8(0x0A, speed_st)
readstate = self._read_u8(0x09) & 0xA0 readstate = self._read_u8(0x09) & 0xA0
state_st=(state<<2) | 0X03 | readstate state_st = (state << 2) | 0x03 | readstate
self._write_u8(0x09, state_st) self._write_u8(0x09, state_st)

View File

@@ -2,6 +2,7 @@ import network,time,board
from machine import UART from machine import UART
import time import time
def wifi_init(RX_Pin, TX_Pin): def wifi_init(RX_Pin, TX_Pin):
board.register(TX_Pin, board.FPIOA.UART2_TX) board.register(TX_Pin, board.FPIOA.UART2_TX)
board.register(RX_Pin, board.FPIOA.UART2_RX) board.register(RX_Pin, board.FPIOA.UART2_RX)
@@ -40,9 +41,9 @@ def wifi_deal_ap_info(info):
res.append(info_one) res.append(info_one)
return res return res
def scans(nic): def scans(nic):
ap_info = nic.scan() ap_info = nic.scan()
ap_info = wifi_deal_ap_info(ap_info) ap_info = wifi_deal_ap_info(ap_info)
ap_info.sort(key=lambda x: x[2], reverse=True) ap_info.sort(key=lambda x: x[2], reverse=True)
return ap_info return ap_info

View File

@@ -1,16 +1,18 @@
import time import time
from math import pi, isnan from math import pi, isnan
class PID: class PID:
_kp = _ki = _kd = _integrator = _imax = 0 _kp = _ki = _kd = _integrator = _imax = 0
_last_error = _last_derivative = _last_t = 0 _last_error = _last_derivative = _last_t = 0
_RC = 1 / (2 * pi * 20) _RC = 1 / (2 * pi * 20)
def __init__(self, p=0, i=0, d=0, imax=0): def __init__(self, p=0, i=0, d=0, imax=0):
self._kp = float(p) self._kp = float(p)
self._ki = float(i) self._ki = float(i)
self._kd = float(d) self._kd = float(d)
self._imax = abs(imax) self._imax = abs(imax)
self._last_derivative = float('nan') self._last_derivative = float("nan")
def get_pid(self, error, scaler): def get_pid(self, error, scaler):
tnow = time.ticks_ms() tnow = time.ticks_ms()
@@ -28,19 +30,23 @@ class PID:
self._last_derivative = 0 self._last_derivative = 0
else: else:
derivative = (error - self._last_error) / delta_time derivative = (error - self._last_error) / delta_time
derivative = self._last_derivative + \ derivative = self._last_derivative + (
((delta_time / (self._RC + delta_time)) * \ (delta_time / (self._RC + delta_time))
(derivative - self._last_derivative)) * (derivative - self._last_derivative)
)
self._last_error = error self._last_error = error
self._last_derivative = derivative self._last_derivative = derivative
output += self._kd * derivative output += self._kd * derivative
output *= scaler output *= scaler
if abs(self._ki) > 0 and dt > 0: if abs(self._ki) > 0 and dt > 0:
self._integrator += (error * self._ki) * scaler * delta_time self._integrator += (error * self._ki) * scaler * delta_time
if self._integrator < -self._imax: self._integrator = -self._imax if self._integrator < -self._imax:
elif self._integrator > self._imax: self._integrator = self._imax self._integrator = -self._imax
elif self._integrator > self._imax:
self._integrator = self._imax
output += self._integrator output += self._integrator
return output return output
def reset_I(self): def reset_I(self):
self._integrator = 0 self._integrator = 0
self._last_derivative = float('nan') self._last_derivative = float("nan")

View File

@@ -7,6 +7,7 @@ spk_b=None
spk_d = None spk_d = None
spk_w = None spk_w = None
def spk_init(BLK=8, WS=9, DAT=10, sample_rate=16000): def spk_init(BLK=8, WS=9, DAT=10, sample_rate=16000):
global spk_b global spk_b
global spk_d global spk_d
@@ -18,17 +19,30 @@ def spk_init(BLK=8,WS=9,DAT=10,sample_rate=16000):
board.register(BLK, board.FPIOA.I2S0_SCLK) board.register(BLK, board.FPIOA.I2S0_SCLK)
board.register(WS, board.FPIOA.I2S0_WS) board.register(WS, board.FPIOA.I2S0_WS)
wav_dev = I2S(I2S.DEVICE_0) wav_dev = I2S(I2S.DEVICE_0)
wav_dev.channel_config(I2S.CHANNEL_1, I2S.TRANSMITTER,resolution = I2S.RESOLUTION_16_BIT, cycles = I2S.SCLK_CYCLES_32, align_mode = I2S.STANDARD_MODE) wav_dev.channel_config(
I2S.CHANNEL_1,
I2S.TRANSMITTER,
resolution=I2S.RESOLUTION_16_BIT,
cycles=I2S.SCLK_CYCLES_32,
align_mode=I2S.STANDARD_MODE,
)
wav_dev.set_sample_rate(sample_rate) wav_dev.set_sample_rate(sample_rate)
spk_rep = wav_dev spk_rep = wav_dev
return wav_dev return wav_dev
def mic_init(BLK=35, WS=33, DAT=34, sample_rate=16000): def mic_init(BLK=35, WS=33, DAT=34, sample_rate=16000):
board.register(DAT, board.FPIOA.I2S2_IN_D0) board.register(DAT, board.FPIOA.I2S2_IN_D0)
board.register(BLK, board.FPIOA.I2S2_SCLK) board.register(BLK, board.FPIOA.I2S2_SCLK)
board.register(WS, board.FPIOA.I2S2_WS) board.register(WS, board.FPIOA.I2S2_WS)
wav_dev = I2S(I2S.DEVICE_2) wav_dev = I2S(I2S.DEVICE_2)
wav_dev.channel_config(I2S.CHANNEL_0, I2S.RECEIVER, resolution = I2S.RESOLUTION_16_BIT, cycles = I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE) wav_dev.channel_config(
I2S.CHANNEL_0,
I2S.RECEIVER,
resolution=I2S.RESOLUTION_16_BIT,
cycles=I2S.SCLK_CYCLES_32,
align_mode=I2S.STANDARD_MODE,
)
wav_dev.set_sample_rate(sample_rate) wav_dev.set_sample_rate(sample_rate)
return wav_dev return wav_dev
@@ -53,6 +67,7 @@ def audio_play(I2S,path,num=80):
player.__deinit__() player.__deinit__()
gc.collect() gc.collect()
def audio_record(I2S, path, record_time, sample_rate=16000): def audio_record(I2S, path, record_time, sample_rate=16000):
try: try:
recorder = audio.Audio(path=path, is_create=True, samplerate=sample_rate) recorder = audio.Audio(path=path, is_create=True, samplerate=sample_rate)
@@ -81,6 +96,7 @@ def video_play(I2S1,path,num=80):
global spk_d global spk_d
global spk_w global spk_w
import lcd import lcd
lcd.init() lcd.init()
I2S = spk_init(spk_b, spk_w, spk_d) I2S = spk_init(spk_b, spk_w, spk_d)
vide = video.open(path) vide = video.open(path)
@@ -106,9 +122,18 @@ def video_play(I2S1,path,num=80):
def video_record(I2S, path, record_time): def video_record(I2S, path, record_time):
import sensor, lcd import sensor, lcd
lcd.init() lcd.init()
try: try:
v = video.open(path, audio=False, record=True, interval=200000, quality=80,width=240, height=240) v = video.open(
path,
audio=False,
record=True,
interval=200000,
quality=80,
width=240,
height=240,
)
except Exception as e: except Exception as e:
raise NameError("Need video storage location or {}".format(e)) raise NameError("Need video storage location or {}".format(e))
record_time = record_time * 5 record_time = record_time * 5
@@ -124,5 +149,3 @@ def video_record(I2S,path,record_time):
print("Video record finish \n") print("Video record finish \n")
v.__del__() v.__del__()
gc.collect() gc.collect()

View File

@@ -1,5 +1,6 @@
try: try:
import image import image
image.font_free() image.font_free()
except: except:
pass pass
@@ -30,4 +31,5 @@ try:
finally: finally:
import gc import gc
gc.collect() gc.collect()

View File

@@ -2,6 +2,8 @@
import math import math
import ustruct import ustruct
import time import time
class PCA9685: class PCA9685:
def __init__(self, i2c, address=0x40): def __init__(self, i2c, address=0x40):
self.i2c = i2c self.i2c = i2c
@@ -19,20 +21,20 @@ class PCA9685:
def freq(self, freq=None): def freq(self, freq=None):
if freq is None: if freq is None:
return int(25000000.0 / 4096 / (self._read(0xfe) - 0.5)) return int(25000000.0 / 4096 / (self._read(0xFE) - 0.5))
prescale = int(25000000.0 / 4096.0 / freq + 0.5) prescale = int(25000000.0 / 4096.0 / freq + 0.5)
old_mode = self._read(0x00) # Mode 1 old_mode = self._read(0x00) # Mode 1
self._write(0x00, (old_mode & 0x7F) | 0x10) # Mode 1, sleep self._write(0x00, (old_mode & 0x7F) | 0x10) # Mode 1, sleep
self._write(0xfe, prescale) # Prescale self._write(0xFE, prescale) # Prescale
self._write(0x00, old_mode) # Mode 1 self._write(0x00, old_mode) # Mode 1
time.sleep_us(5) time.sleep_us(5)
self._write(0x00, old_mode | 0xa1) # Mode 1, autoincrement on self._write(0x00, old_mode | 0xA1) # Mode 1, autoincrement on
def pwm(self, index, on=None, off=None): def pwm(self, index, on=None, off=None):
if on is None or off is None: if on is None or off is None:
data = self.i2c.readfrom_mem(self.address, 0x06 + 4 * index, 4) data = self.i2c.readfrom_mem(self.address, 0x06 + 4 * index, 4)
return ustruct.unpack('<HH', data) return ustruct.unpack("<HH", data)
data = ustruct.pack('<HH', on, off) data = ustruct.pack("<HH", on, off)
self.i2c.writeto_mem(self.address, 0x06 + 4 * index, data) self.i2c.writeto_mem(self.address, 0x06 + 4 * index, data)
def duty(self, index, value=None, invert=False): def duty(self, index, value=None, invert=False):
@@ -57,9 +59,11 @@ class PCA9685:
else: else:
self.pwm(index, 0, value) self.pwm(index, 0, value)
class Servos: class Servos:
def __init__(self, i2c, address=0x55, freq=50, min_us=600, max_us=2400, def __init__(
degrees=180): self, i2c, address=0x55, freq=50, min_us=600, max_us=2400, degrees=180
):
self.period = 1000000 / freq self.period = 1000000 / freq
self.min_duty = self._us2duty(min_us) self.min_duty = self._us2duty(min_us)
self.max_duty = self._us2duty(max_us) self.max_duty = self._us2duty(max_us)

View File

@@ -5,12 +5,11 @@ from time import sleep_ms
SHT20_I2CADDR = 64 SHT20_I2CADDR = 64
# SHT20 Command # SHT20 Command
TRI_T_MEASURE_NO_HOLD = b'\xf3' TRI_T_MEASURE_NO_HOLD = b"\xf3"
TRI_RH_MEASURE_NO_HOLD = b'\xf5' TRI_RH_MEASURE_NO_HOLD = b"\xf5"
READ_USER_REG = b'\xe7' READ_USER_REG = b"\xe7"
WRITE_USER_REG = b'\xe6' WRITE_USER_REG = b"\xe6"
SOFT_RESET = b'\xfe' SOFT_RESET = b"\xfe"
class SHT20(object): class SHT20(object):
@@ -23,7 +22,7 @@ class SHT20(object):
self._bus.writeto(self._address, TRI_T_MEASURE_NO_HOLD) self._bus.writeto(self._address, TRI_T_MEASURE_NO_HOLD)
sleep_ms(150) sleep_ms(150)
origin_data = self._bus.readfrom(self._address, 2) origin_data = self._bus.readfrom(self._address, 2)
origin_value = unp('>h', origin_data)[0] origin_value = unp(">h", origin_data)[0]
value = -46.85 + 175.72 * (origin_value / 65536) value = -46.85 + 175.72 * (origin_value / 65536)
return value return value
@@ -31,8 +30,9 @@ class SHT20(object):
self._bus.writeto(self._address, TRI_RH_MEASURE_NO_HOLD) self._bus.writeto(self._address, TRI_RH_MEASURE_NO_HOLD)
sleep_ms(150) sleep_ms(150)
origin_data = self._bus.readfrom(self._address, 2) origin_data = self._bus.readfrom(self._address, 2)
origin_value = unp('>H', origin_data)[0] origin_value = unp(">H", origin_data)[0]
value = -6 + 125 * (origin_value / 65536) value = -6 + 125 * (origin_value / 65536)
return value return value
# sht=SHT20(I2C(scl = Pin(22), sda = Pin(21), freq = 100000)) # sht=SHT20(I2C(scl = Pin(22), sda = Pin(21), freq = 100000))

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
class QJ00X_MP3: class QJ00X_MP3:
def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01): def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01):
uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600) uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600)
@@ -9,14 +10,14 @@ class QJ00X_MP3:
self.pause() self.pause()
def _send_cmd(self, length, cmd, data_high=None, data_low=None): def _send_cmd(self, length, cmd, data_high=None, data_low=None):
uart.write(b'\x7E') uart.write(b"\x7E")
uart.write(bytes([length])) uart.write(bytes([length]))
uart.write(bytes([cmd])) uart.write(bytes([cmd]))
if data_high != None: if data_high != None:
uart.write(bytes([data_high])) uart.write(bytes([data_high]))
if data_low != None: if data_low != None:
uart.write(bytes([data_low])) uart.write(bytes([data_low]))
uart.write(b'\xEF') uart.write(b"\xEF")
sleep(200) sleep(200)
# 下一曲 # 下一曲

View File

@@ -1,16 +1,18 @@
from microbit import * from microbit import *
DS1307_I2C_ADDRESS = (104) DS1307_I2C_ADDRESS = 104
DS1307_REG_SECOND = (0) DS1307_REG_SECOND = 0
DS1307_REG_MINUTE = (1) DS1307_REG_MINUTE = 1
DS1307_REG_HOUR = (2) DS1307_REG_HOUR = 2
DS1307_REG_WEEKDAY = (3) DS1307_REG_WEEKDAY = 3
DS1307_REG_DAY = (4) DS1307_REG_DAY = 4
DS1307_REG_MONTH = (5) DS1307_REG_MONTH = 5
DS1307_REG_YEAR = (6) DS1307_REG_YEAR = 6
DS1307_REG_CTRL = (7) DS1307_REG_CTRL = 7
DS1307_REG_RAM = (8) DS1307_REG_RAM = 8
class DS1307():
class DS1307:
# set reg # set reg
def setReg(self, reg, dat): def setReg(self, reg, dat):
i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat])) i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat]))
@@ -125,4 +127,5 @@ class DS1307():
self.Month(month) self.Month(month)
self.Day(day) self.Day(day)
ds = DS1307() ds = DS1307()

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
def angle(pin, angle): def angle(pin, angle):
pin.set_analog_period(round((1 / 50) * 1000)) pin.set_analog_period(round((1 / 50) * 1000))
duty = 26 + (angle * 102) / 180 duty = 26 + (angle * 102) / 180

View File

@@ -1,6 +1,7 @@
from microbit import * from microbit import *
class TCS34725():
class TCS34725:
TCS34725_ADDRESS = 0x29 TCS34725_ADDRESS = 0x29
@@ -10,7 +11,9 @@ class TCS34725():
TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer
TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it
TCS34725_ENABLE_PON = 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it TCS34725_ENABLE_PON = (
0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it
)
TCS34725_ATIME = 0x01 # Integration time TCS34725_ATIME = 0x01 # Integration time
TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted
TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
@@ -20,30 +23,66 @@ class TCS34725():
TCS34725_AILTH = 0x05 TCS34725_AILTH = 0x05
TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
TCS34725_AIHTH = 0x07 TCS34725_AIHTH = 0x07
TCS34725_PERS = 0x0C # Persistence register - basic SW filtering mechanism for interrupts TCS34725_PERS = (
0x0C # Persistence register - basic SW filtering mechanism for interrupts
)
TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt
TCS34725_PERS_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt TCS34725_PERS_1_CYCLE = (
TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values outside threshold range generates an interrupt 0b0001 # 1 clean channel value outside threshold range generates an interrupt
TCS34725_PERS_3_CYCLE = 0b0011 # 3 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_5_CYCLE = 0b0100 # 5 clean channel values outside threshold range generates an interrupt TCS34725_PERS_2_CYCLE = (
TCS34725_PERS_10_CYCLE = 0b0101 # 10 clean channel values outside threshold range generates an interrupt 0b0010 # 2 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_15_CYCLE = 0b0110 # 15 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_20_CYCLE = 0b0111 # 20 clean channel values outside threshold range generates an interrupt TCS34725_PERS_3_CYCLE = (
TCS34725_PERS_25_CYCLE = 0b1000 # 25 clean channel values outside threshold range generates an interrupt 0b0011 # 3 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_30_CYCLE = 0b1001 # 30 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_35_CYCLE = 0b1010 # 35 clean channel values outside threshold range generates an interrupt TCS34725_PERS_5_CYCLE = (
TCS34725_PERS_40_CYCLE = 0b1011 # 40 clean channel values outside threshold range generates an interrupt 0b0100 # 5 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_45_CYCLE = 0b1100 # 45 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_50_CYCLE = 0b1101 # 50 clean channel values outside threshold range generates an interrupt TCS34725_PERS_10_CYCLE = (
TCS34725_PERS_55_CYCLE = 0b1110 # 55 clean channel values outside threshold range generates an interrupt 0b0101 # 10 clean channel values outside threshold range generates an interrupt
TCS34725_PERS_60_CYCLE = 0b1111 # 60 clean channel values outside threshold range generates an interrupt )
TCS34725_PERS_15_CYCLE = (
0b0110 # 15 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_20_CYCLE = (
0b0111 # 20 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_25_CYCLE = (
0b1000 # 25 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_30_CYCLE = (
0b1001 # 30 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_35_CYCLE = (
0b1010 # 35 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_40_CYCLE = (
0b1011 # 40 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_45_CYCLE = (
0b1100 # 45 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_50_CYCLE = (
0b1101 # 50 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_55_CYCLE = (
0b1110 # 55 clean channel values outside threshold range generates an interrupt
)
TCS34725_PERS_60_CYCLE = (
0b1111 # 60 clean channel values outside threshold range generates an interrupt
)
TCS34725_CONFIG = 0x0D TCS34725_CONFIG = 0x0D
TCS34725_CONFIG_WLONG = 0x02 # Choose between short and long (12x wait times via TCS34725_WTIME TCS34725_CONFIG_WLONG = (
0x02 # Choose between short and long (12x wait times via TCS34725_WTIME
)
TCS34725_CONTROL = 0x0F # Set the gain level for the sensor TCS34725_CONTROL = 0x0F # Set the gain level for the sensor
TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
TCS34725_STATUS = 0x13 TCS34725_STATUS = 0x13
TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt
TCS34725_STATUS_AVALID = 0x01 # Indicates that the RGBC channels have completed an integration cycle TCS34725_STATUS_AVALID = (
0x01 # Indicates that the RGBC channels have completed an integration cycle
)
TCS34725_CDATAL = 0x14 # Clear channel data TCS34725_CDATAL = 0x14 # Clear channel data
TCS34725_CDATAH = 0x15 TCS34725_CDATAH = 0x15
TCS34725_RDATAL = 0x16 # Red channel data TCS34725_RDATAL = 0x16 # Red channel data
@@ -69,24 +108,31 @@ class TCS34725():
# pass # pass
def write8(self, reg, val): def write8(self, reg, val):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF])) self.i2c.write(
self.TCS34725_ADDRESS,
bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF]),
)
def read16(self, reg): def read16(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])) self.i2c.write(
self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])
)
list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2) list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2)
bytes = list_bytes[1] << 8 | list_bytes[0] bytes = list_bytes[1] << 8 | list_bytes[0]
# return [ hex(x) for x in bytes ][0] # return [ hex(x) for x in bytes ][0]
return bytes return bytes
def read8(self, reg): def read8(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])) self.i2c.write(
self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])
)
return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0 return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0
def begin(self): def begin(self):
x = self.read8(self.TCS34725_ID) x = self.read8(self.TCS34725_ID)
# print(x) # print(x)
if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12 if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12
print('did not get the expected response from sensor: ', x) print("did not get the expected response from sensor: ", x)
return False return False
self._tcs34725Initialised = True self._tcs34725Initialised = True
self.setIntegrationTime(self._tcs34725IntegrationTime) self.setIntegrationTime(self._tcs34725IntegrationTime)
@@ -96,7 +142,7 @@ class TCS34725():
def setIntegrationTime(self, theTime): def setIntegrationTime(self, theTime):
if theTime not in [0xFF, 0xF6, 0xEB, 0xD5, 0xC0, 0x00]: if theTime not in [0xFF, 0xF6, 0xEB, 0xD5, 0xC0, 0x00]:
print('setting integration time to 0x00, %s is illegal' % theTime) print("setting integration time to 0x00, %s is illegal" % theTime)
theTime = 0x00 theTime = 0x00
self.write8(self.TCS34725_ATIME, theTime) self.write8(self.TCS34725_ATIME, theTime)
# self.i2c.write8(self.TCS34725_ATIME, theTime) # self.i2c.write8(self.TCS34725_ATIME, theTime)
@@ -108,7 +154,7 @@ class TCS34725():
# TCS34725_GAIN_16X = 0x02, /**< 16x gain # TCS34725_GAIN_16X = 0x02, /**< 16x gain
# TCS34725_GAIN_60X = 0x03 /**< 60x gain # TCS34725_GAIN_60X = 0x03 /**< 60x gain
if gain not in [0, 1, 2, 3]: if gain not in [0, 1, 2, 3]:
print('setting gain to 0, %s is illegal' % gain) print("setting gain to 0, %s is illegal" % gain)
gain = 0 gain = 0
self.write8(self.TCS34725_CONTROL, gain) self.write8(self.TCS34725_CONTROL, gain)
self._tcs34725Gain = gain self._tcs34725Gain = gain
@@ -116,7 +162,9 @@ class TCS34725():
def enable(self): def enable(self):
self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON) self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON)
sleep(0.003) sleep(0.003)
self.write8(self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN)) self.write8(
self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN)
)
def getRawRGBData(self, type): def getRawRGBData(self, type):
if not self._tcs34725Initialised: if not self._tcs34725Initialised:
@@ -145,4 +193,5 @@ class TCS34725():
else: else:
return b return b
tcs = TCS34725(i2c) tcs = TCS34725(i2c)

View File

@@ -1,6 +1,7 @@
from microbit import * from microbit import *
class LCD1602():
class LCD1602:
def __init__(self, lcd_i2c_addr): def __init__(self, lcd_i2c_addr):
self.buf = bytearray(1) self.buf = bytearray(1)
self.BK = 0x08 self.BK = 0x08
@@ -16,7 +17,7 @@ class LCD1602():
self.setcmd(0x0C) self.setcmd(0x0C)
self.setcmd(0x06) self.setcmd(0x06)
self.setcmd(0x01) self.setcmd(0x01)
self.version='1.0' self.version = "1.0"
self.lcd_i2c_addr = lcd_i2c_addr self.lcd_i2c_addr = lcd_i2c_addr
def setReg(self, dat): def setReg(self, dat):

View File

@@ -1,21 +1,29 @@
import math import math
def math_map(v, al, ah, bl, bh): def math_map(v, al, ah, bl, bh):
return bl + (bh - bl) * (v - al) / (ah - al) return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList): def math_mean(myList):
localList = [e for e in myList if type(e) == int or type(e) == float] localList = [e for e in myList if type(e) == int or type(e) == float]
if not localList: return if not localList:
return
return float(sum(localList)) / len(localList) return float(sum(localList)) / len(localList)
def math_median(myList): def math_median(myList):
localList = sorted([e for e in myList if type(e) == int or type(e) == float]) localList = sorted([e for e in myList if type(e) == int or type(e) == float])
if not localList: return if not localList:
return
if len(localList) % 2 == 0: if len(localList) % 2 == 0:
return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0 return (
localList[len(localList) // 2 - 1] + localList[len(localList) // 2]
) / 2.0
else: else:
return localList[(len(localList) - 1) // 2] return localList[(len(localList) - 1) // 2]
def math_modes(some_list): def math_modes(some_list):
modes = [] modes = []
# Using a lists of [item, count] to keep count rather than dict # Using a lists of [item, count] to keep count rather than dict
@@ -36,23 +44,27 @@ def math_modes(some_list):
modes.append(counted_item) modes.append(counted_item)
return modes return modes
def math_standard_deviation(numbers): def math_standard_deviation(numbers):
n = len(numbers) n = len(numbers)
if n == 0: return if n == 0:
return
mean = float(sum(numbers)) / n mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance) return math.sqrt(variance)
def lists_sort(my_list, type, reverse): def lists_sort(my_list, type, reverse):
def try_float(s): def try_float(s):
try: try:
return float(s) return float(s)
except: except:
return 0 return 0
key_funcs = { key_funcs = {
"NUMERIC": try_float, "NUMERIC": try_float,
"TEXT": str, "TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower() "IGNORE_CASE": lambda s: str(s).lower(),
} }
key_func = key_funcs[type] key_func = key_funcs[type]
list_cpy = list(my_list) list_cpy = list(my_list)

View File

@@ -1,48 +1,67 @@
from microbit import * from microbit import *
def initPCA9685(): def initPCA9685():
i2c.write(0x40, bytearray([0x00, 0x00])) i2c.write(0x40, bytearray([0x00, 0x00]))
setFreq(50) setFreq(50)
for idx in range(0, 16, 1): for idx in range(0, 16, 1):
setPwm(idx, 0, 0) setPwm(idx, 0, 0)
def MotorRun(Motors, speed): def MotorRun(Motors, speed):
speed = speed * 16 speed = speed * 16
if (speed >= 4096): if speed >= 4096:
speed = 4095 speed = 4095
if (speed <= -4096): if speed <= -4096:
speed = -4095 speed = -4095
if (Motors <= 4 and Motors > 0): if Motors <= 4 and Motors > 0:
pp = (Motors - 1) * 2 pp = (Motors - 1) * 2
pn = (Motors - 1) * 2 + 1 pn = (Motors - 1) * 2 + 1
if (speed >= 0): if speed >= 0:
setPwm(pp, 0, speed) setPwm(pp, 0, speed)
setPwm(pn, 0, 0) setPwm(pn, 0, 0)
else: else:
setPwm(pp, 0, 0) setPwm(pp, 0, 0)
setPwm(pn, 0, -speed) setPwm(pn, 0, -speed)
def Servo(Servos, degree): def Servo(Servos, degree):
v_us = (degree * 1800 / 180 + 600) v_us = degree * 1800 / 180 + 600
value = int(v_us * 4096 / 20000) value = int(v_us * 4096 / 20000)
setPwm(Servos + 7, 0, value) setPwm(Servos + 7, 0, value)
def setFreq(freq): def setFreq(freq):
prescaleval = int(25000000 / (4096 * freq)) - 1 prescaleval = int(25000000 / (4096 * freq)) - 1
i2c.write(0x40, bytearray([0x00])) i2c.write(0x40, bytearray([0x00]))
oldmode = i2c.read(0x40, 1) oldmode = i2c.read(0x40, 1)
newmode = (oldmode[0] & 0x7F) | 0x10 newmode = (oldmode[0] & 0x7F) | 0x10
i2c.write(0x40, bytearray([0x00, newmode])) i2c.write(0x40, bytearray([0x00, newmode]))
i2c.write(0x40, bytearray([0xfe, prescaleval])) i2c.write(0x40, bytearray([0xFE, prescaleval]))
i2c.write(0x40, bytearray([0x00, oldmode[0]])) i2c.write(0x40, bytearray([0x00, oldmode[0]]))
sleep(4) sleep(4)
i2c.write(0x40, bytearray([0x00, oldmode[0] | 0xa1])) i2c.write(0x40, bytearray([0x00, oldmode[0] | 0xA1]))
def setPwm(channel, on, off): def setPwm(channel, on, off):
if (channel >= 0 and channel <= 15): if channel >= 0 and channel <= 15:
buf = bytearray([0X06 + 4 * channel, on & 0xff, (on >> 8) & 0xff, off & 0xff, (off >> 8) & 0xff]) buf = bytearray(
[
0x06 + 4 * channel,
on & 0xFF,
(on >> 8) & 0xFF,
off & 0xFF,
(off >> 8) & 0xFF,
]
)
i2c.write(0x40, buf) i2c.write(0x40, buf)
def setStepper(stpMotors, dir, speed): def setStepper(stpMotors, dir, speed):
spd = speed spd = speed
setFreq(spd) setFreq(spd)
if (stpMotors == 1): if stpMotors == 1:
if (dir): if dir:
setPwm(0, 2047, 4095) setPwm(0, 2047, 4095)
setPwm(1, 1, 2047) setPwm(1, 1, 2047)
setPwm(2, 1023, 3071) setPwm(2, 1023, 3071)
@@ -52,8 +71,8 @@ def setStepper(stpMotors, dir, speed):
setPwm(2, 1, 2047) setPwm(2, 1, 2047)
setPwm(1, 1023, 3071) setPwm(1, 1023, 3071)
setPwm(0, 3071, 1023) setPwm(0, 3071, 1023)
elif (stpMotors == 2): elif stpMotors == 2:
if (dir): if dir:
setPwm(4, 2047, 4095) setPwm(4, 2047, 4095)
setPwm(5, 1, 2047) setPwm(5, 1, 2047)
setPwm(6, 1023, 3071) setPwm(6, 1023, 3071)

View File

@@ -7,6 +7,7 @@ _B = 3950
_T1 = 273.15 + 25 _T1 = 273.15 + 25
_R1 = 100 _R1 = 100
def read(pin, r1, b, rs): def read(pin, r1, b, rs):
r1 = r1 / 1000 r1 = r1 / 1000
rs = rs / 1000 rs = rs / 1000
@@ -22,6 +23,6 @@ def read(pin, r1, b, rs):
# print("rt:" + str(_rt)) # print("rt:" + str(_rt))
_tempValue = (((_T1 * b) / (b + _T1 * math.log(_rt / r1))) - 273.15) _tempValue = ((_T1 * b) / (b + _T1 * math.log(_rt / r1))) - 273.15
return _tempValue return _tempValue

View File

@@ -32,7 +32,7 @@ class OLED12864_I2C():
self.screen[0] = 0x40 self.screen[0] = 0x40
def command(self, c): def command(self, c):
i2c.write(self.ADDR, b'·' + bytearray(c)) i2c.write(self.ADDR, b'\xb7' + bytearray(c))
def set_pos(self, col=0, page=0): def set_pos(self, col=0, page=0):
self.command([0xb0 | page]) # page number self.command([0xb0 | page]) # page number

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
def show(object, led, r, g, b): def show(object, led, r, g, b):
object[led] = (r, g, b) object[led] = (r, g, b)
object.show() object.show()

View File

@@ -1,8 +1,8 @@
from microbit import * from microbit import *
def distance_mm(tpin=pin16, epin=pin15): def distance_mm(tpin=pin16, epin=pin15):
spi.init(baudrate=125000, sclk=pin13, spi.init(baudrate=125000, sclk=pin13, mosi=tpin, miso=epin)
mosi=tpin, miso=epin)
pre = 0 pre = 0
post = 0 post = 0
k = -1 k = -1
@@ -19,14 +19,18 @@ def distance_mm(tpin=pin16, epin=pin15):
pre = bin(value).count("1") pre = bin(value).count("1")
# find first non full high value afterwards # find first non full high value afterwards
try: try:
k, value = next((ind, v) k, value = next(
for ind, v in enumerate(resp[i:length - 2]) if resp[i + ind + 1] == 0) (ind, v)
for ind, v in enumerate(resp[i : length - 2])
if resp[i + ind + 1] == 0
)
post = bin(value).count("1") if k else 0 post = bin(value).count("1") if k else 0
k = k + i k = k + i
except StopIteration: except StopIteration:
i = -1 i = -1
dist= -1 if i < 0 else round((pre + (k - i) * 8. + post) * 8 * 0.172) dist = -1 if i < 0 else round((pre + (k - i) * 8.0 + post) * 8 * 0.172)
return dist return dist
def distance_cm(t_pin=pin16, e_pin=pin15): def distance_cm(t_pin=pin16, e_pin=pin15):
return distance_mm(tpin=t_pin, epin=e_pin) / 10.0 return distance_mm(tpin=t_pin, epin=e_pin) / 10.0

View File

@@ -1,21 +1,29 @@
import math import math
def math_map(v, al, ah, bl, bh): def math_map(v, al, ah, bl, bh):
return bl + (bh - bl) * (v - al) / (ah - al) return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList): def math_mean(myList):
localList = [e for e in myList if type(e) == int or type(e) == float] localList = [e for e in myList if type(e) == int or type(e) == float]
if not localList: return if not localList:
return
return float(sum(localList)) / len(localList) return float(sum(localList)) / len(localList)
def math_median(myList): def math_median(myList):
localList = sorted([e for e in myList if type(e) == int or type(e) == float]) localList = sorted([e for e in myList if type(e) == int or type(e) == float])
if not localList: return if not localList:
return
if len(localList) % 2 == 0: if len(localList) % 2 == 0:
return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0 return (
localList[len(localList) // 2 - 1] + localList[len(localList) // 2]
) / 2.0
else: else:
return localList[(len(localList) - 1) // 2] return localList[(len(localList) - 1) // 2]
def math_modes(some_list): def math_modes(some_list):
modes = [] modes = []
# Using a lists of [item, count] to keep count rather than dict # Using a lists of [item, count] to keep count rather than dict
@@ -36,23 +44,27 @@ def math_modes(some_list):
modes.append(counted_item) modes.append(counted_item)
return modes return modes
def math_standard_deviation(numbers): def math_standard_deviation(numbers):
n = len(numbers) n = len(numbers)
if n == 0: return if n == 0:
return
mean = float(sum(numbers)) / n mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance) return math.sqrt(variance)
def lists_sort(my_list, type, reverse): def lists_sort(my_list, type, reverse):
def try_float(s): def try_float(s):
try: try:
return float(s) return float(s)
except: except:
return 0 return 0
key_funcs = { key_funcs = {
"NUMERIC": try_float, "NUMERIC": try_float,
"TEXT": str, "TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower() "IGNORE_CASE": lambda s: str(s).lower(),
} }
key_func = key_funcs[type] key_func = key_funcs[type]
list_cpy = list(my_list) list_cpy = list(my_list)

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
def motor1(v, d=1): def motor1(v, d=1):
v = min(12, max(0, v)) v = min(12, max(0, v))
if v == 0: if v == 0:
@@ -12,6 +13,7 @@ def motor1(v,d=1):
pin8.write_analog(0) pin8.write_analog(0)
pin16.write_analog(int(v / 12 * 1023)) pin16.write_analog(int(v / 12 * 1023))
def motor2(v, d=1): def motor2(v, d=1):
v = min(12, max(0, v)) v = min(12, max(0, v))
if v == 0: if v == 0:
@@ -24,6 +26,7 @@ def motor2(v,d=1):
pin14.write_analog(0) pin14.write_analog(0)
pin13.write_analog(int(v / 12 * 1023)) pin13.write_analog(int(v / 12 * 1023))
def motor3(v, d=1): def motor3(v, d=1):
v = min(12, max(0, v)) v = min(12, max(0, v))
if v == 0: if v == 0:

View File

@@ -3,11 +3,13 @@ import neopixel
np = neopixel.NeoPixel(pin12, 4) np = neopixel.NeoPixel(pin12, 4)
def mixly_rgb_show_all(r, g, b): def mixly_rgb_show_all(r, g, b):
for led in range(4): for led in range(4):
np[led] = (r, g, b) np[led] = (r, g, b)
np.show() np.show()
def mixly_rgb_show(led, r, g, b): def mixly_rgb_show(led, r, g, b):
np[led] = (r, g, b) np[led] = (r, g, b)
np.show() np.show()