oringinal code:
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()
from machine import Pin
from machine import Timer
from time import sleep_ms
import bluetooth
import struct
import machine
Study_hours_today = [] # 学习时间-今日
Learning_model_data_day = [] # 学习模式数据-日
Learning_model_data_week = [] # 学习模式数据-周
Learning_model_data_month = [] # 学习模式数据-月
Learn_marketing_data_analysis_week = [] # 学习市场数据分析-周
Learn_marketing_data_analysis_month1 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month2 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month3 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month4 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month5 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month6 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month7 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month8 = [] # 学习市场数据分析-月
BLE_MSG = ""
# 配置串口
uart = machine.UART(2, baudrate=115200) # UART在ESP32上的引脚号为2
uart.init(115200, bits=8, parity=None, stop=1)
def parse_data(data):
decoded_data = data.decode()
key, value = decoded_data.split(':') # 根据冒号分割key和value
value = int(value.split()[0]) # 去掉value后面的“hours”,并将其转换为整数
if key == 'sht':
Study_hours_today.append(value)
elif key == 'lmdd':
Learning_model_data_day.append(value)
elif key == 'lmdw':
Learning_model_data_week.append(value)
elif key == 'lmdm':
Learning_model_data_month.append(value)
elif key == 'lmdaw':
Learn_marketing_data_analysis_week.append(value)
elif key == 'lmdam1':
Learn_marketing_data_analysis_month1.append(value)
elif key == 'lmdam2':
Learn_marketing_data_analysis_month2.append(value)
elif key == 'lmdam3':
Learn_marketing_data_analysis_month3.append(value)
elif key == 'lmdam4':
Learn_marketing_data_analysis_month4.append(value)
elif key == 'lmdam5':
Learn_marketing_data_analysis_month5.append(value)
elif key == 'lmdam6':
Learn_marketing_data_analysis_month6.append(value)
elif key == 'lmdam7':
Learn_marketing_data_analysis_month7.append(value)
elif key == 'lmdam8':
Learn_marketing_data_analysis_month8.append(value)
class ESP32_BLE():
def __init__(self, name):
self.led = Pin(2, Pin.OUT)
self.timer1 = Timer(0)
self.name = name
self.ble = bluetooth.BLE()
self.ble.active(True)
self.ble.config(gap_name=name)
self.disconnected()
self.ble.irq(self.ble_irq)
self.register()
self.ble.gatts_write(self.tx, bytes(1000))
self.advertiser()
def connected(self):
self.led.value(1)
self.timer1.deinit()
def disconnected(self):
self.timer1.init(period=100, mode=Timer.PERIODIC, callback=lambda t: self.led.value(not self.led.value()))
def ble_irq(self, event, data):
global BLE_MSG
if event == 1: #_IRQ_CENTRAL_CONNECT 手机链接了此设备
self.connected()
elif event == 2: #_IRQ_CENTRAL_DISCONNECT 手机断开此设备
self.advertiser()
self.disconnected()
elif event == 3: #_IRQ_GATTS_WRITE 手机发送了数据
buffer = self.ble.gatts_read(self.rx)
BLE_MSG = buffer.decode('UTF-8').strip()
def register(self):
service_uuid = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'
reader_uuid = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'
sender_uuid = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'
services = (
(
bluetooth.UUID(service_uuid),
(
(bluetooth.UUID(sender_uuid), bluetooth.FLAG_NOTIFY | 0xFB),
(bluetooth.UUID(reader_uuid), bluetooth.FLAG_WRITE | 0xFB),
)
),
)
((self.tx, self.rx,), ) = self.ble.gatts_register_services(services)
def send(self, data):
self.ble.gatts_notify(0, self.tx, data)
def advertiser(self):
name = bytes(self.name, 'UTF-8')
adv_data = bytearray('\x02\x01\x02') + bytearray((len(name) + 1, 0x09)) + name
self.ble.gap_advertise(100, adv_data)
print(adv_data)
print("\r\n")
def send():
led.value(not led.value())
print('LED is ON.' if led.value() else 'LED is OFF')
for i in range(1):
ble.send('sht:{} '.format(Study_hours_today[i]))
sleep_ms(1000)
ble.send('lmdd:{} '.format(','.join(str(i) for i in Learning_model_data_day)))
sleep_ms(400)
ble.send('lmdw:{} '.format(','.join(str(i) for i in Learning_model_data_week)))
sleep_ms(400)
ble.send('lmdm:{} '.format(','.join(str(i) for i in Learning_model_data_month)))
sleep_ms(400)
ble.send('lmdaw:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_week)))
sleep_ms(400)
ble.send('lmdam1:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month1)))
sleep_ms(400)
ble.send('lmdam2:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month2)))
sleep_ms(400)
ble.send('lmdam3:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month3)))
sleep_ms(400)
ble.send('lmdam4:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month4)))
sleep_ms(400)
ble.send('lmdam5:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month5)))
sleep_ms(400)
ble.send('lmdam6:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month6)))
sleep_ms(400)
ble.send('lmdam7:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month7)))
sleep_ms(400)
ble.send('lmdam8:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month8)))
sleep_ms(400)
# 发送最后一组,剩余 3个数据
def simulate_button_press():
but.on() # 设置引脚为高电平
sleep_ms(400)
but.off() # 设置引脚为低电平
if __name__ == "__main__":
ble = ESP32_BLE("ESP32BLE")
led = Pin(2, Pin.OUT)
while(1):
for i in range(50):
if uart.any(): # 判断串口是否有数据可读
data = uart.readline() # 读取一行数据
parse_data(data) # 解析数据并放入相应的数组中
if len(Study_hours_today) == 1 and \
len(Learning_model_data_day) == 4 and \
len(Learning_model_data_week) == 4 and \
len(Learning_model_data_month) == 4 and \
len(Learn_marketing_data_analysis_week) == 7 and \
len(Learn_marketing_data_analysis_month1) == 7 and \
len(Learn_marketing_data_analysis_month2) == 7 and \
len(Learn_marketing_data_analysis_month3) == 7 and \
len(Learn_marketing_data_analysis_month4) == 7 and \
len(Learn_marketing_data_analysis_month5) == 7 and \
len(Learn_marketing_data_analysis_month6) == 7 and \
len(Learn_marketing_data_analysis_month7) == 7 and \
len(Learn_marketing_data_analysis_month8) == 2:
send()
data='b'
Study_hours_today=Study_hours_today[-1:]
Learning_model_data_day=Learning_model_data_day[-4:]
Learning_model_data_week=Learning_model_data_week[-4:]
Learning_model_data_month=Learning_model_data_month[-4:]
Learn_marketing_data_analysis_week=Learn_marketing_data_analysis_week[-7:]
Learn_marketing_data_analysis_month1=Learn_marketing_data_analysis_month1[-7:]
Learn_marketing_data_analysis_month2=Learn_marketing_data_analysis_month2[-7:]
Learn_marketing_data_analysis_month3=Learn_marketing_data_analysis_month3[-7:]
Learn_marketing_data_analysis_month4=Learn_marketing_data_analysis_month4[-7:]
Learn_marketing_data_analysis_month5=Learn_marketing_data_analysis_month5[-7:]
Learn_marketing_data_analysis_month6=Learn_marketing_data_analysis_month6[-7:]
Learn_marketing_data_analysis_month7=Learn_marketing_data_analysis_month7[-7:]
Learn_marketing_data_analysis_month8=Learn_marketing_data_analysis_month8[-2:]
In this place,we can see so many words to judge the length whether enough.Why we use so many word to judge?Yes,you can think that if we don't use this word to judge,we will suprisly find
it will offer a error :list is out of range
why?
because as a slave computer,if it can't receive data,we use send fuction will appear this wrong.So we should check this length and send,it can avoid this problem