2416浏览
查看: 2416|回复: 0

[ESP8266/ESP32] thonny更新固件和手机远程点灯

[复制链接]
本帖最后由 得劲滋润爽 于 2023-6-2 13:30 编辑

thonny更新固件和手机远程点灯

板子:合宙ESP32-C3简约版
thonny:4.0.2
MQTT服务器:broker.emqx.io
在线调试助手:http://www.emqx.io/online-mqtt-client
手机APP:IOT MQTT panel
micropython固件:esp32c3-usb-20230426-v1.20.0


我的板子是已经有固件了,并且可以正常使用,如果你的条件不满足请使用乐鑫官方的flash_download_tool进行固件的烧写。(社区搜索ESP32 C3能搜到教程)


一、连接板子,烧写固件
thonny更新固件和手机远程点灯图1thonny更新固件和手机远程点灯图2thonny更新固件和手机远程点灯图3thonny更新固件和手机远程点灯图4thonny更新固件和手机远程点灯图5thonny更新固件和手机远程点灯图6

报错了
thonny更新固件和手机远程点灯图7
[tr][/tr]
  


按住boot键再插数据线试一下
thonny更新固件和手机远程点灯图8thonny更新固件和手机远程点灯图9
OK了,如果还是失败或者刷完固件无法正常运行可以再尝试重新烧写一次,还不行就请使用乐鑫官方的烧写工具进行烧写固件。!




二、测试MQTT通信
  1. '''
  2. 实验名称:MQTT通信
  3. 版本:v1.1
  4. 日期:2023.5
  5. 改编:maikemaker
  6. 说明:编程实现MQTT通信,实现接收到消息后打印出消息和topic并且往另一个topic发送一条消息
  7. MQTT助手:http://www.emqx.io/online-mqtt-client
  8. '''
  9. import network,time
  10. from simple import MQTTClient #导入MQTT板块
  11. from machine import Pin,Timer
  12. #WIFI连接函数
  13. def WIFI_Connect():
  14.     WIFI_LED=Pin(12, Pin.OUT) #初始化WIFI指示灯
  15.     wlan = network.WLAN(network.STA_IF) #STA模式
  16.     wlan.active(True)                   #激活接口
  17.     start_time=time.time()              #记录时间做超时判断
  18.     if not wlan.isconnected():
  19.         print('connecting to network...')
  20.         wlan.connect('waoo2111280', 'waoo2111280') #输入WIFI账号密码
  21.         while not wlan.isconnected():
  22.             #LED闪烁提示
  23.             WIFI_LED.value(1)
  24.             time.sleep_ms(300)
  25.             WIFI_LED.value(0)
  26.             time.sleep_ms(300)
  27.             #超时判断,15秒没连接成功判定为超时
  28.             if time.time()-start_time > 15 :
  29.                 print('WIFI Connected Timeout!')
  30.                 wlan.active(False) #反激活WiFi
  31.                 break
  32.     if wlan.isconnected():
  33.         #LED点亮
  34.         WIFI_LED.value(1)
  35.         #串口打印信息
  36.         print('network information:', wlan.ifconfig())
  37.         
  38.         return True
  39.     else:
  40.         return False
  41.    
  42. #MQTT发布数据任务
  43. def MQTT_Send(tim):
  44.     client.publish(TOPIC2, 'Im fine.Thanks')
  45. #设置MQTT回调函数,有信息时候执行
  46. def MQTT_callback(topic, msg):
  47.     print('topic: {}'.format(topic))
  48.     print('msg: {}'.format(msg))
  49.     MQTT_Send(None) #调用MQTT_Send()函数
  50.    
  51. #接收数据任务
  52. def MQTT_Rev(tim):
  53.     client.check_msg()
  54. #执行WIFI连接函数并判断是否已经连接成功
  55. if WIFI_Connect():
  56.     SERVER = 'broker.emqx.io'# MQTT服务器
  57.     PORT = 1883 #端口
  58.     CLIENT_ID = '202306021143' # 客户端ID
复制代码


程序效果,给接收的话题发送一个消息,接收到之后串口打印消息并给回复的话题回复一条消息。


