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

View File

@@ -31,6 +31,7 @@ task_fe=None
info = None
bb = 1
def set_key_state(*_):
global start_processing
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.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)
@@ -85,7 +97,7 @@ def train(img,names,threshold):
T = image.get_affine_transform(src_point, dst_point)
a = image.warp_affine_ai(img, img_face, T)
a = img_face.ai_to_pix()
del(face_cut_128)
del face_cut_128
fmap = kpu.forward(task_fe, img_face)
feature = kpu.face_encode(fmap[:])
reg_flag = False
@@ -118,16 +130,19 @@ def train(img,names,threshold):
return False
gc.collect()
def info_name():
gc.collect()
return info[0]
def info_score():
return info[1]
def info_face():
return info[2]
def info_organs():
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(17, board.FPIOA.UART2_RX)
def wifi_enable(en):
global wifi_en
wifi_en.value(en)
def wifi_reset():
global uart
wifi_enable(0)
@@ -19,7 +21,9 @@ def wifi_reset():
tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
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")
tmp = uart.read()
print(tmp)
@@ -32,6 +36,7 @@ def wifi_reset():
return None
return nic
def nic_init(account, password):
nic = wifi_reset()
if not nic:
@@ -41,7 +46,7 @@ def nic_init(account,password):
nic.ifconfig()
class SimpleEncode():
class SimpleEncode:
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|"
keyLength = len(keyStr)
encryptionA = 17
@@ -63,8 +68,8 @@ class SimpleEncode():
def base64Encode(self, sourceStr):
encode = ""
for ch in base64.b64encode(sourceStr.encode()).decode():
if ch == '=':
encode += '='
if ch == "=":
encode += "="
else:
for i in range(64):
if ch == self.STANDARD[i]:
@@ -74,7 +79,9 @@ class SimpleEncode():
def encrpyt(self, 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) + "|"
for i in range(addCharCount):
@@ -88,7 +95,7 @@ class SimpleEncode():
# base64 加密
base64Str = self.base64Encode(sb)
destStr = ''
destStr = ""
for i in range(len(base64Str)):
# 找到字符所在位置
position = self.keyStr.find(base64Str[i])
@@ -102,36 +109,34 @@ class SimpleEncode():
return destStr
def token(account, password):
url = 'http://ai.heclouds.com:9090/v1/user/oneNetLogin'
url = "http://ai.heclouds.com:9090/v1/user/oneNetLogin"
headers = {
'Content-Type': 'application/json',
"Content-Type": "application/json",
}
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)
# print(req.text)
try:
return eval(req.text)['data']['loginToken']
return eval(req.text)["data"]["loginToken"]
except:
raise ValueError("[Cool.AI]:Wrong account or password ")
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)
headers ={
'Content-Type':'application/json',
'Login-Token':'Token'
}
headers = {"Content-Type": "application/json", "Login-Token": "Token"}
headers['Login-Token']=Token
headers["Login-Token"] = Token
imge = img.compressed(quality=50)
file = imge.to_bytes()
str = base64.b64encode(file).decode()
data = {'picture':[str]}
data = {"picture": [str]}
req = request.post(url, data=json.dumps(data), headers=headers)
return json.loads(req.text)
# return eval(req.text)

View File

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

View File

