1 如何在Micropython下使用ESPNow功能进行数据传输呢?-德赢Vwin官网 网

如何在Micropython下使用ESPNow功能进行数据传输呢?

电子说

1.3w人已加入

描述

ESPNow是一种轻量级的无线通信协议,适用于ESP32芯片,它可以实现低功耗、高效率的设备间通讯,不需要路由器,也不需要wifi,同时,在使用ESPNow的时候不影响wifi 和蓝牙。

在文章中,我们将学习如何在Micropython环境下使用ESP32的ESPNow功能进行数据传输。ESPNOW支持一对一,一对多,多对多的各种通讯方式,在这里不做更多的说明。

准备工作

在开始之前,确保你已经做好了以下准备工作:

1.安装Micropython固件到ESP32模块上(1.20.0 以后的版本)。
2.确保你有两个或更多的ESP32模块,它们将用于数据通讯(我用的两块ESP32-S3进行的测试,实际ESP8266也是支持的,但是某些函数略有差异)。

获取ESP32的MAC地址

ESPNOW发送数据需要知道目标ESP32的MAC地址。有两种简单的方法获取MAC地址,一种是在烧录完成后可以看到,另一个是通过程序来获得

路由器

在上图中烧录完成后可以看到AP和STA状态下的MAC地址

下面是通过代码获取MAC地址的方法:

路由器

获取到MAC地址后,一切都简单了,当然,还有一种不获取MAC地址的方法就是广播0xFF*6的方式,废话不多说,直接上代码

发送端

import network
import espnow
import time

sta = network.WLAN(network.STA_IF)    # Enable station mode for ESP
sta.active(True)
sta.disconnect()        # Disconnect from last connected WiFi SSID

e = espnow.ESPNow()     # Enable ESP-NOW
e.active(True)

peer1 = b'x34x85x18x90x86x38'   # MAC address of peer1's wifi interface
e.add_peer(peer1)                     # add peer1 (receiver1)
#如果有多个接收都就在这下面接着增加peer2...

print("Starting...")            # Send to all peers

def main():
    while True:
        e.send(peer1, "这是Slave发送过来的数据", True)     # send commands to pear 1
        time.sleep(2)

if __name__ == "__main__":
    main()

代码很简单,直接官方代码小改,注意使用时改MAC地址即可。

#### 接收端的代码
import network
import espnow
# A WLAN interface must be active to send()/recv()
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect()                # Disconnect from last connected WiFi SSID

e = espnow.ESPNow()                  # Enable ESP-NOW
e.active(True)

peer = b'x34x85x18x46x3dx28'   # MAC address of peer's wifi interface
#这个MAC地址是发送端的
e.add_peer(peer)                     # Sender's MAC registration

def espnow_rx():
    while True:
        host, msg = e.recv()
        if msg:                          # wait for message
            print(msg)
if __name__ == "__main__":
    espnow_rx()

代码简单,不多赘述,注册完设备后就收发信息即可。

通过以上步骤,你就可以在Micropython环境下使用ESPNow进行简单而高效的数据通讯了。记得根据你的实际需求调整代码和配置信息。

几个说明

在Micropython控制硬件主要就分几步走,首先导入相关的库,然后构建对象,接下来定义相关的函数,最后调用定义好的函数。

1.在这里,导入espnow之后,先实例化一个对象并激活。

2.在使用espnow收发数据之前必须先启用Network.STA_IF或者Network.AP_IF,如果不需要wifi转发那就不需要连接或者配置

3.ESPNow.send(mac,msg)注意消息发送消息长度不大于250bytes,如是长度大于250bytes时切包再合包。

4.ESPNow.recv([timeout_ms])接收数据

5.ESPNow.any()检查数据是否可用

6.其它函数简说:

ESPNow.set_pmk(pmk) 设置用于加密本地主密钥的主密钥 (PMK) 用于加密消息的密钥 (LMK)。如果未设置,则默认 PMK 为 由底层乐鑫 ESP-NOW 软件堆栈使用

ESPNow.add_peer(mac[, lmk][, channel][, ifidx][, encrypt])

ESPNow.add_peer(mac, param=value, …)

添加/注册提供的 mac 地址作为对等方。其他参数可以 也被指定为位置或关键字参数(任何设置为 的参数都将设置为其默认值)

ESPNow.del_peer(mac) 取消注册与提供的 mac 地址关联的对等方

ESPNow.get_peer(mac) (ESP32 only) 已注册的对等体上转换信息

ESPNow.get_peers() (ESP32 only) 返回所有已注册对等方的“对等信息”参数(作为元组 元组)。

ESPNow.peer_count() (ESP32 only) 查看已注册对等方的数量

ESPNow.mod_peer(mac, lmk, [channel], [ifidx], [encrypt]) (ESP32 only) ESPNow.mod_peer(mac, ‘param’=value, …) (ESP32 only)

修改与提供的 mac 地址关联的对等方的参数。参数可以作为位置或关键字参数提供 (请参阅)。任何未设置(或设置为 )的参数都将保留该参数的现有值。

ESPNow.irq(callback) (ESP32 only)

设置回调函数,在消息有消息后尽快调用 从另一个 ESPNow 设备接收。将调用回调函数 以实例对象作为参数。

为了更可靠的运行, 建议在以下情况下读出尽可能多的可用消息 调用回调并将读取超时设置为零,例如:

def recv_cb(e):
    while True:  # Read out all messages waiting in the buffer
        mac, msg = e.irecv(0)  # Don't wait if no messages left
        if mac is None:
            return
        print(mac, msg)
e.irq(recv_cb)

广播消息的方法:
bcast = b'xff' * 6
e.add_peer(bcast)
e.send(bcast, "Hello World!")
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分