前言:
最近学习了一下ESP32_NOW的通讯,发现例程有点难懂,现在从esp32_now 中的Control例程来解析一下它的程序思路。
作为新手去看它官方文档,感觉最缺的就是这个程序的整体流程。
虽然例程直接编译就可以工作,却没有一个操作说明,让人不知所措,经过一番折腾总结经验如下。
前提条件:
将程序编译完成并且下载到ESP32 DEMO板上(必须两个板以上才以通信),最好能看到日志并判断已经正常工作。
下面是操作步骤:
1、一块板作为控制设备,只需要操作这块板的控制按键即可,注意一定要等被控制设备开机后才能双击控制按键。
2、另一块板为被控制设备,只需要按重启键并靠近控制设备。
3、以上准备好之后,被控制设备重启后,在20秒内双击控制设备按键此时开始绑定,这样才能绑定成功。
如果没有成功,需要重新长按控制设备按键(>2秒)取消绑定,才能再次进行绑定。
4、绑定成功后单击控制设备键会发送控制命令,被控制设备会处理命令并改变LED状态。
5、绑定后数据会被保存,控制设备重启后,还需要双击一下后再单击才能发送控制命令。
重要:被控制设备怎么才能绑定?是根据开机时间和rssi的信号强弱来确定的。靠的近一些、开机就立即绑定。实际应用中这些参数可以设置的更严格些,缩小绑定范围,防止误绑定其它设备。
这些参数通过下面函数更改:
static void app_responder_init(void)
{
ESP_ERROR_CHECK(espnow_ctrl_responder_bind(15 * 1000, -45, NULL)); // 设置符合绑定设备条件参数(rssi >-45和开机20秒内)
espnow_ctrl_responder_data(app_responder_ctrl_data_cb); // 注册控制数据包处理事件回调函数
}
功能说明:
控制设备方通过双击按键发送绑定设备命令和单击发送控制命令。
接收方收到控制命令后RGB LED会显示对应状态。
绑定设备:
双击按钮,所有收到命令并符合条件的设备将被绑定。(可同时绑定多台设备)
需要绑定的设备一定要符合条件才能被绑定 。如:开机时间<20秒,RSSI>-45。通过条件可以排除不需要绑定的设备。
如果绑定不成功可将控制设备解绑或重启,并将被绑定设备重启设备和靠近,再进行绑定操作。(不能重复绑定,只能解绑后或重启后才能再绑定操作)
可以通过日志查看绑定不成功原因。
解绑:
长按按钮,能收到信号的设备将被解绑,未收到数据的设备将无法解绑(可以重复解绑)。
控制:
控制设备只有在双击之后,才能控制被绑定设备。重新启动后,即使已经绑定也需要双击。(程序限制)
控制设备单击控制对方设备LED状态。
程序优化:
针对原示例程序的难懂之处,进行了优化并增加中文注释和中文日志。
现将修改后的操作日志和示例展示如下:
A 被控制设备日志:
设备启动
I (419) espnow: Enable main task
I (419) espnow: main task entry
I (419) espnow_ctrl: 注册绑定解绑回调:
I (419) espnow_ctrl: 注册控制数据包回调
I (419) main_task: Returned from app_main()
超出绑定条件,绑定失败
I (160539) espnow_ctrl: bind, 系统时间: 160539, 设置时间: 15419, 设备rssi: -29, 设置rssi: -45
I (160539) espnow_ctrl: 绑定数据包处理
I (160539) espnow_ctrl: 执行绑定事件处理回调函数,未注册回调,径直处理
I (160539) espnow_ctrl: 超出绑定条件参数范围:系统时间>设置时间 失败,未绑定退出
符合绑定条件,绑定成功
I (419) espnow: main task entry
I (419) espnow_ctrl: 注册绑定解绑回调:
I (419) espnow_ctrl: 注册控制数据包回调
I (419) main_task: Returned from app_main()
I (4629) espnow_ctrl: bind, 系统时间: 4629, 设置时间: 15419, 设备rssi: -32, 设置rssi: -45
I (4629) espnow_ctrl: 解绑数据包处理
I (4629) app_main: espnow事件处理
I (4629) app_main: 控制解绑
I (4629) app_main: unbind, uuid: a8:03:2a:4b:19:4c, initiator_type: 513
I (5879) espnow_ctrl: bind, 系统时间: 5879, 设置时间: 15419, 设备rssi: -29, 设置rssi: -45
I (5879) espnow_ctrl: 绑定数据包处理
I (5879) espnow_ctrl: 执行绑定事件处理回调函数,未注册回调,直接处理
I (5879) control_func: addr: a8:03:2a:4b:19:4c, initiator_type: 2, initiator_value: 1
I (5879) espnow_ctrl: 查询是否注册绑定列表MAC=
I (5879) espnow_ctrl: a8 03 2a 4b 19 4c
I (5879) espnow_ctrl: MAC未注册
I (5879) app_main: espnow事件处理
I (5879) app_main: 控制绑定
I (5879) app_main: bind, uuid: a8:03:2a:4b:19:4c, initiator_type: 513
I (5889) espnow_ctrl: 绑定成功
单击控制
I (74719) espnow_ctrl: 接收到数据包:
I (74719) espnow_ctrl: src_addr: a8:03:2a:4b:19:4c, espnow_ctrl_responder_recv, value: 0
I (74719) espnow_ctrl: 查询是否注册绑定列表MAC=
I (74719) espnow_ctrl: a8 03 2a 4b 19 4c
I (74719) espnow_ctrl: 此设备已经注册
I (74719) espnow_ctrl: 处理接收数据包:data_cb
I (74719) app_main: app_responder_ctrl_data_cb, initiator_attribute: 513, responder_attribute: 1, value: 0
I (74719) app_main: 输出LED颜色0,0,0
I (74719) app_main: Led Out Red:0, Green:0, Blue:255
I (74719) espnow_ctrl: 处理接收数据包:data_raw_cb
I (74719) espnow_ctrl: 未注册此回调:data_raw_cb
B 控制设备日志:
设备启动
I (388) espnow: main task entry
I (388) espnow_ctrl: 注册绑定解绑回调:
I (388) espnow_ctrl: 注册控制数据包回调
I (388) main_task: Returned from app_main()
单击
I (34268) app_main: 按键单击ctrl_status=APP_ESPNOW_CTRL_INIT
I (34268) app_main: 请先双击绑定设备
再单击
I (36088) app_main: 按键单击ctrl_status=APP_ESPNOW_CTRL_INIT
I (36088) app_main: 请先双击绑定设备
双击
I (59338) app_main: 按键双击,ctrl_status=APP_ESPNOW_CTRL_INIT
I (59338) app_main: initiator bind press
再双击
I (82978) app_main: 按键双击,ctrl_status=APP_ESPNOW_CTRL_BOUND
I (82978) app_main: 该设备已处于绑定状态
单击控制
I (102208) app_main: 按键单击ctrl_status=APP_ESPNOW_CTRL_BOUND
I (102208) app_main: initiator send press
修改后的代码更直白,容易上手,适合边实验操作边理解代码,加快代码运用。
附上修改后源码:esp32_now_control.rar