——文档转载自电子发烧友
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配置ICL为23(自定义),串口波特率设置为115200,因为ESP32代码串口波特率就是115200,波特率要一致,不然无法正常接收,选择自动上传数据。
因为屏幕是T5L的,所以需要生成背景图片ICL,生成的ICL为32。
最后保存工程并生成DWIN_SET工程文件,将ICL和工程文件复制到SD卡烧录。
3.功能介绍
该蓝牙按键键盘可以实现与普通键盘相同的效果,但是部分快捷键无法实现,因为需要多个按键同时按。可以实现媒体音量调节、换歌和暂停播放等操作。手机可以实现一键返回桌面与返回上一次功能,最终效果如顶部视频所示。
视频链接:https://www.bilibili.com/video/BV1wS4y1e7L6/
|