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,12 +3,13 @@ import time
import ustruct import ustruct
DATA_FORMAT = 0x31 DATA_FORMAT = 0x31
BW_RATE = 0x2c BW_RATE = 0x2C
POWER_CTL = 0x2d POWER_CTL = 0x2D
INT_ENABLE = 0x2E INT_ENABLE = 0x2E
OFSX = 0x1e OFSX = 0x1E
OFSY =0x1f OFSY = 0x1F
OFSZ =0x20 OFSZ = 0x20
class ADXL345: class ADXL345:
def __init__(self, i2c): def __init__(self, i2c):
@@ -18,51 +19,51 @@ class ADXL345:
for s in slv: for s in slv:
buf = self.i2c.readfrom_mem(s, 0, 1) buf = self.i2c.readfrom_mem(s, 0, 1)
print(buf) print(buf)
if(buf[0] == 0xe5): if buf[0] == 0xE5:
self.slvAddr = s self.slvAddr = s
print('adxl345 found') print("adxl345 found")
break break
#self.writeByte(POWER_CTL,0x00) #sleep # self.writeByte(POWER_CTL,0x00) #sleep
#time.sleep(0.001) # time.sleep(0.001)
#低电平中断输出,13位全分辨率,输出数据右对齐,16g量程 # 低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
self.writeByte(DATA_FORMAT,0x2B) self.writeByte(DATA_FORMAT, 0x2B)
#数据输出速度为100Hz # 数据输出速度为100Hz
self.writeByte(BW_RATE,0x0A) self.writeByte(BW_RATE, 0x0A)
#不使用中断 # 不使用中断
self.writeByte(INT_ENABLE,0x00) self.writeByte(INT_ENABLE, 0x00)
self.writeByte(OFSX,0x00) self.writeByte(OFSX, 0x00)
self.writeByte(OFSY,0x00) self.writeByte(OFSY, 0x00)
self.writeByte(OFSZ,0x00) self.writeByte(OFSZ, 0x00)
#链接使能,测量模式 # 链接使能,测量模式
self.writeByte(POWER_CTL,0x28) self.writeByte(POWER_CTL, 0x28)
time.sleep(1) time.sleep(1)
def readXYZ(self): def readXYZ(self):
fmt = '<h' #little-endian fmt = "<h" # little-endian
buf1 = self.readByte(0x32) buf1 = self.readByte(0x32)
buf2 = self.readByte(0x33) buf2 = self.readByte(0x33)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
x, = ustruct.unpack(fmt, buf) (x,) = ustruct.unpack(fmt, buf)
x = x*3.9 x = x * 3.9
#print('x:',x) # print('x:',x)
buf1 = self.readByte(0x34) buf1 = self.readByte(0x34)
buf2 = self.readByte(0x35) buf2 = self.readByte(0x35)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
y, = ustruct.unpack(fmt, buf) (y,) = ustruct.unpack(fmt, buf)
y = y*3.9 y = y * 3.9
#print('y:',y) # print('y:',y)
buf1 = self.readByte(0x36) buf1 = self.readByte(0x36)
buf2 = self.readByte(0x37) buf2 = self.readByte(0x37)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
z, = ustruct.unpack(fmt, buf) (z,) = ustruct.unpack(fmt, buf)
z = z*3.9 z = z * 3.9
#print('z:',z) # print('z:',z)
#print('************************') # print('************************')
#time.sleep(0.5) # time.sleep(0.5)
return (x,y,z) return (x, y, z)
def readX(self): def readX(self):
return self.readXYZ()[0] return self.readXYZ()[0]
@@ -76,17 +77,19 @@ class ADXL345:
def writeByte(self, addr, data): def writeByte(self, addr, data):
d = bytearray([data]) d = bytearray([data])
self.i2c.writeto_mem(self.slvAddr, addr, d) self.i2c.writeto_mem(self.slvAddr, addr, d)
def readByte(self, addr): def readByte(self, addr):
return self.i2c.readfrom_mem(self.slvAddr, addr, 1) return self.i2c.readfrom_mem(self.slvAddr, addr, 1)
if __name__ == '__main__':
#初始化
sensor = ADXL345(i2c)
#getXYZ if __name__ == "__main__":
x,y,z = sensor.readXYZ() # 初始化
sensor = ADXL345(i2c)
#getX/Y/Z # getXYZ
x0 = sensor.readX() x, y, z = sensor.readXYZ()
y0 = sensor.readY()
z0 = sensor.readZ() # getX/Y/Z
x0 = sensor.readX()
y0 = sensor.readY()
z0 = sensor.readZ()

View File

@@ -1,16 +1,16 @@
import KPU as kpu import KPU as kpu
import gc,image,time import gc, image, time
import board import board
try: try:
kpu.deinit(task_fe) kpu.deinit(task_fe)
kpu.deinit(task_ld) kpu.deinit(task_ld)
kpu.deinit(task_fd) kpu.deinit(task_fd)
del task_fe del task_fe
del task_ld del task_ld
del task_fd del task_fd
except Exception: except Exception:
pass pass
@@ -20,114 +20,129 @@ record_ftr = []
record_ftrs = [] record_ftrs = []
img_face = image.Image(size=(128, 128)) img_face = image.Image(size=(128, 128))
a = img_face.pix_to_ai() a = img_face.pix_to_ai()
dst_point = [(44, 59), (84, 59), (64, 82), (47, 105),(81, 105)] dst_point = [(44, 59), (84, 59), (64, 82), (47, 105), (81, 105)]
start_processing = False start_processing = False
tim2 = time.ticks_ms() tim2 = time.ticks_ms()
task_fd=None task_fd = None
task_ld=None task_ld = None
task_fe=None task_fe = None
info=None info = None
bb=1 bb = 1
def set_key_state(*_): def set_key_state(*_):
global start_processing global start_processing
global tim2 global tim2
if (time.ticks_ms() - tim2 )> 4000: if (time.ticks_ms() - tim2) > 4000:
start_processing = True start_processing = True
tim2 = time.ticks_ms() tim2 = time.ticks_ms()
def init(FD,LD,FE): def init(FD, LD, FE):
global task_fd global task_fd
global task_ld global task_ld
global task_fe global task_fe
# task_fd = kpu.load(0x200000) # task_fd = kpu.load(0x200000)
# task_ld = kpu.load(0x300000) # task_ld = kpu.load(0x300000)
# task_fe = kpu.load(0x400000) # task_fe = kpu.load(0x400000)
task_fd = kpu.load(FD) task_fd = kpu.load(FD)
task_ld = kpu.load(LD) task_ld = kpu.load(LD)
task_fe = kpu.load(FE) task_fe = kpu.load(FE)
gc.collect()
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
kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor)
def train(img, names, threshold):
global task_fd
global task_ld
global task_fe
global start_processing
global info
global bb
code = kpu.run_yolo2(task_fd, img)
if code:
for i in code:
face_cut = img.cut(i.x(), i.y(), i.w(), i.h())
face_cut_128 = face_cut.resize(128, 128)
a = face_cut_128.pix_to_ai()
fmap = kpu.forward(task_ld, face_cut_128)
plist = fmap[:]
le = (i.x() + int(plist[0] * i.w() - 10), i.y() + int(plist[1] * i.h()))
re = (i.x() + int(plist[2] * i.w()), i.y() + int(plist[3] * i.h()))
nose = (i.x() + int(plist[4] * i.w()), i.y() + int(plist[5] * i.h()))
lm = (i.x() + int(plist[6] * i.w()), i.y() + int(plist[7] * i.h()))
rm = (i.x() + int(plist[8] * i.w()), i.y() + int(plist[9] * i.h()))
lb = i.rect()
src_point = [le, re, nose, lm, rm]
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
fmap = kpu.forward(task_fe, img_face)
feature = kpu.face_encode(fmap[:])
reg_flag = False
scores = []
for j in range(len(record_ftrs)):
score = kpu.face_compare(record_ftrs[j], feature)
scores.append(score)
max_score = 0
index = 0
for k in range(len(scores)):
if max_score < scores[k]:
max_score = scores[k]
index = k
if start_processing:
record_ftr = feature
record_ftrs.append(record_ftr)
start_processing = False
if max_score > threshold:
info = [names[index], max_score, lb, src_point]
else:
if bb == 1:
print("Please press BOOT key to enter the face")
bb = 0
info = [None, max_score, lb, src_point]
return True
break
else:
info = None
bb = 1
return False
gc.collect()
gc.collect()
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
kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor)
def train(img,names,threshold):
global task_fd
global task_ld
global task_fe
global start_processing
global info
global bb
code = kpu.run_yolo2(task_fd, img)
if code:
for i in code:
face_cut = img.cut(i.x(), i.y(), i.w(), i.h())
face_cut_128 = face_cut.resize(128, 128)
a = face_cut_128.pix_to_ai()
fmap = kpu.forward(task_ld, face_cut_128)
plist = fmap[:]
le = (i.x()+int(plist[0]*i.w() - 10), i.y()+int(plist[1]*i.h()))
re = (i.x()+int(plist[2]*i.w()), i.y()+int(plist[3]*i.h()))
nose = (i.x()+int(plist[4]*i.w()), i.y()+int(plist[5]*i.h()))
lm = (i.x()+int(plist[6]*i.w()), i.y()+int(plist[7]*i.h()))
rm = (i.x()+int(plist[8]*i.w()), i.y()+int(plist[9]*i.h()))
lb=i.rect()
src_point = [le, re, nose, lm, rm]
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)
fmap = kpu.forward(task_fe, img_face)
feature = kpu.face_encode(fmap[:])
reg_flag = False
scores = []
for j in range(len(record_ftrs)):
score = kpu.face_compare(record_ftrs[j], feature)
scores.append(score)
max_score = 0
index = 0
for k in range(len(scores)):
if max_score < scores[k]:
max_score = scores[k]
index = k
if start_processing:
record_ftr = feature
record_ftrs.append(record_ftr)
start_processing = False
if max_score > threshold:
info=[names[index],max_score,lb,src_point]
else:
if bb==1:
print("Please press BOOT key to enter the face")
bb=0
info=[None,max_score,lb,src_point]
return True
break
else:
info=None
bb=1
return False
gc.collect()
def info_name(): def info_name():
gc.collect() gc.collect()
return info[0] return info[0]
def info_score():
return info[1]
def info_face(): def info_score():
return info[2] return info[1]
def info_organs():
return info[3] def info_face():
return info[2]
def info_organs():
return info[3]

View File

