1197| 1
|
[Micropython] FireBeetle 2 ESP32-S3 使用Esp-Now |
FireBeetle 2 ESP32-S3是一款基于ESP32-S3的开发板,支持使用Esp-Now进行通信。Esp-Now是Espressif Systems开发的一种低功耗、快速、可靠的无线通信协议,旨在在ESP32和ESP8266芯片之间或者在ESP32芯片之间进行直接通信。 使用Esp-Now进行通信的基本步骤如下: 1. 初始化Esp-Now:在FireBeetle 2 ESP32-S3上,用`esp_now`库初始化Esp-Now功能。这包括初始化WiFi和ESP-Now,并设置回调函数来处理接收到的数据。 2. 注册Peers:在Esp-Now通信中,有一个发送方(Sender)和一个或多个接收方(Receiver),也称为Peers。在FireBeetle 2 ESP32-S3上,您可以使用`esp_now`库的`esp_now_add_peer()`函数注册其他设备作为Peers。 3. 发送数据:作为发送方,您可以使用`esp_now`库的`esp_now_send()`函数将数据发送给已注册的Peers。您可以将数据以任何格式发送,例如字符串、字节数组等。 4. 接收数据:作为接收方,您需要设置回调函数来处理接收到的数据。当FireBeetle 2 ESP32-S3接收到来自Peers的数据时,Esp-Now会调用回调函数,并将数据传递给它。 首先我们以下代码获取当前开发板的Mac import network # A WLAN interface must be active to send()/recv() sta = network.WLAN(network.STA_IF) sta.active(True) print("Mac:", sta.config("mac")) 这里我们是不需要提供Wifi的ssid和密码的。这也是EspNow的一大优势之一 下面是一个简单的示例代码,演示了如何在FireBeetle 2 ESP32-S3上使用Esp-Now进行通信: import esp_now import network from machine import Pin # 初始化WiFi和Esp-Now wifi = network.WLAN(network.STA_IF) wifi.active(True) esp_now.init() # 回调函数来处理接收到的数据 def on_data_received(data): print("Received data:", data) # 设置回调函数 esp_now.on_recv(on_data_received) # 注册接收方设备作为Peer receiver_mac = b'\x12\x34\x56\x78\x90\xAB' # 用上面的代码获得接收方的mac esp_now.add_peer(receiver_mac) # 发送数据给接收方 data = b"Hello, Esp-Now!" esp_now.send(receiver_mac, data) # 延迟一段时间以等待接收方处理数据 time.sleep(1) # 关闭Esp-Now esp_now.deinit() 在上述示例代码中,我们首先导入`esp_now`和`network`库,并初始化WiFi和Esp-Now。 我们定义了一个回调函数`on_data_received`,它用于处理接收到的数据。当FireBeetle 2 ESP32-S3接收到来自Peers的数据时,Esp-Now会调用此回调函数,并将数据传递给它。 然后,我们使用`esp_now.add_peer()`函数注册接收方设备的MAC地址作为Peer。您需要将`receiver_mac`替换为实际的接收方设备的MAC地址。 接下来,我们使用`esp_now.send()`函数将数据发送给接收方。在示例中,我们发送了一个简单的字符串。 最后,我们使用`esp_now.deinit()`关闭Esp-Now。 下面是完整的异步esp-now代码 import network import aioespnow import uasyncio as asyncio # A WLAN interface must be active to send()/recv() sta = network.WLAN(network.STA_IF) sta.active(True) print("Mac:", sta.config("mac")) e = aioespnow.AIOESPNow() # Returns AIOESPNow enhanced with async support e.active(True) peer = b'\xdcTu\x93q\x8c' #peer = b'`U\xf9y\xbc\xfc' #LUATOS e.add_peer(peer) # Send a periodic ping to a peer async def heartbeat(e, peer, period=30): while True: if not await e.asend(peer, b'ping'): print("Heartbeat: peer not responding:", peer) else: print("Heartbeat: ping", peer) await asyncio.sleep(period) # Echo any received messages back to the sender async def echo_server(e): async for mac, msg in e: print("Echo:", msg) try: await e.asend(mac, msg) except OSError as err: if len(err.args) > 1 and err.args[1] == 'ESP_ERR_ESPNOW_NOT_FOUND': e.add_peer(mac) await e.asend(mac, msg) async def main(e, peer, timeout, period): asyncio.create_task(heartbeat(e, peer, period)) asyncio.create_task(echo_server(e)) await asyncio.sleep(timeout) asyncio.run(main(e, peer, 120, 10)) |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed