基于ESP32-S3-BOX-Lite和Wio Terminal的蓝牙BLE通信与显示系统
老胡
- 系统简介
本文使用ESP32-S3-BOX-Lite和Wio Terminal开发了一个蓝牙BLE双向通信与显示系统, 两个嵌入式模块可以相互收发数据,获取对方按键状态,并通过屏幕进行显示。
- 硬件组成
系统主要用到Wio Terminal和ESP32-S3-BOX-Lite两款模块各1个。这两种模块在硬禾学堂的Funpack第1季第12期和第2季第5期分别进行了推广。
https://www.eetree.cn/page/digikey-funpack/phase17
https://www.eetree.cn/page/digikey-funpack/phase12
ESP32-S3-BOX-Lite Wio Terminal
两个模块的硬件比较相似,主要参数比较见下表
|
ESP32-S3-BOX-Lite |
Wio Terminal |
主芯片 |
ESP32-S3 |
ATSAMD51P19 ARM Cortex-M4F |
CPU速度 |
240MHz |
120MHz,最高200 MHz |
屏幕分辨率 |
320*240 |
320*240 |
屏幕驱动 |
ST7789V |
ILI9341 |
屏幕尺寸 |
2.4英寸 |
2.4英寸 |
WIFI |
支持 |
支持 |
蓝牙 |
支持BLE5.0 |
支持BLE5.0 |
其它 |
麦克风、扬声器 |
加速计、麦克风、扬声器、光传感器、红外发射器 |
- 方案设计
系统的设计方案如下图所示
ESP32-S3-BOX-Lite正面具有3个用户按键,按键采用分压电路的方式,将1路ADC输入单片机。单片机收到按键信息后,可将按键状态转换成1、2、3等数值,并通过屏幕显示。单片机自带Wifi和BLE无线功能。BOX作为BLE Server,可将按键数值信号通过BLE发送出去。BLE Server配置了数据收发的UUID,可以发送和接收数据。
Wio Terminal作为BLE Client,通过扫描BLE Server的MAC地址,与服务器建立蓝牙连接。连接成功后,客户端能够读到服务器的按键数值状态,并在显示屏上显示出来。Wio Terminal也具有1个5位按键,也可以将按键信息通过BLE无线方式发送到ESP32-S3-BOX-Lite,实现双向通信功能。
两个模块BLE通信的原理如下图所示
为了便于测试,也可以用手机代替Wio Terminal,使用手机App nRF Connect搜索BLE Server,测试通信功能。
- 软件与程序
软件安装
厂家提供了Espressif-IDE开发环境,因本人还是比较熟悉Arduino,仍都使用Arduino进行开发。
两个模块使用的驱动见下表
|
ESP32-S3-BOX-Lite |
Wio Terminal |
开发板驱动 |
Esp32 by Espressif Systems 2.0.9 |
Seeed SAMD Boards by Seeed Studio 1.8.1 |
屏幕驱动 |
TFT_eSPI |
Seeed_Arduino_LCD |
蓝牙驱动 |
ArduinoBLE |
Seeed_Arduino_rpcBLE |
开发板驱动,需要在Arduino中配置好厂商提供的网址即可搜索到,在线安装;也可离线导入。
https://espressif.github.io/arduino-esp32/package_esp32_index.json
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
ESP32-S3-BOX-Lite屏幕和蓝牙驱动,可以在Arduino中直接下载;Wio Terminal屏幕和蓝牙驱动,在官网找到压缩包,导入到Arduino.
注意:Wio Terminal要使用蓝牙功能,需要先更新固件,更新方法见官网。
https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/#update-the-wireless-core-firmware
Wio Terminal的屏幕驱动也是原厂基于TFT_eSPI修改的,二者不能共存。使用Wio Terminal时,需要将TFT_eSPI卸载或将Arduino库文件下TFT_eSPI文件夹移动到其它目录。
开发过程
ESP32-S3-BOX-Lite
首先对ESP32-S3-BOX-Lite进行编程,安装好TFT_eSPI库后,需要在C:\Users\Administrator\Documents\Arduino\libraries\TFT_eSPI目录下,在User_Setups 文件夹添加Setup208_ESP32_S3_Box_Lite.h文件,并在TFT_eSPI文件夹的User_Setup_Select.h文件中添加相应的头文件名称。
在修改和创建Setup208_ESP32_S3_Box_Lite.h文件时,需要参考ESP32-S3-BOX-Lite的硬件资料,确保引脚对应正确。
如果要使用LVGL库进行显示,还需要配置 触摸引脚 #define TOUCH_CS 3,否则编译会报错。配置完成后,即可使用Arduino进行编程。
ESP32-S3-BOX-Lite编程完成后,先使用手机App nRF Connect搜索BLE Server并连接,确保连接和通讯正常,然后再用Wio Terminal进行测试。
代码说明
添加头文件
#include <ArduinoBLE.h>
#include <math.h>
#include <TFT_eSPI.h> //TFT屏驱动
定义两个显示色块的坐标值变量
int red_x,red_y; //红色方块坐标
int blue_x,blue_y; //蓝色方块坐标
定义蓝牙BLE通信的UUID地址
BLEService MyService("181A");
BLEUnsignedIntCharacteristic Character_Write("2A81", BLEWrite | BLENotify);
BLEUnsignedIntCharacteristic Character_Read("2A82", BLERead);
在void setup()中添加以下代码
屏幕初始化
tft.init();
tft.setRotation(3); //设置屏幕方向
spr.createSprite(320,240);
spr.fillSprite(TFT_BLACK);
spr.setTextColor(TFT_BLACK);
spr.setTextSize(2);
spr.drawString("Wait BLE connect",30,20);
定义按钮的ADC引脚
pinMode(1, INPUT);//gpio1口为adc button
添加蓝牙设备的名称及UUID地址,确定收发变量
BLE.setLocalName("ESP32-S3-BOX-Lite"); //蓝牙设备名称
BLE.setAdvertisedService(MyService);
MyService.addCharacteristic(Character_Write);
MyService.addCharacteristic(Character_Read);
BLE.addService(MyService);
Character_Write.readValue(iBLE_receive);
Character_Read.writeValue(iBLE_send);
在void loop()中,添加以下代码
if (adc_Data>=900 and adc_Data<1000) //KEY3按下
{
red_x=260;
red_y=160;
iBLE_send=51;
}
else if (adc_Data>=2400 and adc_Data<2500) //KEY2按下
{
red_x=140;
red_y=160;
iBLE_send=50;
}
else if (adc_Data>=2900 and adc_Data<3000)////KEY1按下
{
red_x=30;
red_y=160;
iBLE_send=49;
}
else
{
red_x=320;
red_y=160;
iBLE_send=48;
}
根据接收到Client的数据,并通过蓝色方块坐标的形式进行显示
//根据接收的数据确定蓝色方块的坐标
if (iBLE_receive==1) //上
{blue_x=150;
blue_y=50;}
else if (iBLE_receive==2)//下
{blue_x=150;
blue_y=110;}
else if (iBLE_receive==3)//左
{blue_x=120;
blue_y=80;}
else if (iBLE_receive==4)//右
{blue_x=180;
blue_y=80;}
else if (iBLE_receive==5)//中
{blue_x=150;
blue_y=80;}
else
{blue_x=320;
blue_y=160;}
在屏幕相应位置上绘制图形,并显示数值
//绘制图形
spr.createSprite(320, 240);
spr.fillSprite(TFT_WHITE);
//显示adc数值
spr.setTextColor(TFT_BLACK);
spr.setTextSize(2);
spr.drawString("ADC_Button",30,200);
spr.setTextColor(TFT_BLUE);
spr.setTextSize(2);
spr.drawNumber(adc_Data,30,220);
//显示发出的BLE数值,并图形表示
spr.setTextColor(TFT_BLACK);
spr.setTextSize(2);
spr.drawString("Send Data",200,200);
spr.setTextColor(TFT_BLUE);
spr.setTextSize(2);
spr.drawNumber(iBLE_send-48,200,220);//发出去的是ascii值,屏幕显示的是数值
spr.fillRect(red_x, red_y, 30, 30,TFT_RED);
//显示接收的BLE数值,并图形表示
spr.setTextColor(TFT_BLACK);
spr.setTextSize(2);
spr.drawString("Receive Data",50,10);
spr.setTextColor(TFT_BLUE);
spr.setTextSize(2);
spr.drawNumber(iBLE_receive,50,30);
spr.fillRect(blue_x, blue_y, 30, 30,TFT_BLUE);
spr.drawCircle(165, 95, 50,TFT_BLUE);
spr.pushSprite(0,0);
spr.deleteSprite();//刷新屏幕
- 演示效果
测试时,按下ESP32-S3-BOX-Lite的按键,BOX屏幕上会显示按下的按键,Wio Terminal能显示手到的按键代号,如1表示1号按键,3表示3号按键;
当操作Wio Terminal的5位按钮时,上、下、左、右、中 几个动作分别输出数值1至5并发出,ESP32-S3-BOX-Lite也能通过屏幕显示收到的数据并有动画效果。
ESP32-S3-BOX-Lite发,Wio Terminal收
Wio Terminal发,ESP32-S3-BOX-Lite收
- 心得体会
硬件上,ESP32-S3-BOX-Lite的3D打印外壳略显粗糙,尤其是背板螺钉,因塑料材质问题,很容易滑扣。Wio Terminal相对精致美观一些,也更加小巧和轻薄。
软件上,ESP32-S3-BOX-Lite自带的开发环境和软件资源比较丰富。
感谢群友岑兄(汤半泛)的大力帮助!