迪文科技论坛

 找回密码
 立即注册
搜索
查看: 686|回复: 0

【开源】COF案例分享:基于ESP32的低功耗蓝牙触摸键盘

[复制链接]

574

主题

169

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12353
发表于 2022-4-25 13:44:02 | 显示全部楼层 |阅读模式
——文档转载自电子发烧友

1.案例介绍

串口屏最重要的功能就是串口通信了,那么本文文章我们将使用ESP32的蓝牙功能实现低功耗蓝牙键盘控制蓝牙设备(电脑/手机)ESP32使用PLATFORM IO插件的arduino框架编写代码。

2.步骤

(1)步骤一
新建工程并搜索低功耗蓝牙键盘库文件并加入工程。如下图:




(2)步骤二

编写ESP32串口接收与解析函数。
#include <Arduino.h>
#include <BleKeyboard.h>
BleKeyboard bleKeyboard("智能屏KEYBOT","噶呜嗷嗷",100);
char a=0;

String comdata = "";//缓存清零
void number_button();//数字按键
void symbol_button();//符号按键
void special_button();//特殊按键
void media_button();//媒体按键

void setup()
{
   Serial.begin(115200);
   Serial2.begin(115200);
   bleKeyboard.begin();
   Serial.print("hello world!");
}

void loop()
{
    IF (Serial.available() > 0)//判读是否串口有数据
  {
    String comdata = "";//缓存清零
    while (Serial.available() > 0)//循环串口是否有数据
    {
      comdata += char(Serial.read());//叠加数据到comdata
      delay(2);//延时等待响应
    }
    if (comdata.length() > 0)//如果comdata有数据
    {
      Serial.println(comdata);//打印comdata数据
      if(bleKeyboard.isConnected()&&comdata=="keyboard_state")
      {
          Serial.print("keyboard_state.val=1");
      }
      char a=0;
      a=comdata.length();
      if(a==7&&comdata[a-1]==0x55&&(comdata[a-4]==0x00||comdata[a-4]==0x01)&&(comdata[a-7]==0x00||comdata[a-7]==0x01))//符号 FF FF 符号 FF FF 55
      {
          Serial2.print(comdata);//调试是否接收到键值返回数据
      }
      //检测字母按键
      else if(comdata=="q")//q
      {
          bleKeyboard.print("q");
      }else if(comdata=="w")
      {
          bleKeyboard.print("w");
      }else if(comdata=="e")
      {
          bleKeyboard.print("e");
      }else if(comdata=="r")
      {
          bleKeyboard.print("r");
      }else if(comdata=="t")
      {
          bleKeyboard.print("t");
      }else if(comdata=="y")
      {
          bleKeyboard.print("y");
      }else if(comdata=="u")
      {
          bleKeyboard.print("u");
      }else if(comdata=="i")
      {
          bleKeyboard.print("i");
      }else if(comdata=="o")
      {
          bleKeyboard.print("o");
      }else if(comdata=="p")
      {
          bleKeyboard.print("p");
      }else if(comdata=="a")
      {
          bleKeyboard.print("a");
      }else if(comdata=="s")
      {
          bleKeyboard.print("s");
      }else if(comdata=="d")
      {
          bleKeyboard.print("d");
      }else if(comdata=="f")
      {
          bleKeyboard.print("f");
      }else if(comdata=="g")
      {
          bleKeyboard.print("g");
      }else if(comdata=="h")
      {
          bleKeyboard.print("h");
      }else if(comdata=="j")
      {
          bleKeyboard.print("j");
      }else if(comdata=="k")
      {
          bleKeyboard.print("k");
      }else if(comdata=="l")
      {
          bleKeyboard.print("l");
      }else if(comdata=="z")
      {
          bleKeyboard.print("z");
      }else if(comdata=="x")
      {
          bleKeyboard.print("x");
      }else if(comdata=="c")
      {
          bleKeyboard.print("c");
      }else if(comdata=="v")
      {
          bleKeyboard.print("v");
      }else if(comdata=="b")
      {
          bleKeyboard.print("b");
      }else if(comdata=="n")
      {
          bleKeyboard.print("n");
      }else if(comdata=="m")
      {
          bleKeyboard.print("m");
      }
      //检测数字
      else if(comdata=="1")
      {
          bleKeyboard.print("1");
      }else if(comdata=="2")
      {
          bleKeyboard.print("2");
      }else if(comdata=="3")
      {
          bleKeyboard.print("3");
      }else if(comdata=="4")
      {
          bleKeyboard.print("4");
      }else if(comdata=="5")
      {
          bleKeyboard.print("5");
      }else if(comdata=="6")
      {
          bleKeyboard.print("6");
      }else if(comdata=="7")
      {
          bleKeyboard.print("7");
      }else if(comdata=="8")
      {
          bleKeyboard.print("8");
      }else if(comdata=="9")
      {
          bleKeyboard.print("9");
      }else if(comdata=="0")
      {
          bleKeyboard.print("0");
      }
      //检测媒体按键
      else if(comdata=="KEY_MEDIA_NEXT_TRACK")
      {
          bleKeyboard.write(KEY_MEDIA_NEXT_TRACK);
      }else if(comdata=="KEY_MEDIA_PREVIOUS_TRACK")
      {
          bleKeyboard.write(KEY_MEDIA_PREVIOUS_TRACK);
      }else if(comdata=="KEY_MEDIA_STOP")
      {
          bleKeyboard.write(KEY_MEDIA_STOP);
      }else if(comdata=="KEY_MEDIA_PLAY_PAUSE")
      {
          bleKeyboard.write(KEY_MEDIA_PLAY_PAUSE);
      }else if(comdata=="KEY_MEDIA_MUTE")
      {
          bleKeyboard.write(KEY_MEDIA_MUTE);
      }else if(comdata=="KEY_MEDIA_VOLUME_UP")
      {
          bleKeyboard.write(KEY_MEDIA_VOLUME_UP);
      }else if(comdata=="KEY_MEDIA_VOLUME_DOWN")
      {
          bleKeyboard.write(KEY_MEDIA_VOLUME_DOWN);
      }else if(comdata=="KEY_MEDIA_WWW_HOME")
      {
          bleKeyboard.write(KEY_MEDIA_WWW_HOME);
      }
      //检测字符按键
      else if(comdata=="'")
      {
          bleKeyboard.print("'");
      }else if(comdata=="!")
      {
          bleKeyboard.print("!");
      }else if(comdata=="#")
      {
          bleKeyboard.print("#");
      }else if(comdata=="$")
      {
          bleKeyboard.print("$");
      }else if(comdata=="%")
      {
          bleKeyboard.print("%");
      }else if(comdata=="&")
      {
          bleKeyboard.print("&");
      }else if(comdata=="'")
      {
          bleKeyboard.print("'");
      }else if(comdata=="(")
      {
          bleKeyboard.print("(");
      }else if(comdata==")")
      {
          bleKeyboard.print(")");
      }else if(comdata=="*")
      {
          bleKeyboard.print("*");
      }else if(comdata=="+")
      {
          bleKeyboard.print("+");
      }else if(comdata==",")
      {
          bleKeyboard.print(",");
      }else if(comdata=="-")
      {
          bleKeyboard.print("-");
      }else if(comdata==".")
      {
          bleKeyboard.print(".");
      }else if(comdata=="/")
      {
          bleKeyboard.print("/");
      }else if(comdata==":")
      {
          bleKeyboard.print(":");
      }else if(comdata==";")
      {
          bleKeyboard.print(";");
      }else if(comdata=="<")
      {
          bleKeyboard.print("<");
      }else if(comdata=="=")
      {
          bleKeyboard.print("=");
      }else if(comdata==">")
      {
          bleKeyboard.print(">");
      }else if(comdata=="?")
      {
          bleKeyboard.print("?");
      }else if(comdata=="@")
      {
          bleKeyboard.print("@");
      }else if(comdata=="[")
      {
          bleKeyboard.print("[");
      }else if(comdata=="]")
      {
          bleKeyboard.print("]");
      }else if(comdata=="^")
      {
          bleKeyboard.print("^");
      }else if(comdata=="_")
      {
          bleKeyboard.print("_");
      }else if(comdata=="`")
      {
          bleKeyboard.print("`");
      }else if(comdata=="{")
      {
          bleKeyboard.print("{");
      }else if(comdata=="#")
      {
          bleKeyboard.print("#");
      }else if(comdata=="|")
      {
          bleKeyboard.print("|");
      }else if(comdata=="}")
      {
          bleKeyboard.print("}");
      }else if(comdata=="~")
      {
          bleKeyboard.print("~");
      }
      //奇怪字符
      else if(comdata=="yinhao")
      {
          bleKeyboard.print("\"");
      }else if(comdata=="blank")
      {
          bleKeyboard.print(" ");
      }else if(comdata=="blash")//反斜杠
      {
          bleKeyboard.print("\\");
      }
      //检测特殊按键
      else if (comdata=="KEY_LEFT_CTRL_DOWN")//KEY_LEFT_CTRL
      {
          bleKeyboard.press(KEY_LEFT_CTRL);
      }else if(comdata=="KEY_LEFT_CTRL_UP")
      {
          bleKeyboard.release(KEY_LEFT_CTRL);
      }else if(comdata=="KEY_LEFT_SHIFT_DOWN")//KEY_LEFT_SHIFT
      {
          bleKeyboard.press(KEY_LEFT_SHIFT);
      }else if(comdata=="KEY_LEFT_SHIFT_UP")
      {
          bleKeyboard.release(KEY_LEFT_SHIFT);
      }else if(comdata=="KEY_LEFT_ALT_DOWN")//KEY_LEFT_ALT
      {
          bleKeyboard.press(KEY_LEFT_ALT);
      }else if(comdata=="KEY_LEFT_ALT_UP")
      {
          bleKeyboard.release(KEY_LEFT_ALT);
      }else if(comdata=="KEY_LEFT_GUI_DOWN")//KEY_LEFT_GUI
      {
          bleKeyboard.press(KEY_LEFT_GUI);
      }else if(comdata=="KEY_LEFT_GUI_UP")
      {
          bleKeyboard.release(KEY_LEFT_GUI);
      }else if(comdata=="KEY_RIGHT_CTRL_Down")//KEY_RIGHT_CTRL
      {
          bleKeyboard.press(KEY_RIGHT_CTRL);
      }else if(comdata=="KEY_RIGHT_CTRL_UP")
      {
          bleKeyboard.release(KEY_RIGHT_CTRL);
      }else if(comdata=="KEY_RIGHT_SHIFT_DOWN")//KEY_RIGHT_SHIFT
      {
          bleKeyboard.press(KEY_RIGHT_SHIFT);
      }else if(comdata=="KEY_RIGHT_SHIFT_UP")
      {
          bleKeyboard.release(KEY_RIGHT_SHIFT);
      }else if(comdata=="KEY_RIGHT_ALT_DOWN")//KEY_RIGHT_ALT
      {
          bleKeyboard.press(KEY_RIGHT_ALT);
      }else if(comdata=="KEY_RIGHT_ALT_UP")
      {
          bleKeyboard.release(KEY_RIGHT_ALT);
      }else if(comdata=="KEY_RIGHT_GUI_DOWN")//KEY_RIGHT_GUI
      {
          bleKeyboard.press(KEY_RIGHT_GUI);
      }else if(comdata=="KEY_RIGHT_GUI_UP")
      {
          bleKeyboard.release(KEY_RIGHT_GUI);
      }else if(comdata=="KEY_UP_ARROW_DOWN")//KEY_UP_ARROW
      {
          bleKeyboard.press(KEY_UP_ARROW);
      }else if(comdata=="KEY_UP_ARROW_UP")
      {
          bleKeyboard.release(KEY_UP_ARROW);
      }else if(comdata=="KEY_DOWN_ARROW_DOWN")//KEY_DOWN_ARROW
      {
          bleKeyboard.press(KEY_DOWN_ARROW);
      }else if(comdata=="KEY_DOWN_ARROW_UP")
      {
          bleKeyboard.release(KEY_DOWN_ARROW);
      }else if(comdata=="KEY_LEFT_ARROW_DOWN")//KEY_LEFT_ARROW
      {
          bleKeyboard.press(KEY_LEFT_ARROW);
      }else if(comdata=="KEY_LEFT_ARROW_UP")
      {
          bleKeyboard.release(KEY_LEFT_ARROW);
      }else if(comdata=="KEY_RIGHT_ARROW_DOWN")//KEY_RIGHT_ARROW
      {
          bleKeyboard.press(KEY_RIGHT_ARROW);
      }else if(comdata=="KEY_RIGHT_ARROW_UP")
      {
          bleKeyboard.release(KEY_RIGHT_ARROW);
      }else if(comdata=="KEY_BACKSPACE_DOWN")//KEY_BACKSPACE删除
      {
          bleKeyboard.press(KEY_BACKSPACE);
      }else if(comdata=="KEY_BACKSPACE_UP")
      {
          bleKeyboard.release(KEY_BACKSPACE);
      }else if(comdata=="KEY_TAB_DOWN")//KEY_TAB
      {
          bleKeyboard.press(KEY_TAB);
      }else if(comdata=="KEY_TAB_UP")
      {
          bleKeyboard.release(KEY_TAB);
      }else if(comdata=="KEY_RETURN_DOWN")//KEY_RETURN回车
      {
          bleKeyboard.press(KEY_RETURN);
      }else if(comdata=="KEY_RETURN_UP")
      {
          bleKeyboard.release(KEY_RETURN);
      }else if(comdata=="KEY_ESC_DOWN")//KEY_ESC
      {
          bleKeyboard.press(KEY_ESC);
      }else if(comdata=="KEY_ESC_UP")
      {
          bleKeyboard.release(KEY_ESC);
      }else if(comdata=="KEY_INSERT_DOWN")//KEY_INSERT安卓没啥效果
      {
          bleKeyboard.press(KEY_INSERT);
      }else if(comdata=="KEY_INSERT_UP")
      {
          bleKeyboard.release(KEY_INSERT);
      }else if(comdata=="KEY_DELETE_DOWN")//KEY_DELETE
      {
          bleKeyboard.press(KEY_DELETE);
      }else if(comdata=="KEY_DELETE_UP")
      {
          bleKeyboard.release(KEY_DELETE);
      }else if(comdata=="KEY_PAGE_UP_DOWN")//KEY_PAGE_UP
      {
          bleKeyboard.press(KEY_PAGE_UP);
      }else if(comdata=="KEY_PAGE_UP_UP")
      {
          bleKeyboard.release(KEY_PAGE_UP);
      }else if(comdata=="KEY_PAGE_DOWN_DOWN")//KEY_PAGE_DOWN
      {
          bleKeyboard.press(KEY_PAGE_DOWN);
      }else if(comdata=="KEY_PAGE_DOWN_UP")
      {
          bleKeyboard.release(KEY_PAGE_DOWN);
      }else if(comdata=="KEY_HOME_DOWN")//KEY_HOME
      {
          bleKeyboard.press(KEY_HOME);
      }else if(comdata=="KEY_HOME_UP")
      {
          bleKeyboard.release(KEY_HOME);
      }else if(comdata=="KEY_END_DOWN")//KEY_END
      {
          bleKeyboard.press(KEY_END);
      }else if(comdata=="KEY_END_UP")
      {
          bleKeyboard.release(KEY_END);
      }else if(comdata=="KEY_CAPS_LOCK_WRITE")//KEY_CAPS_LOCK
      {
          bleKeyboard.write(KEY_CAPS_LOCK);
          Serial.print("KEY_CAPS_LOCK_WRITE");
          Serial.print(0xff);
          Serial.print(0xff);
          Serial.print(0xff);
      }else if(comdata=="KEY_F1_DOWN")//KEY_F1
      {
          bleKeyboard.press(KEY_F1);
      }else if(comdata=="KEY_F1_UP")
      {
          bleKeyboard.release(KEY_F1);
      }else if(comdata=="KEY_F2_DOWN")//KEY_F2
      {
          bleKeyboard.press(KEY_F2);
      }else if(comdata=="KEY_F2_UP")
      {
          bleKeyboard.release(KEY_F2);
      }else if(comdata=="KEY_F3_DOWN")//KEY_F3
      {
          bleKeyboard.press(KEY_F3);
      }else if(comdata=="KEY_F3_UP")
      {
          bleKeyboard.release(KEY_F3);
      }else if(comdata=="KEY_F4_DOWN")//KEY_F4
      {
          bleKeyboard.press(KEY_F4);
      }else if(comdata=="KEY_F4_UP")
      {
          bleKeyboard.release(KEY_F4);
      }else if(comdata=="KEY_F5_DOWN")//KEY_F5
      {
          bleKeyboard.press(KEY_F5);
      }else if(comdata=="KEY_F5_UP")
      {
          bleKeyboard.release(KEY_F5);
      }else if(comdata=="KEY_F6_DOWN")//KEY_F6
      {
          bleKeyboard.press(KEY_F6);
      }else if(comdata=="KEY_F6_UP")
      {
          bleKeyboard.release(KEY_F6);
      }else if(comdata=="KEY_F7_DOWN")//KEY_F7
      {
          bleKeyboard.press(KEY_F7);
      }else if(comdata=="KEY_F7_UP")
      {
          bleKeyboard.release(KEY_F7);
      }else if(comdata=="KEY_F8_DOWN")//KEY_F8
      {
          bleKeyboard.press(KEY_F8);
      }else if(comdata=="KEY_F8_UP")
      {
          bleKeyboard.release(KEY_F8);
      }else if(comdata=="KEY_F9_DOWN")//KEY_F9
      {
          bleKeyboard.press(KEY_F9);
      }else if(comdata=="KEY_F9_UP")
      {
          bleKeyboard.release(KEY_F9);
      }else if(comdata=="KEY_F10_DOWN")//KEY_F10
      {
          bleKeyboard.press(KEY_F10);
      }else if(comdata=="KEY_F10_UP")
      {
          bleKeyboard.release(KEY_F10);
      }else if(comdata=="KEY_F11_DOWN")//KEY_F11
      {
          bleKeyboard.press(KEY_F11);
      }else if(comdata=="KEY_F11_UP")
      {
          bleKeyboard.release(KEY_F11);
      }else if(comdata=="KEY_F12_DOWN")//KEY_F12
      {
          bleKeyboard.press(KEY_F12);
      }else if(comdata=="KEY_F12_UP")
      {
          bleKeyboard.release(KEY_F12);
      }
    }
  }if (Serial2.available() > 0)//判读是否串口有数据
  {
    String comdata = "";//缓存清零
    while (Serial2.available() > 0)//循环串口是否有数据
    {
      comdata += char(Serial2.read());//叠加数据到comdata
      delay(2);//延时等待响应
    }
    if (comdata.length() > 0)//如果comdata有数据
    {
      Serial.println(comdata);//打印comdata数据
    }
  }
}
//
以上代码需要进行部分更改,比如