@@ -1,25 +1,29 @@
import network,time,random,request,base64,json,board import network, time, random, request, base64, json, board
from machine import UART from machine import UART
wifi_en=board.pin(19,board.GPIO.OUT) wifi_en = board.pin(19, board.GPIO.OUT)
board.register(18,board.FPIOA.UART2_TX) board.register(18, board.FPIOA.UART2_TX)
board.register(17,board.FPIOA.UART2_RX) board.register(17, board.FPIOA.UART2_RX)
def wifi_enable(en): def wifi_enable(en):
global wifi_en global wifi_en
wifi_en.value(en) wifi_en.value(en)
def wifi_reset(): def wifi_reset():
global uart global uart
wifi_enable(0) wifi_enable(0)
time.sleep_ms(200) time.sleep_ms(200)
wifi_enable(1) wifi_enable(1)
time.sleep(2) time.sleep(2)
uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=4096) uart = UART(UART.UART2, 115200, timeout=1000, read_buf_len=4096)
tmp = uart.read() tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n") uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read()) print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data uart = UART(
UART.UART2, 921600, timeout=1000, read_buf_len=10240
) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n") uart.write("AT\r\n")
tmp = uart.read() tmp = uart.read()
print(tmp) print(tmp)
@@ -32,16 +36,17 @@ def wifi_reset():
return None return None
return nic return nic
def nic_init(account,password):
nic=wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account,password) def nic_init(account, password):
nic.ifconfig() nic = wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account, password)
nic.ifconfig()
class SimpleEncode(): class SimpleEncode:
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|" keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|"
keyLength = len(keyStr) keyLength = len(keyStr)
encryptionA = 17 encryptionA = 17
@@ -51,87 +56,87 @@ class SimpleEncode():
postCount = 5 postCount = 5
randomChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop" randomChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop"
randomCharLength = len(randomChar) randomCharLength = len(randomChar)
#base64字符 # base64字符
ALPHABET = "ABCDEFGHIJKLMN0123456789OPQRSTUVWXYZ+/abcdefghijklmnopqrstuvwxyz" ALPHABET = "ABCDEFGHIJKLMN0123456789OPQRSTUVWXYZ+/abcdefghijklmnopqrstuvwxyz"
STANDARD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" # 标准的字符串索引 STANDARD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" # 标准的字符串索引
#找到密钥 # 找到密钥
for i in range(1,keyLength): for i in range(1, keyLength):
if (encryptionA * i) % keyLength == 1: if (encryptionA * i) % keyLength == 1:
decodeA = i decodeA = i
def base64Encode(self,sourceStr): def base64Encode(self, sourceStr):
encode = "" encode = ""
for ch in base64.b64encode(sourceStr.encode()).decode(): for ch in base64.b64encode(sourceStr.encode()).decode():
if ch == '=': if ch == "=":
encode += '=' encode += "="
else: else:
for i in range(64): for i in range(64):
if ch == self.STANDARD[i]: if ch == self.STANDARD[i]:
encode += self.ALPHABET[i] encode += self.ALPHABET[i]
return encode return encode
def encrpyt(self,sourceStr): def encrpyt(self, sourceStr):
srcLength = len(sourceStr) srcLength = len(sourceStr)
#先加入干扰字符的数量 # 先加入干扰字符的数量
addCharCount = random.randint(1,self.preCountMax) if srcLength < self.preCountMax else 0 addCharCount = (
#随机字符 random.randint(1, self.preCountMax) if srcLength < self.preCountMax else 0
sb = str(addCharCount)+"|" )
# 随机字符
sb = str(addCharCount) + "|"
for i in range(addCharCount): for i in range(addCharCount):
sb += self.randomChar[random.randint(0,self.randomCharLength-1)] sb += self.randomChar[random.randint(0, self.randomCharLength - 1)]
sb += sourceStr sb += sourceStr
#尾部固定增加x个字符 # 尾部固定增加x个字符
for i in range(self.postCount): for i in range(self.postCount):
sb += self.randomChar[random.randint(0,self.randomCharLength-1)] sb += self.randomChar[random.randint(0, self.randomCharLength - 1)]
#base64 加密 # base64 加密
base64Str = self.base64Encode(sb) base64Str = self.base64Encode(sb)
destStr = '' destStr = ""
for i in range(len(base64Str)): for i in range(len(base64Str)):
#找到字符所在位置 # 找到字符所在位置
position = self.keyStr.find(base64Str[i]) position = self.keyStr.find(base64Str[i])
#对字符进行转换 # 对字符进行转换
y = (self.encryptionA * position + self.encryptionB) % self.keyLength y = (self.encryptionA * position + self.encryptionB) % self.keyLength
#找到替换后的字符 # 找到替换后的字符
destStr += self.keyStr[y] destStr += self.keyStr[y]
return destStr return destStr
def token(account,password):
url = 'http://ai.heclouds.com:9090/v1/user/oneNetLogin' def token(account, password):
url = "http://ai.heclouds.com:9090/v1/user/oneNetLogin"
headers = { headers = {
'Content-Type': 'application/json', "Content-Type": "application/json",
} }
simpleencode = SimpleEncode() simpleencode = SimpleEncode()
data = {'account': account, 'password': simpleencode.encrpyt(password)} data = {"account": account, "password": simpleencode.encrpyt(password)}
req = request.post(url, data=json.dumps(data), headers=headers) req = request.post(url, data=json.dumps(data), headers=headers)
#print(req.text) # print(req.text)
try: try:
return eval(req.text)['data']['loginToken'] return eval(req.text)["data"]["loginToken"]
except: except:
raise ValueError( "[Cool.AI]:Wrong account or password ") raise ValueError("[Cool.AI]:Wrong account or password ")
def post_ai(img,urlx,Token): def post_ai(img, urlx, Token):
ur = 'http://183.230.40.32:9090/v1/aiApi/picture/MixPY' ur = "http://183.230.40.32:9090/v1/aiApi/picture/MixPY"
url=ur.replace("MixPY",urlx) url = ur.replace("MixPY", urlx)
headers ={ headers = {"Content-Type": "application/json", "Login-Token": "Token"}
'Content-Type':'application/json',
'Login-Token':'Token' headers["Login-Token"] = Token
}
imge = img.compressed(quality=50)
headers['Login-Token']=Token file = imge.to_bytes()
str = base64.b64encode(file).decode()
imge = img.compressed(quality=50) data = {"picture": [str]}
file =imge.to_bytes() req = request.post(url, data=json.dumps(data), headers=headers)
str = base64.b64encode(file).decode() return json.loads(req.text)
data = {'picture':[str]} # return eval(req.text)
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 import binascii
__all__ = [ __all__ = [
'encode', 'decode', 'encodebytes', 'decodebytes', "encode",
'b64encode', 'b64decode', 'b32encode', 'b32decode', "decode",
'b16encode', 'b16decode', "encodebytes",
'standard_b64encode', 'standard_b64decode', "decodebytes",
'urlsafe_b64encode', 'urlsafe_b64decode', "b64encode",
] "b64decode",
"b32encode",
"b32decode",
"b16encode",
"b16decode",
"standard_b64encode",
"standard_b64decode",
"urlsafe_b64encode",
"urlsafe_b64decode",
]
bytes_types = (bytes, bytearray)
bytes_types = (bytes, bytearray)
def _bytes_from_decode_data(s): def _bytes_from_decode_data(s):
if isinstance(s, str): if isinstance(s, str):
try: try:
return s.encode('ascii') return s.encode("ascii")
except: except:
raise ValueError('string argument should contain only ASCII characters') raise ValueError("string argument should contain only ASCII characters")
elif isinstance(s, bytes_types): elif isinstance(s, bytes_types):
return s return s
else: else:
raise TypeError("argument should be bytes or ASCII string, not %s" % s.__class__.__name__) raise TypeError(
"argument should be bytes or ASCII string, not %s" % s.__class__.__name__
)
def b64encode(s, altchars=None): def b64encode(s, altchars=None):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
@@ -29,45 +42,73 @@ def b64encode(s, altchars=None):
encoded = binascii.b2a_base64(s)[:-1] encoded = binascii.b2a_base64(s)[:-1]
if altchars is not None: if altchars is not None:
if not isinstance(altchars, bytes_types): if not isinstance(altchars, bytes_types):
raise TypeError("expected bytes, not %s" raise TypeError("expected bytes, not %s" % altchars.__class__.__name__)
% altchars.__class__.__name__)
assert len(altchars) == 2, repr(altchars) assert len(altchars) == 2, repr(altchars)
return encoded.translate(bytes.maketrans(b'+/', altchars)) return encoded.translate(bytes.maketrans(b"+/", altchars))
return encoded return encoded
def b64decode(s, altchars=None, validate=False): def b64decode(s, altchars=None, validate=False):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
if altchars is not None: if altchars is not None:
altchars = _bytes_from_decode_data(altchars) altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars) assert len(altchars) == 2, repr(altchars)
s = s.translate(bytes.maketrans(altchars, b'+/')) s = s.translate(bytes.maketrans(altchars, b"+/"))
if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): if validate and not re.match(b"^[A-Za-z0-9+/]*={0,2}$", s):
raise binascii.Error('Non-base64 digit found') raise binascii.Error("Non-base64 digit found")
return binascii.a2b_base64(s) return binascii.a2b_base64(s)
def standard_b64encode(s): def standard_b64encode(s):
return b64encode(s) return b64encode(s)
def standard_b64decode(s): def standard_b64decode(s):
return b64decode(s) return b64decode(s)
def urlsafe_b64encode(s): def urlsafe_b64encode(s):
raise NotImplementedError() raise NotImplementedError()
def urlsafe_b64decode(s): def urlsafe_b64decode(s):
raise NotImplementedError() raise NotImplementedError()
_b32alphabet = { _b32alphabet = {
0: b'A', 9: b'J', 18: b'S', 27: b'3', 0: b"A",
1: b'B', 10: b'K', 19: b'T', 28: b'4', 9: b"J",
2: b'C', 11: b'L', 20: b'U', 29: b'5', 18: b"S",
3: b'D', 12: b'M', 21: b'V', 30: b'6', 27: b"3",
4: b'E', 13: b'N', 22: b'W', 31: b'7', 1: b"B",
5: b'F', 14: b'O', 23: b'X', 10: b"K",
6: b'G', 15: b'P', 24: b'Y', 19: b"T",
7: b'H', 16: b'Q', 25: b'Z', 28: b"4",
8: b'I', 17: b'R', 26: b'2', 2: b"C",
} 11: b"L",
20: b"U",
29: b"5",
3: b"D",
12: b"M",
21: b"V",
30: b"6",
4: b"E",
13: b"N",
22: b"W",
31: b"7",
5: b"F",
14: b"O",
23: b"X",
6: b"G",
15: b"P",
24: b"Y",
7: b"H",
16: b"Q",
25: b"Z",
8: b"I",
17: b"R",
26: b"2",
}
_b32tab = [v[0] for k, v in sorted(_b32alphabet.items())] _b32tab = [v[0] for k, v in sorted(_b32alphabet.items())]
_b32rev = dict([(v[0], k) for k, v in _b32alphabet.items()]) _b32rev = dict([(v[0], k) for k, v in _b32alphabet.items()])
@@ -82,26 +123,29 @@ def b32encode(s):
quanta += 1 quanta += 1
encoded = bytearray() encoded = bytearray()
for i in range(quanta): for i in range(quanta):
c1, c2, c3 = struct.unpack('!HHB', s[i*5:(i+1)*5]) c1, c2, c3 = struct.unpack("!HHB", s[i * 5 : (i + 1) * 5])
c2 += (c1 & 1) << 16 c2 += (c1 & 1) << 16
c3 += (c2 & 3) << 8 c3 += (c2 & 3) << 8
encoded += bytes([_b32tab[c1 >> 11], encoded += bytes(
_b32tab[(c1 >> 6) & 0x1f], [
_b32tab[(c1 >> 1) & 0x1f], _b32tab[c1 >> 11],
_b32tab[c2 >> 12], _b32tab[(c1 >> 6) & 0x1F],
_b32tab[(c2 >> 7) & 0x1f], _b32tab[(c1 >> 1) & 0x1F],
_b32tab[(c2 >> 2) & 0x1f], _b32tab[c2 >> 12],
_b32tab[c3 >> 5], _b32tab[(c2 >> 7) & 0x1F],
_b32tab[c3 & 0x1f], _b32tab[(c2 >> 2) & 0x1F],
]) _b32tab[c3 >> 5],
_b32tab[c3 & 0x1F],
]
)
if leftover == 1: if leftover == 1:
encoded = encoded[:-6] + b'======' encoded = encoded[:-6] + b"======"
elif leftover == 2: elif leftover == 2:
encoded = encoded[:-4] + b'====' encoded = encoded[:-4] + b"===="
elif leftover == 3: elif leftover == 3:
encoded = encoded[:-3] + b'===' encoded = encoded[:-3] + b"==="
elif leftover == 4: elif leftover == 4:
encoded = encoded[:-1] + b'=' encoded = encoded[:-1] + b"="
return bytes(encoded) return bytes(encoded)
@@ -109,14 +153,14 @@ def b32decode(s, casefold=False, map01=None):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
quanta, leftover = divmod(len(s), 8) quanta, leftover = divmod(len(s), 8)
if leftover: if leftover:
raise binascii.Error('Incorrect padding') raise binascii.Error("Incorrect padding")
if map01 is not None: if map01 is not None:
map01 = _bytes_from_decode_data(map01) map01 = _bytes_from_decode_data(map01)
assert len(map01) == 1, repr(map01) assert len(map01) == 1, repr(map01)
s = s.translate(bytes.maketrans(b'01', b'O' + map01)) s = s.translate(bytes.maketrans(b"01", b"O" + map01))
if casefold: if casefold:
s = s.upper() s = s.upper()
padchars = s.find(b'=') padchars = s.find(b"=")
if padchars > 0: if padchars > 0:
padchars = len(s) - padchars padchars = len(s) - padchars
s = s[:-padchars] s = s[:-padchars]
@@ -129,16 +173,16 @@ def b32decode(s, casefold=False, map01=None):
for c in s: for c in s:
val = _b32rev.get(c) val = _b32rev.get(c)
if val is None: if val is None:
raise binascii.Error('Non-base32 digit found') raise binascii.Error("Non-base32 digit found")
acc += _b32rev[c] << shift acc += _b32rev[c] << shift
shift -= 5 shift -= 5
if shift < 0: if shift < 0:
parts.append(binascii.unhexlify(bytes('%010x' % acc, "ascii"))) parts.append(binascii.unhexlify(bytes("%010x" % acc, "ascii")))
acc = 0 acc = 0
shift = 35 shift = 35
last = binascii.unhexlify(bytes('%010x' % acc, "ascii")) last = binascii.unhexlify(bytes("%010x" % acc, "ascii"))
if padchars == 0: if padchars == 0:
last = b'' last = b""
elif padchars == 1: elif padchars == 1:
last = last[:-1] last = last[:-1]
elif padchars == 3: elif padchars == 3:
@@ -148,9 +192,10 @@ def b32decode(s, casefold=False, map01=None):
elif padchars == 6: elif padchars == 6:
last = last[:-4] last = last[:-4]
else: else:
raise binascii.Error('Incorrect padding') raise binascii.Error("Incorrect padding")
parts.append(last) parts.append(last)
return b''.join(parts) return b"".join(parts)
def b16encode(s): def b16encode(s):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
@@ -162,12 +207,14 @@ def b16decode(s, casefold=False):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
if casefold: if casefold:
s = s.upper() s = s.upper()
if re.search(b'[^0-9A-F]', s): if re.search(b"[^0-9A-F]", s):
raise binascii.Error('Non-base16 digit found') raise binascii.Error("Non-base16 digit found")
return binascii.unhexlify(s) return binascii.unhexlify(s)
MAXLINESIZE = 76
MAXBINSIZE = (MAXLINESIZE//4)*3 MAXLINESIZE = 76
MAXBINSIZE = (MAXLINESIZE // 4) * 3
def encode(input, output): def encode(input, output):
while True: while True:
@@ -175,7 +222,7 @@ def encode(input, output):
if not s: if not s:
break break
while len(s) < MAXBINSIZE: while len(s) < MAXBINSIZE:
ns = input.read(MAXBINSIZE-len(s)) ns = input.read(MAXBINSIZE - len(s))
if not ns: if not ns:
break break
s += ns s += ns
@@ -191,6 +238,7 @@ def decode(input, output):
s = binascii.a2b_base64(line) s = binascii.a2b_base64(line)
output.write(s) output.write(s)
def encodebytes(s): def encodebytes(s):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__) raise TypeError("expected bytes, not %s" % s.__class__.__name__)
@@ -200,10 +248,13 @@ def encodebytes(s):
pieces.append(binascii.b2a_base64(chunk)) pieces.append(binascii.b2a_base64(chunk))
return b"".join(pieces) return b"".join(pieces)
def encodestring(s): def encodestring(s):
import warnings import warnings
warnings.warn("encodestring() is a deprecated alias, use encodebytes()",
DeprecationWarning, 2) warnings.warn(
"encodestring() is a deprecated alias, use encodebytes()", DeprecationWarning, 2
)
return encodebytes(s) return encodebytes(s)
@@ -212,36 +263,50 @@ def decodebytes(s):
raise TypeError("expected bytes, not %s" % s.__class__.__name__) raise TypeError("expected bytes, not %s" % s.__class__.__name__)
return binascii.a2b_base64(s) return binascii.a2b_base64(s)
def decodestring(s): def decodestring(s):
import warnings import warnings
warnings.warn("decodestring() is a deprecated alias, use decodebytes()",
DeprecationWarning, 2) warnings.warn(
"decodestring() is a deprecated alias, use decodebytes()", DeprecationWarning, 2
)
return decodebytes(s) return decodebytes(s)
def main(): def main():
import sys, getopt import sys, getopt
try: try:
opts, args = getopt.getopt(sys.argv[1:], 'deut') opts, args = getopt.getopt(sys.argv[1:], "deut")
except getopt.error as msg: except getopt.error as msg:
sys.stdout = sys.stderr sys.stdout = sys.stderr
print(msg) print(msg)
print("""usage: %s [-d|-e|-u|-t] [file|-] print(
"""usage: %s [-d|-e|-u|-t] [file|-]
-d, -u: decode -d, -u: decode
-e: encode (default) -e: encode (default)
-t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0]) -t: encode and decode string 'Aladdin:open sesame'"""
% sys.argv[0]
)
sys.exit(2) sys.exit(2)
func = encode func = encode
for o, a in opts: for o, a in opts:
if o == '-e': func = encode if o == "-e":
if o == '-d': func = decode func = encode
if o == '-u': func = decode if o == "-d":
if o == '-t': test(); return func = decode
if args and args[0] != '-': if o == "-u":
with open(args[0], 'rb') as f: func = decode
if o == "-t":
test()
return
if args and args[0] != "-":
with open(args[0], "rb") as f:
func(f, sys.stdout.buffer) func(f, sys.stdout.buffer)
else: else:
func(sys.stdin.buffer, sys.stdout.buffer) func(sys.stdin.buffer, sys.stdout.buffer)
def test(): def test():
s0 = b"Aladdin:open sesame" s0 = b"Aladdin:open sesame"
print(repr(s0)) print(repr(s0))
@@ -252,5 +317,5 @@ def test():
assert s0 == s2 assert s0 == s2
if __name__ == '__main__': if __name__ == "__main__":
main() main()

View File

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

View File

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

View File

@@ -1,58 +1,60 @@
import time,board import time, board
def read_data(pin_name): def read_data(pin_name):
data=[] data = []
j=0 j = 0
time.sleep_ms(1200) time.sleep_ms(1200)
N1 = board.pin(pin_name, board.GPIO.OUT) N1 = board.pin(pin_name, board.GPIO.OUT)
N1.value(0) N1.value(0)
time.sleep_ms(20) time.sleep_ms(20)
N1.value(1) N1.value(1)
time.sleep_us(30) time.sleep_us(30)
N1 =board.pin(pin_name, board.GPIO.IN) N1 = board.pin(pin_name, board.GPIO.IN)
T1 = time.ticks_us() T1 = time.ticks_us()
while N1.value()==0: while N1.value() == 0:
continue continue
while N1.value()==1: while N1.value() == 1:
T2 =time.ticks_us() T2 = time.ticks_us()
if time.ticks_diff(T2, T1) >200000: if time.ticks_diff(T2, T1) > 200000:
#raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
continue continue
while j<40: while j < 40:
k=0 k = 0
while N1.value()==0: while N1.value() == 0:
continue continue
while N1.value()==1: while N1.value() == 1:
k+=1 k += 1
if k>100:break if k > 100:
if k<15: break
data.append(0) if k < 15:
else: data.append(0)
data.append(1) else:
j=j+1 data.append(1)
del N1 j = j + 1
humidity_bit=data[0:8] del N1
humidity_point_bit=data[8:16] humidity_bit = data[0:8]
temperature_bit=data[16:24] humidity_point_bit = data[8:16]
temperature_point_bit=data[24:32] temperature_bit = data[16:24]
check_bit=data[32:40] temperature_point_bit = data[24:32]
humidity=0 check_bit = data[32:40]
humidity_point=0 humidity = 0
temperature=0.0 humidity_point = 0
temperature_point=0 temperature = 0.0
check=0 temperature_point = 0
for i in range(8): check = 0
humidity+=humidity_bit[i]*2**(7-i) for i in range(8):
humidity_point+=humidity_point_bit[i]*2**(7-i) humidity += humidity_bit[i] * 2 ** (7 - i)
temperature+=temperature_bit[i]*2**(7-i) humidity_point += humidity_point_bit[i] * 2 ** (7 - i)
temperature_point+=temperature_point_bit[i]*2**(7-i) temperature += temperature_bit[i] * 2 ** (7 - i)
check+=check_bit[i]*2**(7-i) temperature_point += temperature_point_bit[i] * 2 ** (7 - i)
tmp=humidity+humidity_point+temperature+temperature_point check += check_bit[i] * 2 ** (7 - i)
#print(humidity_point,temperature_point) tmp = humidity + humidity_point + temperature + temperature_point
if check==tmp: # print(humidity_point,temperature_point)
#print('temperature is',temperature,'-wet is',humidity,'%') if check == tmp:
return (temperature+temperature_point/10,humidity) # print('temperature is',temperature,'-wet is',humidity,'%')
else: return (temperature + temperature_point / 10, humidity)
#print('Error:',humidity,humidity_point,temperature,temperature_point,check) else:
return (None,None) # print('Error:',humidity,humidity_point,temperature,temperature_point,check)
return (None, None)

View File

@@ -1,27 +1,28 @@
import time,board import time, board
def Sonar(trig1, echo1): def Sonar(trig1, echo1):
trig = board.pin(trig1, board.GPIO.OUT) trig = board.pin(trig1, board.GPIO.OUT)
echo = board.pin(echo1, board.GPIO.IN) echo = board.pin(echo1, board.GPIO.IN)
time.sleep_ms(10) time.sleep_ms(10)
trig.value(1) trig.value(1)
time.sleep_us(10) time.sleep_us(10)
trig.value(0) trig.value(0)
n1 = time.ticks_us() n1 = time.ticks_us()
while(echo.value()==0): while echo.value() == 0:
n2 =time.ticks_us() n2 = time.ticks_us()
if time.ticks_diff(n2, n1) >200000: if time.ticks_diff(n2, n1) > 200000:
#raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
pass pass
t1 = time.ticks_us() t1 = time.ticks_us()
while(echo.value()==1): while echo.value() == 1:
n3 =time.ticks_us() n3 = time.ticks_us()
if time.ticks_diff(n3, t1) >200000: if time.ticks_diff(n3, t1) > 200000:
#raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
pass pass
t2 = time.ticks_us() t2 = time.ticks_us()
time.sleep_ms(10) time.sleep_ms(10)
return round(time.ticks_diff(t2, t1) / 10000 * 340 / 2, 2) return round(time.ticks_diff(t2, t1) / 10000 * 340 / 2, 2)

View File

@@ -1,47 +1,48 @@
import time,board import time, board
def read_id(pin): def read_id(pin):
L1 = board.pin(pin, board.GPIO.IN, board.GPIO.PULL_UP) L1 = board.pin(pin, board.GPIO.IN, board.GPIO.PULL_UP)
a = [] a = []
t1 = time.ticks_us() t1 = time.ticks_us()
while L1.value() == 1: while L1.value() == 1:
t2 = time.ticks_us() t2 = time.ticks_us()
if time.ticks_diff(t2, t1) >1000000: if time.ticks_diff(t2, t1) > 1000000:
#raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
pass pass
time.sleep_us(13560) time.sleep_us(13560)
for i in range(1000): for i in range(1000):
v = L1.value() v = L1.value()
a.append(v) a.append(v)
time.sleep_us(56) time.sleep_us(56)
a_c = [] a_c = []
count = 0 count = 0
for i in a: for i in a:
if i == 1: if i == 1:
count += 1 count += 1
elif i == 0: elif i == 0:
if count > 0 : if count > 0:
a_c.append(count) a_c.append(count)
count =0 count = 0
for i in range(len(a_c)): for i in range(len(a_c)):
if a_c[i] > 10: if a_c[i] > 10:
a_c[i] = "1" a_c[i] = "1"
else: else:
a_c[i] = "0" a_c[i] = "0"
B1 = "".join(a_c) B1 = "".join(a_c)
B2 = B1[16:32] B2 = B1[16:32]
#print(len(B1)) # print(len(B1))
if len(B1)==32 or len(B1)==33 or len(B1)==46: if len(B1) == 32 or len(B1) == 33 or len(B1) == 46:
B3=int(B2,2) B3 = int(B2, 2)
return B3 return B3
else: else:
return None return None

View File

@@ -1,29 +1,34 @@
import usocket as socket import usocket as socket
import ustruct as struct import ustruct as struct
import network,time,board import network, time, board
#from ubinascii import hexlify
# from ubinascii import hexlify
import ujson as json import ujson as json
from machine import UART from machine import UART
wifi_en=board.pin(19,board.GPIO.OUT) wifi_en = board.pin(19, board.GPIO.OUT)
board.register(18,board.FPIOA.UART2_TX) board.register(18, board.FPIOA.UART2_TX)
board.register(17,board.FPIOA.UART2_RX) board.register(17, board.FPIOA.UART2_RX)
def wifi_enable(en): def wifi_enable(en):
global wifi_en global wifi_en
wifi_en.value(en) wifi_en.value(en)
def wifi_reset(): def wifi_reset():
global uart global uart
wifi_enable(0) wifi_enable(0)
time.sleep_ms(200) time.sleep_ms(200)
wifi_enable(1) wifi_enable(1)
time.sleep(2) time.sleep(2)
uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=4096) uart = UART(UART.UART2, 115200, timeout=1000, read_buf_len=4096)
tmp = uart.read() tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n") uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read()) print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data uart = UART(
UART.UART2, 921600, timeout=1000, read_buf_len=10240
) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n") uart.write("AT\r\n")
tmp = uart.read() tmp = uart.read()
print(tmp) print(tmp)
@@ -36,46 +41,62 @@ def wifi_reset():
return None return None
return nic return nic
def get_data_dict(d): def get_data_dict(d):
result = {"datastreams":[]} result = {"datastreams": []}
for x in d: for x in d:
result["datastreams"].append({"id":x,"datapoints":[{"value":d[x]}]}) result["datastreams"].append({"id": x, "datapoints": [{"value": d[x]}]})
return result return result
def pubData(value, state):
def pubData(value, state):
value = get_data_dict(value) value = get_data_dict(value)
jdata = json.dumps(value) jdata = json.dumps(value)
jlen = len(jdata) jlen = len(jdata)
bdata = bytearray(jlen+3) bdata = bytearray(jlen + 3)
bdata[0] = 1 # publish data in type of json bdata[0] = 1 # publish data in type of json
bdata[1] = int(jlen / 256) # data lenght bdata[1] = int(jlen / 256) # data lenght
bdata[2] = jlen % 256 # data lenght bdata[2] = jlen % 256 # data lenght
bdata[3:jlen+4] = jdata.encode('ascii') # json data bdata[3 : jlen + 4] = jdata.encode("ascii") # json data
if state: if state:
print(value) print(value)
print(bdata) print(bdata)
return bdata return bdata
def do_connect(account,password):
nic=wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account,password) def do_connect(account, password):
nic.ifconfig() nic = wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account, password)
nic.ifconfig()
def init_MQTT_client(sid, address, cid, api, topic, callback): def init_MQTT_client(sid, address, cid, api, topic, callback):
client = MQTTClient(sid, address, 6002, cid, api) client = MQTTClient(sid, address, 6002, cid, api)
client.set_callback(callback) client.set_callback(callback)
client.connect() client.connect()
client.subscribe(bytes(topic, 'utf-8')) client.subscribe(bytes(topic, "utf-8"))
return client return client
class MQTTException(Exception): class MQTTException(Exception):
pass pass
class MQTTClient: class MQTTClient:
def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0,ssl=False, ssl_params={}): def __init__(
self,
client_id,
server,
port=0,
user=None,
password=None,
keepalive=0,
ssl=False,
ssl_params={},
):
if port == 0: if port == 0:
port = 8883 if ssl else 1883 port = 8883 if ssl else 1883
self.client_id = client_id self.client_id = client_id
@@ -102,7 +123,7 @@ class MQTTClient:
sh = 0 sh = 0
while 1: while 1:
b = self.sock.read(1)[0] b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh n |= (b & 0x7F) << sh
if not b & 0x80: if not b & 0x80:
return n return n
sh += 7 sh += 7
@@ -124,6 +145,7 @@ class MQTTClient:
print(self.addr) print(self.addr)
if self.ssl: if self.ssl:
import ussl import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0") msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0")
msg[1] = 10 + 2 + len(self.client_id) msg[1] = 10 + 2 + len(self.client_id)
@@ -140,7 +162,7 @@ class MQTTClient:
msg[9] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3 msg[9] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
msg[9] |= self.lw_retain << 5 msg[9] |= self.lw_retain << 5
self.sock.write(msg) self.sock.write(msg)
#print(hex(len(msg)), hexlify(msg, ":")) # print(hex(len(msg)), hexlify(msg, ":"))
self._send_str(self.client_id) self._send_str(self.client_id)
if self.lw_topic: if self.lw_topic:
self._send_str(self.lw_topic) self._send_str(self.lw_topic)
@@ -161,7 +183,7 @@ class MQTTClient:
def ping(self): def ping(self):
self.sock.write(b"\xc0\0") self.sock.write(b"\xc0\0")
def publish(self, msg, is_print=True, topic='$dp', retain=False, qos=0): def publish(self, msg, is_print=True, topic="$dp", retain=False, qos=0):
msg = pubData(msg, is_print) msg = pubData(msg, is_print)
pkt = bytearray(b"\x30\0\0\0") pkt = bytearray(b"\x30\0\0\0")
pkt[0] |= qos << 1 | retain pkt[0] |= qos << 1 | retain
@@ -170,12 +192,12 @@ class MQTTClient:
sz += 2 sz += 2
assert sz < 2097152 assert sz < 2097152
i = 1 i = 1
while sz > 0x7f: while sz > 0x7F:
pkt[i] = (sz & 0x7f) | 0x80 pkt[i] = (sz & 0x7F) | 0x80
sz >>= 7 sz >>= 7
i += 1 i += 1
pkt[i] = sz pkt[i] = sz
#print(hex(len(pkt)), hexlify(pkt, ":")) # print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt, i + 1) self.sock.write(pkt, i + 1)
self._send_str(topic) self._send_str(topic)
if qos > 0: if qos > 0:
@@ -202,7 +224,7 @@ class MQTTClient:
pkt = bytearray(b"\x82\0\0\0") pkt = bytearray(b"\x82\0\0\0")
self.pid += 1 self.pid += 1
struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid) struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
#print(hex(len(pkt)), hexlify(pkt, ":")) # print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt) self.sock.write(pkt)
self._send_str(topic) self._send_str(topic)
self.sock.write(qos.to_bytes(1, "little")) self.sock.write(qos.to_bytes(1, "little"))
@@ -210,7 +232,7 @@ class MQTTClient:
op = self.wait_msg() op = self.wait_msg()
if op == 0x90: if op == 0x90:
resp = self.sock.read(4) resp = self.sock.read(4)
#print(resp) # print(resp)
assert resp[1] == pkt[2] and resp[2] == pkt[3] assert resp[1] == pkt[2] and resp[2] == pkt[3]
if resp[3] == 0x80: if resp[3] == 0x80:
raise MQTTException(resp[3]) raise MQTTException(resp[3])
@@ -227,12 +249,12 @@ class MQTTClient:
return None return None
if res == b"": if res == b"":
raise OSError(-1) raise OSError(-1)
if res == b"\xd0": # PINGRESP if res == b"\xd0": # PINGRESP
sz = self.sock.read(1)[0] sz = self.sock.read(1)[0]
assert sz == 0 assert sz == 0
return None return None
op = res[0] op = res[0]
if op & 0xf0 != 0x30: if op & 0xF0 != 0x30:
return op return op
sz = self._recv_len() sz = self._recv_len()
topic_len = self.sock.read(2) topic_len = self.sock.read(2)

View File

@@ -7,33 +7,55 @@ import ujson as json
from matcher import MQTTMatcher from matcher import MQTTMatcher
from machine import Timer from machine import Timer
ADDITIONAL_TOPIC = 'b640a0ce465fa2a4150c36b305c1c11b' ADDITIONAL_TOPIC = "b640a0ce465fa2a4150c36b305c1c11b"
WILL_TOPIC = '9d634e1a156dc0c1611eb4c3cff57276' WILL_TOPIC = "9d634e1a156dc0c1611eb4c3cff57276"
def init_MQTT_client(address, username, password,MQTT_USR_PRJ): def init_MQTT_client(address, username, password, MQTT_USR_PRJ):
client = MQTTClient(hexlify(machine.unique_id()), address, 1883, username, password) client = MQTTClient(hexlify(machine.unique_id()), address, 1883, username, password)
client.set_last_will(topic=MQTT_USR_PRJ+WILL_TOPIC, msg=client.client_id, qos=2) client.set_last_will(topic=MQTT_USR_PRJ + WILL_TOPIC, msg=client.client_id, qos=2)
if client.connect()==0: if client.connect() == 0:
client.publish(MQTT_USR_PRJ+ADDITIONAL_TOPIC, client.client_id, qos=1) client.publish(MQTT_USR_PRJ + ADDITIONAL_TOPIC, client.client_id, qos=1)
Timer(Timer.TIMER2,Timer.CHANNEL3,mode=Timer.MODE_PERIODIC,period = 10000, callback = lambda x : client.ping()) Timer(
Timer.TIMER2,
Timer.CHANNEL3,
mode=Timer.MODE_PERIODIC,
period=10000,
callback=lambda x: client.ping(),
)
return client return client
len_overrided = len len_overrided = len
# Add by Mixly Team # Add by Mixly Team
def len(object): def len(object):
if isinstance(object, str): if isinstance(object, str):
return len_overrided(object.encode('utf-8')) return len_overrided(object.encode("utf-8"))
else: else:
return len_overrided(object) return len_overrided(object)
#####################################################
#####################################################
class MQTTException(Exception): class MQTTException(Exception):
pass pass
class MQTTClient: class MQTTClient:
def __init__(self, client_id, server, port=0, username=None, password=None, keepalive=60, ssl=False, ssl_params={}): def __init__(
self,
client_id,
server,
port=0,
username=None,
password=None,
keepalive=60,
ssl=False,
ssl_params={},
):
if port == 0: if port == 0:
port = 8883 if ssl else 1883 port = 8883 if ssl else 1883
self.client_id = client_id self.client_id = client_id
@@ -42,11 +64,11 @@ class MQTTClient:
self.ssl = ssl self.ssl = ssl
self.ssl_params = ssl_params self.ssl_params = ssl_params
self.pid = 0 self.pid = 0
#self.cb = None # self.cb = None
self._on_message = None self._on_message = None
self.username = username self.username = username
self.password = password self.password = password
#self.project = project # self.project = project
self.keepalive = keepalive self.keepalive = keepalive
self.lw_topic = None self.lw_topic = None
self.lw_msg = None self.lw_msg = None
@@ -63,7 +85,7 @@ class MQTTClient:
sh = 0 sh = 0
while 1: while 1:
b = self.sock.read(1)[0] b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh n |= (b & 0x7F) << sh
if not b & 0x80: if not b & 0x80:
return n return n
sh += 7 sh += 7
@@ -79,7 +101,7 @@ class MQTTClient:
""" """
if mqtt_topic is None or callback_method is None: if mqtt_topic is None or callback_method is None:
raise ValueError("MQTT topic and callback method must both be defined.") raise ValueError("MQTT topic and callback method must both be defined.")
self._on_message_filtered[MQTT_USR_PRJ+mqtt_topic] = callback_method self._on_message_filtered[MQTT_USR_PRJ + mqtt_topic] = callback_method
def remove_callback(self, mqtt_topic): def remove_callback(self, mqtt_topic):
"""Removes a registered callback method. """Removes a registered callback method.
@@ -93,7 +115,7 @@ class MQTTClient:
except KeyError: except KeyError:
raise KeyError( raise KeyError(
"MQTT topic callback not added with add_topic_callback." "MQTT topic callback not added with add_topic_callback."
) from None ) from None
@property @property
def on_message(self): def on_message(self):
@@ -124,19 +146,20 @@ class MQTTClient:
self.lw_msg = msg self.lw_msg = msg
self.lw_qos = qos self.lw_qos = qos
self.lw_retain = retain self.lw_retain = retain
def connect(self, clean_session=True): def connect(self, clean_session=True):
self.sock = socket.socket() self.sock = socket.socket()
self.sock.connect(self.addr) self.sock.connect(self.addr)
print(self.addr) print(self.addr)
if self.ssl: if self.ssl:
import ussl import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg_header=bytearray([0x10]) msg_header = bytearray([0x10])
msg = bytearray(b"\x04MQTT\x04\x02\0\0") msg = bytearray(b"\x04MQTT\x04\x02\0\0")
msg_length = 12 + len(self.client_id) msg_length = 12 + len(self.client_id)
msg[6] = clean_session << 1 msg[6] = clean_session << 1
if self.username is not None: if self.username is not None:
msg_length += 2 + len(self.username) + 2 + len(self.password) msg_length += 2 + len(self.username) + 2 + len(self.password)
msg[6] |= 0xC0 msg[6] |= 0xC0
@@ -148,22 +171,22 @@ class MQTTClient:
msg_length += 2 + len(self.lw_topic) + 2 + len(self.lw_msg) msg_length += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)
msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3 msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
msg[6] |= self.lw_retain << 5 msg[6] |= self.lw_retain << 5
if msg_length > 0x7F: if msg_length > 0x7F:
while msg_length>0: while msg_length > 0:
encoded_byte = msg_length % 0x80 encoded_byte = msg_length % 0x80
msg_length = msg_length // 0x80 msg_length = msg_length // 0x80
if msg_length > 0: if msg_length > 0:
encoded_byte |= 0x80 encoded_byte |= 0x80
msg_header.append(encoded_byte) msg_header.append(encoded_byte)
msg_header.append(0x00) msg_header.append(0x00)
else: else:
msg_header.append(msg_length) msg_header.append(msg_length)
msg_header.append(0x00) msg_header.append(0x00)
self.sock.write(msg_header) self.sock.write(msg_header)
self.sock.write(msg) self.sock.write(msg)
#print(hexlify(msg_header, ":"), hexlify(msg, ":")) # print(hexlify(msg_header, ":"), hexlify(msg, ":"))
self._send_str(self.client_id) self._send_str(self.client_id)
if self.lw_topic: if self.lw_topic:
self._send_str(self.lw_topic) self._send_str(self.lw_topic)
@@ -177,26 +200,25 @@ class MQTTClient:
raise MQTTException(resp[3]) raise MQTTException(resp[3])
return resp[2] & 1 return resp[2] & 1
def disconnect(self, MQTT_USR_PRJ):
def disconnect(self,MQTT_USR_PRJ): # MQTT_USR_PRJ = "{}/{}/".format(self.username,self.project)
#MQTT_USR_PRJ = "{}/{}/".format(self.username,self.project) self.publish(MQTT_USR_PRJ + WILL_TOPIC, self.client_id, qos=1)
self.publish(MQTT_USR_PRJ+WILL_TOPIC, self.client_id, qos=1)
self.sock.write(b"\xe0\0") self.sock.write(b"\xe0\0")
self.sock.close() self.sock.close()
def ping(self): def ping(self):
self.sock.write(b"\xc0\0") self.sock.write(b"\xc0\0")
def pingSync(self): def pingSync(self):
time.ticks_ms() time.ticks_ms()
self.ping() self.ping()
for i in range(0,10): for i in range(0, 10):
msg = self.check_msg() msg = self.check_msg()
if msg == "PINGRESP": if msg == "PINGRESP":
return True return True
time.sleep_ms(100) time.sleep_ms(100)
return False return False
def publish(self, topic, msg, retain=False, qos=0): def publish(self, topic, msg, retain=False, qos=0):
# msg = pubData(msg) # msg = pubData(msg)
if "+" in topic or "#" in topic: if "+" in topic or "#" in topic:
@@ -219,12 +241,12 @@ class MQTTClient:
sz += 2 sz += 2
assert sz < 2097152 assert sz < 2097152
i = 1 i = 1
while sz > 0x7f: while sz > 0x7F:
pkt[i] = (sz & 0x7f) | 0x80 pkt[i] = (sz & 0x7F) | 0x80
sz >>= 7 sz >>= 7
i += 1 i += 1
pkt[i] = sz pkt[i] = sz
#print(hex(len(pkt)), hexlify(pkt, ":")) # print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt, i + 1) self.sock.write(pkt, i + 1)
self._send_str(topic) self._send_str(topic)
if qos > 0: if qos > 0:
@@ -247,13 +269,13 @@ class MQTTClient:
assert 0 assert 0
def subscribe(self, topic, qos=0): def subscribe(self, topic, qos=0):
#assert self.cb is not None, "Subscribe callback is not set" # assert self.cb is not None, "Subscribe callback is not set"
pkt = bytearray(b"\x82\0\0\0") pkt = bytearray(b"\x82\0\0\0")
self.pid += 1 self.pid += 1
if isinstance(topic, str): if isinstance(topic, str):
topic=topic.encode() topic = topic.encode()
struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid) struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
#print(hex(len(pkt)), hexlify(pkt, ":")) # print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt) self.sock.write(pkt)
self._send_str(topic) self._send_str(topic)
self.sock.write(qos.to_bytes(1, "little")) self.sock.write(qos.to_bytes(1, "little"))
@@ -261,7 +283,7 @@ class MQTTClient:
op = self.wait_msg() op = self.wait_msg()
if op == 0x90: if op == 0x90:
resp = self.sock.read(4) resp = self.sock.read(4)
#print(resp) # print(resp)
assert resp[1] == pkt[2] and resp[2] == pkt[3] assert resp[1] == pkt[2] and resp[2] == pkt[3]
if resp[3] == 0x80: if resp[3] == 0x80:
raise MQTTException(resp[3]) raise MQTTException(resp[3])
@@ -278,12 +300,12 @@ class MQTTClient:
return None return None
if res == b"": if res == b"":
raise OSError(-1) raise OSError(-1)
if res == b"\xd0": # PINGRESP if res == b"\xd0": # PINGRESP
sz = self.sock.read(1)[0] sz = self.sock.read(1)[0]
assert sz == 0 assert sz == 0
return "PINGRESP" return "PINGRESP"
op = res[0] op = res[0]
if op & 0xf0 != 0x30: if op & 0xF0 != 0x30:
return op return op
sz = self._recv_len() sz = self._recv_len()
topic_len = self.sock.read(2) topic_len = self.sock.read(2)
@@ -296,7 +318,7 @@ class MQTTClient:
sz -= 2 sz -= 2
msg = self.sock.read(sz) msg = self.sock.read(sz)
self._handle_on_message(self, str(topic, "utf-8"), str(msg, "utf-8")) self._handle_on_message(self, str(topic, "utf-8"), str(msg, "utf-8"))
#self.cb(topic.decode(), msg.decode()) # self.cb(topic.decode(), msg.decode())
if op & 6 == 2: if op & 6 == 2:
pkt = bytearray(b"\x40\x02\0\0") pkt = bytearray(b"\x40\x02\0\0")
struct.pack_into("!H", pkt, 2, pid) struct.pack_into("!H", pkt, 2, pid)
@@ -309,4 +331,4 @@ class MQTTClient:
# the same processing as wait_msg. # the same processing as wait_msg.
def check_msg(self): def check_msg(self):
self.sock.setblocking(False) self.sock.setblocking(False)
return self.wait_msg() return self.wait_msg()

View File

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

View File

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

View File

@@ -19,22 +19,23 @@ import ustruct
import utime import utime
import time import time
import math import math
#from machine import I2C, Pin
# from machine import I2C, Pin
# pylint: enable=import-error # pylint: enable=import-error
__version__ = "0.2.0" __version__ = "0.2.0"
# pylint: disable=import-error # pylint: disable=import-error
# pylint: enable=import-error # pylint: enable=import-error
_GYRO_CONFIG = const(0x1b) _GYRO_CONFIG = const(0x1B)
_ACCEL_CONFIG = const(0x1c) _ACCEL_CONFIG = const(0x1C)
_ACCEL_CONFIG2 = const(0x1d) _ACCEL_CONFIG2 = const(0x1D)
_INT_PIN_CFG = const(0x37) _INT_PIN_CFG = const(0x37)
_ACCEL_XOUT_H = const(0x3b) _ACCEL_XOUT_H = const(0x3B)
_ACCEL_XOUT_L = const(0x3c) _ACCEL_XOUT_L = const(0x3C)
_ACCEL_YOUT_H = const(0x3d) _ACCEL_YOUT_H = const(0x3D)
_ACCEL_YOUT_L = const(0x3e) _ACCEL_YOUT_L = const(0x3E)
_ACCEL_ZOUT_H = const(0x3f) _ACCEL_ZOUT_H = const(0x3F)
_ACCEL_ZOUT_L= const(0x40) _ACCEL_ZOUT_L = const(0x40)
_TEMP_OUT_H = const(0x41) _TEMP_OUT_H = const(0x41)
_TEMP_OUT_L = const(0x42) _TEMP_OUT_L = const(0x42)
_GYRO_XOUT_H = const(0x43) _GYRO_XOUT_H = const(0x43)
@@ -45,18 +46,18 @@ _GYRO_ZOUT_H = const(0x47)
_GYRO_ZOUT_L = const(0x48) _GYRO_ZOUT_L = const(0x48)
_WHO_AM_I = const(0x75) _WHO_AM_I = const(0x75)
#_ACCEL_FS_MASK = const(0b00011000) # _ACCEL_FS_MASK = const(0b00011000)
ACCEL_FS_SEL_2G = const(0b00000000) ACCEL_FS_SEL_2G = const(0b00000000)
ACCEL_FS_SEL_4G = const(0b00001000) ACCEL_FS_SEL_4G = const(0b00001000)
ACCEL_FS_SEL_8G = const(0b00010000) ACCEL_FS_SEL_8G = const(0b00010000)
ACCEL_FS_SEL_16G = const(0b00011000) ACCEL_FS_SEL_16G = const(0b00011000)
_ACCEL_SO_2G = 16384 # 1 / 16384 ie. 0.061 mg / digit _ACCEL_SO_2G = 16384 # 1 / 16384 ie. 0.061 mg / digit
_ACCEL_SO_4G = 8192 # 1 / 8192 ie. 0.122 mg / digit _ACCEL_SO_4G = 8192 # 1 / 8192 ie. 0.122 mg / digit
_ACCEL_SO_8G = 4096 # 1 / 4096 ie. 0.244 mg / digit _ACCEL_SO_8G = 4096 # 1 / 4096 ie. 0.244 mg / digit
_ACCEL_SO_16G = 2048 # 1 / 2048 ie. 0.488 mg / digit _ACCEL_SO_16G = 2048 # 1 / 2048 ie. 0.488 mg / digit
#_GYRO_FS_MASK = const(0b00011000) # _GYRO_FS_MASK = const(0b00011000)
GYRO_FS_SEL_250DPS = const(0b00000000) GYRO_FS_SEL_250DPS = const(0b00000000)
GYRO_FS_SEL_500DPS = const(0b00001000) GYRO_FS_SEL_500DPS = const(0b00001000)
GYRO_FS_SEL_1000DPS = const(0b00010000) GYRO_FS_SEL_1000DPS = const(0b00010000)
@@ -73,9 +74,9 @@ _I2C_BYPASS_EN = const(0b00000010)
_I2C_BYPASS_DIS = const(0b00000000) _I2C_BYPASS_DIS = const(0b00000000)
SF_G = 1 SF_G = 1
SF_M_S2 = 9.80665 # 1 g = 9.80665 m/s2 ie. standard gravity SF_M_S2 = 9.80665 # 1 g = 9.80665 m/s2 ie. standard gravity
SF_DEG_S = 1 SF_DEG_S = 1
SF_RAD_S = 57.295779578552 # 1 rad/s is 57.295779578552 deg/s SF_RAD_S = 57.295779578552 # 1 rad/s is 57.295779578552 deg/s
_WIA = const(0x00) _WIA = const(0x00)
@@ -86,15 +87,15 @@ _HYH = const(0x06)
_HZL = const(0x07) _HZL = const(0x07)
_HZH = const(0x08) _HZH = const(0x08)
_ST2 = const(0x09) _ST2 = const(0x09)
_CNTL1 = const(0x0a) _CNTL1 = const(0x0A)
_ASAX = const(0x10) _ASAX = const(0x10)
_ASAY = const(0x11) _ASAY = const(0x11)
_ASAZ = const(0x12) _ASAZ = const(0x12)
_MODE_POWER_DOWN = 0b00000000 _MODE_POWER_DOWN = 0b00000000
MODE_SINGLE_MEASURE = 0b00000001 MODE_SINGLE_MEASURE = 0b00000001
MODE_CONTINOUS_MEASURE_1 = 0b00000010 # 8Hz MODE_CONTINOUS_MEASURE_1 = 0b00000010 # 8Hz
MODE_CONTINOUS_MEASURE_2 = 0b00000110 # 100Hz MODE_CONTINOUS_MEASURE_2 = 0b00000110 # 100Hz
MODE_EXTERNAL_TRIGGER_MEASURE = 0b00000100 MODE_EXTERNAL_TRIGGER_MEASURE = 0b00000100
_MODE_SELF_TEST = 0b00001000 _MODE_SELF_TEST = 0b00001000
_MODE_FUSE_ROM_ACCESS = 0b00001111 _MODE_FUSE_ROM_ACCESS = 0b00001111
@@ -102,15 +103,21 @@ _MODE_FUSE_ROM_ACCESS = 0b00001111
OUTPUT_14_BIT = 0b00000000 OUTPUT_14_BIT = 0b00000000
OUTPUT_16_BIT = 0b00010000 OUTPUT_16_BIT = 0b00010000
_SO_14BIT = 0.6 # 渭T per digit when 14bit mode _SO_14BIT = 0.6 # 渭T per digit when 14bit mode
_SO_16BIT = 0.15 # 渭T per digit when 16bit mode _SO_16BIT = 0.15 # 渭T per digit when 16bit mode
class MPU6500: class MPU6500:
"""Class which provides interface to MPU6500 6-axis motion tracking device.""" """Class which provides interface to MPU6500 6-axis motion tracking device."""
def __init__( def __init__(
self, i2c, address=0x68, self,
accel_fs=ACCEL_FS_SEL_2G, gyro_fs=GYRO_FS_SEL_250DPS, i2c,
accel_sf=SF_M_S2, gyro_sf=SF_RAD_S address=0x68,
accel_fs=ACCEL_FS_SEL_2G,
gyro_fs=GYRO_FS_SEL_250DPS,
accel_sf=SF_M_S2,
gyro_sf=SF_RAD_S,
): ):
self.i2c = i2c self.i2c = i2c
self.address = address self.address = address
@@ -125,15 +132,15 @@ class MPU6500:
# Enable I2C bypass to access for MPU9250 magnetometer access. # Enable I2C bypass to access for MPU9250 magnetometer access.
char = self._register_char(_INT_PIN_CFG) char = self._register_char(_INT_PIN_CFG)
char &= ~_I2C_BYPASS_MASK # clear I2C bits char &= ~_I2C_BYPASS_MASK # clear I2C bits
char |= _I2C_BYPASS_EN char |= _I2C_BYPASS_EN
self._register_char(_INT_PIN_CFG, char) self._register_char(_INT_PIN_CFG, char)
@property @property
def temperature(self): def temperature(self):
tempbuf=self._register_short(0x41) tempbuf = self._register_short(0x41)
return tempbuf/333.87 + 21 # I think return tempbuf / 333.87 + 21 # I think
# @property # @property
def acceleration(self): def acceleration(self):
""" """
@@ -161,7 +168,7 @@ class MPU6500:
@property @property
def whoami(self): def whoami(self):
""" Value of the whoami register. """ """Value of the whoami register."""
return self._register_char(_WHO_AM_I) return self._register_char(_WHO_AM_I)
def _register_short(self, register, value=None, buf=bytearray(2)): def _register_short(self, register, value=None, buf=bytearray(2)):
@@ -216,12 +223,18 @@ class MPU6500:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class AK8963: class AK8963:
"""Class which provides interface to AK8963 magnetometer.""" """Class which provides interface to AK8963 magnetometer."""
def __init__( def __init__(
self, i2c, address=0x0c, self,
mode=MODE_CONTINOUS_MEASURE_1, output=OUTPUT_16_BIT, i2c,
offset=(0, 0, 0), scale=(1, 1, 1) address=0x0C,
mode=MODE_CONTINOUS_MEASURE_1,
output=OUTPUT_16_BIT,
offset=(0, 0, 0),
scale=(1, 1, 1),
): ):
self.i2c = i2c self.i2c = i2c
self.address = address self.address = address
@@ -242,7 +255,7 @@ class AK8963:
self._adjustement = ( self._adjustement = (
(0.5 * (asax - 128)) / 128 + 1, (0.5 * (asax - 128)) / 128 + 1,
(0.5 * (asay - 128)) / 128 + 1, (0.5 * (asay - 128)) / 128 + 1,
(0.5 * (asaz - 128)) / 128 + 1 (0.5 * (asaz - 128)) / 128 + 1,
) )
# Power on # Power on
@@ -252,15 +265,14 @@ class AK8963:
self._so = _SO_16BIT self._so = _SO_16BIT
else: else:
self._so = _SO_14BIT self._so = _SO_14BIT
@property @property
def magnetic(self): def magnetic(self):
""" """
X, Y, Z axis micro-Tesla (uT) as floats. X, Y, Z axis micro-Tesla (uT) as floats.
""" """
xyz = list(self._register_three_shorts(_HXL)) xyz = list(self._register_three_shorts(_HXL))
self._register_char(_ST2) # Enable updating readings again self._register_char(_ST2) # Enable updating readings again
# Apply factory axial sensitivy adjustements # Apply factory axial sensitivy adjustements
xyz[0] *= self._adjustement[0] xyz[0] *= self._adjustement[0]
@@ -291,7 +303,7 @@ class AK8963:
@property @property
def whoami(self): def whoami(self):
""" Value of the whoami register. """ """Value of the whoami register."""
return self._register_char(_WIA) return self._register_char(_WIA)
def calibrate(self, count=3, delay=200): def calibrate(self, count=3, delay=200):
@@ -314,7 +326,6 @@ class AK8963:
maxz = max(maxz, reading[2]) maxz = max(maxz, reading[2])
count -= 1 count -= 1
# Hard iron correction # Hard iron correction
offset_x = (maxx + minx) / 2 offset_x = (maxx + minx) / 2
offset_y = (maxy + miny) / 2 offset_y = (maxy + miny) / 2
@@ -362,11 +373,12 @@ class AK8963:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class MPU9250: class MPU9250:
"""Class which provides interface to MPU9250 9-axis motion tracking device.""" """Class which provides interface to MPU9250 9-axis motion tracking device."""
def __init__(self, i2c, mpu6500 = None, ak8963 = None):
def __init__(self, i2c, mpu6500=None, ak8963=None):
if mpu6500 is None: if mpu6500 is None:
self.mpu6500 = MPU6500(i2c) self.mpu6500 = MPU6500(i2c)
else: else:
@@ -386,8 +398,8 @@ class MPU9250:
# """ # """
# return self.mpu6500.acceleration # return self.mpu6500.acceleration
def mpu9250_get_temperature(self): def mpu9250_get_temperature(self):
return self.mpu6500.temperature return self.mpu6500.temperature
def mpu9250_get_values(self): def mpu9250_get_values(self):
""" """
Acceleration measured by the sensor. By default will return a Acceleration measured by the sensor. By default will return a
@@ -395,7 +407,7 @@ class MPU9250:
pass `accel_fs=SF_G` parameter to the MPU6500 constructor. pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
""" """
g = self.mpu6500.acceleration() g = self.mpu6500.acceleration()
a = [round(x/9.8, 2) for x in g] a = [round(x / 9.8, 2) for x in g]
return tuple(a) return tuple(a)
def mpu9250_get_x(self): def mpu9250_get_x(self):
@@ -404,15 +416,15 @@ class MPU9250:
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g 3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor. pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
""" """
return round(self.mpu6500.acceleration()[0]/9.8, 2) return round(self.mpu6500.acceleration()[0] / 9.8, 2)
def mpu9250_get_y(self): def mpu9250_get_y(self):
""" """
Acceleration measured by the sensor. By default will return a Acceleration measured by the sensor. By default will return a
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g 3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor. pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
""" """
return round(self.mpu6500.acceleration()[1]/9.8, 2) return round(self.mpu6500.acceleration()[1] / 9.8, 2)
def mpu9250_get_z(self): def mpu9250_get_z(self):
""" """
@@ -420,45 +432,47 @@ class MPU9250:
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g 3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor. pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
""" """
return round(self.mpu6500.acceleration()[2]/9.8, 2) return round(self.mpu6500.acceleration()[2] / 9.8, 2)
def mpu9250_is_gesture(self, choice):
def mpu9250_is_gesture(self,choice): if choice == "face up":
if choice == 'face up': if self.mpu6500.acceleration()[2] <= -9:
if self.mpu6500.acceleration()[2] <= -9: return True
return True else:
else: return False
return False if choice == "face down":
if choice == 'face down': if self.mpu6500.acceleration()[2] >= 9:
if self.mpu6500.acceleration()[2] >= 9: return True
return True else:
else: return False
return False if choice == "shake":
if choice == 'shake': if (
if abs(self.mpu6500.acceleration()[0]) >= 9 and abs(self.mpu6500.acceleration()[1]) >= 9 : abs(self.mpu6500.acceleration()[0]) >= 9
return True and abs(self.mpu6500.acceleration()[1]) >= 9
else: ):
return False return True
if choice == 'up': else:
if self.mpu6500.acceleration()[1] >= 9: return False
return True if choice == "up":
else: if self.mpu6500.acceleration()[1] >= 9:
return False return True
if choice == 'down': else:
if self.mpu6500.acceleration()[1] <= -9: return False
return True if choice == "down":
else: if self.mpu6500.acceleration()[1] <= -9:
return False return True
if choice == 'right': else:
if self.mpu6500.acceleration()[0] <= -9: return False
return True if choice == "right":
else: if self.mpu6500.acceleration()[0] <= -9:
return False return True
if choice == 'left': else:
if self.mpu6500.acceleration()[0] >= 9: return False
return True if choice == "left":
else: if self.mpu6500.acceleration()[0] >= 9:
return False return True
else:
return False
@property @property
def mpu9250_gyro(self): def mpu9250_gyro(self):
@@ -499,23 +513,27 @@ class MPU9250:
def mpu9250_magnetic_values(self): def mpu9250_magnetic_values(self):
return self.mpu9250_magnetic return self.mpu9250_magnetic
# @property # @property
def mpu9250_get_field_strength(self): def mpu9250_get_field_strength(self):
x=self.mpu9250_magnetic[0] x = self.mpu9250_magnetic[0]
y=self.mpu9250_magnetic[1] y = self.mpu9250_magnetic[1]
z=self.mpu9250_magnetic[2] z = self.mpu9250_magnetic[2]
return (x**2+y**2+z**2)**0.5*1000 return (x**2 + y**2 + z**2) ** 0.5 * 1000
def mpu9250_heading(self): def mpu9250_heading(self):
x=self.mpu9250_magnetic[0] x = self.mpu9250_magnetic[0]
y=self.mpu9250_magnetic[1] y = self.mpu9250_magnetic[1]
z=self.mpu9250_magnetic[2] z = self.mpu9250_magnetic[2]
a=math.atan(z/x) a = math.atan(z / x)
b=math.atan(z/y) b = math.atan(z / y)
xr=x*math.cos(a)+y*math.sin(a)*math.sin(b)-z*math.cos(b)*math.sin(a) xr = (
yr=x*math.cos(b)+z*math.sin(b) x * math.cos(a)
return 60*math.atan(yr/xr) + 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)
@property @property
def whoami(self): def whoami(self):
@@ -527,6 +545,7 @@ class MPU9250:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class Compass: class Compass:
RAD_TO_DEG = 57.295779513082320876798154814105 RAD_TO_DEG = 57.295779513082320876798154814105
@@ -547,20 +566,23 @@ class Compass:
def heading(self): def heading(self):
from math import atan2 from math import atan2
xyz = self.sensor.mpu9250_magnetic xyz = self.sensor.mpu9250_magnetic
return int(((atan2(xyz[1], xyz[0]) * Compass.RAD_TO_DEG) + 180) % 360) return int(((atan2(xyz[1], xyz[0]) * Compass.RAD_TO_DEG) + 180) % 360)
def is_calibrate(self): def is_calibrate(self):
try: try:
import compass_cfg import compass_cfg
return True return True
except Exception as e: except Exception as e:
return False return False
def reset_calibrate(self): def reset_calibrate(self):
import os import os
os.remove("compass_cfg.py") os.remove("compass_cfg.py")
# compass = mpu # compass = mpu
# accelerometer = mpu # accelerometer = mpu

