584浏览
查看: 584|回复: 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))





tiger_zc  中级技师

发表于 2024-4-8 17:09:21

向大佬学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

硬件清单

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

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

mail