EC11旋转编码器,Versatile_RotaryEncoder库详解

article/2025/8/6 23:49:44

在这里插入图片描述

旋转编码器与电位器

旋转编码器是电位器的现代数字等效物,并且用途更广泛。

旋转编码器可以不停地旋转360°,而电位器只能旋转3/4圈。

电位器用于需要知道旋钮准确位置的情况。另一方面,旋转编码器用于需要知道位置变化而不是确切位置的情况。

旋转编码器如何工作?

编码器内部有一个开槽圆盘,连接到公共接地引脚 C。它还具有两个接触针 A 和 B,如下所示。

在这里插入图片描述

当转动旋钮时,A 和 B 按照特定顺序与公共接地引脚 C 接触,具体顺序取决于转动旋钮的方向。

当它们与公共地接触时,会产生两个信号。这些信号存在 90° 异相,因为一个引脚先于另一个引脚接触公共地。它被称为正交编码

在这里插入图片描述

当顺时针旋转旋钮时,A 引脚先于 B 引脚接地。当逆时针旋转旋钮时,B 引脚先于 A 引脚接地。

通过监控每个引脚何时连接或断开接地,我们可以确定旋钮旋转的方向。这可以通过简单地观察 A 的状态改变时 B 的状态来完成。

当A改变状态时:

  • 如果 B != A,则顺时针转动旋钮。
    在这里插入图片描述

  • 如果 B = A,则逆时针转动旋钮。

在这里插入图片描述

旋转编码器引脚

在这里插入图片描述

GND:接地。

VCC:通常在 3.3 至 5 伏之间。

SW:按钮开关的输出(低电平有效)。当按下旋钮时,电压变低。

DT(输出 B):与CLK输出类似,但滞后于CLK 90°相移。该输出用于确定旋转方向。

CLK(输出A):是用于确定旋转量的主要输出脉冲。每次仅通过一个制动装置(咔嗒声)向任一方向转动旋钮时,“CLK”输出就会经历一个先高后低的周期。

案例

Versatile_RotaryEncoder-1.3.1

项目地址:https://github.com/ruiseixasm/Versatile_RotaryEncoder

#include <Versatile_RotaryEncoder.h>#define clk 17
#define dt 16
#define sw 18// 每个编码器上要处理的函数原型设计
void handleRotate(int8_t rotation);
void handlePressRotate(int8_t rotation);
void handleHeldRotate(int8_t rotation);
void handlePress();
void handleDoublePress();
void handlePressRelease();
void handleLongPress();
void handleLongPressRelease();
void handlePressRotateRelease();
void handleHeldRotateRelease();//为编码器对象创建全局指针
Versatile_RotaryEncoder *versatile_encoder;// 用于记录旋转脉冲数
int rotationCount = 0;void setup() {Serial.begin(9600);versatile_encoder = new Versatile_RotaryEncoder(clk, dt, sw);//在此处向编码器加载所有neded句柄函数(最多9个函数)versatile_encoder->setHandleRotate(handleRotate);//旋转versatile_encoder->setHandlePressRotate(handlePressRotate);//按下时旋转versatile_encoder->setHandlePressRotateRelease(handlePressRotateRelease);//按下时旋转释放    versatile_encoder->setHandleHeldRotate(handleHeldRotate);//长按后旋转versatile_encoder->setHandleHeldRotateRelease(handleHeldRotateRelease);//长按后旋转释放    versatile_encoder->setHandlePress(handlePress);//短按versatile_encoder->setHandleDoublePress(handleDoublePress);//双击//versatile_encoder->setHandleDoublePress(nullptr); //禁用双击versatile_encoder->setHandlePressRelease(handlePressRelease);//短按释放versatile_encoder->setHandleLongPress(handleLongPress);//长按versatile_encoder->setHandleLongPressRelease(handleLongPressRelease);//长按释放Serial.println("Ready!");// 设置自己的defalt值(可选)// versatile_encoder->setInvertedSwitch(true); // 将开关行为从HIGH(高)转变为LOW(低)转变为LOW(低)// versatile_encoder->setReadIntervalDuration(2);// 将2ms设置为长按持续时间(默认为1ms)// versatile_encoder->setShortPressDuration(35); // 将35ms设置为短按持续时间(默认为50ms)// versatile_encoder->setLongPressDuration(550); // 设置550ms为长按持续时间(默认为1000ms)// versatile_encoder->setDoublePressDuration(350); // 设置350ms为双按持续时间(默认为250ms)}void loop() {//做编码器的读取和处理if (versatile_encoder->ReadEncoder()) {//每当读取编码器动作时,请在此处执行操作// 输出旋转脉冲数Serial.print("Rotation Count: ");Serial.println(rotationCount);        }
}//根据您的需要在此处执行您的功能void handleRotate(int8_t rotation) {Serial.print("#1 Rotated: ");//旋转if (rotation > 0)Serial.println("Right");rotationCount++;elseSerial.println("Left");rotationCount--;
}void handlePressRotate(int8_t rotation) {Serial.print("#2 Pressed and rotated: ");//按下时旋转if (rotation > 0)Serial.println("Right");elseSerial.println("Left");
}void handleHeldRotate(int8_t rotation) {Serial.print("#3 Held and rotated: ");//长按后旋转if (rotation > 0)Serial.println("Right");elseSerial.println("Left");
}void handlePress() {Serial.println("#4.1 Pressed");//短按
}void handleDoublePress() {Serial.println("#4.2 Double Pressed");//双击
}void handlePressRelease() {Serial.println("#5 Press released");//短按释放
}void handleLongPress() {Serial.println("#6 Long pressed");//长按
}void handleLongPressRelease() {Serial.println("#7 Long press released");//长按释放
}void handlePressRotateRelease() {Serial.println("#8 Press rotate released");//按下旋转释放
}void handleHeldRotateRelease() {Serial.println("#9 Held rotate released");//保持旋转释放
}

http://www.hkcw.cn/article/KPUXpIprWA.shtml

相关文章

【金融基础学习】债券回购方式

债券回购作为货币市场的重要工具&#xff0c;本质上是一种以债券为抵押的短期资金借贷行为。在银行间市场&#xff0c;质押式回购与**买断式回购*是两种主要形式。 1. 质押式回购(Pledged Repo, RP) – 所有权不转移的短期融资工具 1.1 质押式回购概述 质押式回购是交易双方…

助力高校AI教学与科研:GpuGeek推出618算力支持活动

618期间&#xff0c;GpuGeek推出面向高校师生的专属算力支持计划&#xff0c;6月5日至25日活动期间&#xff0c;完成学生认证的用户充值即可获得"学霸礼包"&#xff0c;同时平台算力嘉年华活动还将为用户提供额外算力赠送&#xff0c;有效降低了AI学习与研究的资源门…

多线程( Thread)

线程&#xff1a;是一个程序内部的一条执行流程。 多线程&#xff1a;是指从软硬件上实现的多条执行流程的技术&#xff08;多条线程由CPU负责调度执行&#xff09;。 创建线程&#xff1a; 多线程的创建方式之一&#xff1a;继承Thread类 1.定义一个子类MyThread继承线程类…

Vue-2-前端框架Vue基础入门之二

文章目录 1 计算属性1.1 计算属性简介1.2 计算属性示例 2 侦听器2.1 简单的侦听器2.2 深度监听2.3 监听对象单个属性 3 vue-cli3.1 工程化的Vue项目3.2 Vue项目的运行流程 4 vue组件4.1 Vue组件的三个部分4.1.1 template4.1.2 script4.1.3 style 4.2 组件之间的关系4.2.1 使用组…

LTSPICE仿真电路:(三十二)差动放大器电流源

1.差动放大器电流源 本来是和HOWLAND电流源在一起的&#xff0c;后面想着以后不一定好查找&#xff0c;不如重新另起一篇算了&#xff0c;和前一章的电流源有比较接近的地方&#xff0c;四个电阻直接变成差动放大器内部的东西。 方框中的就是差动放大器&#xff0c;也是负反馈…

Redis 缓存穿透、缓存击穿、缓存雪崩详解与解决方案

在分布式系统中&#xff0c;Redis 凭借高性能和高并发处理能力&#xff0c;成为常用的缓存组件。然而&#xff0c;在实际应用中&#xff0c;缓存穿透、缓存击穿、缓存雪崩这三大问题会严重影响系统的性能与稳定性。本文将详细解析这三个问题的成因&#xff0c;并提供对应的解决…

论文阅读笔记——Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset

I3D 论文 UCF-101&#xff08;13000多个视频&#xff09;和 HMDB-51&#xff08;7000多个视频&#xff09;数据集过小&#xff0c;提出了 Kinetics 数据集&#xff0c;并且在其之上预训练之后能够迁移到其他小的数据集。 2DLSTM&#xff1a;使用2D CNN的好处是可以直接从 Ima…

Azure devops 系统之五-部署ASP.NET web app

今天介绍如何通过vscode 来创建一个asp.net web app,并部署到azure 上。 创建 ASP.NET Web 应用 在您的计算机上打开一个终端窗口并进入工作目录。使用 dotnet new webapp 命令创建一个新的 .NET Web 应用,然后将目录切换到新创建的应用。 dotnet new webapp -n MyFirstAzu…

slider滑块async await