View File

@@ -8,135 +8,136 @@ Micropython library for the MS32006 step diever
dahanzimin From the Mixly Team dahanzimin From the Mixly Team
""" """
import time import time
from micropython import const from micropython import const
MS32006_REG_RESET = const(0x00) #复位 MS32006_REG_RESET = const(0x00) # 复位
MS32006_FCLK = const(25000000) #芯片输入时钟选择,此参数与运动速度有关。 范围是5-30MHZ MS32006_FCLK = const(
25000000
) # 芯片输入时钟选择,此参数与运动速度有关。 范围是5-30MHZ
ADDRESS_A = 0x10
ADDRESS_B = 0x18
MOT_FULL = 0
MOT_HALF = 1
MOT_A = 0
MOT_B = 4
MOT_N = 0
MOT_CW = 1
MOT_CCW = 2
MOT_P = 3
ADDRESS_A = 0x10
ADDRESS_B = 0x18
MOT_FULL = 0
MOT_HALF = 1
MOT_A = 0
MOT_B = 4
MOT_N = 0
MOT_CW = 1
MOT_CCW = 2
MOT_P = 3
class MS32006: class MS32006:
_buffer = bytearray(2) _buffer = bytearray(2)
def __init__(self, i2c_bus,addr=ADDRESS_A,mode=MOT_FULL): def __init__(self, i2c_bus, addr=ADDRESS_A, mode=MOT_FULL):
self._device = i2c_bus self._device = i2c_bus
self._address = addr self._address = addr
self.reset() self.reset()
self.mode=mode self.mode = mode
def _read_u8(self, address): def _read_u8(self, address):
self._buffer[0] = address & 0xFF self._buffer[0] = address & 0xFF
self._device.writeto(self._address,self._buffer) self._device.writeto(self._address, self._buffer)
self._device.readfrom_into(self._address,self._buffer) self._device.readfrom_into(self._address, self._buffer)
return self._buffer[0] return self._buffer[0]
def _write_u8(self, address, val):
self._buffer[0] = address & 0xFF
self._buffer[1] = val & 0xFF
self._device.writeto(self._address,self._buffer)
def reset(self): def _write_u8(self, address, val):
self._write_u8(MS32006_REG_RESET,0x00) self._buffer[0] = address & 0xFF
time.sleep(0.1) self._buffer[1] = val & 0xFF
self._write_u8(MS32006_REG_RESET,0xC1) self._device.writeto(self._address, self._buffer)
def move(self,moto,mot_dir,mot_pps,mot_step):
readstate_0H = self._read_u8(0x00)
readstate_9H = self._read_u8(0x09)
speed_data=MS32006_FCLK//mot_pps//128 #设置速度 xx pps 128是固定参数
if speed_data<32: #限定转速
speed_data=32
elif speed_data>16383:
speed_data=16383
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
if mot_step>2047:
raise AttributeError("Reach the set upper limit, up to 2047 step")
mot_step_l=mot_step&0x00ff
mot_step_h=mot_step//0x100
mot_step_h|=0x80
if mot_dir==MOT_CW:
mot_step_h&=0xBF
else:
mot_step_h|=0x40
self._write_u8(0x01+moto,mot_speed_l)
self._write_u8(0x02+moto,mot_speed_h)
self._write_u8(0x03+moto,mot_step_l)
self._write_u8(0x04+moto,mot_step_h)
if moto==MOT_A:
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(0x09, readstate_9H|0x40)
def close(self,moto): #停止并关闭输出
if moto==MOT_A:
self._write_u8(0x04,0x00)
else:
self._write_u8(0x08,0x00)
def stop(self,moto): #此停止函数,强制让电机停止 def reset(self):
readstate = self._read_u8(0x00) self._write_u8(MS32006_REG_RESET, 0x00)
if moto==MOT_A: time.sleep(0.1)
self._write_u8(0x00,readstate|0x04) self._write_u8(MS32006_REG_RESET, 0xC1)
else:
self._write_u8(0x00,readstate|0x02)
def readstep(self,moto): #读取电机运动步数
if moto==MOT_A:
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
def readbusy(self,moto): #读取电机缓存是否有数据 def move(self, moto, mot_dir, mot_pps, mot_step):
if moto==MOT_A: readstate_0H = self._read_u8(0x00)
busy =(self._read_u8(0x0b)>>6)&1 readstate_9H = self._read_u8(0x09)
else: speed_data = MS32006_FCLK // mot_pps // 128 # 设置速度 xx pps 128是固定参数
busy =(self._read_u8(0x0d)>>6)&1
return bool(busy) if speed_data < 32: # 限定转速
speed_data = 32
def readwork(self,moto): #读取电机是否在运行 elif speed_data > 16383:
if moto==MOT_A: speed_data = 16383
busy =(self._read_u8(0x0b)>>4)&1
else: mot_speed_l = speed_data & 0x00FF # 取低8位
busy =(self._read_u8(0x0d)>>4)&1 mot_speed_h = speed_data // 0x100 # 取高6位
return bool(busy)
if self.mode == MOT_FULL: # 设置整步、半步驱动模式
def dc_motor(self,state,speed): #直流电机驱动 mot_speed_h |= 0x80
if (state==MOT_CW) | (state==MOT_CCW) : else:
speed_st=speed*127//100 |0x80 mot_speed_h &= 0x7F
self._write_u8(0x0A,speed_st)
if mot_step > 2047:
readstate = self._read_u8(0x09) & 0xA0 raise AttributeError("Reach the set upper limit, up to 2047 step")
state_st=(state<<2) | 0X03 | readstate
self._write_u8(0x09,state_st) mot_step_l = mot_step & 0x00FF
mot_step_h = mot_step // 0x100
mot_step_h |= 0x80
if mot_dir == MOT_CW:
mot_step_h &= 0xBF
else:
mot_step_h |= 0x40
self._write_u8(0x01 + moto, mot_speed_l)
self._write_u8(0x02 + moto, mot_speed_h)
self._write_u8(0x03 + moto, mot_step_l)
self._write_u8(0x04 + moto, mot_step_h)
if moto == MOT_A:
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(0x09, readstate_9H | 0x40)
def close(self, moto): # 停止并关闭输出
if moto == MOT_A:
self._write_u8(0x04, 0x00)
else:
self._write_u8(0x08, 0x00)
def stop(self, moto): # 此停止函数,强制让电机停止
readstate = self._read_u8(0x00)
if moto == MOT_A:
self._write_u8(0x00, readstate | 0x04)
else:
self._write_u8(0x00, readstate | 0x02)
def readstep(self, moto): # 读取电机运动步数
if moto == MOT_A:
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
def readbusy(self, moto): # 读取电机缓存是否有数据
if moto == MOT_A:
busy = (self._read_u8(0x0B) >> 6) & 1
else:
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
else:
busy = (self._read_u8(0x0D) >> 4) & 1
return bool(busy)
def dc_motor(self, state, speed): # 直流电机驱动
if (state == MOT_CW) | (state == MOT_CCW):
speed_st = speed * 127 // 100 | 0x80
self._write_u8(0x0A, speed_st)
readstate = self._read_u8(0x09) & 0xA0
state_st = (state << 2) | 0x03 | readstate
self._write_u8(0x09, state_st)

View File

@@ -1,30 +1,31 @@
import network,time,board import network, time, board
from machine import UART from machine import UART
import time import time
def wifi_init(RX_Pin,TX_Pin):
board.register(TX_Pin,board.FPIOA.UART2_TX) def wifi_init(RX_Pin, TX_Pin):
board.register(RX_Pin,board.FPIOA.UART2_RX) board.register(TX_Pin, board.FPIOA.UART2_TX)
board.register(RX_Pin, board.FPIOA.UART2_RX)
uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=1024*16)
T1=time.ticks_ms() uart = UART(UART.UART2, 115200, timeout=1000, read_buf_len=1024 * 16)
while True: T1 = time.ticks_ms()
tmp=uart.read() while True:
if tmp: tmp = uart.read()
if tmp.endswith("OK\r\n"): if tmp:
break if tmp.endswith("OK\r\n"):
else: break
uart.write("AT+RST\r\n") else:
time.sleep_ms(20) uart.write("AT+RST\r\n")
if time.ticks_diff(time.ticks_ms(), T1) >2000: time.sleep_ms(20)
raise AttributeError("ESP-AT not connected or needs to be reset") if time.ticks_diff(time.ticks_ms(), T1) > 2000:
try: raise AttributeError("ESP-AT not connected or needs to be reset")
nic = network.ESP8285(uart) try:
time.sleep(1) nic = network.ESP8285(uart)
print("ESP-AT OK") time.sleep(1)
return nic print("ESP-AT OK")
except Exception: return nic
raise AttributeError("ESP-AT Connection Failed") except Exception:
raise AttributeError("ESP-AT Connection Failed")
def wifi_deal_ap_info(info): def wifi_deal_ap_info(info):
@@ -40,9 +41,9 @@ def wifi_deal_ap_info(info):
res.append(info_one) res.append(info_one)
return res return res
def scans(nic):
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
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 import time
from math import pi, isnan from math import pi, isnan
class PID: class PID:
_kp = _ki = _kd = _integrator = _imax = 0 _kp = _ki = _kd = _integrator = _imax = 0
_last_error = _last_derivative = _last_t = 0 _last_error = _last_derivative = _last_t = 0
_RC = 1/(2 * pi * 20) _RC = 1 / (2 * pi * 20)
def __init__(self, p=0, i=0, d=0, imax=0): def __init__(self, p=0, i=0, d=0, imax=0):
self._kp = float(p) self._kp = float(p)
self._ki = float(i) self._ki = float(i)
self._kd = float(d) self._kd = float(d)
self._imax = abs(imax) self._imax = abs(imax)
self._last_derivative = float('nan') self._last_derivative = float("nan")
def get_pid(self, error, scaler): def get_pid(self, error, scaler):
tnow = time.ticks_ms() tnow = time.ticks_ms()
@@ -28,19 +30,23 @@ class PID:
self._last_derivative = 0 self._last_derivative = 0
else: else:
derivative = (error - self._last_error) / delta_time derivative = (error - self._last_error) / delta_time
derivative = self._last_derivative + \ derivative = self._last_derivative + (
((delta_time / (self._RC + delta_time)) * \ (delta_time / (self._RC + delta_time))
(derivative - self._last_derivative)) * (derivative - self._last_derivative)
)
self._last_error = error self._last_error = error
self._last_derivative = derivative self._last_derivative = derivative
output += self._kd * derivative output += self._kd * derivative
output *= scaler output *= scaler
if abs(self._ki) > 0 and dt > 0: if abs(self._ki) > 0 and dt > 0:
self._integrator += (error * self._ki) * scaler * delta_time self._integrator += (error * self._ki) * scaler * delta_time
if self._integrator < -self._imax: self._integrator = -self._imax if self._integrator < -self._imax:
elif self._integrator > self._imax: self._integrator = self._imax self._integrator = -self._imax
elif self._integrator > self._imax:
self._integrator = self._imax
output += self._integrator output += self._integrator
return output return output
def reset_I(self): def reset_I(self):
self._integrator = 0 self._integrator = 0
self._last_derivative = float('nan') self._last_derivative = float("nan")

View File

@@ -1,128 +1,151 @@
import board import board
import audio,video import audio, video
from Maix import I2S from Maix import I2S
import gc import gc
spk_b=None
spk_d=None
spk_w=None
def spk_init(BLK=8,WS=9,DAT=10,sample_rate=16000): spk_b = None
global spk_b spk_d = None
global spk_d spk_w = None
global spk_w
spk_b=BLK
spk_d=DAT
spk_w=WS
board.register(DAT,board.FPIOA.I2S0_OUT_D1)
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.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.set_sample_rate(sample_rate)
return wav_dev
def audio_play(I2S,path,num=80): def spk_init(BLK=8, WS=9, DAT=10, sample_rate=16000):
try: global spk_b
player = audio.Audio(path=path) global spk_d
except Exception as e: global spk_w
raise NameError("No audio file loaded or {}".format(e)) spk_b = BLK
player.volume(num) spk_d = DAT
wav_info=player.play_process(I2S) spk_w = WS
I2S.set_sample_rate(wav_info[1]) board.register(DAT, board.FPIOA.I2S0_OUT_D1)
while True: board.register(BLK, board.FPIOA.I2S0_SCLK)
ret = player.play() board.register(WS, board.FPIOA.I2S0_WS)
if ret == None: wav_dev = I2S(I2S.DEVICE_0)
print("Format Error") wav_dev.channel_config(
break I2S.CHANNEL_1,
elif ret == 0: I2S.TRANSMITTER,
print("Play end \n") resolution=I2S.RESOLUTION_16_BIT,
player.finish() cycles=I2S.SCLK_CYCLES_32,
break align_mode=I2S.STANDARD_MODE,
player.__deinit__() )
gc.collect() wav_dev.set_sample_rate(sample_rate)
spk_rep = wav_dev
def audio_record(I2S,path,record_time,sample_rate=16000): return wav_dev
try:
recorder = audio.Audio(path=path, is_create=True, samplerate=sample_rate)
except Exception as e:
raise NameError("Need audio storage location or {}".format(e))
queue = []
frame_cnt = record_time*sample_rate//2048
for i in range(frame_cnt):
tmp = I2S.record(2048*2)
if len(queue) > 0:
ret = recorder.record(queue[0])
queue.pop(0)
I2S.wait_record()
queue.append(tmp)
print("record:{}s".format(round(((frame_cnt-i-1)/7.7) ,1)))
recorder.finish()
recorder.__deinit__()
del recorder
print("Audio record finish \n")
gc.collect()
def video_play(I2S1,path,num=80):
try:
global spk_b
global spk_d
global spk_w
import lcd
lcd.init()
I2S=spk_init(spk_b,spk_w,spk_d)
vide = video.open(path)
except Exception as e:
raise NameError("No video file loaded or {}".format(e))
vide.volume(num)
while True:
try:
ret = vide.play()
except Exception as e:
raise NameError("Video format error or {}".format(e))
if ret == None:
print("Format Error")
break
elif ret == 0:
print("Play end \n")
break
vide.__del__()
del vide
del I2S
gc.collect()
def video_record(I2S,path,record_time): def mic_init(BLK=35, WS=33, DAT=34, sample_rate=16000):
import sensor,lcd board.register(DAT, board.FPIOA.I2S2_IN_D0)
lcd.init() board.register(BLK, board.FPIOA.I2S2_SCLK)
try: board.register(WS, board.FPIOA.I2S2_WS)
v = video.open(path, audio=False, record=True, interval=200000, quality=80,width=240, height=240) wav_dev = I2S(I2S.DEVICE_2)
except Exception as e: wav_dev.channel_config(
raise NameError("Need video storage location or {}".format(e)) I2S.CHANNEL_0,
record_time=record_time*5 I2S.RECEIVER,
for i in range(record_time): resolution=I2S.RESOLUTION_16_BIT,
try: cycles=I2S.SCLK_CYCLES_32,
img = sensor.snapshot() align_mode=I2S.STANDARD_MODE,
except : )
raise NameError("Need to initialize camera") wav_dev.set_sample_rate(sample_rate)
lcd.display(img) return wav_dev
v.record(img)
print("record {}s".format(round((record_time-i-1)*0.2,1)))
v.record_finish()
print("Video record finish \n")
v.__del__()
gc.collect()
def audio_play(I2S, path, num=80):
try:
player = audio.Audio(path=path)
except Exception as e:
raise NameError("No audio file loaded or {}".format(e))
player.volume(num)
wav_info = player.play_process(I2S)
I2S.set_sample_rate(wav_info[1])
while True:
ret = player.play()
if ret == None:
print("Format Error")
break
elif ret == 0:
print("Play end \n")
player.finish()
break
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)
except Exception as e:
raise NameError("Need audio storage location or {}".format(e))
queue = []
frame_cnt = record_time * sample_rate // 2048
for i in range(frame_cnt):
tmp = I2S.record(2048 * 2)
if len(queue) > 0:
ret = recorder.record(queue[0])
queue.pop(0)
I2S.wait_record()
queue.append(tmp)
print("record:{}s".format(round(((frame_cnt - i - 1) / 7.7), 1)))
recorder.finish()
recorder.__deinit__()
del recorder
print("Audio record finish \n")
gc.collect()
def video_play(I2S1, path, num=80):
try:
global spk_b
global spk_d
global spk_w
import lcd
lcd.init()
I2S = spk_init(spk_b, spk_w, spk_d)
vide = video.open(path)
except Exception as e:
raise NameError("No video file loaded or {}".format(e))
vide.volume(num)
while True:
try:
ret = vide.play()
except Exception as e:
raise NameError("Video format error or {}".format(e))
if ret == None:
print("Format Error")
break
elif ret == 0:
print("Play end \n")
break
vide.__del__()
del vide
del I2S
gc.collect()
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,
)
except Exception as e:
raise NameError("Need video storage location or {}".format(e))
record_time = record_time * 5
for i in range(record_time):
try:
img = sensor.snapshot()
except:
raise NameError("Need to initialize camera")
lcd.display(img)
v.record(img)
print("record {}s".format(round((record_time - i - 1) * 0.2, 1)))
v.record_finish()
print("Video record finish \n")
v.__del__()
gc.collect()

