ESP32蓝牙+EC11旋转编码器实现对电脑音量控制
- ✨本项目基于Arduino开发框架下功能实现。
🛠蓝牙设备添加和连接
⚡需要有带蓝牙硬件支持的电脑才能实现连接并控制,当然手机也可以连接但是不能实现对手机音量控制,
- 🌿以
Win10
系统电脑为例。在设置里面找到,添加蓝牙和其他设备
- 🌿会搜索到
ESP32-keyboard
设备。
- 🌿已连接设备
⛳功能介绍
支持静音功能以及音量增加或减少.
- 按压EC11编码器,静音功能。
- 顺时针旋转,音量+,旋钮一格,音量增加+2.
- 逆时针旋转,音量-,旋钮一格,音量增加+2.
🌻EC11旋转编码器
- 🌼EC11旋转编码器模块
-
🔰原理图
-
🔧接线图原理图
-
接线说明
🎉参照上面的原理图进行接线,滤波电容没有可以忽略。
EC11 A ---->ESP32 GPIO 22
EC11 B ---->ESP32 GPIO 23
EC11 E ---->ESP32 GPIO 19
EC11 D 和 C---->ESP32 GND
📚所需库
- 📌
BleKeyboard
库:https://github.com/T-vK/ESP32-BLE-Keyboard
//需要自行前往下载并导入Arduino IDE
库当中。 - 🌾
OneButton
库:
- 🌾
ESP32Encoder
库:
📝代码实现
/*
*
*
* ESP32-BLE-Keyboard: https://github.com/T-vK/ESP32-BLE-Keyboard
*/
#include <Arduino.h>
#include "BleKeyboard.h"//需要到github下载并导入
#include "OneButton.h"//点击这里会自动打开管理库页面: http://librarymanager/All#OneButton
#include <ESP32Encoder.h>//点击这里会自动打开管理库页面: http://librarymanager/All#ESP32Encoder
//按键配置
#define EC11_A_PIN 22
#define EC11_B_PIN 23
#define EC11_K_PIN 19//按键引脚
//键盘名称:ESP32-BleKeyboard
BleKeyboard bleKeyboard("ESP32-Keyboard", "Espressif", 100);
ESP32Encoder encoder;
OneButton SW(EC11_K_PIN, true);
int lastEncoderValue = 0;
int now_count = 0;
int mode = 0; //0,1两种mode,可自行添加
bool activate = true;
//按键单击回调函数
void click() {
if (mode == 0) {
Serial.println("Click: MUTE");
bleKeyboard.write(KEY_MEDIA_MUTE);
}
if (mode == 1) {
Serial.println("Enter");
bleKeyboard.write(KEY_RETURN);
}
}
//按键长按回调函数
void longclick() {
if (activate) { //如果旋钮转动,则不切换状态
Serial.println("Longclick: Mode Change");
Serial.print("current mode: ");
if (mode == 0) {
mode = 1;
Serial.println("Arrow");
return;
}
if (mode == 1) {
mode = 0;
Serial.println("Media");
return;
}
}
activate = true;
}
//按键双击回调函数
void doubleclick() {
if (mode == 0) {
Serial.println("Doubleclick: Input test");
bleKeyboard.print("ESP32-BLEKeyboard Input Test");
}
if (mode == 1) {
Serial.println("Doubleclick: Input test");
bleKeyboard.print("ESP32-BLEKeyboard Input Test");
}
}
void setup() {
Serial.begin(115200);
ESP32Encoder::useInternalWeakPullResistors = UP;
encoder.attachSingleEdge(EC11_A_PIN, EC11_B_PIN);
pinMode(EC11_K_PIN, INPUT_PULLUP);
//初始化按键事件检测
SW.attachClick(click);
SW.attachDoubleClick(doubleclick);
SW.attachLongPressStop(longclick);
SW.setDebounceTicks(20);//滤波(ms)
SW.setClickTicks(200);
SW.setPressTicks(500);
Serial.println("Starting BLE work");
bleKeyboard.begin();
}
void loop() {
SW.tick();
if (bleKeyboard.isConnected()) {
if (lastEncoderValue != encoder.getCount()) {
now_count = encoder.getCount();
if (now_count != lastEncoderValue) {
if (!SW.isIdle()) { //检测按键是否空闲
activate = false;
Serial.print("(Long_pressed)Encoder value: ");
Serial.println(now_count);
} else {
Serial.print("Encoder value: ");
Serial.println(now_count);
}
}
if (now_count > lastEncoderValue) {
if (!SW.isIdle()) { //检测按键是否空闲
if (mode == 0) {} //模式0按钮按下顺时针功能
if (mode == 1) { //模式1按钮按下顺时针功能
bleKeyboard.write(KEY_DOWN_ARROW);
Serial.println("DOWN_ARROW");
}
} else {
if (mode == 0) { //模式0顺时针功能
bleKeyboard.write(KEY_MEDIA_VOLUME_UP);
Serial.println("MEDIA_VOLUME_UP");
}
if (mode == 1) { //模式1顺时针功能
bleKeyboard.write(KEY_RIGHT_ARROW);
Serial.println("RIGHT_ARROW");
}
}
}
if (now_count < lastEncoderValue) {
if (!SW.isIdle()) { //检测按键是否空闲
if (mode == 0) {} //模式0按钮按下逆时针功能
if (mode == 1) { //模式1按钮按下逆时针功能
bleKeyboard.write(KEY_UP_ARROW);
Serial.println("UP_ARROW");
}
} else {
if (mode == 0) { //模式0逆时针功能
bleKeyboard.write(KEY_MEDIA_VOLUME_DOWN);
Serial.println("MEDIA_VOLUME_DOWN");
}
if (mode == 1) { //模式1逆时针功能
bleKeyboard.write(KEY_LEFT_ARROW);
Serial.println("LEFT_ARROW");
}
}
}
lastEncoderValue = now_count;
}
}
}
- 📋编译信息
使用 0.3.2 版本的库 ESP32-BLE-Keyboard 在文件夹: C:\Users\Administrator\Documents\Arduino\libraries\ESP32-BLE-Keyboard
使用 2.0.0 版本的库 BLE 在文件夹: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.5\libraries\BLE
使用 2.0.4 版本的库 OneButton 在文件夹: C:\Users\Administrator\Documents\Arduino\libraries\OneButton
使用 0.10.1 版本的库 ESP32Encoder 在文件夹: C:\Users\Administrator\Documents\Arduino\libraries\ESP32Encoder
"C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\xtensa-esp32-elf-gcc\\gcc8_4_0-esp-2021r2-patch3/bin/xtensa-esp32-elf-size" -A "d:\\arduino\\MyHexDir/ESP32_BLE_Keyboard.ino.elf"
项目使用了 1055409 字节,占用了 (80%) 程序存储空间。最大为 1310720 字节。
全局变量使用了32988字节,(10%)的动态内存,余留294692字节局部变量。最大为327680字节。