一:组成
四个按键、一个ec11编码器
功能:共有三种模式:
ec11编码器的key键用于key_mode_num的变化,切换模式。
模式一:ctrl+r刷新网页、ctrl+z撤回、ctrl+s保存、del删除。
模式二: 四个按键分别是方向键:上下左右。
模式三:媒体键:上一曲、下一曲、暂停、播放。
二:用到的库
1、蓝牙键盘库
2、ec11编码器
三:BleKeyboard蓝牙键盘库函数
会用这几个就好了
Keyboard.press(KEY_LEFT_CTRL);按下按键
Keyboard.write('n');按下字母按键
Keyboard.releaseAll()释放按键和press一起用
Keyboard.println(character)将一次或多次击键发送到连接的计算机,然后按 Enter 键击键。Keyboard.write(KEY_LEFT_CTRL)向连接的计算机发送击键。这类似于按下和松开键盘上的一个键。您可以发送一些 ASCII 字符或其他键盘修饰符和特殊键。
四:代码
key.cpp
#include <Arduino.h>
#include <key.h>
#include <ESP32Encoder.h>
#include <BleKeyboard.h>
BleKeyboard bleKeyboard;
//ec11按键配置
#define EC11_A_PIN 9
#define EC11_B_PIN 8
#define EC11_K_PIN 12
ESP32Encoder encoder;
//键盘按键配置
int key0 = 4;
int key1 = 5;
int key2 = 6;
int key3 = 7;
int value[4] = {4,5,6,7};
int new_value[4] = {0};
int key_mode_num = 1; //键盘模式
int keynum=0;
/*模拟键盘按下的按键是哪个*/
const uint8_t KEY_mode2[4] = {KEY_UP_ARROW,KEY_DOWN_ARROW,KEY_LEFT_ARROW,KEY_RIGHT_ARROW};
const uint8_t KEY_mode1[4] = {KEY_LEFT_CTRL,KEY_LEFT_CTRL,KEY_LEFT_CTRL,KEY_DELETE};
const uint8_t KEY_mode1_1[4] = {'r','z','s'};
/*轴体为INPUT,esp32读取电平,低电平为按下,高电平为松开。*/
/*按键初始化,蓝牙初始化,ec11初始化*/
void key_init(void)
{
bleKeyboard.begin();
pinMode(key0, INPUT_PULLUP);
pinMode(key1, INPUT_PULLUP);
pinMode(key2, INPUT_PULLUP);
pinMode(key3, INPUT_PULLUP);
encoder.attachSingleEdge(EC11_A_PIN, EC11_B_PIN);
pinMode(EC11_K_PIN, INPUT_PULLUP);
}
/*按键扫描*/
void key_scan(void) {
int i=0;
for(i=0;i<4;i++)
{
digitalRead(value[i]);
if(digitalRead(value[i]) == LOW)
{
delay(8);
if(digitalRead(value[i]) == LOW)
{new_value[i] = value[i];}
}
}
delay(15);//扫描延时,太快容易误触,调用这个可以加快和减慢键盘扫描速度
}
/*键盘显示*/
void key_show(void)
{
int i=0;
key_scan();
for(i=0;i<4;i++)
{
keynum = new_value[i];/*如果按键按下,对应端口号赋值给keynum,没有按下的为0*/
Serial.println("keynum is");
Serial.print(keynum);
Serial.println("\r\n");
if(keynum!=0)
{
Serial.println("KEY is ");
switch (key_mode_num)
{
case1:bleKeyboard.press(KEY_mode1[i]);bleKeyboard.write(KEY_mode1_1[i]);delay(5);bleKeyboard.releaseAll();break;
case 2:bleKeyboard.write(KEY_mode2[i]);break;
case 3:switch (keynum)//媒体键特殊设置
{
case 4:bleKeyboard.write(KEY_MEDIA_PREVIOUS_TRACK);break;
case 5:bleKeyboard.write(KEY_MEDIA_NEXT_TRACK);break;
case 6:bleKeyboard.write(KEY_MEDIA_STOP);break;
case 7:bleKeyboard.write(KEY_MEDIA_PLAY_PAUSE);break;
default:break;
};
default:
break;
}
}
}
/*清零new_value[6]数组,等待下次读取*/
for (i = 0; i < 4; i++) {
new_value[i] = 0;
}
}
int lastEncoderValue = 0;
void ec11_show(void)
{
if (lastEncoderValue != encoder.getCount())
{
int now_count = encoder.getCount();
if (now_count > lastEncoderValue)
{
Serial.println("left");
switch (key_mode_num)
{
case 1:bleKeyboard.write(KEY_MEDIA_VOLUME_UP);break;//音量
case 2:bleKeyboard.write(KEY_MEDIA_VOLUME_UP);break;
case 3:bleKeyboard.write(KEY_MEDIA_VOLUME_UP);break;
default:
break;
}
}
else
{
Serial.println("right");
switch (key_mode_num)
{
case 1:bleKeyboard.write(KEY_MEDIA_VOLUME_DOWN);break;//音量
case 2:bleKeyboard.write(KEY_MEDIA_VOLUME_UP);break;
case 3:bleKeyboard.write(KEY_MEDIA_VOLUME_UP);break;
default:
break;
}
}
lastEncoderValue = now_count;
Serial.print("Encoder value: ");
Serial.println(lastEncoderValue);
}
if (digitalRead(EC11_K_PIN) == LOW)
{
delay(20);
if (digitalRead(EC11_K_PIN) == LOW)
{
Serial.println("K");
key_mode_num++;
if(key_mode_num>3)
{
key_mode_num=1;
}
}
while (digitalRead(EC11_K_PIN) == LOW)
;
}
}
key.h
#ifndef KEY_H_
#define KEY_H_
void key_init(void);
void key_scan(void);
void key_show(void);
void ec11_show(void);
#endif
main.cpp:
#include <Arduino.h>
#include <key.h>
void setup()
{
Serial.begin(9600);
key_init();
}
void loop()
{
key_show();
ec11_show();
}
五:注意
蓝牙的库初始化要记得用上
bleKeyboard.begin();
蓝牙库初始化可以命名蓝牙名字
BleKeyboard bleKeyboard("ESP32-S3-黑大王","Espressif",100);//名字,制造商,电量
但是实测名字为中文名的话有蓝牙连接断断续续的,建议直接使用
BleKeyboard bleKeyboard;
做学习用途