上传MQTT库
  1. import usocket as socket
  2. import ustruct as struct
  3. from ubinascii import hexlify
  4. class MQTTException(Exception):
  5.     pass
  6. class MQTTClient:
  7.     def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0,
  8.                  ssl=False, ssl_params={}):
  9.         if port == 0:
  10.             port = 8883 if ssl else 1883
  11.         self.client_id = client_id
  12.         self.sock = None
  13.         self.server = server
  14.         self.port = port
  15.         self.ssl = ssl
  16.         self.ssl_params = ssl_params
  17.         self.pid = 0
  18.         self.cb = None
  19.         self.user = user
  20.         self.pswd = password
  21.         self.keepalive = keepalive
  22.         self.lw_topic = None
  23.         self.lw_msg = None
  24.         self.lw_qos = 0
  25.         self.lw_retain = False
  26.     def _send_str(self, s):
  27.         self.sock.write(struct.pack("!H", len(s)))
  28.         self.sock.write(s)
  29.     def _recv_len(self):
  30.         n = 0
  31.         sh = 0
  32.         while 1:
  33.             b = self.sock.read(1)[0]
  34.             n |= (b & 0x7f) << sh
  35.             if not b & 0x80:
  36.                 return n
  37.             sh += 7
  38.     def set_callback(self, f):
  39.         self.cb = f
  40.     def set_last_will(self, topic, msg, retain=False, qos=0):
  41.         assert 0 <= qos <= 2
  42.         assert topic
  43.         self.lw_topic = topic
  44.         self.lw_msg = msg
  45.         self.lw_qos = qos
  46.         self.lw_retain = retain
  47.     def connect(self, clean_session=True):
  48.         self.sock = socket.socket()
  49.         addr = socket.getaddrinfo(self.server, self.port)[0][-1]
  50.         self.sock.connect(addr)
  51.         if self.ssl:
  52.             import ussl
  53.             self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
  54.         premsg = bytearray(b"\x10\0\0\0\0\0")
  55.         msg = bytearray(b"\x04MQTT\x04\x02\0\0")
  56.         sz = 10 + 2 + len(self.client_id)
  57.         msg[6] = clean_session << 1
  58.         if self.user is not None:
  59.             sz += 2 + len(self.user) + 2 + len(self.pswd)
  60.             msg[6] |= 0xC0
  61.         if self.keepalive:
  62.             assert self.keepalive < 65536
  63.             msg[7] |= self.keepalive >> 8
  64.             msg[8] |= self.keepalive & 0x00FF
  65.         if self.lw_topic:
  66.             sz += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)
  67.             msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
  68.             msg[6] |= self.lw_retain << 5
  69.         i = 1
  70.         while sz > 0x7f:
  71.             premsg[i] = (sz & 0x7f) | 0x80
  72.             sz >>= 7
  73.             i += 1
  74.         premsg[i] = sz
  75.         self.sock.write(premsg, i + 2)
  76.         self.sock.write(msg)
  77.         #print(hex(len(msg)), hexlify(msg, ":"))
  78.         self._send_str(self.client_id)
  79.         if self.lw_topic:
  80.             self._send_str(self.lw_topic)
  81.             self._send_str(self.lw_msg)
  82.         if self.user is not None:
  83.             self._send_str(self.user)
  84.             self._send_str(self.pswd)
  85.         resp = self.sock.read(4)
  86.         assert resp[0] == 0x20 and resp[1] == 0x02
  87.         if resp[3] != 0:
  88.             raise MQTTException(resp[3])
  89.         return resp[2] & 1
  90.     def disconnect(self):
  91.         self.sock.write(b"\xe0\0")
  92.         self.sock.close()
  93.     def ping(self):
  94.         self.sock.write(b"\xc0\0")
  95.     def publish(self, topic, msg, retain=False, qos=0):
  96.         pkt = bytearray(b"\x30\0\0\0")
  97.         pkt[0] |= qos << 1 | retain
  98.         sz = 2 + len(topic) + len(msg)
  99.         if qos > 0:
  100.             sz += 2
  101.         assert sz < 2097152
  102.         i = 1
  103.         while sz > 0x7f:
  104.             pkt[i] = (sz & 0x7f) | 0x80
  105.             sz >>= 7
  106.             i += 1
  107.         pkt[i] = sz
  108.         #print(hex(len(pkt)), hexlify(pkt, ":"))
  109.         self.sock.write(pkt, i + 1)
  110.         self._send_str(topic)
  111.         if qos > 0:
  112.             self.pid += 1
  113.             pid = self.pid
  114.             struct.pack_into("!H", pkt, 0, pid)
  115.             self.sock.write(pkt, 2)
  116.         self.sock.write(msg)
  117.         if qos == 1:
  118.             while 1:
  119.                 op = self.wait_msg()
  120.                 if op == 0x40:
  121.                     sz = self.sock.read(1)
  122.                     assert sz == b"\x02"
  123.                     rcv_pid = self.sock.read(2)
  124.                     rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]
  125.                     if pid == rcv_pid:
  126.                         return
  127.         elif qos == 2:
  128.             assert 0
  129.     def subscribe(self, topic, qos=0):
  130.         assert self.cb is not None, "Subscribe callback is not set"
  131.         pkt = bytearray(b"\x82\0\0\0")
  132.         self.pid += 1
  133.         struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
  134.         #print(hex(len(pkt)), hexlify(pkt, ":"))
  135.         self.sock.write(pkt)
  136.         self._send_str(topic)
  137.         self.sock.write(qos.to_bytes(1, "little"))
  138.         while 1:
  139.             op = self.wait_msg()
  140.             if op == 0x90:
  141.                 resp = self.sock.read(4)
  142.                 #print(resp)
  143.                 assert resp[1] == pkt[2] and resp[2] == pkt[3]
  144.                 if resp[3] == 0x80:
  145.                     raise MQTTException(resp[3])
  146.                 return
  147.     # Wait for a single incoming MQTT message and process it.
  148.     # Subscribed messages are delivered to a callback previously
  149.     # set by .set_callback() method. Other (internal) MQTT
  150.     # messages processed internally.
  151.     def wait_msg(self):
  152.         res = self.sock.read(1)
  153.         self.sock.setblocking(True)
  154.         if res is None:
  155.             return None
  156.         if res == b"":
  157.             raise OSError(-1)
  158.         if res == b"\xd0":  # PINGRESP
  159.             sz = self.sock.read(1)[0]
  160.             assert sz == 0
  161.             return None
  162.         op = res[0]
  163.         if op & 0xf0 != 0x30:
  164.             return op
  165.         sz = self._recv_len()
  166.         topic_len = self.sock.read(2)
  167.         topic_len = (topic_len[0] << 8) | topic_len[1]
  168.         topic = self.sock.read(topic_len)
  169.         sz -= topic_len + 2
  170.         if op & 6:
  171.             pid = self.sock.read(2)
  172.             pid = pid[0] << 8 | pid[1]
  173.             sz -= 2
  174.         msg = self.sock.read(sz)
  175.         self.cb(topic, msg)
  176.         if op & 6 == 2:
  177.             pkt = bytearray(b"\x40\x02\0\0")
  178.             struct.pack_into("!H", pkt, 2, pid)
  179.             self.sock.write(pkt)
  180.         elif op & 6 == 4:
  181.             assert 0
  182.     # Checks whether a pending message from server is available.
  183.     # If not, returns immediately with None. Otherwise, does
  184.     # the same processing as wait_msg.
  185.     def check_msg(self):
  186.         self.sock.setblocking(False)
  187.         return self.wait_msg()