View File

@@ -1,33 +1,35 @@
try: try:
import image import image
image.font_free()
image.font_free()
except: except:
pass pass
try: try:
import lcd,time,gc,machine import lcd, time, gc, machine
lcd.init(color=0x0000) lcd.init(color=0x0000)
lcd.draw_string(48,100, "Welcome to MixGo!", lcd.YELLOW, lcd.BLACK) lcd.draw_string(48, 100, "Welcome to MixGo!", lcd.YELLOW, lcd.BLACK)
lcd.draw_string(62,132, "loading .", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading .", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading ..", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading ..", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading ...", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading ...", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading ....", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading ....", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading .....", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading .....", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading ......", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading ......", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading .......", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading .......", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.clear(0x0000) lcd.clear(0x0000)
del time del time
del lcd del lcd
del gc del gc
finally: finally:
import gc import gc
gc.collect()
gc.collect()

View File

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

View File

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

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
class QJ00X_MP3: class QJ00X_MP3:
def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01): def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01):
uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600) uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600)
@@ -9,64 +10,64 @@ class QJ00X_MP3:
self.pause() self.pause()
def _send_cmd(self, length, cmd, data_high=None, data_low=None): def _send_cmd(self, length, cmd, data_high=None, data_low=None):
uart.write(b'\x7E') uart.write(b"\x7E")
uart.write(bytes([length])) uart.write(bytes([length]))
uart.write(bytes([cmd])) uart.write(bytes([cmd]))
if data_high != None: if data_high != None:
uart.write(bytes([data_high])) uart.write(bytes([data_high]))
if data_low != None: if data_low != None:
uart.write(bytes([data_low])) uart.write(bytes([data_low]))
uart.write(b'\xEF') uart.write(b"\xEF")
sleep(200) sleep(200)
#下一曲 # 下一曲
def next_track(self): def next_track(self):
self._send_cmd(0x02, 0x03) self._send_cmd(0x02, 0x03)
#上一曲 # 上一曲
def prev_track(self): def prev_track(self):
self._send_cmd(0x02, 0x04) self._send_cmd(0x02, 0x04)
#选择曲目 # 选择曲目
def sel_track(self, track_index): def sel_track(self, track_index):
self._send_cmd(0x03, track_index) self._send_cmd(0x03, track_index)
#音量+ # 音量+
def inc_vol(self): def inc_vol(self):
self._send_cmd(0x02, 0x05) self._send_cmd(0x02, 0x05)
#音量- # 音量-
def dec_vol(self): def dec_vol(self):
self._send_cmd(0x02, 0x06) self._send_cmd(0x02, 0x06)
#设置音量 # 设置音量
def set_vol(self, volume): def set_vol(self, volume):
self._send_cmd(0x03, 0x31, data_high=volume) self._send_cmd(0x03, 0x31, data_high=volume)
#设置音效 # 设置音效
def set_eq(self, equalizer): def set_eq(self, equalizer):
self._send_cmd(0x03, 0x32, data_high=equalizer) self._send_cmd(0x03, 0x32, data_high=equalizer)
#设置播放设备 # 设置播放设备
def set_mode(self, mode): def set_mode(self, mode):
self._send_cmd(0x03, 0x35, data_high=mode) self._send_cmd(0x03, 0x35, data_high=mode)
#播放 # 播放
def play(self): def play(self):
self._send_cmd(0x02, 0x01) self._send_cmd(0x02, 0x01)
#终止播放 # 终止播放
def pause(self): def pause(self):
self._send_cmd(0x02, 0x02) self._send_cmd(0x02, 0x02)
#设置文件夹播放 # 设置文件夹播放
def set_folder(self, folder_index, music_index): def set_folder(self, folder_index, music_index):
self._send_cmd(0x04, 0x42, data_high=folder_index, data_low=music_index) self._send_cmd(0x04, 0x42, data_high=folder_index, data_low=music_index)
#设置曲目播放 # 设置曲目播放
def playFileByIndexNumber(self, music_index): def playFileByIndexNumber(self, music_index):
self._send_cmd(0x04, 0x41, data_high=0x00, data_low=music_index) self._send_cmd(0x04, 0x41, data_high=0x00, data_low=music_index)
#设置循环 # 设置循环
def set_loop(self, mode): def set_loop(self, mode):
self._send_cmd(0x03, 0x33, data_high=mode) self._send_cmd(0x03, 0x33, data_high=mode)

View File

@@ -1,16 +1,18 @@
from microbit import * from microbit import *
DS1307_I2C_ADDRESS = (104) DS1307_I2C_ADDRESS = 104
DS1307_REG_SECOND = (0) DS1307_REG_SECOND = 0
DS1307_REG_MINUTE = (1) DS1307_REG_MINUTE = 1
DS1307_REG_HOUR = (2) DS1307_REG_HOUR = 2
DS1307_REG_WEEKDAY = (3) DS1307_REG_WEEKDAY = 3
DS1307_REG_DAY = (4) DS1307_REG_DAY = 4
DS1307_REG_MONTH = (5) DS1307_REG_MONTH = 5
DS1307_REG_YEAR = (6) DS1307_REG_YEAR = 6
DS1307_REG_CTRL = (7) DS1307_REG_CTRL = 7
DS1307_REG_RAM = (8) DS1307_REG_RAM = 8
class DS1307():
class DS1307:
# set reg # set reg
def setReg(self, reg, dat): def setReg(self, reg, dat):
i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat])) i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat]))
@@ -23,17 +25,17 @@ class DS1307():
def start(self): def start(self):
t = self.getReg(DS1307_REG_SECOND) t = self.getReg(DS1307_REG_SECOND)
self.setReg(DS1307_REG_SECOND, t&0x7F) self.setReg(DS1307_REG_SECOND, t & 0x7F)
def stop(self): def stop(self):
t = self.getReg(DS1307_REG_SECOND) t = self.getReg(DS1307_REG_SECOND)
self.setReg(DS1307_REG_SECOND, t|0x80) self.setReg(DS1307_REG_SECOND, t | 0x80)
def DecToHex(self, dat): def DecToHex(self, dat):
return (dat//10) * 16 + (dat%10) return (dat // 10) * 16 + (dat % 10)
def HexToDec(self, dat): def HexToDec(self, dat):
return (dat//16) * 10 + (dat%16) return (dat // 16) * 10 + (dat % 16)
def DateTime(self, DT=None): def DateTime(self, DT=None):
if DT == None: if DT == None:
@@ -52,62 +54,62 @@ class DS1307():
else: else:
buf = bytearray(8) buf = bytearray(8)
buf[0] = 0 buf[0] = 0
buf[1] = self.DecToHex(DT[6]%60) # second buf[1] = self.DecToHex(DT[6] % 60) # second
buf[2] = self.DecToHex(DT[5]%60) # minute buf[2] = self.DecToHex(DT[5] % 60) # minute
buf[3] = self.DecToHex(DT[4]%24) # hour buf[3] = self.DecToHex(DT[4] % 24) # hour
buf[4] = self.DecToHex(DT[3]%8) # week day buf[4] = self.DecToHex(DT[3] % 8) # week day
buf[5] = self.DecToHex(DT[2]%32) # date buf[5] = self.DecToHex(DT[2] % 32) # date
buf[6] = self.DecToHex(DT[1]%13) # month buf[6] = self.DecToHex(DT[1] % 13) # month
buf[7] = self.DecToHex(DT[0]%100) # year buf[7] = self.DecToHex(DT[0] % 100) # year
i2c.write(DS1307_I2C_ADDRESS, buf) i2c.write(DS1307_I2C_ADDRESS, buf)
def Year(self, year = None): def Year(self, year=None):
if year == None: if year == None:
return self.HexToDec(self.getReg(DS1307_REG_YEAR)) + 2000 return self.HexToDec(self.getReg(DS1307_REG_YEAR)) + 2000
else: else:
self.setReg(DS1307_REG_YEAR, self.DecToHex(year%100)) self.setReg(DS1307_REG_YEAR, self.DecToHex(year % 100))
def Month(self, month = None): def Month(self, month=None):
if month == None: if month == None:
return self.HexToDec(self.getReg(DS1307_REG_MONTH)) return self.HexToDec(self.getReg(DS1307_REG_MONTH))
else: else:
self.setReg(DS1307_REG_MONTH, self.DecToHex(month%13)) self.setReg(DS1307_REG_MONTH, self.DecToHex(month % 13))
def Day(self, day = None): def Day(self, day=None):
if day == None: if day == None:
return self.HexToDec(self.getReg(DS1307_REG_DAY)) return self.HexToDec(self.getReg(DS1307_REG_DAY))
else: else:
self.setReg(DS1307_REG_DAY, self.DecToHex(day%32)) self.setReg(DS1307_REG_DAY, self.DecToHex(day % 32))
def Weekday(self, weekday = None): def Weekday(self, weekday=None):
if weekday == None: if weekday == None:
return self.HexToDec(self.getReg(DS1307_REG_WEEKDAY)) return self.HexToDec(self.getReg(DS1307_REG_WEEKDAY))
else: else:
self.setReg(DS1307_REG_WEEKDAY, self.DecToHex(weekday%8)) self.setReg(DS1307_REG_WEEKDAY, self.DecToHex(weekday % 8))
def Hour(self, hour = None): def Hour(self, hour=None):
if hour == None: if hour == None:
return self.HexToDec(self.getReg(DS1307_REG_HOUR)) return self.HexToDec(self.getReg(DS1307_REG_HOUR))
else: else:
self.setReg(DS1307_REG_HOUR, self.DecToHex(hour%24)) self.setReg(DS1307_REG_HOUR, self.DecToHex(hour % 24))
def Minute(self, minute = None): def Minute(self, minute=None):
if minute == None: if minute == None:
return self.HexToDec(self.getReg(DS1307_REG_MINUTE)) return self.HexToDec(self.getReg(DS1307_REG_MINUTE))
else: else:
self.setReg(DS1307_REG_MINUTE, self.DecToHex(minute%60)) self.setReg(DS1307_REG_MINUTE, self.DecToHex(minute % 60))
def Second(self, second = None): def Second(self, second=None):
if second == None: if second == None:
return self.HexToDec(self.getReg(DS1307_REG_SECOND)) return self.HexToDec(self.getReg(DS1307_REG_SECOND))
else: else:
self.setReg(DS1307_REG_SECOND, self.DecToHex(second%60)) self.setReg(DS1307_REG_SECOND, self.DecToHex(second % 60))
def ram(self, reg, dat = None): def ram(self, reg, dat=None):
if dat == None: if dat == None:
return self.getReg(DS1307_REG_RAM + (reg%56)) return self.getReg(DS1307_REG_RAM + (reg % 56))
else: else:
self.setReg(DS1307_REG_RAM + (reg%56), dat) self.setReg(DS1307_REG_RAM + (reg % 56), dat)
def get_time(self): def get_time(self):
return self.Hour() + self.Minute() + self.Second() return self.Hour() + self.Minute() + self.Second()
@@ -125,4 +127,5 @@ class DS1307():
self.Month(month) self.Month(month)
self.Day(day) self.Day(day)
ds = DS1307()
ds = DS1307()

View File

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

View File

@@ -1,64 +1,103 @@
from microbit import * from microbit import *
class TCS34725():
TCS34725_ADDRESS = 0x29 class TCS34725:
TCS34725_COMMAND_BIT = 0x80 TCS34725_ADDRESS = 0x29
TCS34725_ENABLE = 0x00 TCS34725_COMMAND_BIT = 0x80
TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer TCS34725_ENABLE = 0x00
TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
TCS34725_ENABLE_PON = 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer
TCS34725_ATIME = 0x01 # Integration time TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it
TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted TCS34725_ENABLE_PON = (
TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it
TCS34725_WTIME_204MS = 0xAB # WLONG0 = 204ms WLONG1 = 2.45s )
TCS34725_WTIME_614MS = 0x00 # WLONG0 = 614ms WLONG1 = 7.4s TCS34725_ATIME = 0x01 # Integration time
TCS34725_AILTL = 0x04 # Clear channel lower interrupt threshold TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted
TCS34725_AILTH = 0x05 TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold TCS34725_WTIME_204MS = 0xAB # WLONG0 = 204ms WLONG1 = 2.45s
TCS34725_AIHTH = 0x07 TCS34725_WTIME_614MS = 0x00 # WLONG0 = 614ms WLONG1 = 7.4s
TCS34725_PERS = 0x0C # Persistence register - basic SW filtering mechanism for interrupts TCS34725_AILTL = 0x04 # Clear channel lower interrupt threshold
TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt TCS34725_AILTH = 0x05
TCS34725_PERS_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values outside threshold range generates an interrupt TCS34725_AIHTH = 0x07
TCS34725_PERS_3_CYCLE = 0b0011 # 3 clean channel values outside threshold range generates an interrupt TCS34725_PERS = (
TCS34725_PERS_5_CYCLE = 0b0100 # 5 clean channel values outside threshold range generates an interrupt 0x0C # Persistence register - basic SW filtering mechanism for interrupts
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_NONE = 0b0000 # Every RGBC cycle generates an interrupt
TCS34725_PERS_20_CYCLE = 0b0111 # 20 clean channel values outside threshold range generates an interrupt TCS34725_PERS_1_CYCLE = (
TCS34725_PERS_25_CYCLE = 0b1000 # 25 clean channel values outside threshold range generates an interrupt 0b0001 # 1 clean channel value 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_2_CYCLE = (
TCS34725_PERS_40_CYCLE = 0b1011 # 40 clean channel values outside threshold range generates an interrupt 0b0010 # 2 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_3_CYCLE = (
TCS34725_PERS_55_CYCLE = 0b1110 # 55 clean channel values outside threshold range generates an interrupt 0b0011 # 3 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_PERS_5_CYCLE = (
TCS34725_CONFIG_WLONG = 0x02 # Choose between short and long (12x wait times via TCS34725_WTIME 0b0100 # 5 clean channel values outside threshold range generates an interrupt
TCS34725_CONTROL = 0x0F # Set the gain level for the sensor )
TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 TCS34725_PERS_10_CYCLE = (
TCS34725_STATUS = 0x13 0b0101 # 10 clean channel values outside threshold range generates an interrupt
TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt )
TCS34725_STATUS_AVALID = 0x01 # Indicates that the RGBC channels have completed an integration cycle TCS34725_PERS_15_CYCLE = (
TCS34725_CDATAL = 0x14 # Clear channel data 0b0110 # 15 clean channel values outside threshold range generates an interrupt
TCS34725_CDATAH = 0x15 )
TCS34725_RDATAL = 0x16 # Red channel data TCS34725_PERS_20_CYCLE = (
TCS34725_RDATAH = 0x17 0b0111 # 20 clean channel values outside threshold range generates an interrupt
TCS34725_GDATAL = 0x18 # Green channel data )
TCS34725_GDATAH = 0x19 TCS34725_PERS_25_CYCLE = (
TCS34725_BDATAL = 0x1A # Blue channel data 0b1000 # 25 clean channel values outside threshold range generates an interrupt
TCS34725_BDATAH = 0x1B )
TCS34725_PERS_30_CYCLE = (
# TCS34725_INTEGRATIONTIME_2_4MS = 0xFF, /**< 2.4ms - 1 cycle - Max Count: 1024 0b1001 # 30 clean channel values outside threshold range generates an interrupt
# TCS34725_INTEGRATIONTIME_24MS = 0xF6, /**< 24ms - 10 cycles - Max Count: 10240 )
# TCS34725_INTEGRATIONTIME_50MS = 0xEB, /**< 50ms - 20 cycles - Max Count: 20480 TCS34725_PERS_35_CYCLE = (
# TCS34725_INTEGRATIONTIME_101MS = 0xD5, /**< 101ms - 42 cycles - Max Count: 43008 0b1010 # 35 clean channel values outside threshold range generates an interrupt
# TCS34725_INTEGRATIONTIME_154MS = 0xC0, /**< 154ms - 64 cycles - Max Count: 65535 )
# TCS34725_INTEGRATIONTIME_700MS = 0x00 /**< 700ms - 256 cycles - Max Count: 65535 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_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_CDATAL = 0x14 # Clear channel data
TCS34725_CDATAH = 0x15
TCS34725_RDATAL = 0x16 # Red channel data
TCS34725_RDATAH = 0x17
TCS34725_GDATAL = 0x18 # Green channel data
TCS34725_GDATAH = 0x19
TCS34725_BDATAL = 0x1A # Blue channel data
TCS34725_BDATAH = 0x1B
# TCS34725_INTEGRATIONTIME_2_4MS = 0xFF, /**< 2.4ms - 1 cycle - Max Count: 1024
# TCS34725_INTEGRATIONTIME_24MS = 0xF6, /**< 24ms - 10 cycles - Max Count: 10240
# TCS34725_INTEGRATIONTIME_50MS = 0xEB, /**< 50ms - 20 cycles - Max Count: 20480
# TCS34725_INTEGRATIONTIME_101MS = 0xD5, /**< 101ms - 42 cycles - Max Count: 43008
# TCS34725_INTEGRATIONTIME_154MS = 0xC0, /**< 154ms - 64 cycles - Max Count: 65535
# TCS34725_INTEGRATIONTIME_700MS = 0x00 /**< 700ms - 256 cycles - Max Count: 65535
_tcs34725Initialised = False _tcs34725Initialised = False
_tcs34725Gain = 0 _tcs34725Gain = 0
@@ -66,57 +105,66 @@ class TCS34725():
def __init__(self, i2c): def __init__(self, i2c):
self.i2c = i2c self.i2c = i2c
#pass # pass
def write8(self, reg, val): def write8(self, reg, val):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF])) self.i2c.write(
self.TCS34725_ADDRESS,
bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF]),
)
def read16(self, reg): def read16(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])) self.i2c.write(
self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])
)
list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2) list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2)
bytes = list_bytes[1]<<8 | list_bytes[0] bytes = list_bytes[1] << 8 | list_bytes[0]
#return [ hex(x) for x in bytes ][0] # return [ hex(x) for x in bytes ][0]
return bytes return bytes
def read8(self, reg): def read8(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])) self.i2c.write(
self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])
)
return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0 return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0
def begin(self): def begin(self):
x = self.read8(self.TCS34725_ID) x = self.read8(self.TCS34725_ID)
#print(x) # print(x)
if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12 if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12
print('did not get the expected response from sensor: ', x) print("did not get the expected response from sensor: ", x)
return False return False
self._tcs34725Initialised = True self._tcs34725Initialised = True
self.setIntegrationTime(self._tcs34725IntegrationTime) self.setIntegrationTime(self._tcs34725IntegrationTime)
self.setGain(0) self.setGain(0)
self.enable() self.enable()
return True return True
def setIntegrationTime(self, theTime): def setIntegrationTime(self, theTime):
if theTime not in [0xFF,0xF6,0xEB,0xD5,0xC0,0x00]: if theTime not in [0xFF, 0xF6, 0xEB, 0xD5, 0xC0, 0x00]:
print('setting integration time to 0x00, %s is illegal' % theTime) print("setting integration time to 0x00, %s is illegal" % theTime)
theTime = 0x00 theTime = 0x00
self.write8(self.TCS34725_ATIME, theTime) self.write8(self.TCS34725_ATIME, theTime)
# self.i2c.write8(self.TCS34725_ATIME, theTime) # self.i2c.write8(self.TCS34725_ATIME, theTime)
self._tcs34725IntegrationTime = theTime self._tcs34725IntegrationTime = theTime
def setGain(self, gain): def setGain(self, gain):
# TCS34725_GAIN_1X = 0x00, /**< No gain # TCS34725_GAIN_1X = 0x00, /**< No gain
# TCS34725_GAIN_4X = 0x01, /**< 2x gain # TCS34725_GAIN_4X = 0x01, /**< 2x gain
# TCS34725_GAIN_16X = 0x02, /**< 16x gain # TCS34725_GAIN_16X = 0x02, /**< 16x gain
# TCS34725_GAIN_60X = 0x03 /**< 60x gain # TCS34725_GAIN_60X = 0x03 /**< 60x gain
if gain not in [0,1,2,3]: if gain not in [0, 1, 2, 3]:
print('setting gain to 0, %s is illegal' % gain) print("setting gain to 0, %s is illegal" % gain)
gain = 0 gain = 0
self.write8(self.TCS34725_CONTROL, gain) self.write8(self.TCS34725_CONTROL, gain)
self._tcs34725Gain = gain self._tcs34725Gain = gain
def enable(self): def enable(self):
self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON) self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON)
sleep(0.003) sleep(0.003)
self.write8(self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN)) self.write8(
self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN)
)
def getRawRGBData(self, type): def getRawRGBData(self, type):
if not self._tcs34725Initialised: if not self._tcs34725Initialised:
@@ -145,4 +193,5 @@ class TCS34725():
else: else:
return b return b
tcs = TCS34725(i2c)
tcs = TCS34725(i2c)

View File

@@ -1,6 +1,7 @@
from microbit import * from microbit import *
class LCD1602():
class LCD1602:
def __init__(self, lcd_i2c_addr): def __init__(self, lcd_i2c_addr):
self.buf = bytearray(1) self.buf = bytearray(1)
self.BK = 0x08 self.BK = 0x08
@@ -16,8 +17,8 @@ class LCD1602():
self.setcmd(0x0C) self.setcmd(0x0C)
self.setcmd(0x06) self.setcmd(0x06)
self.setcmd(0x01) self.setcmd(0x01)
self.version='1.0' self.version = "1.0"
self.lcd_i2c_addr=lcd_i2c_addr self.lcd_i2c_addr = lcd_i2c_addr
def setReg(self, dat): def setReg(self, dat):
self.buf[0] = dat self.buf[0] = dat
@@ -25,31 +26,31 @@ class LCD1602():
sleep(1) sleep(1)
def send(self, dat): def send(self, dat):
d=dat&0xF0 d = dat & 0xF0
d|=self.BK d |= self.BK
d|=self.RS d |= self.RS
self.setReg(d) self.setReg(d)
self.setReg(d|0x04) self.setReg(d | 0x04)
self.setReg(d) self.setReg(d)
def setcmd(self, cmd): def setcmd(self, cmd):
self.RS=0 self.RS = 0
self.send(cmd) self.send(cmd)
self.send(cmd<<4) self.send(cmd << 4)
def setdat(self, dat): def setdat(self, dat):
self.RS=1 self.RS = 1
self.send(dat) self.send(dat)
self.send(dat<<4) self.send(dat << 4)
def clear(self): def clear(self):
self.setcmd(1) self.setcmd(1)
def backlight(self, on): def backlight(self, on):
if on: if on:
self.BK=0x08 self.BK = 0x08
else: else:
self.BK=0 self.BK = 0
self.setdat(0) self.setdat(0)
def on(self): def on(self):
@@ -59,17 +60,17 @@ class LCD1602():
self.setcmd(0x08) self.setcmd(0x08)
def char(self, ch, x=-1, y=0): def char(self, ch, x=-1, y=0):
if x>=0: if x >= 0:
a=0x80 a = 0x80
if y>0: if y > 0:
a=0xC0 a = 0xC0
a+=x a += x
self.setcmd(a) self.setcmd(a)
self.setdat(ch) self.setdat(ch)
def puts(self, s, x=0, y=0): def puts(self, s, x=0, y=0):
if len(s)>0: if len(s) > 0:
self.char(ord(s[0]),x,y) self.char(ord(s[0]), x, y)
for i in range(1, len(s)): for i in range(1, len(s)):
self.char(ord(s[i])) self.char(ord(s[i]))
@@ -83,4 +84,4 @@ class LCD1602():
line1 = str(line1) line1 = str(line1)
line2 = str(line2) line2 = str(line2)
self.puts(self, line1, 0, 0) self.puts(self, line1, 0, 0)
self.puts(self, line2, 0, 1) self.puts(self, line2, 0, 1)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,37 +1,40 @@
from microbit import * from microbit import *
def motor1(v,d=1):
v = min(12,max(0,v)) def motor1(v, d=1):
if v==0: v = min(12, max(0, v))
if v == 0:
pin8.write_analog(0) pin8.write_analog(0)
pin16.write_analog(0) pin16.write_analog(0)
elif d==1: elif d == 1:
pin8.write_analog(int(v/12*1023)) pin8.write_analog(int(v / 12 * 1023))
pin16.write_analog(0) pin16.write_analog(0)
elif d==0: elif d == 0:
pin8.write_analog(0) pin8.write_analog(0)
pin16.write_analog(int(v/12*1023)) pin16.write_analog(int(v / 12 * 1023))
def motor2(v,d=1):
v = min(12,max(0,v)) def motor2(v, d=1):
if v==0: v = min(12, max(0, v))
if v == 0:
pin14.write_analog(0) pin14.write_analog(0)
pin13.write_analog(0) pin13.write_analog(0)
elif d==1: elif d == 1:
pin14.write_analog(int(v/12*1023)) pin14.write_analog(int(v / 12 * 1023))
pin13.write_analog(0) pin13.write_analog(0)
elif d==0: elif d == 0:
pin14.write_analog(0) pin14.write_analog(0)
pin13.write_analog(int(v/12*1023)) pin13.write_analog(int(v / 12 * 1023))
def motor3(v,d=1):
v = min(12,max(0,v)) def motor3(v, d=1):
if v==0: v = min(12, max(0, v))
if v == 0:
pin0.write_analog(0) pin0.write_analog(0)
pin15.write_analog(0) pin15.write_analog(0)
elif d==1: elif d == 1:
pin0.write_analog(int(v/12*1023)) pin0.write_analog(int(v / 12 * 1023))
pin15.write_analog(0) pin15.write_analog(0)
elif d==0: elif d == 0:
pin0.write_analog(0) pin0.write_analog(0)
pin15.write_analog(int(v/12*1023)) pin15.write_analog(int(v / 12 * 1023))

View File

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

View File