isselectionrangeenabled 特色属性 实际场景 视频缓存进度和观看进度 scrollbar 也可以 <StackPanel> <!-- 选择范围头尾相同&#xff0c;但 Slider 仍可操作 --> <Slider IsSelectionRangeEnabled"True" SelectionStart"30" SelectionEn…

LangChain-结合GLM+SQL+函数调用实现数据库查询(一)

业务流程 实现步骤 1. 加载数据库配置 在项目的根目录下创建.env 文件&#xff0c;设置文件内容&#xff1a; DB_HOSTxxx DB_PORT3306 DB_USERxxx DB_PASSWORDxxx DB_NAMExxx DB_CHARSETutf8mb4 加载环境变量&#xff0c;从 .env 文件中读取数据库配置信息 使用 os.getenv…

性能优化 - 工具篇:常用的性能测试工具

文章目录 Pre1. 常用的性能测试工具2. nmon —— 获取系统级性能数据2.1 安装与启动2.2 采样并生成报表 3. jvisualvm —— 获取 JVM 性能数据3.1 启动与连接3.2 CPU 分析&#xff08;Sampler & Profiler&#xff09;3.3 内存监视与 Heap Dump3.4 线程分析 4. JMC&#xff…

箱式不确定集

“箱式不确定集&#xff08;Box Uncertainty Set&#xff09;”可以被认为是一种 相对简单但实用的不确定集建模方式。 ✅ 一、什么是“简单的不确定集”&#xff1f; 在鲁棒优化领域&#xff0c;“简单不确定集”通常指的是&#xff1a; 特点描述形式直观数学表达简洁&#…

GoldenEye

GoldenEye: 1 About Release Back to the Top Name: GoldenEye: 1Date release: 4 May 2018Author: creosoteSeries: GoldenEye 下载&#xff1a; GoldenEye-v1.ova (Size: 805 MB)Download: https://drive.google.com/open?id1M7mMdSMHHpiFKW3JLqq8boNrI95Nv4tqDownload (Mir…

[AI算法] 什么事RoPE scaling

文章目录 RopeScaling 的作用&#x1f4a1; RopeScaling 的核心思想&#xff1a; 常见的 RoPE Scaling 方法Dynamic NTK-Aware Scaling核心原理实现方式&#xff08;伪代码示例&#xff09;优点与效果应用场景总结对比表 YaRN技术 RopeScaling 的作用 ✅ 场景背景&#xff1a;…

功能丰富的PDF处理免费软件推荐

软件介绍 今天给大家介绍一款超棒的PDF工具箱&#xff0c;它处理PDF文档的能力超强&#xff0c;而且是完全免费使用的&#xff0c;没有任何限制。 TinyTools&#xff08;PC&#xff09;这款软件&#xff0c;下载完成后即可直接打开使用。在使用过程中&#xff0c;操作完毕后&a…

统一多模态预训练中的涌现特性

25年5月来自字节、深圳先进技术研究院、Monash 大学、香港科大和 UC Santa Cruz 的论文“Emerging Properties in Unified Multimodal Pretraining”。 统一多模态理解与生成已在尖端专有系统中展现出令人瞩目的能力。本研究的 BAGEL&#xff0c;是一个原生支持多模态理解与生…

从认识AI开始-----Transformer:大模型的核心架构

前言 在NLP领域中&#xff0c;RNN、LSTM及GRU曾是处理序列问题的主力模型&#xff0c;但它们都面临着两个关键问题&#xff1a; 无法并行计算&#xff1a;序列数据需要完成前一步后再处理下一步&#xff0c;这会使得训练效率低下长期依赖问题&#xff1a;即使是LSTM、GRU&…

Mnist手写数字

运行实现&#xff1a; import torch from torch.utils.data import DataLoader from torchvision import transforms from torchvision.datasets import MNIST import matplotlib.pyplot as pltclass Net(torch.nn.Module):#net类神经网络主体def __init__(self):#4个全链接层…

win32相关(互斥体)

互斥体 内核级临界资源怎么处理&#xff1f; 有两个不同进程中的线程&#xff0c;访问内核中的临界资源&#xff0c;该怎么实现线程安全 互斥体其实就是一个内核级的跨进程访问令牌&#xff0c;与在同一个进程中的临界区不同的是&#xff0c;同一个进程中的不同线程&#xff0c…

【配置vscode默认终端为git bash】

配置vscode默认终端为git bash 点击左下角小齿轮&#xff0c;点击设置&#xff0c;搜索terminal.integrated.profiles.windows&#xff0c;点击在setting.json中编辑 第一部分是当前的所有的终端&#xff0c;第二部分是配置默认的终端"terminal.integrated.defaultProfi…