From 8c3e33063ecfd0b0aace55b79ef533b1381507b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=A8=E8=90=BD=E4=B9=A6=E9=A6=99?= Date: Thu, 22 Jul 2021 01:13:13 +0000 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AD8232_C/README.md | 4 +- AD8232_C/code/MQTT.py | 205 ---------------------------------------- AD8232_C/code/ad8232.py | 8 ++ AD8232_C/code/heart.py | 153 ------------------------------ AD8232_C/code/main.py | 159 ++++++++----------------------- 5 files changed, 48 insertions(+), 481 deletions(-) create mode 100644 AD8232_C/code/ad8232.py diff --git a/AD8232_C/README.md b/AD8232_C/README.md index f3f285b..0ec16e8 100644 --- a/AD8232_C/README.md +++ b/AD8232_C/README.md @@ -28,12 +28,12 @@ ## 传感器库使用 -  可以获取[MQTT.py](https://gitee.com/blackwalnutlabs/waffle-nano-v1-sensor-lib/raw/master//AD8232_C/code/ad8232.py),将此库通过[Waffle Maker](https://wafflenano.blackwalnut.tech/ide/index.html#/editor) 的文件上传功能将此库上传到`Waffle Nano` +  可以获取[ad8232.py.py](https://gitee.com/blackwalnutlabs/waffle-nano-v1-sensor-lib/raw/master//AD8232_C/code/ad8232.py),将此库通过[Waffle Maker](https://wafflenano.blackwalnut.tech/ide/index.html#/editor) 的文件上传功能将此库上传到`Waffle Nano`   我们在可以在主函数中使用以下代码导入此库 ```python -from MQTT import MQTTClient +from ad8232 import ADC_init ``` ​ 关于此库相关细节说明详见代码注释 diff --git a/AD8232_C/code/MQTT.py b/AD8232_C/code/MQTT.py index cc8b467..e69de29 100644 --- a/AD8232_C/code/MQTT.py +++ b/AD8232_C/code/MQTT.py @@ -1,205 +0,0 @@ -try: - import usocket as socket -except: - import socket -import ustruct as struct -from ubinascii import hexlify -#引入需要库 -class MQTTException(Exception): - pass -class MQTTClient: - - def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0, - ssl=False, ssl_params={}): - if port == 0: - port = 8883 if ssl else 1883 - self.client_id = client_id - self.sock = None - self.server = server - self.port = port - self.ssl = ssl - self.ssl_params = ssl_params - self.pid = 0 - self.cb = None - self.user = user - self.pswd = password - self.keepalive = keepalive - self.lw_topic = None - self.lw_msg = None - self.lw_qos = 0 - self.lw_retain = False - - def _send_str(self, s): - self.sock.write(struct.pack("!H", len(s))) - self.sock.write(s) - - def _recv_len(self): - n = 0 - sh = 0 - while 1: - b = self.sock.read(1)[0] - n |= (b & 0x7f) << sh - if not b & 0x80: - return n - sh += 7 - - def set_callback(self, f): - self.cb = f - - def set_last_will(self, topic, msg, retain=False, qos=0): - assert 0 <= qos <= 2 - assert topic - self.lw_topic = topic - self.lw_msg = msg - self.lw_qos = qos - self.lw_retain = retain - - def connect(self, clean_session=True): - self.sock = socket.socket() - addr = socket.getaddrinfo(self.server, self.port)[0][-1] - self.sock.connect(addr) - if self.ssl: - import ussl - self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) - premsg = bytearray(b"\x10\0\0\0\0\0") - msg = bytearray(b"\x04MQTT\x04\x02\0\0") - - sz = 10 + 2 + len(self.client_id) - msg[6] = clean_session << 1 - if self.user is not None: - sz += 2 + len(self.user) + 2 + len(self.pswd) - msg[6] |= 0xC0 - if self.keepalive: - assert self.keepalive < 65536 - msg[7] |= self.keepalive >> 8 - msg[8] |= self.keepalive & 0x00FF - if self.lw_topic: - sz += 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] |= self.lw_retain << 5 - - i = 1 - while sz > 0x7f: - premsg[i] = (sz & 0x7f) | 0x80 - sz >>= 7 - i += 1 - premsg[i] = sz - - self.sock.write(premsg, i + 2) - self.sock.write(msg) - self._send_str(self.client_id) - if self.lw_topic: - self._send_str(self.lw_topic) - self._send_str(self.lw_msg) - if self.user is not None: - self._send_str(self.user) - self._send_str(self.pswd) - resp = self.sock.read(4) - assert resp[0] == 0x20 and resp[1] == 0x02 - if resp[3] != 0: - raise MQTTException(resp[3]) - return resp[2] & 1 - - def disconnect(self): - self.sock.write(b"\xe0\0") - self.sock.close() - - def ping(self): - self.sock.write(b"\xc0\0") - - def publish(self, topic, msg, retain=False, qos=0): - pkt = bytearray(b"\x30\0\0\0") - pkt[0] |= qos << 1 | retain - sz = 2 + len(topic) + len(msg) - if qos > 0: - sz += 2 - assert sz < 2097152 - i = 1 - while sz > 0x7f: - pkt[i] = (sz & 0x7f) | 0x80 - sz >>= 7 - i += 1 - pkt[i] = sz - #print(hex(len(pkt)), hexlify(pkt, ":")) - self.sock.write(pkt, i + 1) - self._send_str(topic) - if qos > 0: - self.pid += 1 - pid = self.pid - struct.pack_into("!H", pkt, 0, pid) - self.sock.write(pkt, 2) - self.sock.write(msg) - if qos == 1: - while 1: - op = self.wait_msg() - if op == 0x40: - sz = self.sock.read(1) - assert sz == b"\x02" - rcv_pid = self.sock.read(2) - rcv_pid = rcv_pid[0] << 8 | rcv_pid[1] - if pid == rcv_pid: - return - elif qos == 2: - assert 0 - - def subscribe(self, topic, qos=0): - assert self.cb is not None, "Subscribe callback is not set" - pkt = bytearray(b"\x82\0\0\0") - self.pid += 1 - struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid) - #print(hex(len(pkt)), hexlify(pkt, ":")) - self.sock.write(pkt) - self._send_str(topic) - self.sock.write(qos.to_bytes(1, "little")) - while 1: - op = self.wait_msg() - if op == 0x90: - resp = self.sock.read(4) - #print(resp) - assert resp[1] == pkt[2] and resp[2] == pkt[3] - if resp[3] == 0x80: - raise MQTTException(resp[3]) - return - - # Wait for a single incoming MQTT message and process it. - # Subscribed messages are delivered to a callback previously - # set by .set_callback() method. Other (internal) MQTT - # messages processed internally. - def wait_msg(self): - res = self.sock.read(1) - self.sock.setblocking(True) - if res is None: - return None - if res == b"": - raise OSError(-1) - if res == b"\xd0": # PINGRESP - sz = self.sock.read(1)[0] - assert sz == 0 - return None - op = res[0] - if op & 0xf0 != 0x30: - return op - sz = self._recv_len() - topic_len = self.sock.read(2) - topic_len = (topic_len[0] << 8) | topic_len[1] - topic = self.sock.read(topic_len) - sz -= topic_len + 2 - if op & 6: - pid = self.sock.read(2) - pid = pid[0] << 8 | pid[1] - sz -= 2 - msg = self.sock.read(sz) - self.cb(topic, msg) - if op & 6 == 2: - pkt = bytearray(b"\x40\x02\0\0") - struct.pack_into("!H", pkt, 2, pid) - self.sock.write(pkt) - elif op & 6 == 4: - assert 0 - - # Checks whether a pending message from server is available. - # If not, returns immediately with None. Otherwise, does - # the same processing as wait_msg. - def check_msg(self): - self.sock.setblocking(False) - return self.wait_msg() diff --git a/AD8232_C/code/ad8232.py b/AD8232_C/code/ad8232.py new file mode 100644 index 0000000..847fccd --- /dev/null +++ b/AD8232_C/code/ad8232.py @@ -0,0 +1,8 @@ +from machine import ADC,Pin + +def ADC_init(): + pinLo1 = Pin(2, Pin.IN) + pinLo2 = Pin(14, Pin.IN) # 信号输入 + adc_0 = ADC(Pin(5)) # ADC设置 + adc_0.equ(ADC.EQU_MODEL_8) # 采样8次 + return adc_0 \ No newline at end of file diff --git a/AD8232_C/code/heart.py b/AD8232_C/code/heart.py index 8d8d637..e69de29 100644 --- a/AD8232_C/code/heart.py +++ b/AD8232_C/code/heart.py @@ -1,153 +0,0 @@ -from machine import Pin,SPI,ADC -import utime -import st7789 -def init(): - spi = SPI(0, baudrate=40000000, polarity=1, phase=0, bits=8, endia=0, sck=Pin(6), mosi=Pin(8)) - display = st7789.ST7789(spi, 240, 240, reset=Pin(11, func=Pin.GPIO, dir=Pin.OUT),dc=Pin(7, func=Pin.GPIO, dir=Pin.OUT)) - display.init() # 屏幕初始化 - display.fill(st7789.color565(255, 255, 255)) # 设置屏幕界面为白色 - return display - -def screen_begin(display): - display.fill_rect(20, 200, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(25, 200, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(30, 200, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(35, 190, 5, 15, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(40, 180, 5, 10, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(45, 175, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(50, 180, 5, 35, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(55, 215, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(60, 200, 5, 15, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(65, 190, 5, 10, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(70, 185, 5, 5, st7789.color565(0, 0, 0)) # 心的左顶点 - display.fill_rect(70, 145, 5, 10, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(75, 190, 5, 20, st7789.color565(0, 0, 0)) - display.fill_rect(75, 155, 5, 10, st7789.color565(255, 0, 0)) # - display.fill_rect(75, 135, 5, 10, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(80, 210, 5, 5, st7789.color565(0, 0, 0)) - display.fill_rect(80, 165, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(80, 130, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(85, 200, 5, 10, st7789.color565(0, 0, 0)) - display.fill_rect(85, 170, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(85, 130, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(90, 200, 5, 5, st7789.color565(0, 0, 0)) - display.fill_rect(90, 175, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(90, 125, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(95, 200, 5, 5, st7789.color565(0, 0, 0)) - display.fill_rect(95, 180, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(95, 125, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(100, 200, 5, 5, st7789.color565(0, 0, 0)) - display.fill_rect(100, 185, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(100, 125, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(105, 190, 5, 15, st7789.color565(0, 0, 0)) # 心的左起点 - display.fill_rect(105, 185, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(105, 130, 5, 10, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(110, 140, 5, 5, st7789.color565(255, 0, 0)) # 心的中心点 - utime.sleep(0.1) - display.fill_rect(115, 190, 5, 15, st7789.color565(0, 0, 0)) # 心的右起点 - display.fill_rect(115, 185, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(115, 130, 5, 10, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(120, 200, 5, 5, st7789.color565(0, 0, 0)) - display.fill_rect(120, 185, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(120, 125, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(125, 200, 5, 5, st7789.color565(0, 0, 0)) - display.fill_rect(125, 180, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(125, 125, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(130, 200, 5, 5, st7789.color565(0, 0, 0)) - display.fill_rect(130, 175, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(130, 125, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(135, 200, 5, 10, st7789.color565(0, 0, 0)) - display.fill_rect(135, 170, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(135, 130, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(140, 210, 5, 5, st7789.color565(0, 0, 0)) - display.fill_rect(140, 165, 5, 5, st7789.color565(255, 0, 0)) # - display.fill_rect(140, 130, 5, 5, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(145, 200, 5, 10, st7789.color565(0, 0, 0)) - display.fill_rect(145, 155, 5, 10, st7789.color565(255, 0, 0)) # - display.fill_rect(145, 135, 5, 10, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(150, 195, 5, 5, st7789.color565(0, 0, 0)) # 心的右顶点 - display.fill_rect(150, 145, 5, 10, st7789.color565(255, 0, 0)) # - utime.sleep(0.1) - display.fill_rect(155, 200, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(160, 190, 5, 10, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(165, 175, 5, 15, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(170, 170, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(175, 175, 5, 35, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(180, 210, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(185, 200, 5, 10, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(190, 195, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(195, 195, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(200, 185, 5, 10, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(205, 180, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(210, 185, 5, 20, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(215, 200, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.fill_rect(220, 200, 5, 5, st7789.color565(0, 0, 0)) - utime.sleep(0.1) - display.draw_string(80, 60, "Welcome!", size=2, color=st7789.color565(0, 0, 0)) - display.draw_string(10, 90, "Send ", size=2, color=st7789.color565(0, 0, 0)) - display.draw_string(60, 90, "start", size=2, color=st7789.color565(255, 0, 0)) - display.draw_string(120, 90, "to measure!", size=2, color=st7789.color565(0, 0, 0)) - utime.sleep(5) - -def screen_form(display): - x = 0 - y = 0 - while True: # 绘制网格界面 - display.vline(x, 0, 240, st7789.color565(228, 232, 170)) - display.hline(0, y, 240, st7789.color565(228, 232, 170)) - x = x + 30 - y = y + 30 - if (x >= 240): - break - -def screen_little_heart_1(display): - display.fill_rect(25, 115, 5, 5, st7789.color565(239, 91, 91)) - display.fill_rect(30, 110, 5, 15, st7789.color565(239, 91, 91)) - display.fill_rect(35, 115, 5, 15, st7789.color565(239, 91, 91)) - display.fill_rect(40, 110, 5, 15, st7789.color565(239, 91, 91)) - display.fill_rect(45, 115, 5, 5, st7789.color565(239, 91, 91)) - -def screen_little_heart_2(display): - display.fill_rect(190, 115, 5, 5, st7789.color565(239, 91, 91)) - display.fill_rect(195, 110, 5, 15, st7789.color565(239, 91, 91)) - display.fill_rect(200, 115, 5, 15, st7789.color565(239, 91, 91)) - display.fill_rect(205, 110, 5, 15, st7789.color565(239, 91, 91)) - display.fill_rect(210, 115, 5, 5, st7789.color565(239, 91, 91)) \ No newline at end of file diff --git a/AD8232_C/code/main.py b/AD8232_C/code/main.py index 567b0b3..742b437 100644 --- a/AD8232_C/code/main.py +++ b/AD8232_C/code/main.py @@ -1,126 +1,43 @@ -from machine import Pin,SPI -from machine import Pin,ADC -from heart import init,screen_begin,screen_form -from heart import screen_little_heart_1,screen_little_heart_2 -from MQTT import MQTTClient -import utime, machine, network -import st7789 +from ad8232 import ADC_init #导入AD8232库 +from machine import Pin, SPI #导入通信以及引脚相关的库 +import st7789 #导入屏幕驱动库 import utime -global Mymsg -mymsg=None - -pinLo1 = Pin(2, Pin.IN) -pinLo2 = Pin(14, Pin.IN) # 信号输入 -adc = ADC(Pin(5)) # ADC设置 -adc.equ(ADC.EQU_MODEL_8) # 采样8次 - -wl = network.WLAN(network.STA_IF) -wl.active(1) -wl.connect('123','12345678',security=network.AUTH_PSK) - -client_id = "www" -mqtt_server = "thingworx.zucc.edu.cn" -port=1883 -topic_sub = "wsy" -topic_pub = "wsy" -mqtt_user = "" -mqtt_password = "" - -def sub_cb(topic, msg): - global mymsg - mymsg=msg - #print((topic, msg)) - #client.publish(topic_pub, msg) - -def connect_and_subscribe(): - global client_id, mqtt_server, topic_sub, mqtt_user, mqtt_password - client = MQTTClient(client_id, mqtt_server, user=mqtt_user, password=mqtt_password,port=port) - client.set_callback(sub_cb) - client.connect() - client.subscribe(topic_sub) - print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_server, topic_sub)) - return client - -def restart_and_reconnect(): - print('Failed to connect to MQTT broker. Reconnecting...') - utime.sleep(10) - machine.reset() - -try: - client = connect_and_subscribe() -except OSError as e: - restart_and_reconnect() - -display = init()#屏幕初始化 - -screen_begin(display) - +adc = ADC_init() + +spi = SPI(0, baudrate=40000000, polarity=1, phase=0, bits=8, endia=0, sck=Pin(6), mosi=Pin(8)) #构造spi对象 +display = st7789.ST7789(spi, 240, 240, reset=Pin(11,func=Pin.GPIO, dir=Pin.OUT), dc=Pin(7,func=Pin.GPIO, dir=Pin.OUT)) #构造屏幕控制对象 +display.init() #屏幕初始化 + +display.fill(st7789.color565(255,255,255)) +x1=0 +y1=80 +sum_adc=0 +i=0 +x=0 +y=0 +data=0 +average=0 +t=0 + while True: - client.subscribe(topic_sub) - if mymsg!=None: - Mymsg=str(mymsg,'utf-8') - print(Mymsg) - if (Mymsg=='start'): + if(pinLo1.value == 1 or pinLo2.value == 1): + display.draw_string(20,40,"Your patch to fall off",size=1,color=st7789.color565(0,0,0)) + else: + x2=x1+1 + y2=240-int(adc.read()/10) + display.line(x1, y1, x2, y2, st7789.color565(0,0,0))#心电图绘制 + x1=x1+1 + y1=y2 + value=adc.read()-data + data=adc.read() + if(value>=400):#寻找R型波(峰值变化最大) + sum_adc=sum_adc+value + i=i+1 + average=int(sum_adc/i/10*1.5)#心率数据 + if(x2 == 240 or x1 == 239): display.fill(st7789.color565(255,255,255)) - x1=0 - y1=80 - sum_adc=0 - i=0 - start = utime.ticks_ms()#开始时间为毫秒的递增计数器 - x=0 - y=0 - data=600 - average=0 - t=0 - screen_form(display) + display.draw_string(150,33,'0'+str(average),size=4,color=st7789.color565(0,0,0)) + x1=0#清屏重置图形数据 - while True: - if(pinLo1.value == 1 or pinLo2.value == 1): - display.draw_string(20,40,"Your patch to fall off",size=3,color=st7789.color565(0,0,0)) - elif(utime.ticks_diff(utime.ticks_ms(),start) == 60000): - utime.sleep(2) - break#一分钟结束测试 - else: - - x2=x1+1 - y2=240-int(adc.read()/10) - display.line(x1, y1, x2, y2, st7789.color565(0,0,0)) - x1=x1+1 - y1=y2 - value=adc.read()-data - data=adc.read() - if(value>=400): - sum_adc=sum_adc+value - i=i+1 - average=int(sum_adc/i/10*1.5)#心率数据 - t=1 - if(x2 == 240 or x1 == 239): - display.fill(st7789.color565(255,255,255)) - - display.draw_string(150,33,'0'+str(average),size=4,color=st7789.color565(0,0,0)) - x1=0#清屏重置图形数据 - screen_form(display) - if(average==0): - display.draw_string(20,80,"Your patch",size=4,color=st7789.color565(0,0,0)) - display.draw_string(0,120,"to fall off!",size=4,color=st7789.color565(0,0,0)) - continue - - utime.sleep(0.01) - - display.fill(st7789.color565(255,255,255)) - display.draw_string(40,50,"End of the test!",size=2,color=st7789.color565(255,0,0)) - display.draw_string(50,100,"The result has",size=2,color=st7789.color565(0,0,0)) - display.draw_string(38,120,"been sent to your",size=2,color=st7789.color565(0,0,0)) - display.draw_string(60,140,"mobile phone",size=2,color=st7789.color565(0,0,0)) - utime.sleep(3) - display.fill(st7789.color565(255,255,255)) - utime.sleep(0.1) - screen_little_heart_1(display) - display.draw_string(50,105,"Thanks!",size=4,color=st7789.color565(0,0,255)) - screen_little_heart_2(display) - - client.publish(topic_pub,"Heart Rate: "+str(average))#返还数据 - utime.sleep_ms(500) - client.subscribe(topic_sub) - mymsg=None #结束循环发送信息 \ No newline at end of file + utime.sleep(0.01) \ No newline at end of file -- Gitee