@@ -1,6 +1,7 @@
from ustruct import unpack as unp
import utime
from machine import I2C
# Author David Wahlund david@dafnet.se
# Power Modes
@@ -49,21 +50,20 @@ class BMP280:
self._bmp_i2c = i2c_bus
self._i2c_addr = addr
self.chip_id = self._read(BMP280_REGISTER_ID, 2)
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._T3 = unp('<h', self._read(BMP280_REGISTER_DIG_T3, 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._P3 = unp('<h', self._read(BMP280_REGISTER_DIG_P3, 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._P6 = unp('<h', self._read(BMP280_REGISTER_DIG_P6, 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._P9 = unp('<h', self._read(BMP280_REGISTER_DIG_P9, 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._T3 = unp("<h", self._read(BMP280_REGISTER_DIG_T3, 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._P3 = unp("<h", self._read(BMP280_REGISTER_DIG_P3, 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._P6 = unp("<h", self._read(BMP280_REGISTER_DIG_P6, 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._P9 = unp("<h", self._read(BMP280_REGISTER_DIG_P9, 2))[0]
self._t_os = BMP280_TEMP_OS_2 # temperature 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)
self._write(BMP280_REGISTER_CONTROL, r)
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._t_raw = (d[3] << 12) + (d[4] << 4) + (d[5] >> 4)
@@ -142,14 +144,20 @@ class BMP280:
self._gauge()
if self._t_fine == 0:
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
# @property
def get_BMP_temperature(self):
self._calc_t_fine()
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
# @property
@@ -175,4 +183,3 @@ class BMP280:
p = ((p + var1 + var2) >> 8) + (self._P7 << 4)
self._p = p / 256.0
return self._p

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,25 +1,27 @@
import hashlib
import os
def sha_file(f):
if f not in set(os.listdir(".")):
return 'None:::sha_file_end'
return "None:::sha_file_end"
else:
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")
while len(file_buffer) > 0:
sha.update(file_buffer)
file_buffer = fd.read(128).encode("utf-8")
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):
import sys
mod_name = mod.__name__
try:
del sys.modules[mod_name]
__import__(mod_name)
except:
pass

View File

@@ -1,6 +1,7 @@
# coding=utf-8
import math
def math_map(v, al, ah, bl, bh):
if al == ah:
return bl
@@ -12,19 +13,26 @@ def math_map(v, al, ah, bl, bh):
v = al
return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList):
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)
def math_median(myList):
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:
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:
return localList[(len(localList) - 1) // 2]
def math_modes(some_list):
modes = []
# 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)
return modes
def math_standard_deviation(numbers):
n = len(numbers)
if n == 0: return
if n == 0:
return
mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance)
def lists_sort(my_list, type, reverse):
def try_float(s):
try:
return float(s)
except:
return 0
key_funcs = {
"NUMERIC": try_float,
"TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower()
"IGNORE_CASE": lambda s: str(s).lower(),
}
key_func = key_funcs[type]
list_cpy = list(my_list)
return sorted(list_cpy, key=key_func, reverse=reverse)
def format_content(mydict, cid):
if 'lat' in mydict and 'long' in mydict:
res = '{'+'"lat": "{}", "long": "{}", "clientid": "{}"'.format(mydict.pop('lat'),mydict.pop('long'),cid)
if "lat" in mydict and "long" in mydict:
res = "{" + '"lat": "{}", "long": "{}", "clientid": "{}"'.format(
mydict.pop("lat"), mydict.pop("long"), cid
)
if len(mydict) > 0:
res += ', "message": ['
for d in mydict:
res += '{{"label": "{}", "value": "{}"}},'.format(d, mydict[d])
res = res[:-1] + "]"
res += '}'
res += "}"
return res
else:
print('Invalid Input')
print("Invalid Input")
def format_str(d):
return str(d).replace("'", '"')

View File

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

View File

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

View File

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

View File

@@ -1,16 +1,18 @@
import time
from math import pi, isnan
class PID:
_kp = _ki = _kd = _integrator = _imax = 0
_last_error = _last_derivative = _last_t = 0
_RC = 1 / (2 * pi * 20)
def __init__(self, p=0, i=0, d=0, imax=0):
self._kp = float(p)
self._ki = float(i)
self._kd = float(d)
self._imax = abs(imax)
self._last_derivative = float('nan')
self._last_derivative = float("nan")
def get_pid(self, error, scaler):
tnow = time.ticks_ms()
@@ -28,19 +30,23 @@ class PID:
self._last_derivative = 0
else:
derivative = (error - self._last_error) / delta_time
derivative = self._last_derivative + \
((delta_time / (self._RC + delta_time)) * \
(derivative - self._last_derivative))
derivative = self._last_derivative + (
(delta_time / (self._RC + delta_time))
* (derivative - self._last_derivative)
)
self._last_error = error
self._last_derivative = derivative
output += self._kd * derivative
output *= scaler
if abs(self._ki) > 0 and dt > 0:
self._integrator += (error * self._ki) * scaler * delta_time
if self._integrator < -self._imax: self._integrator = -self._imax
elif self._integrator > self._imax: self._integrator = self._imax
if self._integrator < -self._imax:
self._integrator = -self._imax
elif self._integrator > self._imax:
self._integrator = self._imax
output += self._integrator
return output
def reset_I(self):
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_w = None
def spk_init(BLK=8, WS=9, DAT=10, sample_rate=16000):
global spk_b
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(WS, board.FPIOA.I2S0_WS)
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)
spk_rep = wav_dev
return wav_dev
def mic_init(BLK=35, WS=33, DAT=34, sample_rate=16000):
board.register(DAT, board.FPIOA.I2S2_IN_D0)
board.register(BLK, board.FPIOA.I2S2_SCLK)
board.register(WS, board.FPIOA.I2S2_WS)
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)
return wav_dev
@@ -53,6 +67,7 @@ def audio_play(I2S,path,num=80):
player.__deinit__()
gc.collect()
def audio_record(I2S, path, record_time, sample_rate=16000):
try:
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_w
import lcd
lcd.init()
I2S = spk_init(spk_b, spk_w, spk_d)
vide = video.open(path)
@@ -106,9 +122,18 @@ def video_play(I2S1,path,num=80):
def video_record(I2S, path, record_time):
import sensor, lcd
lcd.init()
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:
raise NameError("Need video storage location or {}".format(e))
record_time = record_time * 5
@@ -124,5 +149,3 @@ def video_record(I2S,path,record_time):
print("Video record finish \n")
v.__del__()
gc.collect()

View File

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

View File

@@ -2,6 +2,8 @@
import math
import ustruct
import time
class PCA9685:
def __init__(self, i2c, address=0x40):
self.i2c = i2c
@@ -19,20 +21,20 @@ class PCA9685:
def freq(self, freq=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)
old_mode = self._read(0x00) # Mode 1
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
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):
if on is None or off is None:
data = self.i2c.readfrom_mem(self.address, 0x06 + 4 * index, 4)
return ustruct.unpack('<HH', data)
data = ustruct.pack('<HH', on, off)
return ustruct.unpack("<HH", data)
data = ustruct.pack("<HH", on, off)
self.i2c.writeto_mem(self.address, 0x06 + 4 * index, data)
def duty(self, index, value=None, invert=False):
@@ -57,9 +59,11 @@ class PCA9685:
else:
self.pwm(index, 0, value)
class Servos:
def __init__(self, i2c, address=0x55, freq=50, min_us=600, max_us=2400,
degrees=180):
def __init__(
self, i2c, address=0x55, freq=50, min_us=600, max_us=2400, degrees=180
):
self.period = 1000000 / freq
self.min_duty = self._us2duty(min_us)
self.max_duty = self._us2duty(max_us)

View File

@@ -5,12 +5,11 @@ from time import sleep_ms
SHT20_I2CADDR = 64
# SHT20 Command
TRI_T_MEASURE_NO_HOLD = b'\xf3'
TRI_RH_MEASURE_NO_HOLD = b'\xf5'
READ_USER_REG = b'\xe7'
WRITE_USER_REG = b'\xe6'
SOFT_RESET = b'\xfe'
TRI_T_MEASURE_NO_HOLD = b"\xf3"
TRI_RH_MEASURE_NO_HOLD = b"\xf5"
READ_USER_REG = b"\xe7"
WRITE_USER_REG = b"\xe6"
SOFT_RESET = b"\xfe"
class SHT20(object):
@@ -23,7 +22,7 @@ class SHT20(object):
self._bus.writeto(self._address, TRI_T_MEASURE_NO_HOLD)
sleep_ms(150)
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)
return value
@@ -31,8 +30,9 @@ class SHT20(object):
self._bus.writeto(self._address, TRI_RH_MEASURE_NO_HOLD)
sleep_ms(150)
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)
return value
# sht=SHT20(I2C(scl = Pin(22), sda = Pin(21), freq = 100000))

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,7 @@
from microbit import *
class TCS34725():
class TCS34725:
TCS34725_ADDRESS = 0x29
@@ -10,7 +11,9 @@ class TCS34725():
TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
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_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_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted
TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
@@ -20,30 +23,66 @@ class TCS34725():
TCS34725_AILTH = 0x05
TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
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_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt
TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values 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_10_CYCLE = 0b0101 # 10 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_PERS_1_CYCLE = (
0b0001 # 1 clean channel value outside threshold range generates an interrupt
)
TCS34725_PERS_2_CYCLE = (
0b0010 # 2 clean channel values 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_10_CYCLE = (
0b0101 # 10 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_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_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
TCS34725_STATUS = 0x13
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_CDATAH = 0x15
TCS34725_RDATAL = 0x16 # Red channel data
@@ -69,24 +108,31 @@ class TCS34725():
# pass
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):
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)
bytes = list_bytes[1] << 8 | list_bytes[0]
# return [ hex(x) for x in bytes ][0]
return bytes
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
def begin(self):
x = self.read8(self.TCS34725_ID)
# print(x)
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
self._tcs34725Initialised = True
self.setIntegrationTime(self._tcs34725IntegrationTime)
@@ -96,7 +142,7 @@ class TCS34725():
def setIntegrationTime(self, theTime):
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
self.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_60X = 0x03 /**< 60x gain
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
self.write8(self.TCS34725_CONTROL, gain)
self._tcs34725Gain = gain
@@ -116,7 +162,9 @@ class TCS34725():
def enable(self):
self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON)
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):
if not self._tcs34725Initialised:
@@ -145,4 +193,5 @@ class TCS34725():
else:
return b
tcs = TCS34725(i2c)

View File

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

View File

@@ -1,21 +1,29 @@
import math
def math_map(v, al, ah, bl, bh):
return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList):
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)
def math_median(myList):
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:
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:
return localList[(len(localList) - 1) // 2]
def math_modes(some_list):
modes = []
# 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)
return modes
def math_standard_deviation(numbers):
n = len(numbers)
if n == 0: return
if n == 0:
return
mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance)
def lists_sort(my_list, type, reverse):
def try_float(s):
try:
return float(s)
except:
return 0
key_funcs = {
"NUMERIC": try_float,
"TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower()
"IGNORE_CASE": lambda s: str(s).lower(),
}
key_func = key_funcs[type]
list_cpy = list(my_list)

View File

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

View File

@@ -7,6 +7,7 @@ _B = 3950
_T1 = 273.15 + 25
_R1 = 100
def read(pin, r1, b, rs):
r1 = r1 / 1000
rs = rs / 1000
@@ -22,6 +23,6 @@ def read(pin, r1, b, rs):
# 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

View File

@@ -32,7 +32,7 @@ class OLED12864_I2C():
self.screen[0] = 0x40
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):
self.command([0xb0 | page]) # page number

View File

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

View File

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

View File

@@ -1,21 +1,29 @@
import math
def math_map(v, al, ah, bl, bh):
return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList):
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)
def math_median(myList):
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:
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:
return localList[(len(localList) - 1) // 2]
def math_modes(some_list):
modes = []
# 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)
return modes
def math_standard_deviation(numbers):
n = len(numbers)
if n == 0: return
if n == 0:
return
mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance)
def lists_sort(my_list, type, reverse):
def try_float(s):
try:
return float(s)
except:
return 0
key_funcs = {
"NUMERIC": try_float,
"TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower()
"IGNORE_CASE": lambda s: str(s).lower(),
}
key_func = key_funcs[type]
list_cpy = list(my_list)

View File

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

View File

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

View File

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

View File

@@ -31,6 +31,7 @@ task_fe=None
info = None
bb = 1
def set_key_state(*_):
global start_processing
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.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)
@@ -85,7 +97,7 @@ def train(img,names,threshold):
T = image.get_affine_transform(src_point, dst_point)
a = image.warp_affine_ai(img, img_face, T)
a = img_face.ai_to_pix()
del(face_cut_128)
del face_cut_128
fmap = kpu.forward(task_fe, img_face)
feature = kpu.face_encode(fmap[:])
reg_flag = False
@@ -118,16 +130,19 @@ def train(img,names,threshold):
return False
gc.collect()
def info_name():
gc.collect()
return info[0]
def info_score():
return info[1]
def info_face():
return info[2]
def info_organs():
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(17, board.FPIOA.UART2_RX)
def wifi_enable(en):
global wifi_en
wifi_en.value(en)
def wifi_reset():
global uart
wifi_enable(0)
@@ -19,7 +21,9 @@ def wifi_reset():
tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
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")
tmp = uart.read()
print(tmp)
@@ -32,6 +36,7 @@ def wifi_reset():
return None
return nic
def nic_init(account, password):
nic = wifi_reset()
if not nic:
@@ -41,7 +46,7 @@ def nic_init(account,password):
nic.ifconfig()
class SimpleEncode():
class SimpleEncode:
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|"
keyLength = len(keyStr)
encryptionA = 17
@@ -63,8 +68,8 @@ class SimpleEncode():
def base64Encode(self, sourceStr):
encode = ""
for ch in base64.b64encode(sourceStr.encode()).decode():
if ch == '=':
encode += '='
if ch == "=":
encode += "="
else:
for i in range(64):
if ch == self.STANDARD[i]:
@@ -74,7 +79,9 @@ class SimpleEncode():
def encrpyt(self, 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) + "|"
for i in range(addCharCount):
@@ -88,7 +95,7 @@ class SimpleEncode():
# base64 加密
base64Str = self.base64Encode(sb)
destStr = ''
destStr = ""
for i in range(len(base64Str)):
# 找到字符所在位置
position = self.keyStr.find(base64Str[i])
@@ -102,36 +109,34 @@ class SimpleEncode():
return destStr
def token(account, password):
url = 'http://ai.heclouds.com:9090/v1/user/oneNetLogin'
url = "http://ai.heclouds.com:9090/v1/user/oneNetLogin"
headers = {
'Content-Type': 'application/json',
"Content-Type": "application/json",
}
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)
# print(req.text)
try:
return eval(req.text)['data']['loginToken']
return eval(req.text)["data"]["loginToken"]
except:
raise ValueError("[Cool.AI]:Wrong account or password ")
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)
headers ={
'Content-Type':'application/json',
'Login-Token':'Token'
}
headers = {"Content-Type": "application/json", "Login-Token": "Token"}
headers['Login-Token']=Token
headers["Login-Token"] = Token
imge = img.compressed(quality=50)
file = imge.to_bytes()
str = base64.b64encode(file).decode()
data = {'picture':[str]}
data = {"picture": [str]}
req = request.post(url, data=json.dumps(data), headers=headers)
return json.loads(req.text)
# return eval(req.text)

View File

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

View File

@@ -1,6 +1,7 @@
from ustruct import unpack as unp
import utime
from machine import I2C
# Author David Wahlund david@dafnet.se
# Power Modes
@@ -49,21 +50,20 @@ class BMP280:
self._bmp_i2c = i2c_bus
self._i2c_addr = addr
self.chip_id = self._read(BMP280_REGISTER_ID, 2)
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._T3 = unp('<h', self._read(BMP280_REGISTER_DIG_T3, 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._P3 = unp('<h', self._read(BMP280_REGISTER_DIG_P3, 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._P6 = unp('<h', self._read(BMP280_REGISTER_DIG_P6, 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._P9 = unp('<h', self._read(BMP280_REGISTER_DIG_P9, 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._T3 = unp("<h", self._read(BMP280_REGISTER_DIG_T3, 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._P3 = unp("<h", self._read(BMP280_REGISTER_DIG_P3, 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._P6 = unp("<h", self._read(BMP280_REGISTER_DIG_P6, 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._P9 = unp("<h", self._read(BMP280_REGISTER_DIG_P9, 2))[0]
self._t_os = BMP280_TEMP_OS_2 # temperature 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)
self._write(BMP280_REGISTER_CONTROL, r)
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._t_raw = (d[3] << 12) + (d[4] << 4) + (d[5] >> 4)
@@ -142,14 +144,20 @@ class BMP280:
self._gauge()
if self._t_fine == 0:
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
# @property
def get_BMP_temperature(self):
self._calc_t_fine()
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
# @property
@@ -175,4 +183,3 @@ class BMP280:
p = ((p + var1 + var2) >> 8) + (self._P7 << 4)
self._p = p / 256.0
return self._p

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,6 @@
import time, board
def read_id(pin):
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 ustruct as struct
import network, time, board
# from ubinascii import hexlify
import ujson as json
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(17, board.FPIOA.UART2_RX)
def wifi_enable(en):
global wifi_en
wifi_en.value(en)
def wifi_reset():
global uart
wifi_enable(0)
@@ -23,7 +26,9 @@ def wifi_reset():
tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
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")
tmp = uart.read()
print(tmp)
@@ -36,12 +41,14 @@ def wifi_reset():
return None
return nic
def get_data_dict(d):
result = {"datastreams": []}
for x in d:
result["datastreams"].append({"id": x, "datapoints": [{"value": d[x]}]})
return result
def pubData(value, state):
value = get_data_dict(value)
jdata = json.dumps(value)
@@ -50,12 +57,13 @@ def pubData(value, state):
bdata[0] = 1 # publish data in type of json
bdata[1] = int(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:
print(value)
print(bdata)
return bdata
def do_connect(account, password):
nic = wifi_reset()
if not nic:
@@ -64,18 +72,31 @@ def do_connect(account,password):
nic.connect(account, password)
nic.ifconfig()
def init_MQTT_client(sid, address, cid, api, topic, callback):
client = MQTTClient(sid, address, 6002, cid, api)
client.set_callback(callback)
client.connect()
client.subscribe(bytes(topic, 'utf-8'))
client.subscribe(bytes(topic, "utf-8"))
return client
class MQTTException(Exception):
pass
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:
port = 8883 if ssl else 1883
self.client_id = client_id
@@ -102,7 +123,7 @@ class MQTTClient:
sh = 0
while 1:
b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh
n |= (b & 0x7F) << sh
if not b & 0x80:
return n
sh += 7
@@ -124,6 +145,7 @@ class MQTTClient:
print(self.addr)
if self.ssl:
import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0")
msg[1] = 10 + 2 + len(self.client_id)
@@ -161,7 +183,7 @@ class MQTTClient:
def ping(self):
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)
pkt = bytearray(b"\x30\0\0\0")
pkt[0] |= qos << 1 | retain
@@ -170,8 +192,8 @@ class MQTTClient:
sz += 2
assert sz < 2097152
i = 1
while sz > 0x7f:
pkt[i] = (sz & 0x7f) | 0x80
while sz > 0x7F:
pkt[i] = (sz & 0x7F) | 0x80
sz >>= 7
i += 1
pkt[i] = sz
@@ -232,7 +254,7 @@ class MQTTClient:
assert sz == 0
return None
op = res[0]
if op & 0xf0 != 0x30:
if op & 0xF0 != 0x30:
return op
sz = self._recv_len()
topic_len = self.sock.read(2)

View File

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

View File

@@ -1,25 +1,27 @@
import hashlib
import os
def sha_file(f):
if f not in set(os.listdir(".")):
return 'None:::sha_file_end'
return "None:::sha_file_end"
else:
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")
while len(file_buffer) > 0:
sha.update(file_buffer)
file_buffer = fd.read(128).encode("utf-8")
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):
import sys
mod_name = mod.__name__
try:
del sys.modules[mod_name]
__import__(mod_name)
except:
pass

View File

@@ -1,6 +1,7 @@
# coding=utf-8
import math
def math_map(v, al, ah, bl, bh):
if al == ah:
return bl
@@ -12,19 +13,26 @@ def math_map(v, al, ah, bl, bh):
v = al
return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList):
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)
def math_median(myList):
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:
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:
return localList[(len(localList) - 1) // 2]
def math_modes(some_list):
modes = []
# 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)
return modes
def math_standard_deviation(numbers):
n = len(numbers)
if n == 0: return
if n == 0:
return
mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance)
def lists_sort(my_list, type, reverse):
def try_float(s):
try:
return float(s)
except:
return 0
key_funcs = {
"NUMERIC": try_float,
"TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower()
"IGNORE_CASE": lambda s: str(s).lower(),
}
key_func = key_funcs[type]
list_cpy = list(my_list)
return sorted(list_cpy, key=key_func, reverse=reverse)
def format_content(mydict, cid):
if 'lat' in mydict and 'long' in mydict:
res = '{'+'"lat": "{}", "long": "{}", "clientid": "{}"'.format(mydict.pop('lat'),mydict.pop('long'),cid)
if "lat" in mydict and "long" in mydict:
res = "{" + '"lat": "{}", "long": "{}", "clientid": "{}"'.format(
mydict.pop("lat"), mydict.pop("long"), cid
)
if len(mydict) > 0:
res += ', "message": ['
for d in mydict:
res += '{{"label": "{}", "value": "{}"}},'.format(d, mydict[d])
res = res[:-1] + "]"
res += '}'
res += "}"
return res
else:
print('Invalid Input')
print("Invalid Input")
def format_str(d):
return str(d).replace("'", '"')

View File

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

View File

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

View File

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

View File

@@ -1,16 +1,18 @@
import time
from math import pi, isnan
class PID:
_kp = _ki = _kd = _integrator = _imax = 0
_last_error = _last_derivative = _last_t = 0
_RC = 1 / (2 * pi * 20)
def __init__(self, p=0, i=0, d=0, imax=0):
self._kp = float(p)
self._ki = float(i)
self._kd = float(d)
self._imax = abs(imax)
self._last_derivative = float('nan')
self._last_derivative = float("nan")
def get_pid(self, error, scaler):
tnow = time.ticks_ms()
@@ -28,19 +30,23 @@ class PID:
self._last_derivative = 0
else:
derivative = (error - self._last_error) / delta_time
derivative = self._last_derivative + \
((delta_time / (self._RC + delta_time)) * \
(derivative - self._last_derivative))
derivative = self._last_derivative + (
(delta_time / (self._RC + delta_time))
* (derivative - self._last_derivative)
)
self._last_error = error
self._last_derivative = derivative
output += self._kd * derivative
output *= scaler
if abs(self._ki) > 0 and dt > 0:
self._integrator += (error * self._ki) * scaler * delta_time
if self._integrator < -self._imax: self._integrator = -self._imax
elif self._integrator > self._imax: self._integrator = self._imax
if self._integrator < -self._imax:
self._integrator = -self._imax
elif self._integrator > self._imax:
self._integrator = self._imax
output += self._integrator
return output
def reset_I(self):
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_w = None
def spk_init(BLK=8, WS=9, DAT=10, sample_rate=16000):
global spk_b
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(WS, board.FPIOA.I2S0_WS)
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)
spk_rep = wav_dev
return wav_dev
def mic_init(BLK=35, WS=33, DAT=34, sample_rate=16000):
board.register(DAT, board.FPIOA.I2S2_IN_D0)
board.register(BLK, board.FPIOA.I2S2_SCLK)
board.register(WS, board.FPIOA.I2S2_WS)
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)
return wav_dev
@@ -53,6 +67,7 @@ def audio_play(I2S,path,num=80):
player.__deinit__()
gc.collect()
def audio_record(I2S, path, record_time, sample_rate=16000):
try:
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_w
import lcd
lcd.init()
I2S = spk_init(spk_b, spk_w, spk_d)
vide = video.open(path)
@@ -106,9 +122,18 @@ def video_play(I2S1,path,num=80):
def video_record(I2S, path, record_time):
import sensor, lcd
lcd.init()
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:
raise NameError("Need video storage location or {}".format(e))
record_time = record_time * 5
@@ -124,5 +149,3 @@ def video_record(I2S,path,record_time):
print("Video record finish \n")
v.__del__()
gc.collect()

View File

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

View File

@@ -2,6 +2,8 @@
import math
import ustruct
import time
class PCA9685:
def __init__(self, i2c, address=0x40):
self.i2c = i2c
@@ -19,20 +21,20 @@ class PCA9685:
def freq(self, freq=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)
old_mode = self._read(0x00) # Mode 1
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
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):
if on is None or off is None:
data = self.i2c.readfrom_mem(self.address, 0x06 + 4 * index, 4)
return ustruct.unpack('<HH', data)
data = ustruct.pack('<HH', on, off)
return ustruct.unpack("<HH", data)
data = ustruct.pack("<HH", on, off)
self.i2c.writeto_mem(self.address, 0x06 + 4 * index, data)
def duty(self, index, value=None, invert=False):
@@ -57,9 +59,11 @@ class PCA9685:
else:
self.pwm(index, 0, value)
class Servos:
def __init__(self, i2c, address=0x55, freq=50, min_us=600, max_us=2400,
degrees=180):
def __init__(
self, i2c, address=0x55, freq=50, min_us=600, max_us=2400, degrees=180
):
self.period = 1000000 / freq
self.min_duty = self._us2duty(min_us)
self.max_duty = self._us2duty(max_us)

View File

@@ -5,12 +5,11 @@ from time import sleep_ms
SHT20_I2CADDR = 64
# SHT20 Command
TRI_T_MEASURE_NO_HOLD = b'\xf3'
TRI_RH_MEASURE_NO_HOLD = b'\xf5'
READ_USER_REG = b'\xe7'
WRITE_USER_REG = b'\xe6'
SOFT_RESET = b'\xfe'
TRI_T_MEASURE_NO_HOLD = b"\xf3"
TRI_RH_MEASURE_NO_HOLD = b"\xf5"
READ_USER_REG = b"\xe7"
WRITE_USER_REG = b"\xe6"
SOFT_RESET = b"\xfe"
class SHT20(object):
@@ -23,7 +22,7 @@ class SHT20(object):
self._bus.writeto(self._address, TRI_T_MEASURE_NO_HOLD)
sleep_ms(150)
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)
return value
@@ -31,8 +30,9 @@ class SHT20(object):
self._bus.writeto(self._address, TRI_RH_MEASURE_NO_HOLD)
sleep_ms(150)
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)
return value
# sht=SHT20(I2C(scl = Pin(22), sda = Pin(21), freq = 100000))

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,7 @@
from microbit import *
class TCS34725():
class TCS34725:
TCS34725_ADDRESS = 0x29
@@ -10,7 +11,9 @@ class TCS34725():
TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
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_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_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted
TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
@@ -20,30 +23,66 @@ class TCS34725():
TCS34725_AILTH = 0x05
TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
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_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt
TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values 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_10_CYCLE = 0b0101 # 10 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_PERS_1_CYCLE = (
0b0001 # 1 clean channel value outside threshold range generates an interrupt
)
TCS34725_PERS_2_CYCLE = (
0b0010 # 2 clean channel values 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_10_CYCLE = (
0b0101 # 10 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_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_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
TCS34725_STATUS = 0x13
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_CDATAH = 0x15
TCS34725_RDATAL = 0x16 # Red channel data
@@ -69,24 +108,31 @@ class TCS34725():
# pass
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):
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)
bytes = list_bytes[1] << 8 | list_bytes[0]
# return [ hex(x) for x in bytes ][0]
return bytes
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
def begin(self):
x = self.read8(self.TCS34725_ID)
# print(x)
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
self._tcs34725Initialised = True
self.setIntegrationTime(self._tcs34725IntegrationTime)
@@ -96,7 +142,7 @@ class TCS34725():
def setIntegrationTime(self, theTime):
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
self.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_60X = 0x03 /**< 60x gain
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
self.write8(self.TCS34725_CONTROL, gain)
self._tcs34725Gain = gain
@@ -116,7 +162,9 @@ class TCS34725():
def enable(self):
self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON)
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):
if not self._tcs34725Initialised:
@@ -145,4 +193,5 @@ class TCS34725():
else:
return b
tcs = TCS34725(i2c)

View File

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

View File

@@ -1,21 +1,29 @@
import math
def math_map(v, al, ah, bl, bh):
return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList):
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)
def math_median(myList):
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:
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:
return localList[(len(localList) - 1) // 2]
def math_modes(some_list):
modes = []
# 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)
return modes
def math_standard_deviation(numbers):
n = len(numbers)
if n == 0: return
if n == 0:
return
mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance)
def lists_sort(my_list, type, reverse):
def try_float(s):
try:
return float(s)
except:
return 0
key_funcs = {
"NUMERIC": try_float,
"TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower()
"IGNORE_CASE": lambda s: str(s).lower(),
}
key_func = key_funcs[type]
list_cpy = list(my_list)

View File

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

View File

@@ -7,6 +7,7 @@ _B = 3950
_T1 = 273.15 + 25
_R1 = 100
def read(pin, r1, b, rs):
r1 = r1 / 1000
rs = rs / 1000
@@ -22,6 +23,6 @@ def read(pin, r1, b, rs):
# 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

View File

@@ -32,7 +32,7 @@ class OLED12864_I2C():
self.screen[0] = 0x40
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):
self.command([0xb0 | page]) # page number

View File

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

View File

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

View File

@@ -1,21 +1,29 @@
import math
def math_map(v, al, ah, bl, bh):
return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList):
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)
def math_median(myList):
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:
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:
return localList[(len(localList) - 1) // 2]
def math_modes(some_list):
modes = []
# 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)
return modes
def math_standard_deviation(numbers):
n = len(numbers)
if n == 0: return
if n == 0:
return
mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance)
def lists_sort(my_list, type, reverse):
def try_float(s):
try:
return float(s)
except:
return 0
key_funcs = {
"NUMERIC": try_float,
"TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower()
"IGNORE_CASE": lambda s: str(s).lower(),
}
key_func = key_funcs[type]
list_cpy = list(my_list)

View File

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

View File

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