@@ -3,12 +3,13 @@ import time
import ustruct import ustruct
DATA_FORMAT = 0x31 DATA_FORMAT = 0x31
BW_RATE = 0x2c BW_RATE = 0x2C
POWER_CTL = 0x2d POWER_CTL = 0x2D
INT_ENABLE = 0x2E INT_ENABLE = 0x2E
OFSX = 0x1e OFSX = 0x1E
OFSY =0x1f OFSY = 0x1F
OFSZ =0x20 OFSZ = 0x20
class ADXL345: class ADXL345:
def __init__(self, i2c): def __init__(self, i2c):
@@ -18,51 +19,51 @@ class ADXL345:
for s in slv: for s in slv:
buf = self.i2c.readfrom_mem(s, 0, 1) buf = self.i2c.readfrom_mem(s, 0, 1)
print(buf) print(buf)
if(buf[0] == 0xe5): if buf[0] == 0xE5:
self.slvAddr = s self.slvAddr = s
print('adxl345 found') print("adxl345 found")
break break
#self.writeByte(POWER_CTL,0x00) #sleep # self.writeByte(POWER_CTL,0x00) #sleep
#time.sleep(0.001) # time.sleep(0.001)
#低电平中断输出,13位全分辨率,输出数据右对齐,16g量程 # 低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
self.writeByte(DATA_FORMAT,0x2B) self.writeByte(DATA_FORMAT, 0x2B)
#数据输出速度为100Hz # 数据输出速度为100Hz
self.writeByte(BW_RATE,0x0A) self.writeByte(BW_RATE, 0x0A)
#不使用中断 # 不使用中断
self.writeByte(INT_ENABLE,0x00) self.writeByte(INT_ENABLE, 0x00)
self.writeByte(OFSX,0x00) self.writeByte(OFSX, 0x00)
self.writeByte(OFSY,0x00) self.writeByte(OFSY, 0x00)
self.writeByte(OFSZ,0x00) self.writeByte(OFSZ, 0x00)
#链接使能,测量模式 # 链接使能,测量模式
self.writeByte(POWER_CTL,0x28) self.writeByte(POWER_CTL, 0x28)
time.sleep(1) time.sleep(1)
def readXYZ(self): def readXYZ(self):
fmt = '<h' #little-endian fmt = "<h" # little-endian
buf1 = self.readByte(0x32) buf1 = self.readByte(0x32)
buf2 = self.readByte(0x33) buf2 = self.readByte(0x33)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
x, = ustruct.unpack(fmt, buf) (x,) = ustruct.unpack(fmt, buf)
x = x*3.9 x = x * 3.9
#print('x:',x) # print('x:',x)
buf1 = self.readByte(0x34) buf1 = self.readByte(0x34)
buf2 = self.readByte(0x35) buf2 = self.readByte(0x35)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
y, = ustruct.unpack(fmt, buf) (y,) = ustruct.unpack(fmt, buf)
y = y*3.9 y = y * 3.9
#print('y:',y) # print('y:',y)
buf1 = self.readByte(0x36) buf1 = self.readByte(0x36)
buf2 = self.readByte(0x37) buf2 = self.readByte(0x37)
buf = bytearray([buf1[0], buf2[0]]) buf = bytearray([buf1[0], buf2[0]])
z, = ustruct.unpack(fmt, buf) (z,) = ustruct.unpack(fmt, buf)
z = z*3.9 z = z * 3.9
#print('z:',z) # print('z:',z)
#print('************************') # print('************************')
#time.sleep(0.5) # time.sleep(0.5)
return (x,y,z) return (x, y, z)
def readX(self): def readX(self):
return self.readXYZ()[0] return self.readXYZ()[0]
@@ -76,17 +77,19 @@ class ADXL345:
def writeByte(self, addr, data): def writeByte(self, addr, data):
d = bytearray([data]) d = bytearray([data])
self.i2c.writeto_mem(self.slvAddr, addr, d) self.i2c.writeto_mem(self.slvAddr, addr, d)
def readByte(self, addr): def readByte(self, addr):
return self.i2c.readfrom_mem(self.slvAddr, addr, 1) return self.i2c.readfrom_mem(self.slvAddr, addr, 1)
if __name__ == '__main__':
#初始化
sensor = ADXL345(i2c)
#getXYZ if __name__ == "__main__":
x,y,z = sensor.readXYZ() # 初始化
sensor = ADXL345(i2c)
#getX/Y/Z # getXYZ
x0 = sensor.readX() x, y, z = sensor.readXYZ()
y0 = sensor.readY()
z0 = sensor.readZ() # getX/Y/Z
x0 = sensor.readX()
y0 = sensor.readY()
z0 = sensor.readZ()

View File

@@ -1,16 +1,16 @@
import KPU as kpu import KPU as kpu
import gc,image,time import gc, image, time
import board import board
try: try:
kpu.deinit(task_fe) kpu.deinit(task_fe)
kpu.deinit(task_ld) kpu.deinit(task_ld)
kpu.deinit(task_fd) kpu.deinit(task_fd)
del task_fe del task_fe
del task_ld del task_ld
del task_fd del task_fd
except Exception: except Exception:
pass pass
@@ -20,114 +20,129 @@ record_ftr = []
record_ftrs = [] record_ftrs = []
img_face = image.Image(size=(128, 128)) img_face = image.Image(size=(128, 128))
a = img_face.pix_to_ai() a = img_face.pix_to_ai()
dst_point = [(44, 59), (84, 59), (64, 82), (47, 105),(81, 105)] dst_point = [(44, 59), (84, 59), (64, 82), (47, 105), (81, 105)]
start_processing = False start_processing = False
tim2 = time.ticks_ms() tim2 = time.ticks_ms()
task_fd=None task_fd = None
task_ld=None task_ld = None
task_fe=None task_fe = None
info=None info = None
bb=1 bb = 1
def set_key_state(*_): def set_key_state(*_):
global start_processing global start_processing
global tim2 global tim2
if (time.ticks_ms() - tim2 )> 4000: if (time.ticks_ms() - tim2) > 4000:
start_processing = True start_processing = True
tim2 = time.ticks_ms() tim2 = time.ticks_ms()
def init(FD,LD,FE): def init(FD, LD, FE):
global task_fd global task_fd
global task_ld global task_ld
global task_fe global task_fe
# task_fd = kpu.load(0x200000) # task_fd = kpu.load(0x200000)
# task_ld = kpu.load(0x300000) # task_ld = kpu.load(0x300000)
# task_fe = kpu.load(0x400000) # task_fe = kpu.load(0x400000)
task_fd = kpu.load(FD) task_fd = kpu.load(FD)
task_ld = kpu.load(LD) task_ld = kpu.load(LD)
task_fe = kpu.load(FE) task_fe = kpu.load(FE)
gc.collect()
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
kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor)
def train(img, names, threshold):
global task_fd
global task_ld
global task_fe
global start_processing
global info
global bb
code = kpu.run_yolo2(task_fd, img)
if code:
for i in code:
face_cut = img.cut(i.x(), i.y(), i.w(), i.h())
face_cut_128 = face_cut.resize(128, 128)
a = face_cut_128.pix_to_ai()
fmap = kpu.forward(task_ld, face_cut_128)
plist = fmap[:]
le = (i.x() + int(plist[0] * i.w() - 10), i.y() + int(plist[1] * i.h()))
re = (i.x() + int(plist[2] * i.w()), i.y() + int(plist[3] * i.h()))
nose = (i.x() + int(plist[4] * i.w()), i.y() + int(plist[5] * i.h()))
lm = (i.x() + int(plist[6] * i.w()), i.y() + int(plist[7] * i.h()))
rm = (i.x() + int(plist[8] * i.w()), i.y() + int(plist[9] * i.h()))
lb = i.rect()
src_point = [le, re, nose, lm, rm]
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
fmap = kpu.forward(task_fe, img_face)
feature = kpu.face_encode(fmap[:])
reg_flag = False
scores = []
for j in range(len(record_ftrs)):
score = kpu.face_compare(record_ftrs[j], feature)
scores.append(score)
max_score = 0
index = 0
for k in range(len(scores)):
if max_score < scores[k]:
max_score = scores[k]
index = k
if start_processing:
record_ftr = feature
record_ftrs.append(record_ftr)
start_processing = False
if max_score > threshold:
info = [names[index], max_score, lb, src_point]
else:
if bb == 1:
print("Please press BOOT key to enter the face")
bb = 0
info = [None, max_score, lb, src_point]
return True
break
else:
info = None
bb = 1
return False
gc.collect()
gc.collect()
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
kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor)
def train(img,names,threshold):
global task_fd
global task_ld
global task_fe
global start_processing
global info
global bb
code = kpu.run_yolo2(task_fd, img)
if code:
for i in code:
face_cut = img.cut(i.x(), i.y(), i.w(), i.h())
face_cut_128 = face_cut.resize(128, 128)
a = face_cut_128.pix_to_ai()
fmap = kpu.forward(task_ld, face_cut_128)
plist = fmap[:]
le = (i.x()+int(plist[0]*i.w() - 10), i.y()+int(plist[1]*i.h()))
re = (i.x()+int(plist[2]*i.w()), i.y()+int(plist[3]*i.h()))
nose = (i.x()+int(plist[4]*i.w()), i.y()+int(plist[5]*i.h()))
lm = (i.x()+int(plist[6]*i.w()), i.y()+int(plist[7]*i.h()))
rm = (i.x()+int(plist[8]*i.w()), i.y()+int(plist[9]*i.h()))
lb=i.rect()
src_point = [le, re, nose, lm, rm]
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)
fmap = kpu.forward(task_fe, img_face)
feature = kpu.face_encode(fmap[:])
reg_flag = False
scores = []
for j in range(len(record_ftrs)):
score = kpu.face_compare(record_ftrs[j], feature)
scores.append(score)
max_score = 0
index = 0
for k in range(len(scores)):
if max_score < scores[k]:
max_score = scores[k]
index = k
if start_processing:
record_ftr = feature
record_ftrs.append(record_ftr)
start_processing = False
if max_score > threshold:
info=[names[index],max_score,lb,src_point]
else:
if bb==1:
print("Please press BOOT key to enter the face")
bb=0
info=[None,max_score,lb,src_point]
return True
break
else:
info=None
bb=1
return False
gc.collect()
def info_name(): def info_name():
gc.collect() gc.collect()
return info[0] return info[0]
def info_score():
return info[1]
def info_face(): def info_score():
return info[2] return info[1]
def info_organs():
return info[3] def info_face():
return info[2]
def info_organs():
return info[3]

View File

