esp32-s3蓝牙键盘

一:组成

        四个按键、一个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;

 做学习用途

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值