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

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


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

🛠蓝牙设备添加和连接

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

在这里插入图片描述

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

在这里插入图片描述

  • 🌿已连接设备
    在这里插入图片描述

⛳功能介绍

  1. 模式0:短按EC11编码器,静音/取消静音,双击蓝牙输入测试,顺时针音量加,逆时针音量键、按钮按下顺时针逆时针无功能。
  2. 模式1:短按EC11编码器,,双击蓝牙输入测试,顺时针右方向键,逆时针左方向键,按钮按下顺时针下方向键,按钮按下逆时针上方向键。
    在这里插入图片描述

🌻EC11旋转编码器

在这里插入图片描述
在这里插入图片描述

  • 🌼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;
        }
    }
}
  • 📍代码相关参考:https://blog.csdn.net/qq_46443616/article/details/127995706
  • 📋编译信息
使用 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字节。
  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在ESP32-C3开发板上使用PlatformIO和TFT_eSPI库来操作旋转编码器,你可以按照以下步骤进行设置: 1. 在PlatformIO中创建一个新的项目,选择ESP32开发板作为目标设备。 2. 在你的项目文件夹中打开`platformio.ini`文件,确保以下内容存在或添加: ```ini [env:esp32c3] platform = espressif32 board = esp32c3 framework = arduino lib_deps = bodmer/TFT_eSPI@^2.4.0 ``` 这将配置PlatformIO以使用ESP32-C3开发板和TFT_eSPI库。 3. 在你的项目文件夹中创建一个新的源文件(例如`main.cpp`),并添加以下示例代码: ```cpp #include <TFT_eSPI.h> // 定义编码器引脚 #define PIN_A 4 #define PIN_B 5 TFT_eSPI tft; // 初始化编码器状态 int encoder_last_state = 0; void setup() { // 初始化TFT显示屏 tft.init(); tft.setRotation(1); // 设置编码器引脚为输入模式 pinMode(PIN_A, INPUT); pinMode(PIN_B, INPUT); // 启用内部上拉电阻 digitalWrite(PIN_A, HIGH); digitalWrite(PIN_B, HIGH); // 注册编码器引脚的中断回调函数 attachInterrupt(digitalPinToInterrupt(PIN_A), encoder_callback, CHANGE); } void loop() { // 主循环 } void encoder_callback() { // 读取编码器当前状态 int encoder_state = digitalRead(PIN_A); // 判断旋转方向 if (encoder_state != encoder_last_state) { if (digitalRead(PIN_B) != encoder_state) { // 顺时针旋转 tft.println("顺时针"); } else { // 逆时针旋转 tft.println("逆时针"); } } // 更新编码器状态 encoder_last_state = encoder_state; } ``` 这段代码假设你已经将TFT显示屏连接到ESP32-C3的相应引脚,并且已经将旋转编码器的引脚连接到GPIO 4和GPIO 5。在`setup()`函数中,我们初始化TFT显示屏和编码器引脚,并注册中断回调函数。在`encoder_callback()`函数中,我们读取编码器的当前状态并判断旋转方向,然后在TFT显示屏上打印相应的信息。 4. 编译和上传代码到ESP32-C3开发板。 这样,你就可以使用PlatformIO和TFT_eSPI库来操作旋转编码器,并在TFT显示屏上显示旋转方向的信息。请确保你已正确配置硬件连接,并根据需要进行适当的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值