@@ -1,25 +1,29 @@
import network,time,random,request,base64,json,board import network, time, random, request, base64, json, board
from machine import UART from machine import UART
wifi_en=board.pin(19,board.GPIO.OUT) wifi_en = board.pin(19, board.GPIO.OUT)
board.register(18,board.FPIOA.UART2_TX) board.register(18, board.FPIOA.UART2_TX)
board.register(17,board.FPIOA.UART2_RX) board.register(17, board.FPIOA.UART2_RX)
def wifi_enable(en): def wifi_enable(en):
global wifi_en global wifi_en
wifi_en.value(en) wifi_en.value(en)
def wifi_reset(): def wifi_reset():
global uart global uart
wifi_enable(0) wifi_enable(0)
time.sleep_ms(200) time.sleep_ms(200)
wifi_enable(1) wifi_enable(1)
time.sleep(2) time.sleep(2)
uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=4096) uart = UART(UART.UART2, 115200, timeout=1000, read_buf_len=4096)
tmp = uart.read() tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n") uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read()) print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data uart = UART(
UART.UART2, 921600, timeout=1000, read_buf_len=10240
) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n") uart.write("AT\r\n")
tmp = uart.read() tmp = uart.read()
print(tmp) print(tmp)
@@ -32,16 +36,17 @@ def wifi_reset():
return None return None
return nic return nic
def nic_init(account,password):
nic=wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account,password) def nic_init(account, password):
nic.ifconfig() nic = wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account, password)
nic.ifconfig()
class SimpleEncode(): class SimpleEncode:
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|" keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|"
keyLength = len(keyStr) keyLength = len(keyStr)
encryptionA = 17 encryptionA = 17
@@ -51,87 +56,87 @@ class SimpleEncode():
postCount = 5 postCount = 5
randomChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop" randomChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop"
randomCharLength = len(randomChar) randomCharLength = len(randomChar)
#base64字符 # base64字符
ALPHABET = "ABCDEFGHIJKLMN0123456789OPQRSTUVWXYZ+/abcdefghijklmnopqrstuvwxyz" ALPHABET = "ABCDEFGHIJKLMN0123456789OPQRSTUVWXYZ+/abcdefghijklmnopqrstuvwxyz"
STANDARD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" # 标准的字符串索引 STANDARD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" # 标准的字符串索引
#找到密钥 # 找到密钥
for i in range(1,keyLength): for i in range(1, keyLength):
if (encryptionA * i) % keyLength == 1: if (encryptionA * i) % keyLength == 1:
decodeA = i decodeA = i
def base64Encode(self,sourceStr): def base64Encode(self, sourceStr):
encode = "" encode = ""
for ch in base64.b64encode(sourceStr.encode()).decode(): for ch in base64.b64encode(sourceStr.encode()).decode():
if ch == '=': if ch == "=":
encode += '=' encode += "="
else: else:
for i in range(64): for i in range(64):
if ch == self.STANDARD[i]: if ch == self.STANDARD[i]:
encode += self.ALPHABET[i] encode += self.ALPHABET[i]
return encode return encode
def encrpyt(self,sourceStr): def encrpyt(self, sourceStr):
srcLength = len(sourceStr) srcLength = len(sourceStr)
#先加入干扰字符的数量 # 先加入干扰字符的数量
addCharCount = random.randint(1,self.preCountMax) if srcLength < self.preCountMax else 0 addCharCount = (
#随机字符 random.randint(1, self.preCountMax) if srcLength < self.preCountMax else 0
sb = str(addCharCount)+"|" )
# 随机字符
sb = str(addCharCount) + "|"
for i in range(addCharCount): for i in range(addCharCount):
sb += self.randomChar[random.randint(0,self.randomCharLength-1)] sb += self.randomChar[random.randint(0, self.randomCharLength - 1)]
sb += sourceStr sb += sourceStr
#尾部固定增加x个字符 # 尾部固定增加x个字符
for i in range(self.postCount): for i in range(self.postCount):
sb += self.randomChar[random.randint(0,self.randomCharLength-1)] sb += self.randomChar[random.randint(0, self.randomCharLength - 1)]
#base64 加密 # base64 加密
base64Str = self.base64Encode(sb) base64Str = self.base64Encode(sb)
destStr = '' destStr = ""
for i in range(len(base64Str)): for i in range(len(base64Str)):
#找到字符所在位置 # 找到字符所在位置
position = self.keyStr.find(base64Str[i]) position = self.keyStr.find(base64Str[i])
#对字符进行转换 # 对字符进行转换
y = (self.encryptionA * position + self.encryptionB) % self.keyLength y = (self.encryptionA * position + self.encryptionB) % self.keyLength
#找到替换后的字符 # 找到替换后的字符
destStr += self.keyStr[y] destStr += self.keyStr[y]
return destStr return destStr
def token(account,password):
url = 'http://ai.heclouds.com:9090/v1/user/oneNetLogin' def token(account, password):
url = "http://ai.heclouds.com:9090/v1/user/oneNetLogin"
headers = { headers = {
'Content-Type': 'application/json', "Content-Type": "application/json",
} }
simpleencode = SimpleEncode() simpleencode = SimpleEncode()
data = {'account': account, 'password': simpleencode.encrpyt(password)} data = {"account": account, "password": simpleencode.encrpyt(password)}
req = request.post(url, data=json.dumps(data), headers=headers) req = request.post(url, data=json.dumps(data), headers=headers)
#print(req.text) # print(req.text)
try: try:
return eval(req.text)['data']['loginToken'] return eval(req.text)["data"]["loginToken"]
except: except:
raise ValueError( "[Cool.AI]:Wrong account or password ") raise ValueError("[Cool.AI]:Wrong account or password ")
def post_ai(img,urlx,Token): def post_ai(img, urlx, Token):
ur = 'http://183.230.40.32:9090/v1/aiApi/picture/MixPY' ur = "http://183.230.40.32:9090/v1/aiApi/picture/MixPY"
url=ur.replace("MixPY",urlx) url = ur.replace("MixPY", urlx)
headers ={ headers = {"Content-Type": "application/json", "Login-Token": "Token"}
'Content-Type':'application/json',
'Login-Token':'Token' headers["Login-Token"] = Token
}
imge = img.compressed(quality=50)
headers['Login-Token']=Token file = imge.to_bytes()
str = base64.b64encode(file).decode()
imge = img.compressed(quality=50) data = {"picture": [str]}
file =imge.to_bytes() req = request.post(url, data=json.dumps(data), headers=headers)
str = base64.b64encode(file).decode() return json.loads(req.text)
data = {'picture':[str]} # return eval(req.text)
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 import binascii
__all__ = [ __all__ = [
'encode', 'decode', 'encodebytes', 'decodebytes', "encode",
'b64encode', 'b64decode', 'b32encode', 'b32decode', "decode",
'b16encode', 'b16decode', "encodebytes",
'standard_b64encode', 'standard_b64decode', "decodebytes",
'urlsafe_b64encode', 'urlsafe_b64decode', "b64encode",
] "b64decode",
"b32encode",
"b32decode",
"b16encode",
"b16decode",
"standard_b64encode",
"standard_b64decode",
"urlsafe_b64encode",
"urlsafe_b64decode",
]
bytes_types = (bytes, bytearray)
bytes_types = (bytes, bytearray)
def _bytes_from_decode_data(s): def _bytes_from_decode_data(s):
if isinstance(s, str): if isinstance(s, str):
try: try:
return s.encode('ascii') return s.encode("ascii")
except: except:
raise ValueError('string argument should contain only ASCII characters') raise ValueError("string argument should contain only ASCII characters")
elif isinstance(s, bytes_types): elif isinstance(s, bytes_types):
return s return s
else: else:
raise TypeError("argument should be bytes or ASCII string, not %s" % s.__class__.__name__) raise TypeError(
"argument should be bytes or ASCII string, not %s" % s.__class__.__name__
)
def b64encode(s, altchars=None): def b64encode(s, altchars=None):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
@@ -29,45 +42,73 @@ def b64encode(s, altchars=None):
encoded = binascii.b2a_base64(s)[:-1] encoded = binascii.b2a_base64(s)[:-1]
if altchars is not None: if altchars is not None:
if not isinstance(altchars, bytes_types): if not isinstance(altchars, bytes_types):
raise TypeError("expected bytes, not %s" raise TypeError("expected bytes, not %s" % altchars.__class__.__name__)
% altchars.__class__.__name__)
assert len(altchars) == 2, repr(altchars) assert len(altchars) == 2, repr(altchars)
return encoded.translate(bytes.maketrans(b'+/', altchars)) return encoded.translate(bytes.maketrans(b"+/", altchars))
return encoded return encoded
def b64decode(s, altchars=None, validate=False): def b64decode(s, altchars=None, validate=False):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
if altchars is not None: if altchars is not None:
altchars = _bytes_from_decode_data(altchars) altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars) assert len(altchars) == 2, repr(altchars)
s = s.translate(bytes.maketrans(altchars, b'+/')) s = s.translate(bytes.maketrans(altchars, b"+/"))
if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): if validate and not re.match(b"^[A-Za-z0-9+/]*={0,2}$", s):
raise binascii.Error('Non-base64 digit found') raise binascii.Error("Non-base64 digit found")
return binascii.a2b_base64(s) return binascii.a2b_base64(s)
def standard_b64encode(s): def standard_b64encode(s):
return b64encode(s) return b64encode(s)
def standard_b64decode(s): def standard_b64decode(s):
return b64decode(s) return b64decode(s)
def urlsafe_b64encode(s): def urlsafe_b64encode(s):
raise NotImplementedError() raise NotImplementedError()
def urlsafe_b64decode(s): def urlsafe_b64decode(s):
raise NotImplementedError() raise NotImplementedError()
_b32alphabet = { _b32alphabet = {
0: b'A', 9: b'J', 18: b'S', 27: b'3', 0: b"A",
1: b'B', 10: b'K', 19: b'T', 28: b'4', 9: b"J",
2: b'C', 11: b'L', 20: b'U', 29: b'5', 18: b"S",
3: b'D', 12: b'M', 21: b'V', 30: b'6', 27: b"3",
4: b'E', 13: b'N', 22: b'W', 31: b'7', 1: b"B",
5: b'F', 14: b'O', 23: b'X', 10: b"K",
6: b'G', 15: b'P', 24: b'Y', 19: b"T",
7: b'H', 16: b'Q', 25: b'Z', 28: b"4",
8: b'I', 17: b'R', 26: b'2', 2: b"C",
} 11: b"L",
20: b"U",
29: b"5",
3: b"D",
12: b"M",
21: b"V",
30: b"6",
4: b"E",
13: b"N",
22: b"W",
31: b"7",
5: b"F",
14: b"O",
23: b"X",
6: b"G",
15: b"P",
24: b"Y",
7: b"H",
16: b"Q",
25: b"Z",
8: b"I",
17: b"R",
26: b"2",
}
_b32tab = [v[0] for k, v in sorted(_b32alphabet.items())] _b32tab = [v[0] for k, v in sorted(_b32alphabet.items())]
_b32rev = dict([(v[0], k) for k, v in _b32alphabet.items()]) _b32rev = dict([(v[0], k) for k, v in _b32alphabet.items()])
@@ -82,26 +123,29 @@ def b32encode(s):
quanta += 1 quanta += 1
encoded = bytearray() encoded = bytearray()
for i in range(quanta): for i in range(quanta):
c1, c2, c3 = struct.unpack('!HHB', s[i*5:(i+1)*5]) c1, c2, c3 = struct.unpack("!HHB", s[i * 5 : (i + 1) * 5])
c2 += (c1 & 1) << 16 c2 += (c1 & 1) << 16
c3 += (c2 & 3) << 8 c3 += (c2 & 3) << 8
encoded += bytes([_b32tab[c1 >> 11], encoded += bytes(
_b32tab[(c1 >> 6) & 0x1f], [
_b32tab[(c1 >> 1) & 0x1f], _b32tab[c1 >> 11],
_b32tab[c2 >> 12], _b32tab[(c1 >> 6) & 0x1F],
_b32tab[(c2 >> 7) & 0x1f], _b32tab[(c1 >> 1) & 0x1F],
_b32tab[(c2 >> 2) & 0x1f], _b32tab[c2 >> 12],
_b32tab[c3 >> 5], _b32tab[(c2 >> 7) & 0x1F],
_b32tab[c3 & 0x1f], _b32tab[(c2 >> 2) & 0x1F],
]) _b32tab[c3 >> 5],
_b32tab[c3 & 0x1F],
]
)
if leftover == 1: if leftover == 1:
encoded = encoded[:-6] + b'======' encoded = encoded[:-6] + b"======"
elif leftover == 2: elif leftover == 2:
encoded = encoded[:-4] + b'====' encoded = encoded[:-4] + b"===="
elif leftover == 3: elif leftover == 3:
encoded = encoded[:-3] + b'===' encoded = encoded[:-3] + b"==="
elif leftover == 4: elif leftover == 4:
encoded = encoded[:-1] + b'=' encoded = encoded[:-1] + b"="
return bytes(encoded) return bytes(encoded)
@@ -109,14 +153,14 @@ def b32decode(s, casefold=False, map01=None):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
quanta, leftover = divmod(len(s), 8) quanta, leftover = divmod(len(s), 8)
if leftover: if leftover:
raise binascii.Error('Incorrect padding') raise binascii.Error("Incorrect padding")
if map01 is not None: if map01 is not None:
map01 = _bytes_from_decode_data(map01) map01 = _bytes_from_decode_data(map01)
assert len(map01) == 1, repr(map01) assert len(map01) == 1, repr(map01)
s = s.translate(bytes.maketrans(b'01', b'O' + map01)) s = s.translate(bytes.maketrans(b"01", b"O" + map01))
if casefold: if casefold:
s = s.upper() s = s.upper()
padchars = s.find(b'=') padchars = s.find(b"=")
if padchars > 0: if padchars > 0:
padchars = len(s) - padchars padchars = len(s) - padchars
s = s[:-padchars] s = s[:-padchars]
@@ -129,16 +173,16 @@ def b32decode(s, casefold=False, map01=None):
for c in s: for c in s:
val = _b32rev.get(c) val = _b32rev.get(c)
if val is None: if val is None:
raise binascii.Error('Non-base32 digit found') raise binascii.Error("Non-base32 digit found")
acc += _b32rev[c] << shift acc += _b32rev[c] << shift
shift -= 5 shift -= 5
if shift < 0: if shift < 0:
parts.append(binascii.unhexlify(bytes('%010x' % acc, "ascii"))) parts.append(binascii.unhexlify(bytes("%010x" % acc, "ascii")))
acc = 0 acc = 0
shift = 35 shift = 35
last = binascii.unhexlify(bytes('%010x' % acc, "ascii")) last = binascii.unhexlify(bytes("%010x" % acc, "ascii"))
if padchars == 0: if padchars == 0:
last = b'' last = b""
elif padchars == 1: elif padchars == 1:
last = last[:-1] last = last[:-1]
elif padchars == 3: elif padchars == 3:
@@ -148,9 +192,10 @@ def b32decode(s, casefold=False, map01=None):
elif padchars == 6: elif padchars == 6:
last = last[:-4] last = last[:-4]
else: else:
raise binascii.Error('Incorrect padding') raise binascii.Error("Incorrect padding")
parts.append(last) parts.append(last)
return b''.join(parts) return b"".join(parts)
def b16encode(s): def b16encode(s):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
@@ -162,12 +207,14 @@ def b16decode(s, casefold=False):
s = _bytes_from_decode_data(s) s = _bytes_from_decode_data(s)
if casefold: if casefold:
s = s.upper() s = s.upper()
if re.search(b'[^0-9A-F]', s): if re.search(b"[^0-9A-F]", s):
raise binascii.Error('Non-base16 digit found') raise binascii.Error("Non-base16 digit found")
return binascii.unhexlify(s) return binascii.unhexlify(s)
MAXLINESIZE = 76
MAXBINSIZE = (MAXLINESIZE//4)*3 MAXLINESIZE = 76
MAXBINSIZE = (MAXLINESIZE // 4) * 3
def encode(input, output): def encode(input, output):
while True: while True:
@@ -175,7 +222,7 @@ def encode(input, output):
if not s: if not s:
break break
while len(s) < MAXBINSIZE: while len(s) < MAXBINSIZE:
ns = input.read(MAXBINSIZE-len(s)) ns = input.read(MAXBINSIZE - len(s))
if not ns: if not ns:
break break
s += ns s += ns
@@ -191,6 +238,7 @@ def decode(input, output):
s = binascii.a2b_base64(line) s = binascii.a2b_base64(line)
output.write(s) output.write(s)
def encodebytes(s): def encodebytes(s):
if not isinstance(s, bytes_types): if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__) raise TypeError("expected bytes, not %s" % s.__class__.__name__)
@@ -200,10 +248,13 @@ def encodebytes(s):
pieces.append(binascii.b2a_base64(chunk)) pieces.append(binascii.b2a_base64(chunk))
return b"".join(pieces) return b"".join(pieces)
def encodestring(s): def encodestring(s):
import warnings import warnings
warnings.warn("encodestring() is a deprecated alias, use encodebytes()",
DeprecationWarning, 2) warnings.warn(
"encodestring() is a deprecated alias, use encodebytes()", DeprecationWarning, 2
)
return encodebytes(s) return encodebytes(s)
@@ -212,36 +263,50 @@ def decodebytes(s):
raise TypeError("expected bytes, not %s" % s.__class__.__name__) raise TypeError("expected bytes, not %s" % s.__class__.__name__)
return binascii.a2b_base64(s) return binascii.a2b_base64(s)
def decodestring(s): def decodestring(s):
import warnings import warnings
warnings.warn("decodestring() is a deprecated alias, use decodebytes()",
DeprecationWarning, 2) warnings.warn(
"decodestring() is a deprecated alias, use decodebytes()", DeprecationWarning, 2
)
return decodebytes(s) return decodebytes(s)
def main(): def main():
import sys, getopt import sys, getopt
try: try:
opts, args = getopt.getopt(sys.argv[1:], 'deut') opts, args = getopt.getopt(sys.argv[1:], "deut")
except getopt.error as msg: except getopt.error as msg:
sys.stdout = sys.stderr sys.stdout = sys.stderr
print(msg) print(msg)
print("""usage: %s [-d|-e|-u|-t] [file|-] print(
"""usage: %s [-d|-e|-u|-t] [file|-]
-d, -u: decode -d, -u: decode
-e: encode (default) -e: encode (default)
-t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0]) -t: encode and decode string 'Aladdin:open sesame'"""
% sys.argv[0]
)
sys.exit(2) sys.exit(2)
func = encode func = encode
for o, a in opts: for o, a in opts:
if o == '-e': func = encode if o == "-e":
if o == '-d': func = decode func = encode
if o == '-u': func = decode if o == "-d":
if o == '-t': test(); return func = decode
if args and args[0] != '-': if o == "-u":
with open(args[0], 'rb') as f: func = decode
if o == "-t":
test()
return
if args and args[0] != "-":
with open(args[0], "rb") as f:
func(f, sys.stdout.buffer) func(f, sys.stdout.buffer)
else: else:
func(sys.stdin.buffer, sys.stdout.buffer) func(sys.stdin.buffer, sys.stdout.buffer)
def test(): def test():
s0 = b"Aladdin:open sesame" s0 = b"Aladdin:open sesame"
print(repr(s0)) print(repr(s0))
@@ -252,5 +317,5 @@ def test():
assert s0 == s2 assert s0 == s2
if __name__ == '__main__': if __name__ == "__main__":
main() main()

View File

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

View File

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

View File

@@ -1,58 +1,60 @@
import time,board import time, board
def read_data(pin_name): def read_data(pin_name):
data=[] data = []
j=0 j = 0
time.sleep_ms(1200) time.sleep_ms(1200)
N1 = board.pin(pin_name, board.GPIO.OUT) N1 = board.pin(pin_name, board.GPIO.OUT)
N1.value(0) N1.value(0)
time.sleep_ms(20) time.sleep_ms(20)
N1.value(1) N1.value(1)
time.sleep_us(30) time.sleep_us(30)
N1 =board.pin(pin_name, board.GPIO.IN) N1 = board.pin(pin_name, board.GPIO.IN)
T1 = time.ticks_us() T1 = time.ticks_us()
while N1.value()==0: while N1.value() == 0:
continue continue
while N1.value()==1: while N1.value() == 1:
T2 =time.ticks_us() T2 = time.ticks_us()
if time.ticks_diff(T2, T1) >200000: if time.ticks_diff(T2, T1) > 200000:
#raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
continue continue
while j<40: while j < 40:
k=0 k = 0
while N1.value()==0: while N1.value() == 0:
continue continue
while N1.value()==1: while N1.value() == 1:
k+=1 k += 1
if k>100:break if k > 100:
if k<15: break
data.append(0) if k < 15:
else: data.append(0)
data.append(1) else:
j=j+1 data.append(1)
del N1 j = j + 1
humidity_bit=data[0:8] del N1
humidity_point_bit=data[8:16] humidity_bit = data[0:8]
temperature_bit=data[16:24] humidity_point_bit = data[8:16]
temperature_point_bit=data[24:32] temperature_bit = data[16:24]
check_bit=data[32:40] temperature_point_bit = data[24:32]
humidity=0 check_bit = data[32:40]
humidity_point=0 humidity = 0
temperature=0.0 humidity_point = 0
temperature_point=0 temperature = 0.0
check=0 temperature_point = 0
for i in range(8): check = 0
humidity+=humidity_bit[i]*2**(7-i) for i in range(8):
humidity_point+=humidity_point_bit[i]*2**(7-i) humidity += humidity_bit[i] * 2 ** (7 - i)
temperature+=temperature_bit[i]*2**(7-i) humidity_point += humidity_point_bit[i] * 2 ** (7 - i)
temperature_point+=temperature_point_bit[i]*2**(7-i) temperature += temperature_bit[i] * 2 ** (7 - i)
check+=check_bit[i]*2**(7-i) temperature_point += temperature_point_bit[i] * 2 ** (7 - i)
tmp=humidity+humidity_point+temperature+temperature_point check += check_bit[i] * 2 ** (7 - i)
#print(humidity_point,temperature_point) tmp = humidity + humidity_point + temperature + temperature_point
if check==tmp: # print(humidity_point,temperature_point)
#print('temperature is',temperature,'-wet is',humidity,'%') if check == tmp:
return (temperature+temperature_point/10,humidity) # print('temperature is',temperature,'-wet is',humidity,'%')
else: return (temperature + temperature_point / 10, humidity)
#print('Error:',humidity,humidity_point,temperature,temperature_point,check) else:
return (None,None) # print('Error:',humidity,humidity_point,temperature,temperature_point,check)
return (None, None)

View File

@@ -1,27 +1,28 @@
import time,board import time, board
def Sonar(trig1, echo1): def Sonar(trig1, echo1):
trig = board.pin(trig1, board.GPIO.OUT) trig = board.pin(trig1, board.GPIO.OUT)
echo = board.pin(echo1, board.GPIO.IN) echo = board.pin(echo1, board.GPIO.IN)
time.sleep_ms(10) time.sleep_ms(10)
trig.value(1) trig.value(1)
time.sleep_us(10) time.sleep_us(10)
trig.value(0) trig.value(0)
n1 = time.ticks_us() n1 = time.ticks_us()
while(echo.value()==0): while echo.value() == 0:
n2 =time.ticks_us() n2 = time.ticks_us()
if time.ticks_diff(n2, n1) >200000: if time.ticks_diff(n2, n1) > 200000:
#raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
pass pass
t1 = time.ticks_us() t1 = time.ticks_us()
while(echo.value()==1): while echo.value() == 1:
n3 =time.ticks_us() n3 = time.ticks_us()
if time.ticks_diff(n3, t1) >200000: if time.ticks_diff(n3, t1) > 200000:
#raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
pass pass
t2 = time.ticks_us() t2 = time.ticks_us()
time.sleep_ms(10) time.sleep_ms(10)
return round(time.ticks_diff(t2, t1) / 10000 * 340 / 2, 2) return round(time.ticks_diff(t2, t1) / 10000 * 340 / 2, 2)

View File

@@ -1,47 +1,48 @@
import time,board import time, board
def read_id(pin): def read_id(pin):
L1 = board.pin(pin, board.GPIO.IN, board.GPIO.PULL_UP) L1 = board.pin(pin, board.GPIO.IN, board.GPIO.PULL_UP)
a = [] a = []
t1 = time.ticks_us() t1 = time.ticks_us()
while L1.value() == 1: while L1.value() == 1:
t2 = time.ticks_us() t2 = time.ticks_us()
if time.ticks_diff(t2, t1) >1000000: if time.ticks_diff(t2, t1) > 1000000:
#raise ValueError("[MixNo]:Sensor read error") # raise ValueError("[MixNo]:Sensor read error")
break break
pass pass
time.sleep_us(13560) time.sleep_us(13560)
for i in range(1000): for i in range(1000):
v = L1.value() v = L1.value()
a.append(v) a.append(v)
time.sleep_us(56) time.sleep_us(56)
a_c = [] a_c = []
count = 0 count = 0
for i in a: for i in a:
if i == 1: if i == 1:
count += 1 count += 1
elif i == 0: elif i == 0:
if count > 0 : if count > 0:
a_c.append(count) a_c.append(count)
count =0 count = 0
for i in range(len(a_c)): for i in range(len(a_c)):
if a_c[i] > 10: if a_c[i] > 10:
a_c[i] = "1" a_c[i] = "1"
else: else:
a_c[i] = "0" a_c[i] = "0"
B1 = "".join(a_c) B1 = "".join(a_c)
B2 = B1[16:32] B2 = B1[16:32]
#print(len(B1)) # print(len(B1))
if len(B1)==32 or len(B1)==33 or len(B1)==46: if len(B1) == 32 or len(B1) == 33 or len(B1) == 46:
B3=int(B2,2) B3 = int(B2, 2)
return B3 return B3
else: else:
return None return None

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,29 +1,34 @@
import usocket as socket import usocket as socket
import ustruct as struct import ustruct as struct
import network,time,board import network, time, board
#from ubinascii import hexlify
# from ubinascii import hexlify
import ujson as json import ujson as json
from machine import UART from machine import UART
wifi_en=board.pin(19,board.GPIO.OUT) wifi_en = board.pin(19, board.GPIO.OUT)
board.register(18,board.FPIOA.UART2_TX) board.register(18, board.FPIOA.UART2_TX)
board.register(17,board.FPIOA.UART2_RX) board.register(17, board.FPIOA.UART2_RX)
def wifi_enable(en): def wifi_enable(en):
global wifi_en global wifi_en
wifi_en.value(en) wifi_en.value(en)
def wifi_reset(): def wifi_reset():
global uart global uart
wifi_enable(0) wifi_enable(0)
time.sleep_ms(200) time.sleep_ms(200)
wifi_enable(1) wifi_enable(1)
time.sleep(2) time.sleep(2)
uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=4096) uart = UART(UART.UART2, 115200, timeout=1000, read_buf_len=4096)
tmp = uart.read() tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n") uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read()) print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data uart = UART(
UART.UART2, 921600, timeout=1000, read_buf_len=10240
) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n") uart.write("AT\r\n")
tmp = uart.read() tmp = uart.read()
print(tmp) print(tmp)
@@ -36,46 +41,62 @@ def wifi_reset():
return None return None
return nic return nic
def get_data_dict(d): def get_data_dict(d):
result = {"datastreams":[]} result = {"datastreams": []}
for x in d: for x in d:
result["datastreams"].append({"id":x,"datapoints":[{"value":d[x]}]}) result["datastreams"].append({"id": x, "datapoints": [{"value": d[x]}]})
return result return result
def pubData(value, state):
def pubData(value, state):
value = get_data_dict(value) value = get_data_dict(value)
jdata = json.dumps(value) jdata = json.dumps(value)
jlen = len(jdata) jlen = len(jdata)
bdata = bytearray(jlen+3) bdata = bytearray(jlen + 3)
bdata[0] = 1 # publish data in type of json bdata[0] = 1 # publish data in type of json
bdata[1] = int(jlen / 256) # data lenght bdata[1] = int(jlen / 256) # data lenght
bdata[2] = jlen % 256 # data lenght bdata[2] = jlen % 256 # data lenght
bdata[3:jlen+4] = jdata.encode('ascii') # json data bdata[3 : jlen + 4] = jdata.encode("ascii") # json data
if state: if state:
print(value) print(value)
print(bdata) print(bdata)
return bdata return bdata
def do_connect(account,password):
nic=wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account,password) def do_connect(account, password):
nic.ifconfig() nic = wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account, password)
nic.ifconfig()
def init_MQTT_client(sid, address, cid, api, topic, callback): def init_MQTT_client(sid, address, cid, api, topic, callback):
client = MQTTClient(sid, address, 6002, cid, api) client = MQTTClient(sid, address, 6002, cid, api)
client.set_callback(callback) client.set_callback(callback)
client.connect() client.connect()
client.subscribe(bytes(topic, 'utf-8')) client.subscribe(bytes(topic, "utf-8"))
return client return client
class MQTTException(Exception): class MQTTException(Exception):
pass pass
class MQTTClient: class MQTTClient:
def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0,ssl=False, ssl_params={}): def __init__(
self,
client_id,
server,
port=0,
user=None,
password=None,
keepalive=0,
ssl=False,
ssl_params={},
):
if port == 0: if port == 0:
port = 8883 if ssl else 1883 port = 8883 if ssl else 1883
self.client_id = client_id self.client_id = client_id
@@ -102,7 +123,7 @@ class MQTTClient:
sh = 0 sh = 0
while 1: while 1:
b = self.sock.read(1)[0] b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh n |= (b & 0x7F) << sh
if not b & 0x80: if not b & 0x80:
return n return n
sh += 7 sh += 7
@@ -124,6 +145,7 @@ class MQTTClient:
print(self.addr) print(self.addr)
if self.ssl: if self.ssl:
import ussl import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0") msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0")
msg[1] = 10 + 2 + len(self.client_id) msg[1] = 10 + 2 + len(self.client_id)
@@ -140,7 +162,7 @@ class MQTTClient:
msg[9] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3 msg[9] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
msg[9] |= self.lw_retain << 5 msg[9] |= self.lw_retain << 5
self.sock.write(msg) self.sock.write(msg)
#print(hex(len(msg)), hexlify(msg, ":")) # print(hex(len(msg)), hexlify(msg, ":"))
self._send_str(self.client_id) self._send_str(self.client_id)
if self.lw_topic: if self.lw_topic:
self._send_str(self.lw_topic) self._send_str(self.lw_topic)
@@ -161,7 +183,7 @@ class MQTTClient:
def ping(self): def ping(self):
self.sock.write(b"\xc0\0") self.sock.write(b"\xc0\0")
def publish(self, msg, is_print=True, topic='$dp', retain=False, qos=0): def publish(self, msg, is_print=True, topic="$dp", retain=False, qos=0):
msg = pubData(msg, is_print) msg = pubData(msg, is_print)
pkt = bytearray(b"\x30\0\0\0") pkt = bytearray(b"\x30\0\0\0")
pkt[0] |= qos << 1 | retain pkt[0] |= qos << 1 | retain
@@ -170,12 +192,12 @@ class MQTTClient:
sz += 2 sz += 2
assert sz < 2097152 assert sz < 2097152
i = 1 i = 1
while sz > 0x7f: while sz > 0x7F:
pkt[i] = (sz & 0x7f) | 0x80 pkt[i] = (sz & 0x7F) | 0x80
sz >>= 7 sz >>= 7
i += 1 i += 1
pkt[i] = sz pkt[i] = sz
#print(hex(len(pkt)), hexlify(pkt, ":")) # print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt, i + 1) self.sock.write(pkt, i + 1)
self._send_str(topic) self._send_str(topic)
if qos > 0: if qos > 0:
@@ -202,7 +224,7 @@ class MQTTClient:
pkt = bytearray(b"\x82\0\0\0") pkt = bytearray(b"\x82\0\0\0")
self.pid += 1 self.pid += 1
struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid) struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
#print(hex(len(pkt)), hexlify(pkt, ":")) # print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt) self.sock.write(pkt)
self._send_str(topic) self._send_str(topic)
self.sock.write(qos.to_bytes(1, "little")) self.sock.write(qos.to_bytes(1, "little"))
@@ -210,7 +232,7 @@ class MQTTClient:
op = self.wait_msg() op = self.wait_msg()
if op == 0x90: if op == 0x90:
resp = self.sock.read(4) resp = self.sock.read(4)
#print(resp) # print(resp)
assert resp[1] == pkt[2] and resp[2] == pkt[3] assert resp[1] == pkt[2] and resp[2] == pkt[3]
if resp[3] == 0x80: if resp[3] == 0x80:
raise MQTTException(resp[3]) raise MQTTException(resp[3])
@@ -227,12 +249,12 @@ class MQTTClient:
return None return None
if res == b"": if res == b"":
raise OSError(-1) raise OSError(-1)
if res == b"\xd0": # PINGRESP if res == b"\xd0": # PINGRESP
sz = self.sock.read(1)[0] sz = self.sock.read(1)[0]
assert sz == 0 assert sz == 0
return None return None
op = res[0] op = res[0]
if op & 0xf0 != 0x30: if op & 0xF0 != 0x30:
return op return op
sz = self._recv_len() sz = self._recv_len()
topic_len = self.sock.read(2) topic_len = self.sock.read(2)

View File

@@ -7,33 +7,55 @@ import ujson as json
from matcher import MQTTMatcher from matcher import MQTTMatcher
from machine import Timer from machine import Timer
ADDITIONAL_TOPIC = 'b640a0ce465fa2a4150c36b305c1c11b' ADDITIONAL_TOPIC = "b640a0ce465fa2a4150c36b305c1c11b"
WILL_TOPIC = '9d634e1a156dc0c1611eb4c3cff57276' WILL_TOPIC = "9d634e1a156dc0c1611eb4c3cff57276"
def init_MQTT_client(address, username, password,MQTT_USR_PRJ): def init_MQTT_client(address, username, password, MQTT_USR_PRJ):
client = MQTTClient(hexlify(machine.unique_id()), address, 1883, username, password) client = MQTTClient(hexlify(machine.unique_id()), address, 1883, username, password)
client.set_last_will(topic=MQTT_USR_PRJ+WILL_TOPIC, msg=client.client_id, qos=2) client.set_last_will(topic=MQTT_USR_PRJ + WILL_TOPIC, msg=client.client_id, qos=2)
if client.connect()==0: if client.connect() == 0:
client.publish(MQTT_USR_PRJ+ADDITIONAL_TOPIC, client.client_id, qos=1) client.publish(MQTT_USR_PRJ + ADDITIONAL_TOPIC, client.client_id, qos=1)
Timer(Timer.TIMER2,Timer.CHANNEL3,mode=Timer.MODE_PERIODIC,period = 10000, callback = lambda x : client.ping()) Timer(
Timer.TIMER2,
Timer.CHANNEL3,
mode=Timer.MODE_PERIODIC,
period=10000,
callback=lambda x: client.ping(),
)
return client return client
len_overrided = len len_overrided = len
# Add by Mixly Team # Add by Mixly Team
def len(object): def len(object):
if isinstance(object, str): if isinstance(object, str):
return len_overrided(object.encode('utf-8')) return len_overrided(object.encode("utf-8"))
else: else:
return len_overrided(object) return len_overrided(object)
#####################################################
#####################################################
class MQTTException(Exception): class MQTTException(Exception):
pass pass
class MQTTClient: class MQTTClient:
def __init__(self, client_id, server, port=0, username=None, password=None, keepalive=60, ssl=False, ssl_params={}): def __init__(
self,
client_id,
server,
port=0,
username=None,
password=None,
keepalive=60,
ssl=False,
ssl_params={},
):
if port == 0: if port == 0:
port = 8883 if ssl else 1883 port = 8883 if ssl else 1883
self.client_id = client_id self.client_id = client_id
@@ -42,11 +64,11 @@ class MQTTClient:
self.ssl = ssl self.ssl = ssl
self.ssl_params = ssl_params self.ssl_params = ssl_params
self.pid = 0 self.pid = 0
#self.cb = None # self.cb = None
self._on_message = None self._on_message = None
self.username = username self.username = username
self.password = password self.password = password
#self.project = project # self.project = project
self.keepalive = keepalive self.keepalive = keepalive
self.lw_topic = None self.lw_topic = None
self.lw_msg = None self.lw_msg = None
@@ -63,7 +85,7 @@ class MQTTClient:
sh = 0 sh = 0
while 1: while 1:
b = self.sock.read(1)[0] b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh n |= (b & 0x7F) << sh
if not b & 0x80: if not b & 0x80:
return n return n
sh += 7 sh += 7
@@ -79,7 +101,7 @@ class MQTTClient:
""" """
if mqtt_topic is None or callback_method is None: if mqtt_topic is None or callback_method is None:
raise ValueError("MQTT topic and callback method must both be defined.") raise ValueError("MQTT topic and callback method must both be defined.")
self._on_message_filtered[MQTT_USR_PRJ+mqtt_topic] = callback_method self._on_message_filtered[MQTT_USR_PRJ + mqtt_topic] = callback_method
def remove_callback(self, mqtt_topic): def remove_callback(self, mqtt_topic):
"""Removes a registered callback method. """Removes a registered callback method.
@@ -93,7 +115,7 @@ class MQTTClient:
except KeyError: except KeyError:
raise KeyError( raise KeyError(
"MQTT topic callback not added with add_topic_callback." "MQTT topic callback not added with add_topic_callback."
) from None ) from None
@property @property
def on_message(self): def on_message(self):
@@ -124,19 +146,20 @@ class MQTTClient:
self.lw_msg = msg self.lw_msg = msg
self.lw_qos = qos self.lw_qos = qos
self.lw_retain = retain self.lw_retain = retain
def connect(self, clean_session=True): def connect(self, clean_session=True):
self.sock = socket.socket() self.sock = socket.socket()
self.sock.connect(self.addr) self.sock.connect(self.addr)
print(self.addr) print(self.addr)
if self.ssl: if self.ssl:
import ussl import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg_header=bytearray([0x10]) msg_header = bytearray([0x10])
msg = bytearray(b"\x04MQTT\x04\x02\0\0") msg = bytearray(b"\x04MQTT\x04\x02\0\0")
msg_length = 12 + len(self.client_id) msg_length = 12 + len(self.client_id)
msg[6] = clean_session << 1 msg[6] = clean_session << 1
if self.username is not None: if self.username is not None:
msg_length += 2 + len(self.username) + 2 + len(self.password) msg_length += 2 + len(self.username) + 2 + len(self.password)
msg[6] |= 0xC0 msg[6] |= 0xC0
@@ -148,22 +171,22 @@ class MQTTClient:
msg_length += 2 + len(self.lw_topic) + 2 + len(self.lw_msg) msg_length += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)
msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3 msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
msg[6] |= self.lw_retain << 5 msg[6] |= self.lw_retain << 5
if msg_length > 0x7F: if msg_length > 0x7F:
while msg_length>0: while msg_length > 0:
encoded_byte = msg_length % 0x80 encoded_byte = msg_length % 0x80
msg_length = msg_length // 0x80 msg_length = msg_length // 0x80
if msg_length > 0: if msg_length > 0:
encoded_byte |= 0x80 encoded_byte |= 0x80
msg_header.append(encoded_byte) msg_header.append(encoded_byte)
msg_header.append(0x00) msg_header.append(0x00)
else: else:
msg_header.append(msg_length) msg_header.append(msg_length)
msg_header.append(0x00) msg_header.append(0x00)
self.sock.write(msg_header) self.sock.write(msg_header)
self.sock.write(msg) self.sock.write(msg)
#print(hexlify(msg_header, ":"), hexlify(msg, ":")) # print(hexlify(msg_header, ":"), hexlify(msg, ":"))
self._send_str(self.client_id) self._send_str(self.client_id)
if self.lw_topic: if self.lw_topic:
self._send_str(self.lw_topic) self._send_str(self.lw_topic)
@@ -177,26 +200,25 @@ class MQTTClient:
raise MQTTException(resp[3]) raise MQTTException(resp[3])
return resp[2] & 1 return resp[2] & 1
def disconnect(self, MQTT_USR_PRJ):
def disconnect(self,MQTT_USR_PRJ): # MQTT_USR_PRJ = "{}/{}/".format(self.username,self.project)
#MQTT_USR_PRJ = "{}/{}/".format(self.username,self.project) self.publish(MQTT_USR_PRJ + WILL_TOPIC, self.client_id, qos=1)
self.publish(MQTT_USR_PRJ+WILL_TOPIC, self.client_id, qos=1)
self.sock.write(b"\xe0\0") self.sock.write(b"\xe0\0")
self.sock.close() self.sock.close()
def ping(self): def ping(self):
self.sock.write(b"\xc0\0") self.sock.write(b"\xc0\0")
def pingSync(self): def pingSync(self):
time.ticks_ms() time.ticks_ms()
self.ping() self.ping()
for i in range(0,10): for i in range(0, 10):
msg = self.check_msg() msg = self.check_msg()
if msg == "PINGRESP": if msg == "PINGRESP":
return True return True
time.sleep_ms(100) time.sleep_ms(100)
return False return False
def publish(self, topic, msg, retain=False, qos=0): def publish(self, topic, msg, retain=False, qos=0):
# msg = pubData(msg) # msg = pubData(msg)
if "+" in topic or "#" in topic: if "+" in topic or "#" in topic:
@@ -219,12 +241,12 @@ class MQTTClient:
sz += 2 sz += 2
assert sz < 2097152 assert sz < 2097152
i = 1 i = 1
while sz > 0x7f: while sz > 0x7F:
pkt[i] = (sz & 0x7f) | 0x80 pkt[i] = (sz & 0x7F) | 0x80
sz >>= 7 sz >>= 7
i += 1 i += 1
pkt[i] = sz pkt[i] = sz
#print(hex(len(pkt)), hexlify(pkt, ":")) # print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt, i + 1) self.sock.write(pkt, i + 1)
self._send_str(topic) self._send_str(topic)
if qos > 0: if qos > 0:
@@ -247,13 +269,13 @@ class MQTTClient:
assert 0 assert 0
def subscribe(self, topic, qos=0): def subscribe(self, topic, qos=0):
#assert self.cb is not None, "Subscribe callback is not set" # assert self.cb is not None, "Subscribe callback is not set"
pkt = bytearray(b"\x82\0\0\0") pkt = bytearray(b"\x82\0\0\0")
self.pid += 1 self.pid += 1
if isinstance(topic, str): if isinstance(topic, str):
topic=topic.encode() topic = topic.encode()
struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid) struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
#print(hex(len(pkt)), hexlify(pkt, ":")) # print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt) self.sock.write(pkt)
self._send_str(topic) self._send_str(topic)
self.sock.write(qos.to_bytes(1, "little")) self.sock.write(qos.to_bytes(1, "little"))
@@ -261,7 +283,7 @@ class MQTTClient:
op = self.wait_msg() op = self.wait_msg()
if op == 0x90: if op == 0x90:
resp = self.sock.read(4) resp = self.sock.read(4)
#print(resp) # print(resp)
assert resp[1] == pkt[2] and resp[2] == pkt[3] assert resp[1] == pkt[2] and resp[2] == pkt[3]
if resp[3] == 0x80: if resp[3] == 0x80:
raise MQTTException(resp[3]) raise MQTTException(resp[3])
@@ -278,12 +300,12 @@ class MQTTClient:
return None return None
if res == b"": if res == b"":
raise OSError(-1) raise OSError(-1)
if res == b"\xd0": # PINGRESP if res == b"\xd0": # PINGRESP
sz = self.sock.read(1)[0] sz = self.sock.read(1)[0]
assert sz == 0 assert sz == 0
return "PINGRESP" return "PINGRESP"
op = res[0] op = res[0]
if op & 0xf0 != 0x30: if op & 0xF0 != 0x30:
return op return op
sz = self._recv_len() sz = self._recv_len()
topic_len = self.sock.read(2) topic_len = self.sock.read(2)
@@ -296,7 +318,7 @@ class MQTTClient:
sz -= 2 sz -= 2
msg = self.sock.read(sz) msg = self.sock.read(sz)
self._handle_on_message(self, str(topic, "utf-8"), str(msg, "utf-8")) self._handle_on_message(self, str(topic, "utf-8"), str(msg, "utf-8"))
#self.cb(topic.decode(), msg.decode()) # self.cb(topic.decode(), msg.decode())
if op & 6 == 2: if op & 6 == 2:
pkt = bytearray(b"\x40\x02\0\0") pkt = bytearray(b"\x40\x02\0\0")
struct.pack_into("!H", pkt, 2, pid) struct.pack_into("!H", pkt, 2, pid)
@@ -309,4 +331,4 @@ class MQTTClient:
# the same processing as wait_msg. # the same processing as wait_msg.
def check_msg(self): def check_msg(self):
self.sock.setblocking(False) self.sock.setblocking(False)
return self.wait_msg() return self.wait_msg()

View File

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

View File

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

View File

@@ -19,22 +19,23 @@ import ustruct
import utime import utime
import time import time
import math import math
#from machine import I2C, Pin
# from machine import I2C, Pin
# pylint: enable=import-error # pylint: enable=import-error
__version__ = "0.2.0" __version__ = "0.2.0"
# pylint: disable=import-error # pylint: disable=import-error
# pylint: enable=import-error # pylint: enable=import-error
_GYRO_CONFIG = const(0x1b) _GYRO_CONFIG = const(0x1B)
_ACCEL_CONFIG = const(0x1c) _ACCEL_CONFIG = const(0x1C)
_ACCEL_CONFIG2 = const(0x1d) _ACCEL_CONFIG2 = const(0x1D)
_INT_PIN_CFG = const(0x37) _INT_PIN_CFG = const(0x37)
_ACCEL_XOUT_H = const(0x3b) _ACCEL_XOUT_H = const(0x3B)
_ACCEL_XOUT_L = const(0x3c) _ACCEL_XOUT_L = const(0x3C)
_ACCEL_YOUT_H = const(0x3d) _ACCEL_YOUT_H = const(0x3D)
_ACCEL_YOUT_L = const(0x3e) _ACCEL_YOUT_L = const(0x3E)
_ACCEL_ZOUT_H = const(0x3f) _ACCEL_ZOUT_H = const(0x3F)
_ACCEL_ZOUT_L= const(0x40) _ACCEL_ZOUT_L = const(0x40)
_TEMP_OUT_H = const(0x41) _TEMP_OUT_H = const(0x41)
_TEMP_OUT_L = const(0x42) _TEMP_OUT_L = const(0x42)
_GYRO_XOUT_H = const(0x43) _GYRO_XOUT_H = const(0x43)
@@ -45,18 +46,18 @@ _GYRO_ZOUT_H = const(0x47)
_GYRO_ZOUT_L = const(0x48) _GYRO_ZOUT_L = const(0x48)
_WHO_AM_I = const(0x75) _WHO_AM_I = const(0x75)
#_ACCEL_FS_MASK = const(0b00011000) # _ACCEL_FS_MASK = const(0b00011000)
ACCEL_FS_SEL_2G = const(0b00000000) ACCEL_FS_SEL_2G = const(0b00000000)
ACCEL_FS_SEL_4G = const(0b00001000) ACCEL_FS_SEL_4G = const(0b00001000)
ACCEL_FS_SEL_8G = const(0b00010000) ACCEL_FS_SEL_8G = const(0b00010000)
ACCEL_FS_SEL_16G = const(0b00011000) ACCEL_FS_SEL_16G = const(0b00011000)
_ACCEL_SO_2G = 16384 # 1 / 16384 ie. 0.061 mg / digit _ACCEL_SO_2G = 16384 # 1 / 16384 ie. 0.061 mg / digit
_ACCEL_SO_4G = 8192 # 1 / 8192 ie. 0.122 mg / digit _ACCEL_SO_4G = 8192 # 1 / 8192 ie. 0.122 mg / digit
_ACCEL_SO_8G = 4096 # 1 / 4096 ie. 0.244 mg / digit _ACCEL_SO_8G = 4096 # 1 / 4096 ie. 0.244 mg / digit
_ACCEL_SO_16G = 2048 # 1 / 2048 ie. 0.488 mg / digit _ACCEL_SO_16G = 2048 # 1 / 2048 ie. 0.488 mg / digit
#_GYRO_FS_MASK = const(0b00011000) # _GYRO_FS_MASK = const(0b00011000)
GYRO_FS_SEL_250DPS = const(0b00000000) GYRO_FS_SEL_250DPS = const(0b00000000)
GYRO_FS_SEL_500DPS = const(0b00001000) GYRO_FS_SEL_500DPS = const(0b00001000)
GYRO_FS_SEL_1000DPS = const(0b00010000) GYRO_FS_SEL_1000DPS = const(0b00010000)
@@ -73,9 +74,9 @@ _I2C_BYPASS_EN = const(0b00000010)
_I2C_BYPASS_DIS = const(0b00000000) _I2C_BYPASS_DIS = const(0b00000000)
SF_G = 1 SF_G = 1
SF_M_S2 = 9.80665 # 1 g = 9.80665 m/s2 ie. standard gravity SF_M_S2 = 9.80665 # 1 g = 9.80665 m/s2 ie. standard gravity
SF_DEG_S = 1 SF_DEG_S = 1
SF_RAD_S = 57.295779578552 # 1 rad/s is 57.295779578552 deg/s SF_RAD_S = 57.295779578552 # 1 rad/s is 57.295779578552 deg/s
_WIA = const(0x00) _WIA = const(0x00)
@@ -86,15 +87,15 @@ _HYH = const(0x06)
_HZL = const(0x07) _HZL = const(0x07)
_HZH = const(0x08) _HZH = const(0x08)
_ST2 = const(0x09) _ST2 = const(0x09)
_CNTL1 = const(0x0a) _CNTL1 = const(0x0A)
_ASAX = const(0x10) _ASAX = const(0x10)
_ASAY = const(0x11) _ASAY = const(0x11)
_ASAZ = const(0x12) _ASAZ = const(0x12)
_MODE_POWER_DOWN = 0b00000000 _MODE_POWER_DOWN = 0b00000000
MODE_SINGLE_MEASURE = 0b00000001 MODE_SINGLE_MEASURE = 0b00000001
MODE_CONTINOUS_MEASURE_1 = 0b00000010 # 8Hz MODE_CONTINOUS_MEASURE_1 = 0b00000010 # 8Hz
MODE_CONTINOUS_MEASURE_2 = 0b00000110 # 100Hz MODE_CONTINOUS_MEASURE_2 = 0b00000110 # 100Hz
MODE_EXTERNAL_TRIGGER_MEASURE = 0b00000100 MODE_EXTERNAL_TRIGGER_MEASURE = 0b00000100
_MODE_SELF_TEST = 0b00001000 _MODE_SELF_TEST = 0b00001000
_MODE_FUSE_ROM_ACCESS = 0b00001111 _MODE_FUSE_ROM_ACCESS = 0b00001111
@@ -102,15 +103,21 @@ _MODE_FUSE_ROM_ACCESS = 0b00001111
OUTPUT_14_BIT = 0b00000000 OUTPUT_14_BIT = 0b00000000
OUTPUT_16_BIT = 0b00010000 OUTPUT_16_BIT = 0b00010000
_SO_14BIT = 0.6 # 渭T per digit when 14bit mode _SO_14BIT = 0.6 # 渭T per digit when 14bit mode
_SO_16BIT = 0.15 # 渭T per digit when 16bit mode _SO_16BIT = 0.15 # 渭T per digit when 16bit mode
class MPU6500: class MPU6500:
"""Class which provides interface to MPU6500 6-axis motion tracking device.""" """Class which provides interface to MPU6500 6-axis motion tracking device."""
def __init__( def __init__(
self, i2c, address=0x68, self,
accel_fs=ACCEL_FS_SEL_2G, gyro_fs=GYRO_FS_SEL_250DPS, i2c,
accel_sf=SF_M_S2, gyro_sf=SF_RAD_S address=0x68,
accel_fs=ACCEL_FS_SEL_2G,
gyro_fs=GYRO_FS_SEL_250DPS,
accel_sf=SF_M_S2,
gyro_sf=SF_RAD_S,
): ):
self.i2c = i2c self.i2c = i2c
self.address = address self.address = address
@@ -125,15 +132,15 @@ class MPU6500:
# Enable I2C bypass to access for MPU9250 magnetometer access. # Enable I2C bypass to access for MPU9250 magnetometer access.
char = self._register_char(_INT_PIN_CFG) char = self._register_char(_INT_PIN_CFG)
char &= ~_I2C_BYPASS_MASK # clear I2C bits char &= ~_I2C_BYPASS_MASK # clear I2C bits
char |= _I2C_BYPASS_EN char |= _I2C_BYPASS_EN
self._register_char(_INT_PIN_CFG, char) self._register_char(_INT_PIN_CFG, char)
@property @property
def temperature(self): def temperature(self):
tempbuf=self._register_short(0x41) tempbuf = self._register_short(0x41)
return tempbuf/333.87 + 21 # I think return tempbuf / 333.87 + 21 # I think
# @property # @property
def acceleration(self): def acceleration(self):
""" """
@@ -161,7 +168,7 @@ class MPU6500:
@property @property
def whoami(self): def whoami(self):
""" Value of the whoami register. """ """Value of the whoami register."""
return self._register_char(_WHO_AM_I) return self._register_char(_WHO_AM_I)
def _register_short(self, register, value=None, buf=bytearray(2)): def _register_short(self, register, value=None, buf=bytearray(2)):
@@ -216,12 +223,18 @@ class MPU6500:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class AK8963: class AK8963:
"""Class which provides interface to AK8963 magnetometer.""" """Class which provides interface to AK8963 magnetometer."""
def __init__( def __init__(
self, i2c, address=0x0c, self,
mode=MODE_CONTINOUS_MEASURE_1, output=OUTPUT_16_BIT, i2c,
offset=(0, 0, 0), scale=(1, 1, 1) address=0x0C,
mode=MODE_CONTINOUS_MEASURE_1,
output=OUTPUT_16_BIT,
offset=(0, 0, 0),
scale=(1, 1, 1),
): ):
self.i2c = i2c self.i2c = i2c
self.address = address self.address = address
@@ -242,7 +255,7 @@ class AK8963:
self._adjustement = ( self._adjustement = (
(0.5 * (asax - 128)) / 128 + 1, (0.5 * (asax - 128)) / 128 + 1,
(0.5 * (asay - 128)) / 128 + 1, (0.5 * (asay - 128)) / 128 + 1,
(0.5 * (asaz - 128)) / 128 + 1 (0.5 * (asaz - 128)) / 128 + 1,
) )
# Power on # Power on
@@ -252,15 +265,14 @@ class AK8963:
self._so = _SO_16BIT self._so = _SO_16BIT
else: else:
self._so = _SO_14BIT self._so = _SO_14BIT
@property @property
def magnetic(self): def magnetic(self):
""" """
X, Y, Z axis micro-Tesla (uT) as floats. X, Y, Z axis micro-Tesla (uT) as floats.
""" """
xyz = list(self._register_three_shorts(_HXL)) xyz = list(self._register_three_shorts(_HXL))
self._register_char(_ST2) # Enable updating readings again self._register_char(_ST2) # Enable updating readings again
# Apply factory axial sensitivy adjustements # Apply factory axial sensitivy adjustements
xyz[0] *= self._adjustement[0] xyz[0] *= self._adjustement[0]
@@ -291,7 +303,7 @@ class AK8963:
@property @property
def whoami(self): def whoami(self):
""" Value of the whoami register. """ """Value of the whoami register."""
return self._register_char(_WIA) return self._register_char(_WIA)
def calibrate(self, count=3, delay=200): def calibrate(self, count=3, delay=200):
@@ -314,7 +326,6 @@ class AK8963:
maxz = max(maxz, reading[2]) maxz = max(maxz, reading[2])
count -= 1 count -= 1
# Hard iron correction # Hard iron correction
offset_x = (maxx + minx) / 2 offset_x = (maxx + minx) / 2
offset_y = (maxy + miny) / 2 offset_y = (maxy + miny) / 2
@@ -362,11 +373,12 @@ class AK8963:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class MPU9250: class MPU9250:
"""Class which provides interface to MPU9250 9-axis motion tracking device.""" """Class which provides interface to MPU9250 9-axis motion tracking device."""
def __init__(self, i2c, mpu6500 = None, ak8963 = None):
def __init__(self, i2c, mpu6500=None, ak8963=None):
if mpu6500 is None: if mpu6500 is None:
self.mpu6500 = MPU6500(i2c) self.mpu6500 = MPU6500(i2c)
else: else:
@@ -386,8 +398,8 @@ class MPU9250:
# """ # """
# return self.mpu6500.acceleration # return self.mpu6500.acceleration
def mpu9250_get_temperature(self): def mpu9250_get_temperature(self):
return self.mpu6500.temperature return self.mpu6500.temperature
def mpu9250_get_values(self): def mpu9250_get_values(self):
""" """
Acceleration measured by the sensor. By default will return a Acceleration measured by the sensor. By default will return a
@@ -395,7 +407,7 @@ class MPU9250:
pass `accel_fs=SF_G` parameter to the MPU6500 constructor. pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
""" """
g = self.mpu6500.acceleration() g = self.mpu6500.acceleration()
a = [round(x/9.8, 2) for x in g] a = [round(x / 9.8, 2) for x in g]
return tuple(a) return tuple(a)
def mpu9250_get_x(self): def mpu9250_get_x(self):
@@ -404,15 +416,15 @@ class MPU9250:
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g 3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor. pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
""" """
return round(self.mpu6500.acceleration()[0]/9.8, 2) return round(self.mpu6500.acceleration()[0] / 9.8, 2)
def mpu9250_get_y(self): def mpu9250_get_y(self):
""" """
Acceleration measured by the sensor. By default will return a Acceleration measured by the sensor. By default will return a
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g 3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor. pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
""" """
return round(self.mpu6500.acceleration()[1]/9.8, 2) return round(self.mpu6500.acceleration()[1] / 9.8, 2)
def mpu9250_get_z(self): def mpu9250_get_z(self):
""" """
@@ -420,45 +432,47 @@ class MPU9250:
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g 3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor. pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
""" """
return round(self.mpu6500.acceleration()[2]/9.8, 2) return round(self.mpu6500.acceleration()[2] / 9.8, 2)
def mpu9250_is_gesture(self, choice):
def mpu9250_is_gesture(self,choice): if choice == "face up":
if choice == 'face up': if self.mpu6500.acceleration()[2] <= -9:
if self.mpu6500.acceleration()[2] <= -9: return True
return True else:
else: return False
return False if choice == "face down":
if choice == 'face down': if self.mpu6500.acceleration()[2] >= 9:
if self.mpu6500.acceleration()[2] >= 9: return True
return True else:
else: return False
return False if choice == "shake":
if choice == 'shake': if (
if abs(self.mpu6500.acceleration()[0]) >= 9 and abs(self.mpu6500.acceleration()[1]) >= 9 : abs(self.mpu6500.acceleration()[0]) >= 9
return True and abs(self.mpu6500.acceleration()[1]) >= 9
else: ):
return False return True
if choice == 'up': else:
if self.mpu6500.acceleration()[1] >= 9: return False
return True if choice == "up":
else: if self.mpu6500.acceleration()[1] >= 9:
return False return True
if choice == 'down': else:
if self.mpu6500.acceleration()[1] <= -9: return False
return True if choice == "down":
else: if self.mpu6500.acceleration()[1] <= -9:
return False return True
if choice == 'right': else:
if self.mpu6500.acceleration()[0] <= -9: return False
return True if choice == "right":
else: if self.mpu6500.acceleration()[0] <= -9:
return False return True
if choice == 'left': else:
if self.mpu6500.acceleration()[0] >= 9: return False
return True if choice == "left":
else: if self.mpu6500.acceleration()[0] >= 9:
return False return True
else:
return False
@property @property
def mpu9250_gyro(self): def mpu9250_gyro(self):
@@ -499,23 +513,27 @@ class MPU9250:
def mpu9250_magnetic_values(self): def mpu9250_magnetic_values(self):
return self.mpu9250_magnetic return self.mpu9250_magnetic
# @property # @property
def mpu9250_get_field_strength(self): def mpu9250_get_field_strength(self):
x=self.mpu9250_magnetic[0] x = self.mpu9250_magnetic[0]
y=self.mpu9250_magnetic[1] y = self.mpu9250_magnetic[1]
z=self.mpu9250_magnetic[2] z = self.mpu9250_magnetic[2]
return (x**2+y**2+z**2)**0.5*1000 return (x**2 + y**2 + z**2) ** 0.5 * 1000
def mpu9250_heading(self): def mpu9250_heading(self):
x=self.mpu9250_magnetic[0] x = self.mpu9250_magnetic[0]
y=self.mpu9250_magnetic[1] y = self.mpu9250_magnetic[1]
z=self.mpu9250_magnetic[2] z = self.mpu9250_magnetic[2]
a=math.atan(z/x) a = math.atan(z / x)
b=math.atan(z/y) b = math.atan(z / y)
xr=x*math.cos(a)+y*math.sin(a)*math.sin(b)-z*math.cos(b)*math.sin(a) xr = (
yr=x*math.cos(b)+z*math.sin(b) x * math.cos(a)
return 60*math.atan(yr/xr) + 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)
@property @property
def whoami(self): def whoami(self):
@@ -527,6 +545,7 @@ class MPU9250:
def __exit__(self, exception_type, exception_value, traceback): def __exit__(self, exception_type, exception_value, traceback):
pass pass
class Compass: class Compass:
RAD_TO_DEG = 57.295779513082320876798154814105 RAD_TO_DEG = 57.295779513082320876798154814105
@@ -547,20 +566,23 @@ class Compass:
def heading(self): def heading(self):
from math import atan2 from math import atan2
xyz = self.sensor.mpu9250_magnetic xyz = self.sensor.mpu9250_magnetic
return int(((atan2(xyz[1], xyz[0]) * Compass.RAD_TO_DEG) + 180) % 360) return int(((atan2(xyz[1], xyz[0]) * Compass.RAD_TO_DEG) + 180) % 360)
def is_calibrate(self): def is_calibrate(self):
try: try:
import compass_cfg import compass_cfg
return True return True
except Exception as e: except Exception as e:
return False return False
def reset_calibrate(self): def reset_calibrate(self):
import os import os
os.remove("compass_cfg.py") os.remove("compass_cfg.py")
# compass = mpu # compass = mpu
# accelerometer = mpu # accelerometer = mpu

View File

@@ -8,135 +8,136 @@ Micropython library for the MS32006 step diever
dahanzimin From the Mixly Team dahanzimin From the Mixly Team
""" """
import time import time
from micropython import const from micropython import const
MS32006_REG_RESET = const(0x00) #复位 MS32006_REG_RESET = const(0x00) # 复位
MS32006_FCLK = const(25000000) #芯片输入时钟选择,此参数与运动速度有关。 范围是5-30MHZ MS32006_FCLK = const(
25000000
) # 芯片输入时钟选择,此参数与运动速度有关。 范围是5-30MHZ
ADDRESS_A = 0x10
ADDRESS_B = 0x18
MOT_FULL = 0
MOT_HALF = 1
MOT_A = 0
MOT_B = 4
MOT_N = 0
MOT_CW = 1
MOT_CCW = 2
MOT_P = 3
ADDRESS_A = 0x10
ADDRESS_B = 0x18
MOT_FULL = 0
MOT_HALF = 1
MOT_A = 0
MOT_B = 4
MOT_N = 0
MOT_CW = 1
MOT_CCW = 2
MOT_P = 3
class MS32006: class MS32006:
_buffer = bytearray(2) _buffer = bytearray(2)
def __init__(self, i2c_bus,addr=ADDRESS_A,mode=MOT_FULL): def __init__(self, i2c_bus, addr=ADDRESS_A, mode=MOT_FULL):
self._device = i2c_bus self._device = i2c_bus
self._address = addr self._address = addr
self.reset() self.reset()
self.mode=mode self.mode = mode
def _read_u8(self, address): def _read_u8(self, address):
self._buffer[0] = address & 0xFF self._buffer[0] = address & 0xFF
self._device.writeto(self._address,self._buffer) self._device.writeto(self._address, self._buffer)
self._device.readfrom_into(self._address,self._buffer) self._device.readfrom_into(self._address, self._buffer)
return self._buffer[0] return self._buffer[0]
def _write_u8(self, address, val):
self._buffer[0] = address & 0xFF
self._buffer[1] = val & 0xFF
self._device.writeto(self._address,self._buffer)
def reset(self): def _write_u8(self, address, val):
self._write_u8(MS32006_REG_RESET,0x00) self._buffer[0] = address & 0xFF
time.sleep(0.1) self._buffer[1] = val & 0xFF
self._write_u8(MS32006_REG_RESET,0xC1) self._device.writeto(self._address, self._buffer)
def move(self,moto,mot_dir,mot_pps,mot_step):
readstate_0H = self._read_u8(0x00)
readstate_9H = self._read_u8(0x09)
speed_data=MS32006_FCLK//mot_pps//128 #设置速度 xx pps 128是固定参数
if speed_data<32: #限定转速
speed_data=32
elif speed_data>16383:
speed_data=16383
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
if mot_step>2047:
raise AttributeError("Reach the set upper limit, up to 2047 step")
mot_step_l=mot_step&0x00ff
mot_step_h=mot_step//0x100
mot_step_h|=0x80
if mot_dir==MOT_CW:
mot_step_h&=0xBF
else:
mot_step_h|=0x40
self._write_u8(0x01+moto,mot_speed_l)
self._write_u8(0x02+moto,mot_speed_h)
self._write_u8(0x03+moto,mot_step_l)
self._write_u8(0x04+moto,mot_step_h)
if moto==MOT_A:
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(0x09, readstate_9H|0x40)
def close(self,moto): #停止并关闭输出
if moto==MOT_A:
self._write_u8(0x04,0x00)
else:
self._write_u8(0x08,0x00)
def stop(self,moto): #此停止函数,强制让电机停止 def reset(self):
readstate = self._read_u8(0x00) self._write_u8(MS32006_REG_RESET, 0x00)
if moto==MOT_A: time.sleep(0.1)
self._write_u8(0x00,readstate|0x04) self._write_u8(MS32006_REG_RESET, 0xC1)
else:
self._write_u8(0x00,readstate|0x02)
def readstep(self,moto): #读取电机运动步数
if moto==MOT_A:
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
def readbusy(self,moto): #读取电机缓存是否有数据 def move(self, moto, mot_dir, mot_pps, mot_step):
if moto==MOT_A: readstate_0H = self._read_u8(0x00)
busy =(self._read_u8(0x0b)>>6)&1 readstate_9H = self._read_u8(0x09)
else: speed_data = MS32006_FCLK // mot_pps // 128 # 设置速度 xx pps 128是固定参数
busy =(self._read_u8(0x0d)>>6)&1
return bool(busy) if speed_data < 32: # 限定转速
speed_data = 32
def readwork(self,moto): #读取电机是否在运行 elif speed_data > 16383:
if moto==MOT_A: speed_data = 16383
busy =(self._read_u8(0x0b)>>4)&1
else: mot_speed_l = speed_data & 0x00FF # 取低8位
busy =(self._read_u8(0x0d)>>4)&1 mot_speed_h = speed_data // 0x100 # 取高6位
return bool(busy)
if self.mode == MOT_FULL: # 设置整步、半步驱动模式
def dc_motor(self,state,speed): #直流电机驱动 mot_speed_h |= 0x80
if (state==MOT_CW) | (state==MOT_CCW) : else:
speed_st=speed*127//100 |0x80 mot_speed_h &= 0x7F
self._write_u8(0x0A,speed_st)
if mot_step > 2047:
readstate = self._read_u8(0x09) & 0xA0 raise AttributeError("Reach the set upper limit, up to 2047 step")
state_st=(state<<2) | 0X03 | readstate
self._write_u8(0x09,state_st) mot_step_l = mot_step & 0x00FF
mot_step_h = mot_step // 0x100
mot_step_h |= 0x80
if mot_dir == MOT_CW:
mot_step_h &= 0xBF
else:
mot_step_h |= 0x40
self._write_u8(0x01 + moto, mot_speed_l)
self._write_u8(0x02 + moto, mot_speed_h)
self._write_u8(0x03 + moto, mot_step_l)
self._write_u8(0x04 + moto, mot_step_h)
if moto == MOT_A:
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(0x09, readstate_9H | 0x40)
def close(self, moto): # 停止并关闭输出
if moto == MOT_A:
self._write_u8(0x04, 0x00)
else:
self._write_u8(0x08, 0x00)
def stop(self, moto): # 此停止函数,强制让电机停止
readstate = self._read_u8(0x00)
if moto == MOT_A:
self._write_u8(0x00, readstate | 0x04)
else:
self._write_u8(0x00, readstate | 0x02)
def readstep(self, moto): # 读取电机运动步数
if moto == MOT_A:
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
def readbusy(self, moto): # 读取电机缓存是否有数据
if moto == MOT_A:
busy = (self._read_u8(0x0B) >> 6) & 1
else:
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
else:
busy = (self._read_u8(0x0D) >> 4) & 1
return bool(busy)
def dc_motor(self, state, speed): # 直流电机驱动
if (state == MOT_CW) | (state == MOT_CCW):
speed_st = speed * 127 // 100 | 0x80
self._write_u8(0x0A, speed_st)
readstate = self._read_u8(0x09) & 0xA0
state_st = (state << 2) | 0x03 | readstate
self._write_u8(0x09, state_st)

View File

@@ -1,30 +1,31 @@
import network,time,board import network, time, board
from machine import UART from machine import UART
import time import time
def wifi_init(RX_Pin,TX_Pin):
board.register(TX_Pin,board.FPIOA.UART2_TX) def wifi_init(RX_Pin, TX_Pin):
board.register(RX_Pin,board.FPIOA.UART2_RX) board.register(TX_Pin, board.FPIOA.UART2_TX)
board.register(RX_Pin, board.FPIOA.UART2_RX)
uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=1024*16)
T1=time.ticks_ms() uart = UART(UART.UART2, 115200, timeout=1000, read_buf_len=1024 * 16)
while True: T1 = time.ticks_ms()
tmp=uart.read() while True:
if tmp: tmp = uart.read()
if tmp.endswith("OK\r\n"): if tmp:
break if tmp.endswith("OK\r\n"):
else: break
uart.write("AT+RST\r\n") else:
time.sleep_ms(20) uart.write("AT+RST\r\n")
if time.ticks_diff(time.ticks_ms(), T1) >2000: time.sleep_ms(20)
raise AttributeError("ESP-AT not connected or needs to be reset") if time.ticks_diff(time.ticks_ms(), T1) > 2000:
try: raise AttributeError("ESP-AT not connected or needs to be reset")
nic = network.ESP8285(uart) try:
time.sleep(1) nic = network.ESP8285(uart)
print("ESP-AT OK") time.sleep(1)
return nic print("ESP-AT OK")
except Exception: return nic
raise AttributeError("ESP-AT Connection Failed") except Exception:
raise AttributeError("ESP-AT Connection Failed")
def wifi_deal_ap_info(info): def wifi_deal_ap_info(info):
@@ -40,9 +41,9 @@ def wifi_deal_ap_info(info):
res.append(info_one) res.append(info_one)
return res return res
def scans(nic):
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
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 import time
from math import pi, isnan from math import pi, isnan
class PID: class PID:
_kp = _ki = _kd = _integrator = _imax = 0 _kp = _ki = _kd = _integrator = _imax = 0
_last_error = _last_derivative = _last_t = 0 _last_error = _last_derivative = _last_t = 0
_RC = 1/(2 * pi * 20) _RC = 1 / (2 * pi * 20)
def __init__(self, p=0, i=0, d=0, imax=0): def __init__(self, p=0, i=0, d=0, imax=0):
self._kp = float(p) self._kp = float(p)
self._ki = float(i) self._ki = float(i)
self._kd = float(d) self._kd = float(d)
self._imax = abs(imax) self._imax = abs(imax)
self._last_derivative = float('nan') self._last_derivative = float("nan")
def get_pid(self, error, scaler): def get_pid(self, error, scaler):
tnow = time.ticks_ms() tnow = time.ticks_ms()
@@ -28,19 +30,23 @@ class PID:
self._last_derivative = 0 self._last_derivative = 0
else: else:
derivative = (error - self._last_error) / delta_time derivative = (error - self._last_error) / delta_time
derivative = self._last_derivative + \ derivative = self._last_derivative + (
((delta_time / (self._RC + delta_time)) * \ (delta_time / (self._RC + delta_time))
(derivative - self._last_derivative)) * (derivative - self._last_derivative)
)
self._last_error = error self._last_error = error
self._last_derivative = derivative self._last_derivative = derivative
output += self._kd * derivative output += self._kd * derivative
output *= scaler output *= scaler
if abs(self._ki) > 0 and dt > 0: if abs(self._ki) > 0 and dt > 0:
self._integrator += (error * self._ki) * scaler * delta_time self._integrator += (error * self._ki) * scaler * delta_time
if self._integrator < -self._imax: self._integrator = -self._imax if self._integrator < -self._imax:
elif self._integrator > self._imax: self._integrator = self._imax self._integrator = -self._imax
elif self._integrator > self._imax:
self._integrator = self._imax
output += self._integrator output += self._integrator
return output return output
def reset_I(self): def reset_I(self):
self._integrator = 0 self._integrator = 0
self._last_derivative = float('nan') self._last_derivative = float("nan")

View File

@@ -1,128 +1,151 @@
import board import board
import audio,video import audio, video
from Maix import I2S from Maix import I2S
import gc import gc
spk_b=None
spk_d=None
spk_w=None
def spk_init(BLK=8,WS=9,DAT=10,sample_rate=16000): spk_b = None
global spk_b spk_d = None
global spk_d spk_w = None
global spk_w
spk_b=BLK
spk_d=DAT
spk_w=WS
board.register(DAT,board.FPIOA.I2S0_OUT_D1)
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.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.set_sample_rate(sample_rate)
return wav_dev
def audio_play(I2S,path,num=80): def spk_init(BLK=8, WS=9, DAT=10, sample_rate=16000):
try: global spk_b
player = audio.Audio(path=path) global spk_d
except Exception as e: global spk_w
raise NameError("No audio file loaded or {}".format(e)) spk_b = BLK
player.volume(num) spk_d = DAT
wav_info=player.play_process(I2S) spk_w = WS
I2S.set_sample_rate(wav_info[1]) board.register(DAT, board.FPIOA.I2S0_OUT_D1)
while True: board.register(BLK, board.FPIOA.I2S0_SCLK)
ret = player.play() board.register(WS, board.FPIOA.I2S0_WS)
if ret == None: wav_dev = I2S(I2S.DEVICE_0)
print("Format Error") wav_dev.channel_config(
break I2S.CHANNEL_1,
elif ret == 0: I2S.TRANSMITTER,
print("Play end \n") resolution=I2S.RESOLUTION_16_BIT,
player.finish() cycles=I2S.SCLK_CYCLES_32,
break align_mode=I2S.STANDARD_MODE,
player.__deinit__() )
gc.collect() wav_dev.set_sample_rate(sample_rate)
spk_rep = wav_dev
def audio_record(I2S,path,record_time,sample_rate=16000): return wav_dev
try:
recorder = audio.Audio(path=path, is_create=True, samplerate=sample_rate)
except Exception as e:
raise NameError("Need audio storage location or {}".format(e))
queue = []
frame_cnt = record_time*sample_rate//2048
for i in range(frame_cnt):
tmp = I2S.record(2048*2)
if len(queue) > 0:
ret = recorder.record(queue[0])
queue.pop(0)
I2S.wait_record()
queue.append(tmp)
print("record:{}s".format(round(((frame_cnt-i-1)/7.7) ,1)))
recorder.finish()
recorder.__deinit__()
del recorder
print("Audio record finish \n")
gc.collect()
def video_play(I2S1,path,num=80):
try:
global spk_b
global spk_d
global spk_w
import lcd
lcd.init()
I2S=spk_init(spk_b,spk_w,spk_d)
vide = video.open(path)
except Exception as e:
raise NameError("No video file loaded or {}".format(e))
vide.volume(num)
while True:
try:
ret = vide.play()
except Exception as e:
raise NameError("Video format error or {}".format(e))
if ret == None:
print("Format Error")
break
elif ret == 0:
print("Play end \n")
break
vide.__del__()
del vide
del I2S
gc.collect()
def video_record(I2S,path,record_time): def mic_init(BLK=35, WS=33, DAT=34, sample_rate=16000):
import sensor,lcd board.register(DAT, board.FPIOA.I2S2_IN_D0)
lcd.init() board.register(BLK, board.FPIOA.I2S2_SCLK)
try: board.register(WS, board.FPIOA.I2S2_WS)
v = video.open(path, audio=False, record=True, interval=200000, quality=80,width=240, height=240) wav_dev = I2S(I2S.DEVICE_2)
except Exception as e: wav_dev.channel_config(
raise NameError("Need video storage location or {}".format(e)) I2S.CHANNEL_0,
record_time=record_time*5 I2S.RECEIVER,
for i in range(record_time): resolution=I2S.RESOLUTION_16_BIT,
try: cycles=I2S.SCLK_CYCLES_32,
img = sensor.snapshot() align_mode=I2S.STANDARD_MODE,
except : )
raise NameError("Need to initialize camera") wav_dev.set_sample_rate(sample_rate)
lcd.display(img) return wav_dev
v.record(img)
print("record {}s".format(round((record_time-i-1)*0.2,1)))
v.record_finish()
print("Video record finish \n")
v.__del__()
gc.collect()
def audio_play(I2S, path, num=80):
try:
player = audio.Audio(path=path)
except Exception as e:
raise NameError("No audio file loaded or {}".format(e))
player.volume(num)
wav_info = player.play_process(I2S)
I2S.set_sample_rate(wav_info[1])
while True:
ret = player.play()
if ret == None:
print("Format Error")
break
elif ret == 0:
print("Play end \n")
player.finish()
break
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)
except Exception as e:
raise NameError("Need audio storage location or {}".format(e))
queue = []
frame_cnt = record_time * sample_rate // 2048
for i in range(frame_cnt):
tmp = I2S.record(2048 * 2)
if len(queue) > 0:
ret = recorder.record(queue[0])
queue.pop(0)
I2S.wait_record()
queue.append(tmp)
print("record:{}s".format(round(((frame_cnt - i - 1) / 7.7), 1)))
recorder.finish()
recorder.__deinit__()
del recorder
print("Audio record finish \n")
gc.collect()
def video_play(I2S1, path, num=80):
try:
global spk_b
global spk_d
global spk_w
import lcd
lcd.init()
I2S = spk_init(spk_b, spk_w, spk_d)
vide = video.open(path)
except Exception as e:
raise NameError("No video file loaded or {}".format(e))
vide.volume(num)
while True:
try:
ret = vide.play()
except Exception as e:
raise NameError("Video format error or {}".format(e))
if ret == None:
print("Format Error")
break
elif ret == 0:
print("Play end \n")
break
vide.__del__()
del vide
del I2S
gc.collect()
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,
)
except Exception as e:
raise NameError("Need video storage location or {}".format(e))
record_time = record_time * 5
for i in range(record_time):
try:
img = sensor.snapshot()
except:
raise NameError("Need to initialize camera")
lcd.display(img)
v.record(img)
print("record {}s".format(round((record_time - i - 1) * 0.2, 1)))
v.record_finish()
print("Video record finish \n")
v.__del__()
gc.collect()

