ESP32蓝牙+EC11旋转编码器实现对电脑音量控制

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32蓝牙+EC11旋转编码器实现对电脑音量控制相关的知识,希望对你有一定的参考价值。

ESP32蓝牙+EC11旋转编码器实现对电脑音量控制


  • ✨本项目基于Arduino开发框架下功能实现。

🛠蓝牙设备添加和连接

⚡需要有带蓝牙硬件支持的电脑才能实现连接并控制,当然手机也可以连接但是不能实现对手机音量控制,

  • 🌿以Win10系统电脑为例。在设置里面找到,添加蓝牙和其他设备
  • 🌿会搜索到ESP32-keyboard设备。

  • 🌿已连接设备

⛳功能介绍

支持静音功能以及音量增加或减少.

  1. 按压EC11编码器,静音功能。
  2. 顺时针旋转,音量+,旋钮一格,音量增加+2.
  3. 逆时针旋转,音量-,旋钮一格,音量增加+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字节。

以上是关于ESP32蓝牙+EC11旋转编码器实现对电脑音量控制的主要内容,如果未能解决你的问题,请参考以下文章

ESP32 + EC11旋转编码器调节PWM占空比输出

ESP32 EC11 制作电脑音量调节旋钮

Arduino ESP32 WIFI &蓝牙模式触控按键切换

STM32F103 + 0.96/1.3“ I2C OLED + EC11旋转编码器多级菜单demo

了解EC11旋转编码器,编写EC11旋转编码器驱动程序。

esp32蓝牙密码设置