else if(comdata=="q")//q
      {
          bleKeyboard.print("q");
      }
如果串口屏发送的是字符串"q",才会执行蓝牙按键按下Q的操作。而迪文的串口屏按键返回控件发出的是16进制。

返回数据格式:
5A A5 06 83 5436 01 0001
含义:05A:帧头;
0x06:数据长度;
0x83:读指令;
0x5436:变量地址;
0x01:返回数据的字长度;
0x0001:返回的 0001 键值。

所以我们需要根据串口接收到的数据做更改为如下代码:

else if(comdata[a-2]==0x00&&comdata[a-1]==0x01)//q
{
bleKeyboard.print("q");
}
其余更改不多展示,因为按键太多了。

(3)步骤三   
ESP32的串口引脚与迪文的串口引脚对应连接,并连接5V引脚且共地。
(4)步骤四
迪文上位机设置键值返回的属性,勾选数据上传,键值数值和变量地址自行规定。



CFG配置ICL23(自定义),串口波特率设置为115200,因为ESP32代码串口波特率就是115200,波特率要一致,不然无法正常接收,选择自动上传数据。



因为屏幕是T5L的,所以需要生成背景图片ICL,生成的ICL32


最后保存工程并生成DWIN_SET工程文件,将ICL和工程文件复制到SD卡烧录。



3.功能介绍

该蓝牙按键键盘可以实现与普通键盘相同的效果,但是部分快捷键无法实现,因为需要多个按键同时按。可以实现媒体音量调节、换歌和暂停播放等操作。手机可以实现一键返回桌面与返回上一次功能,最终效果如顶部视频所示。

视频链接:https://www.bilibili.com/video/BV1wS4y1e7L6/









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-1-14 21:19 , Processed in 0.064670 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表