View File

@@ -1,33 +1,35 @@
try: try:
import image import image
image.font_free()
image.font_free()
except: except:
pass pass
try: try:
import lcd,time,gc,machine import lcd, time, gc, machine
lcd.init(color=0x0000) lcd.init(color=0x0000)
lcd.draw_string(48,100, "Welcome to MixGo!", lcd.YELLOW, lcd.BLACK) lcd.draw_string(48, 100, "Welcome to MixGo!", lcd.YELLOW, lcd.BLACK)
lcd.draw_string(62,132, "loading .", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading .", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading ..", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading ..", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading ...", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading ...", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading ....", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading ....", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading .....", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading .....", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading ......", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading ......", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.draw_string(62,132, "loading .......", lcd.YELLOW, lcd.BLACK) lcd.draw_string(62, 132, "loading .......", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50) time.sleep_ms(50)
lcd.clear(0x0000) lcd.clear(0x0000)
del time del time
del lcd del lcd
del gc del gc
finally: finally:
import gc import gc
gc.collect()
gc.collect()

View File

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

View File

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

View File

@@ -1,5 +1,6 @@
from microbit import * from microbit import *
class QJ00X_MP3: class QJ00X_MP3:
def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01): def __init__(self, mp3_rx=pin2, mp3_tx=pin16, volume=0x16, mode=0x01):
uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600) uart.init(rx=mp3_rx, tx=mp3_tx, baudrate=9600)
@@ -9,64 +10,64 @@ class QJ00X_MP3:
self.pause() self.pause()
def _send_cmd(self, length, cmd, data_high=None, data_low=None): def _send_cmd(self, length, cmd, data_high=None, data_low=None):
uart.write(b'\x7E') uart.write(b"\x7E")
uart.write(bytes([length])) uart.write(bytes([length]))
uart.write(bytes([cmd])) uart.write(bytes([cmd]))
if data_high != None: if data_high != None:
uart.write(bytes([data_high])) uart.write(bytes([data_high]))
if data_low != None: if data_low != None:
uart.write(bytes([data_low])) uart.write(bytes([data_low]))
uart.write(b'\xEF') uart.write(b"\xEF")
sleep(200) sleep(200)
#下一曲 # 下一曲
def next_track(self): def next_track(self):
self._send_cmd(0x02, 0x03) self._send_cmd(0x02, 0x03)
#上一曲 # 上一曲
def prev_track(self): def prev_track(self):
self._send_cmd(0x02, 0x04) self._send_cmd(0x02, 0x04)
#选择曲目 # 选择曲目
def sel_track(self, track_index): def sel_track(self, track_index):
self._send_cmd(0x03, track_index) self._send_cmd(0x03, track_index)
#音量+ # 音量+
def inc_vol(self): def inc_vol(self):
self._send_cmd(0x02, 0x05) self._send_cmd(0x02, 0x05)
#音量- # 音量-
def dec_vol(self): def dec_vol(self):
self._send_cmd(0x02, 0x06) self._send_cmd(0x02, 0x06)
#设置音量 # 设置音量
def set_vol(self, volume): def set_vol(self, volume):
self._send_cmd(0x03, 0x31, data_high=volume) self._send_cmd(0x03, 0x31, data_high=volume)
#设置音效 # 设置音效
def set_eq(self, equalizer): def set_eq(self, equalizer):
self._send_cmd(0x03, 0x32, data_high=equalizer) self._send_cmd(0x03, 0x32, data_high=equalizer)
#设置播放设备 # 设置播放设备
def set_mode(self, mode): def set_mode(self, mode):
self._send_cmd(0x03, 0x35, data_high=mode) self._send_cmd(0x03, 0x35, data_high=mode)
#播放 # 播放
def play(self): def play(self):
self._send_cmd(0x02, 0x01) self._send_cmd(0x02, 0x01)
#终止播放 # 终止播放
def pause(self): def pause(self):
self._send_cmd(0x02, 0x02) self._send_cmd(0x02, 0x02)
#设置文件夹播放 # 设置文件夹播放
def set_folder(self, folder_index, music_index): def set_folder(self, folder_index, music_index):
self._send_cmd(0x04, 0x42, data_high=folder_index, data_low=music_index) self._send_cmd(0x04, 0x42, data_high=folder_index, data_low=music_index)
#设置曲目播放 # 设置曲目播放
def playFileByIndexNumber(self, music_index): def playFileByIndexNumber(self, music_index):
self._send_cmd(0x04, 0x41, data_high=0x00, data_low=music_index) self._send_cmd(0x04, 0x41, data_high=0x00, data_low=music_index)
#设置循环 # 设置循环
def set_loop(self, mode): def set_loop(self, mode):
self._send_cmd(0x03, 0x33, data_high=mode) self._send_cmd(0x03, 0x33, data_high=mode)

View File

@@ -1,16 +1,18 @@
from microbit import * from microbit import *
DS1307_I2C_ADDRESS = (104) DS1307_I2C_ADDRESS = 104
DS1307_REG_SECOND = (0) DS1307_REG_SECOND = 0
DS1307_REG_MINUTE = (1) DS1307_REG_MINUTE = 1
DS1307_REG_HOUR = (2) DS1307_REG_HOUR = 2
DS1307_REG_WEEKDAY = (3) DS1307_REG_WEEKDAY = 3
DS1307_REG_DAY = (4) DS1307_REG_DAY = 4
DS1307_REG_MONTH = (5) DS1307_REG_MONTH = 5
DS1307_REG_YEAR = (6) DS1307_REG_YEAR = 6
DS1307_REG_CTRL = (7) DS1307_REG_CTRL = 7
DS1307_REG_RAM = (8) DS1307_REG_RAM = 8
class DS1307():
class DS1307:
# set reg # set reg
def setReg(self, reg, dat): def setReg(self, reg, dat):
i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat])) i2c.write(DS1307_I2C_ADDRESS, bytearray([reg, dat]))
@@ -23,17 +25,17 @@ class DS1307():
def start(self): def start(self):
t = self.getReg(DS1307_REG_SECOND) t = self.getReg(DS1307_REG_SECOND)
self.setReg(DS1307_REG_SECOND, t&0x7F) self.setReg(DS1307_REG_SECOND, t & 0x7F)
def stop(self): def stop(self):
t = self.getReg(DS1307_REG_SECOND) t = self.getReg(DS1307_REG_SECOND)
self.setReg(DS1307_REG_SECOND, t|0x80) self.setReg(DS1307_REG_SECOND, t | 0x80)
def DecToHex(self, dat): def DecToHex(self, dat):
return (dat//10) * 16 + (dat%10) return (dat // 10) * 16 + (dat % 10)
def HexToDec(self, dat): def HexToDec(self, dat):
return (dat//16) * 10 + (dat%16) return (dat // 16) * 10 + (dat % 16)
def DateTime(self, DT=None): def DateTime(self, DT=None):
if DT == None: if DT == None:
@@ -52,62 +54,62 @@ class DS1307():
else: else:
buf = bytearray(8) buf = bytearray(8)
buf[0] = 0 buf[0] = 0
buf[1] = self.DecToHex(DT[6]%60) # second buf[1] = self.DecToHex(DT[6] % 60) # second
buf[2] = self.DecToHex(DT[5]%60) # minute buf[2] = self.DecToHex(DT[5] % 60) # minute
buf[3] = self.DecToHex(DT[4]%24) # hour buf[3] = self.DecToHex(DT[4] % 24) # hour
buf[4] = self.DecToHex(DT[3]%8) # week day buf[4] = self.DecToHex(DT[3] % 8) # week day
buf[5] = self.DecToHex(DT[2]%32) # date buf[5] = self.DecToHex(DT[2] % 32) # date
buf[6] = self.DecToHex(DT[1]%13) # month buf[6] = self.DecToHex(DT[1] % 13) # month
buf[7] = self.DecToHex(DT[0]%100) # year buf[7] = self.DecToHex(DT[0] % 100) # year
i2c.write(DS1307_I2C_ADDRESS, buf) i2c.write(DS1307_I2C_ADDRESS, buf)
def Year(self, year = None): def Year(self, year=None):
if year == None: if year == None:
return self.HexToDec(self.getReg(DS1307_REG_YEAR)) + 2000 return self.HexToDec(self.getReg(DS1307_REG_YEAR)) + 2000
else: else:
self.setReg(DS1307_REG_YEAR, self.DecToHex(year%100)) self.setReg(DS1307_REG_YEAR, self.DecToHex(year % 100))
def Month(self, month = None): def Month(self, month=None):
if month == None: if month == None:
return self.HexToDec(self.getReg(DS1307_REG_MONTH)) return self.HexToDec(self.getReg(DS1307_REG_MONTH))
else: else:
self.setReg(DS1307_REG_MONTH, self.DecToHex(month%13)) self.setReg(DS1307_REG_MONTH, self.DecToHex(month % 13))
def Day(self, day = None): def Day(self, day=None):
if day == None: if day == None:
return self.HexToDec(self.getReg(DS1307_REG_DAY)) return self.HexToDec(self.getReg(DS1307_REG_DAY))
else: else:
self.setReg(DS1307_REG_DAY, self.DecToHex(day%32)) self.setReg(DS1307_REG_DAY, self.DecToHex(day % 32))
def Weekday(self, weekday = None): def Weekday(self, weekday=None):
if weekday == None: if weekday == None:
return self.HexToDec(self.getReg(DS1307_REG_WEEKDAY)) return self.HexToDec(self.getReg(DS1307_REG_WEEKDAY))
else: else:
self.setReg(DS1307_REG_WEEKDAY, self.DecToHex(weekday%8)) self.setReg(DS1307_REG_WEEKDAY, self.DecToHex(weekday % 8))
def Hour(self, hour = None): def Hour(self, hour=None):
if hour == None: if hour == None:
return self.HexToDec(self.getReg(DS1307_REG_HOUR)) return self.HexToDec(self.getReg(DS1307_REG_HOUR))
else: else:
self.setReg(DS1307_REG_HOUR, self.DecToHex(hour%24)) self.setReg(DS1307_REG_HOUR, self.DecToHex(hour % 24))
def Minute(self, minute = None): def Minute(self, minute=None):
if minute == None: if minute == None:
return self.HexToDec(self.getReg(DS1307_REG_MINUTE)) return self.HexToDec(self.getReg(DS1307_REG_MINUTE))
else: else:
self.setReg(DS1307_REG_MINUTE, self.DecToHex(minute%60)) self.setReg(DS1307_REG_MINUTE, self.DecToHex(minute % 60))
def Second(self, second = None): def Second(self, second=None):
if second == None: if second == None:
return self.HexToDec(self.getReg(DS1307_REG_SECOND)) return self.HexToDec(self.getReg(DS1307_REG_SECOND))
else: else:
self.setReg(DS1307_REG_SECOND, self.DecToHex(second%60)) self.setReg(DS1307_REG_SECOND, self.DecToHex(second % 60))
def ram(self, reg, dat = None): def ram(self, reg, dat=None):
if dat == None: if dat == None:
return self.getReg(DS1307_REG_RAM + (reg%56)) return self.getReg(DS1307_REG_RAM + (reg % 56))
else: else:
self.setReg(DS1307_REG_RAM + (reg%56), dat) self.setReg(DS1307_REG_RAM + (reg % 56), dat)
def get_time(self): def get_time(self):
return self.Hour() + self.Minute() + self.Second() return self.Hour() + self.Minute() + self.Second()
@@ -125,4 +127,5 @@ class DS1307():
self.Month(month) self.Month(month)
self.Day(day) self.Day(day)
ds = DS1307()
ds = DS1307()

View File

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

View File

@@ -1,64 +1,103 @@
from microbit import * from microbit import *
class TCS34725():
TCS34725_ADDRESS = 0x29 class TCS34725:
TCS34725_COMMAND_BIT = 0x80 TCS34725_ADDRESS = 0x29
TCS34725_ENABLE = 0x00 TCS34725_COMMAND_BIT = 0x80
TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer TCS34725_ENABLE = 0x00
TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
TCS34725_ENABLE_PON = 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer
TCS34725_ATIME = 0x01 # Integration time TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it
TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted TCS34725_ENABLE_PON = (
TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it
TCS34725_WTIME_204MS = 0xAB # WLONG0 = 204ms WLONG1 = 2.45s )
TCS34725_WTIME_614MS = 0x00 # WLONG0 = 614ms WLONG1 = 7.4s TCS34725_ATIME = 0x01 # Integration time
TCS34725_AILTL = 0x04 # Clear channel lower interrupt threshold TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted
TCS34725_AILTH = 0x05 TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold TCS34725_WTIME_204MS = 0xAB # WLONG0 = 204ms WLONG1 = 2.45s
TCS34725_AIHTH = 0x07 TCS34725_WTIME_614MS = 0x00 # WLONG0 = 614ms WLONG1 = 7.4s
TCS34725_PERS = 0x0C # Persistence register - basic SW filtering mechanism for interrupts TCS34725_AILTL = 0x04 # Clear channel lower interrupt threshold
TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt TCS34725_AILTH = 0x05
TCS34725_PERS_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values outside threshold range generates an interrupt TCS34725_AIHTH = 0x07
TCS34725_PERS_3_CYCLE = 0b0011 # 3 clean channel values outside threshold range generates an interrupt TCS34725_PERS = (
TCS34725_PERS_5_CYCLE = 0b0100 # 5 clean channel values outside threshold range generates an interrupt 0x0C # Persistence register - basic SW filtering mechanism for interrupts
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_NONE = 0b0000 # Every RGBC cycle generates an interrupt
TCS34725_PERS_20_CYCLE = 0b0111 # 20 clean channel values outside threshold range generates an interrupt TCS34725_PERS_1_CYCLE = (
TCS34725_PERS_25_CYCLE = 0b1000 # 25 clean channel values outside threshold range generates an interrupt 0b0001 # 1 clean channel value 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_2_CYCLE = (
TCS34725_PERS_40_CYCLE = 0b1011 # 40 clean channel values outside threshold range generates an interrupt 0b0010 # 2 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_3_CYCLE = (
TCS34725_PERS_55_CYCLE = 0b1110 # 55 clean channel values outside threshold range generates an interrupt 0b0011 # 3 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_PERS_5_CYCLE = (
TCS34725_CONFIG_WLONG = 0x02 # Choose between short and long (12x wait times via TCS34725_WTIME 0b0100 # 5 clean channel values outside threshold range generates an interrupt
TCS34725_CONTROL = 0x0F # Set the gain level for the sensor )
TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 TCS34725_PERS_10_CYCLE = (
TCS34725_STATUS = 0x13 0b0101 # 10 clean channel values outside threshold range generates an interrupt
TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt )
TCS34725_STATUS_AVALID = 0x01 # Indicates that the RGBC channels have completed an integration cycle TCS34725_PERS_15_CYCLE = (
TCS34725_CDATAL = 0x14 # Clear channel data 0b0110 # 15 clean channel values outside threshold range generates an interrupt
TCS34725_CDATAH = 0x15 )
TCS34725_RDATAL = 0x16 # Red channel data TCS34725_PERS_20_CYCLE = (
TCS34725_RDATAH = 0x17 0b0111 # 20 clean channel values outside threshold range generates an interrupt
TCS34725_GDATAL = 0x18 # Green channel data )
TCS34725_GDATAH = 0x19 TCS34725_PERS_25_CYCLE = (
TCS34725_BDATAL = 0x1A # Blue channel data 0b1000 # 25 clean channel values outside threshold range generates an interrupt
TCS34725_BDATAH = 0x1B )
TCS34725_PERS_30_CYCLE = (
# TCS34725_INTEGRATIONTIME_2_4MS = 0xFF, /**< 2.4ms - 1 cycle - Max Count: 1024 0b1001 # 30 clean channel values outside threshold range generates an interrupt
# TCS34725_INTEGRATIONTIME_24MS = 0xF6, /**< 24ms - 10 cycles - Max Count: 10240 )
# TCS34725_INTEGRATIONTIME_50MS = 0xEB, /**< 50ms - 20 cycles - Max Count: 20480 TCS34725_PERS_35_CYCLE = (
# TCS34725_INTEGRATIONTIME_101MS = 0xD5, /**< 101ms - 42 cycles - Max Count: 43008 0b1010 # 35 clean channel values outside threshold range generates an interrupt
# TCS34725_INTEGRATIONTIME_154MS = 0xC0, /**< 154ms - 64 cycles - Max Count: 65535 )
# TCS34725_INTEGRATIONTIME_700MS = 0x00 /**< 700ms - 256 cycles - Max Count: 65535 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_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_CDATAL = 0x14 # Clear channel data
TCS34725_CDATAH = 0x15
TCS34725_RDATAL = 0x16 # Red channel data
TCS34725_RDATAH = 0x17
TCS34725_GDATAL = 0x18 # Green channel data
TCS34725_GDATAH = 0x19
TCS34725_BDATAL = 0x1A # Blue channel data
TCS34725_BDATAH = 0x1B
# TCS34725_INTEGRATIONTIME_2_4MS = 0xFF, /**< 2.4ms - 1 cycle - Max Count: 1024
# TCS34725_INTEGRATIONTIME_24MS = 0xF6, /**< 24ms - 10 cycles - Max Count: 10240
# TCS34725_INTEGRATIONTIME_50MS = 0xEB, /**< 50ms - 20 cycles - Max Count: 20480
# TCS34725_INTEGRATIONTIME_101MS = 0xD5, /**< 101ms - 42 cycles - Max Count: 43008
# TCS34725_INTEGRATIONTIME_154MS = 0xC0, /**< 154ms - 64 cycles - Max Count: 65535
# TCS34725_INTEGRATIONTIME_700MS = 0x00 /**< 700ms - 256 cycles - Max Count: 65535
_tcs34725Initialised = False _tcs34725Initialised = False
_tcs34725Gain = 0 _tcs34725Gain = 0
@@ -66,57 +105,66 @@ class TCS34725():
def __init__(self, i2c): def __init__(self, i2c):
self.i2c = i2c self.i2c = i2c
#pass # pass
def write8(self, reg, val): def write8(self, reg, val):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF])) self.i2c.write(
self.TCS34725_ADDRESS,
bytearray([self.TCS34725_COMMAND_BIT | reg, val & 0xFF]),
)
def read16(self, reg): def read16(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])) self.i2c.write(
self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])
)
list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2) list_bytes = self.i2c.read(self.TCS34725_ADDRESS, 2)
bytes = list_bytes[1]<<8 | list_bytes[0] bytes = list_bytes[1] << 8 | list_bytes[0]
#return [ hex(x) for x in bytes ][0] # return [ hex(x) for x in bytes ][0]
return bytes return bytes
def read8(self, reg): def read8(self, reg):
self.i2c.write(self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])) self.i2c.write(
self.TCS34725_ADDRESS, bytearray([self.TCS34725_COMMAND_BIT | reg])
)
return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0 return i2c.read(self.TCS34725_ADDRESS, 1)[0] - 0
def begin(self): def begin(self):
x = self.read8(self.TCS34725_ID) x = self.read8(self.TCS34725_ID)
#print(x) # print(x)
if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12 if x != 68: # code I was basing this on expects 0x44, not sure why. Got 0x12
print('did not get the expected response from sensor: ', x) print("did not get the expected response from sensor: ", x)
return False return False
self._tcs34725Initialised = True self._tcs34725Initialised = True
self.setIntegrationTime(self._tcs34725IntegrationTime) self.setIntegrationTime(self._tcs34725IntegrationTime)
self.setGain(0) self.setGain(0)
self.enable() self.enable()
return True return True
def setIntegrationTime(self, theTime): def setIntegrationTime(self, theTime):
if theTime not in [0xFF,0xF6,0xEB,0xD5,0xC0,0x00]: if theTime not in [0xFF, 0xF6, 0xEB, 0xD5, 0xC0, 0x00]:
print('setting integration time to 0x00, %s is illegal' % theTime) print("setting integration time to 0x00, %s is illegal" % theTime)
theTime = 0x00 theTime = 0x00
self.write8(self.TCS34725_ATIME, theTime) self.write8(self.TCS34725_ATIME, theTime)
# self.i2c.write8(self.TCS34725_ATIME, theTime) # self.i2c.write8(self.TCS34725_ATIME, theTime)
self._tcs34725IntegrationTime = theTime self._tcs34725IntegrationTime = theTime
def setGain(self, gain): def setGain(self, gain):
# TCS34725_GAIN_1X = 0x00, /**< No gain # TCS34725_GAIN_1X = 0x00, /**< No gain
# TCS34725_GAIN_4X = 0x01, /**< 2x gain # TCS34725_GAIN_4X = 0x01, /**< 2x gain
# TCS34725_GAIN_16X = 0x02, /**< 16x gain # TCS34725_GAIN_16X = 0x02, /**< 16x gain
# TCS34725_GAIN_60X = 0x03 /**< 60x gain # TCS34725_GAIN_60X = 0x03 /**< 60x gain
if gain not in [0,1,2,3]: if gain not in [0, 1, 2, 3]:
print('setting gain to 0, %s is illegal' % gain) print("setting gain to 0, %s is illegal" % gain)
gain = 0 gain = 0
self.write8(self.TCS34725_CONTROL, gain) self.write8(self.TCS34725_CONTROL, gain)
self._tcs34725Gain = gain self._tcs34725Gain = gain
def enable(self): def enable(self):
self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON) self.write8(self.TCS34725_ENABLE, self.TCS34725_ENABLE_PON)
sleep(0.003) sleep(0.003)
self.write8(self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN)) self.write8(
self.TCS34725_ENABLE, (self.TCS34725_ENABLE_PON | self.TCS34725_ENABLE_AEN)
)
def getRawRGBData(self, type): def getRawRGBData(self, type):
if not self._tcs34725Initialised: if not self._tcs34725Initialised:
@@ -145,4 +193,5 @@ class TCS34725():
else: else:
return b return b
tcs = TCS34725(i2c)
tcs = TCS34725(i2c)

View File

@@ -1,6 +1,7 @@
from microbit import * from microbit import *
class LCD1602():
class LCD1602:
def __init__(self, lcd_i2c_addr): def __init__(self, lcd_i2c_addr):
self.buf = bytearray(1) self.buf = bytearray(1)
self.BK = 0x08 self.BK = 0x08
@@ -16,8 +17,8 @@ class LCD1602():
self.setcmd(0x0C) self.setcmd(0x0C)
self.setcmd(0x06) self.setcmd(0x06)
self.setcmd(0x01) self.setcmd(0x01)
self.version='1.0' self.version = "1.0"
self.lcd_i2c_addr=lcd_i2c_addr self.lcd_i2c_addr = lcd_i2c_addr
def setReg(self, dat): def setReg(self, dat):
self.buf[0] = dat self.buf[0] = dat
@@ -25,31 +26,31 @@ class LCD1602():
sleep(1) sleep(1)
def send(self, dat): def send(self, dat):
d=dat&0xF0 d = dat & 0xF0
d|=self.BK d |= self.BK
d|=self.RS d |= self.RS
self.setReg(d) self.setReg(d)
self.setReg(d|0x04) self.setReg(d | 0x04)
self.setReg(d) self.setReg(d)
def setcmd(self, cmd): def setcmd(self, cmd):
self.RS=0 self.RS = 0
self.send(cmd) self.send(cmd)
self.send(cmd<<4) self.send(cmd << 4)
def setdat(self, dat): def setdat(self, dat):
self.RS=1 self.RS = 1
self.send(dat) self.send(dat)
self.send(dat<<4) self.send(dat << 4)
def clear(self): def clear(self):
self.setcmd(1) self.setcmd(1)
def backlight(self, on): def backlight(self, on):
if on: if on:
self.BK=0x08 self.BK = 0x08
else: else:
self.BK=0 self.BK = 0
self.setdat(0) self.setdat(0)
def on(self): def on(self):
@@ -59,17 +60,17 @@ class LCD1602():
self.setcmd(0x08) self.setcmd(0x08)
def char(self, ch, x=-1, y=0): def char(self, ch, x=-1, y=0):
if x>=0: if x >= 0:
a=0x80 a = 0x80
if y>0: if y > 0:
a=0xC0 a = 0xC0
a+=x a += x
self.setcmd(a) self.setcmd(a)
self.setdat(ch) self.setdat(ch)
def puts(self, s, x=0, y=0): def puts(self, s, x=0, y=0):
if len(s)>0: if len(s) > 0:
self.char(ord(s[0]),x,y) self.char(ord(s[0]), x, y)
for i in range(1, len(s)): for i in range(1, len(s)):
self.char(ord(s[i])) self.char(ord(s[i]))
@@ -83,4 +84,4 @@ class LCD1602():
line1 = str(line1) line1 = str(line1)
line2 = str(line2) line2 = str(line2)
self.puts(self, line1, 0, 0) self.puts(self, line1, 0, 0)
self.puts(self, line2, 0, 1) self.puts(self, line2, 0, 1)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,37 +1,40 @@
from microbit import * from microbit import *
def motor1(v,d=1):
v = min(12,max(0,v)) def motor1(v, d=1):
if v==0: v = min(12, max(0, v))
if v == 0:
pin8.write_analog(0) pin8.write_analog(0)
pin16.write_analog(0) pin16.write_analog(0)
elif d==1: elif d == 1:
pin8.write_analog(int(v/12*1023)) pin8.write_analog(int(v / 12 * 1023))
pin16.write_analog(0) pin16.write_analog(0)
elif d==0: elif d == 0:
pin8.write_analog(0) pin8.write_analog(0)
pin16.write_analog(int(v/12*1023)) pin16.write_analog(int(v / 12 * 1023))
def motor2(v,d=1):
v = min(12,max(0,v)) def motor2(v, d=1):
if v==0: v = min(12, max(0, v))
if v == 0:
pin14.write_analog(0) pin14.write_analog(0)
pin13.write_analog(0) pin13.write_analog(0)
elif d==1: elif d == 1:
pin14.write_analog(int(v/12*1023)) pin14.write_analog(int(v / 12 * 1023))
pin13.write_analog(0) pin13.write_analog(0)
elif d==0: elif d == 0:
pin14.write_analog(0) pin14.write_analog(0)
pin13.write_analog(int(v/12*1023)) pin13.write_analog(int(v / 12 * 1023))
def motor3(v,d=1):
v = min(12,max(0,v)) def motor3(v, d=1):
if v==0: v = min(12, max(0, v))
if v == 0:
pin0.write_analog(0) pin0.write_analog(0)
pin15.write_analog(0) pin15.write_analog(0)
elif d==1: elif d == 1:
pin0.write_analog(int(v/12*1023)) pin0.write_analog(int(v / 12 * 1023))
pin15.write_analog(0) pin15.write_analog(0)
elif d==0: elif d == 0:
pin0.write_analog(0) pin0.write_analog(0)
pin15.write_analog(int(v/12*1023)) pin15.write_analog(int(v / 12 * 1023))

View File

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