复制代码
新建文件,输入上面的代码,点击保存,选择保存到micropython设备,文件名simple.py
thonny更新固件和手机远程点灯图11thonny更新固件和手机远程点灯图12thonny更新固件和手机远程点灯图13
打开文件视图
thonny更新固件和手机远程点灯图10

运行程序
thonny更新固件和手机远程点灯图14
打开调试助手,进行调试
thonny更新固件和手机远程点灯图15thonny更新固件和手机远程点灯图16thonny更新固件和手机远程点灯图17thonny更新固件和手机远程点灯图18thonny更新固件和手机远程点灯图19


订阅程序里面的两个主题(Topic)
thonny更新固件和手机远程点灯图20thonny更新固件和手机远程点灯图21
效果
thonny更新固件和手机远程点灯图22


三、点灯测试
  1. '''
  2. 实验名称:MQTT通信
  3. 版本:v1.1
  4. 日期:2023.6
  5. 改编:maikemaker
  6. 说明:点灯测试
  7. MQTT助手:http://www.emqx.io/online-mqtt-client
  8. '''
  9. import network,time
  10. from simple import MQTTClient #导入MQTT板块
  11. from machine import Pin,Timer
  12. led=Pin(13,Pin.OUT,value=0)
  13. #WIFI连接函数
  14. def WIFI_Connect():
  15.     WIFI_LED=Pin(12, Pin.OUT) #初始化WIFI指示灯
  16.     wlan = network.WLAN(network.STA_IF) #STA模式
  17.     wlan.active(True)                   #激活接口
  18.     start_time=time.time()              #记录时间做超时判断
  19.     if not wlan.isconnected():
  20.         print('connecting to network...')
  21.         wlan.connect('waoo2111280', 'waoo2111280') #输入WIFI账号密码
  22.         while not wlan.isconnected():
  23.             #LED闪烁提示
  24.             WIFI_LED.value(1)
  25.             time.sleep_ms(300)
  26.             WIFI_LED.value(0)
  27.             time.sleep_ms(300)
  28.             #超时判断,15秒没连接成功判定为超时
  29.             if time.time()-start_time > 15 :
  30.                 print('WIFI Connected Timeout!')
  31.                 wlan.active(False) #反激活WiFi
  32.                 break
  33.     if wlan.isconnected():
  34.         #LED点亮
  35.         WIFI_LED.value(1)
  36.         #串口打印信息
  37.         print('network information:', wlan.ifconfig())
  38.         
  39.         return True
  40.     else:
  41.         return False
  42.    
  43. #MQTT发布数据任务
  44. def MQTT_Send(tim):
  45.     client.publish(TOPIC2, 'Im fine.Thanks')
  46. #设置MQTT回调函数,有信息时候执行
  47. def MQTT_callback(topic, msg):
  48.     print('topic: {}'.format(topic))
  49.     print('msg: {}'.format(msg))
  50.     if msg==b'on':
  51.         led.value(1)
  52.     if msg==b'off':
  53.         led.value(0)
  54.     MQTT_Send(None) #调用MQTT_Send()函数
  55.    
  56. #接收数据任务
  57. def MQTT_Rev(tim):
  58.     client.check_msg()
  59. #执行WIFI连接函数并判断是否已经连接成功
  60. if WIFI_Connect():
  61.     SERVER = 'broker.emqx.io'# MQTT服务器
  62.     PORT = 1883
  63.     CLIENT_ID = '202306021143' # 客户端ID
  64.     #话题1
  65.     TOPIC = '/T1/test/1' # TOPIC名称,接收消息的主题
  66.     #话题2
  67.     TOPIC2 = '/T2/test/2' # TOPIC名称,回复的主题
  68.    
  69.     client = MQTTClient(CLIENT_ID, SERVER, PORT)
  70.     client.set_callback(MQTT_callback)  #配置回调函数
  71.     client.connect()
  72.     client.subscribe(TOPIC) #订阅主题
  73.     #开启RTOS定时器,编号为0或2,周期1000ms,执行MQTT发布
  74.     tim = Timer(0)
  75.     tim.init(period=300, mode=Timer.PERIODIC,callback=MQTT_Rev)
复制代码

thonny更新固件和手机远程点灯图35
设置APP
thonny更新固件和手机远程点灯图23thonny更新固件和手机远程点灯图24thonny更新固件和手机远程点灯图25thonny更新固件和手机远程点灯图26thonny更新固件和手机远程点灯图27thonny更新固件和手机远程点灯图28thonny更新固件和手机远程点灯图29
添加两个按钮
thonny更新固件和手机远程点灯图30thonny更新固件和手机远程点灯图31thonny更新固件和手机远程点灯图32thonny更新固件和手机远程点灯图33thonny更新固件和手机远程点灯图34


测试
thonny更新固件和手机远程点灯图36

效果还不错吧
试一下开关控件
thonny更新固件和手机远程点灯图37
thonny更新固件和手机远程点灯图38
效果也不错。


不想用blynk和点灯的可以试试这个APP。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail