ESP32藍(lán)牙 + EC11旋轉(zhuǎn)編碼器實(shí)現(xiàn)對(duì)電腦音量控制
- ?本項(xiàng)目基于Arduino開(kāi)發(fā)框架下功能實(shí)現(xiàn)。
??藍(lán)牙設(shè)備添加和連接
?需要有帶藍(lán)牙硬件支持的電腦才能實(shí)現(xiàn)連接并控制,當(dāng)然手機(jī)也可以連接但是不能實(shí)現(xiàn)對(duì)手機(jī)音量控制,
- ??以
Win10
系統(tǒng)電腦為例。在設(shè)置里面找到,添加藍(lán)牙和其他設(shè)備
- ??會(huì)搜索到
ESP32-keyboard
設(shè)備。
- ??已連接設(shè)備
?功能介紹
- 模式0:短按EC11編碼器,靜音/取消靜音,雙擊藍(lán)牙輸入測(cè)試,順時(shí)針音量加,逆時(shí)針音量鍵、按鈕按下順時(shí)針逆時(shí)針無(wú)功能。
- 模式1:短按EC11編碼器,,雙擊藍(lán)牙輸入測(cè)試,順時(shí)針右方向鍵,逆時(shí)針左方向鍵,按鈕按下順時(shí)針下方向鍵,按鈕按下逆時(shí)針上方向鍵。
??EC11旋轉(zhuǎn)編碼器
- ??EC11旋轉(zhuǎn)編碼器模塊
-
??EC11濾波電路
-
??接線圖原理圖
-
??接線說(shuō)明
??參照上面的原理圖進(jìn)行接線,如果想實(shí)現(xiàn)平滑控制,最好加上濾波電容。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-800997.html
EC11 A ---->ESP32 GPIO 22
EC11 B ---->ESP32 GPIO 23
EC11 E ---->ESP32 GPIO 19
EC11 D 和 C---->ESP32 GND
??所需庫(kù)
- ??
BleKeyboard
庫(kù):https://github.com/T-vK/ESP32-BLE-Keyboard
//需要自行前往下載并導(dǎo)入Arduino IDE
庫(kù)當(dāng)中。 - ??
OneButton
庫(kù):
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-800997.html
- ??
ESP32Encoder
庫(kù):
??代碼實(shí)現(xiàn)
/*
*
*
* ESP32-BLE-Keyboard: https://github.com/T-vK/ESP32-BLE-Keyboard
*/
#include <Arduino.h>
#include "BleKeyboard.h"//需要到github下載并導(dǎo)入
#include "OneButton.h"//點(diǎn)擊這里會(huì)自動(dòng)打開(kāi)管理庫(kù)頁(yè)面: http://librarymanager/All#OneButton
#include <ESP32Encoder.h>//點(diǎn)擊這里會(huì)自動(dòng)打開(kāi)管理庫(kù)頁(yè)面: http://librarymanager/All#ESP32Encoder
//按鍵配置
#define EC11_A_PIN 22
#define EC11_B_PIN 23
#define EC11_K_PIN 19//按鍵引腳
//鍵盤(pán)名稱(chēng):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;
//按鍵單擊回調(diào)函數(shù)
void click() {
if (mode == 0) {
Serial.println("Click: MUTE");
bleKeyboard.write(KEY_MEDIA_MUTE);
}
if (mode == 1) {
Serial.println("Enter");
bleKeyboard.write(KEY_RETURN);
}
}
//按鍵長(zhǎng)按回調(diào)函數(shù)
void longclick() {
if (activate) { //如果旋鈕轉(zhuǎn)動(dòng),則不切換狀態(tài)
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;
}
//按鍵雙擊回調(diào)函數(shù)
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);
//初始化按鍵事件檢測(cè)
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()) { //檢測(cè)按鍵是否空閑
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()) { //檢測(cè)按鍵是否空閑
if (mode == 0) {} //模式0按鈕按下順時(shí)針功能
if (mode == 1) { //模式1按鈕按下順時(shí)針功能
bleKeyboard.write(KEY_DOWN_ARROW);
Serial.println("DOWN_ARROW");
}
} else {
if (mode == 0) { //模式0順時(shí)針功能
bleKeyboard.write(KEY_MEDIA_VOLUME_UP);
Serial.println("MEDIA_VOLUME_UP");
}
if (mode == 1) { //模式1順時(shí)針功能
bleKeyboard.write(KEY_RIGHT_ARROW);
Serial.println("RIGHT_ARROW");
}
}
}
if (now_count < lastEncoderValue) {
if (!SW.isIdle()) { //檢測(cè)按鍵是否空閑
if (mode == 0) {} //模式0按鈕按下逆時(shí)針功能
if (mode == 1) { //模式1按鈕按下逆時(shí)針功能
bleKeyboard.write(KEY_UP_ARROW);
Serial.println("UP_ARROW");
}
} else {
if (mode == 0) { //模式0逆時(shí)針功能
bleKeyboard.write(KEY_MEDIA_VOLUME_DOWN);
Serial.println("MEDIA_VOLUME_DOWN");
}
if (mode == 1) { //模式1逆時(shí)針功能
bleKeyboard.write(KEY_LEFT_ARROW);
Serial.println("LEFT_ARROW");
}
}
}
lastEncoderValue = now_count;
}
}
}
- ??代碼相關(guān)參考:
https://blog.csdn.net/qq_46443616/article/details/127995706
- ??編譯信息
使用 0.3.2 版本的庫(kù) ESP32-BLE-Keyboard 在文件夾: C:\Users\Administrator\Documents\Arduino\libraries\ESP32-BLE-Keyboard
使用 2.0.0 版本的庫(kù) BLE 在文件夾: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.5\libraries\BLE
使用 2.0.4 版本的庫(kù) OneButton 在文件夾: C:\Users\Administrator\Documents\Arduino\libraries\OneButton
使用 0.10.1 版本的庫(kù) 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"
項(xiàng)目使用了 1055409 字節(jié),占用了 (80%) 程序存儲(chǔ)空間。最大為 1310720 字節(jié)。
全局變量使用了32988字節(jié),(10%)的動(dòng)態(tài)內(nèi)存,余留294692字節(jié)局部變量。最大為327680字節(jié)。
到了這里,關(guān)于ESP32藍(lán)牙+EC11旋轉(zhuǎn)編碼器實(shí)現(xiàn)對(duì)電腦音量控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!