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

这篇具有很好参考价值的文章主要介绍了ESP32蓝牙+EC11旋转编码器实现对电脑音量控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


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

🛠蓝牙设备添加和连接

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

esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器

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

esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器

  • 🌿已连接设备
    esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器

⛳功能介绍

  1. 模式0:短按EC11编码器,静音/取消静音,双击蓝牙输入测试,顺时针音量加,逆时针音量键、按钮按下顺时针逆时针无功能。
  2. 模式1:短按EC11编码器,,双击蓝牙输入测试,顺时针右方向键,逆时针左方向键,按钮按下顺时针下方向键,按钮按下逆时针上方向键。
    esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器

🌻EC11旋转编码器

esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器
esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器

  • 🌼EC11旋转编码器模块

esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器

  • 🔰EC11滤波电路
    esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器

  • 🔧接线图原理图
    esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,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库:

esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器文章来源地址https://www.toymoban.com/news/detail-800997.html

  • 🌾ESP32Encoder库:
    esp32 ec11,Arduino ESP32 入门实例教程,ESP32蓝牙功能,EC11旋转编码器

📝代码实现

/*
 * 
 * 
 *  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字节。

到了这里,关于ESP32蓝牙+EC11旋转编码器实现对电脑音量控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【单片机】STM32单片机读取旋转编码器,TIM定时器编码器模式捕获,程序

    旋转编码器简单来说,就是会输出2个PWM,依据相位可以知道旋转方向,依据脉冲个数可以知道旋转的角度。一般旋转一圈有一个固定数值的脉冲个数。 旋转编码器广泛用于电机、或者角度传感器,STM32的定时器可以直接接入这两个波形获取到信息。 前两个引脚(接地和Vcc)

    2024年02月13日
    浏览(50)
  • STM32-微项目07-旋转编码器计数及测速

    一、微项目实现目标: 检测旋转编码器模式下,检测旋转编码器的转动计数值及转速。并且区分转向,一侧转动增加cout,转速值为正,一侧转动减少count,转速值为负;   二、微项目硬件配置需求: 1,stm32F103C8T6核心板一块 2,0.96寸OLED显示,用于显示计数 3,旋转编码器,

    2024年02月08日
    浏览(39)
  • ESP32(MicroPython) 编码器电机闭环控制

    本人最近查找资料时,发现ESP32上的使用MicroPython的编码器电机相关程序较少,闭环控制程序都是Pyboard上的,与ESP32不完全兼容。本人通过micropython编程 esp32+drv8833+霍尔编码器_micropython 编码器_青右的博客-CSDN博客 上的程序读取编码器计数,然后另写了控制程序,有两个版本。

    2024年02月16日
    浏览(41)
  • 【STM32】HAL库自学记录-旋转编码器的使用

    通过本文可学会两种实现判断旋转编码器正转反转的方法,可根据自己的应用场景来选择使用哪种方法。 1、芯片:STM32F103RCT6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、旋转编码器模块 5、XCOM V1.4串口软件 图中C端为GND。 方向 :A相和B相相差一个相位,一般来说是90°。A相信号在

    2024年02月11日
    浏览(52)
  • 关于stm32旋转编码器计次乱跳问题(消抖)

    旋转编码器A口接GPIOB0,B口接GPIOB1。设置中断类型为上升下降沿均触发。 输出是用0.96寸oled输出 A脚设置为上升下降沿均会进中断,下降上升一个变换周期,判断这个周期的A脚,B脚的始末状态,来判断正反转一次。 A口输出的波形用来中断,B口输出的波形用来判断正转还是反转

    2024年02月16日
    浏览(39)
  • (STM32)PWM输出控制电机旋转并且使用编码器读取脉冲数

    目录  前言 一、pwm输出让电机转  1.电机的接线说明 2.驱动的接线说明 3.pwm输出代码  pwm.c pwm.h 4.输出pwm控制电机旋转 二、配置定时器编码器模式 1.定时器编码器模式 编码器原理 编码器相关的概念 2.编码器模式——代码部分 3.获取脉冲数 三、定时读取编码器读取的脉冲数

    2024年02月03日
    浏览(58)
  • 【STM32】STM32学习笔记-对射式红外传感器计次 旋转编码器计次(12)

    相关头文件: misc.h 1.1 NVIC_PriorityGroupConfig函数 1.2 NVIC_PriorityGroup类型 1.3 NVIC_Init函数 1.4 NVIC_InitTypeDef类型 NVIC_IRQChannel取值 成员NVIC_IRQChannelPreemptionPriority可赋的值:最大取值15,具体有上面设置的优先级组中规定的位数决定 成员NVIC_IRQChannelSubPriority可赋的值:最大取值15,具体有

    2024年01月15日
    浏览(45)
  • STM32单片机(五)第二节:EXTI外部中断练习2(旋转编码器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(44)
  • STM32第五课:对射式红外线传感器计数和旋转编码器计数

    1.1 产品特性          使用ITR9606高灵敏度槽型光耦器件,它由一个红外发光二极管和一个NPN光电三极管组成,槽宽度为5mm。传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。广泛用于电机转速检测,

    2024年02月20日
    浏览(37)
  • 7、江科大stm32视频学习笔记——中断的应用:对射式红外传感器计次&旋转编码器计次

    目录 1、标志位函数 2、 初始化的中断的步骤 3、对射式红外传感器计次 (1)接线图 (2)CountSensor.c (3)main.c 4、旋转编码器计次 (1)接线图(旋转编码器接在PB1、PB0引脚) (2)Encoder.c (3)main.c 5、建议 //在 主程序 中查看标志位和清楚标志位,用以下两个函数,能不能

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包