当前位置: 首页 > news >正文

ESP32 读取旋转编码器

1、旋转编码器原理
image
1.1、以A输入为时钟,边沿中断检测A输入的上升边沿,同时在中断回调函数判断B的电平状态
①正转CW:A上升沿,B低电平;
②反转CWW:A上升沿,B高电平;
1.2、中间按键直接使用电平或者电平中断检测;

2、旋钮编码器读取
①顺时针旋转:三色灯根据编码器数据增加而变化
②逆时针旋转:三色灯根据编码器数据减少而变化
③中间按键:熄灭RGB三色灯

#define R_PIN 19
#define G_PIN 20
#define B_PIN 21#define ENCODER_A_PIN 12
#define ENCODER_B_PIN 13
#define ENCODER_SW_PIN 14unsigned char encoder_cnt = 0;
unsigned char cnt_last_state = 0;void rgb_turn_off(void){digitalWrite(R_PIN, LOW);digitalWrite(B_PIN, LOW);digitalWrite(G_PIN, LOW);
}void rgb_change(unsigned char val){unsigned int i =val;switch(i){case 1:digitalWrite(R_PIN, HIGH);digitalWrite(B_PIN, LOW);digitalWrite(G_PIN, LOW);break;case 2:digitalWrite(R_PIN, HIGH);digitalWrite(B_PIN, LOW);digitalWrite(G_PIN, HIGH);break;case 3:digitalWrite(R_PIN, HIGH);digitalWrite(B_PIN, HIGH);digitalWrite(G_PIN, LOW);break;case 4:digitalWrite(R_PIN, HIGH);digitalWrite(B_PIN, HIGH);digitalWrite(G_PIN, HIGH);break;case 5:digitalWrite(R_PIN, LOW);digitalWrite(B_PIN, LOW);digitalWrite(G_PIN, HIGH);break;case 6:digitalWrite(R_PIN, LOW);digitalWrite(B_PIN, HIGH);digitalWrite(G_PIN, HIGH);break;case 7:digitalWrite(R_PIN, LOW);digitalWrite(B_PIN, HIGH);digitalWrite(G_PIN, LOW);break;default:digitalWrite(R_PIN, LOW);digitalWrite(B_PIN, LOW);digitalWrite(G_PIN, LOW);break;}
}void Interrupt_read_encoder(void) {int dt_val = 0;dt_val = digitalRead(ENCODER_B_PIN);if(dt_val == LOW){Serial.println("Rotated CW >>");if(encoder_cnt >= 7){encoder_cnt = 7;}else{encoder_cnt ++;}}if(dt_val == HIGH){Serial.println("Rotated CCW <<");if(encoder_cnt == 0){encoder_cnt = 0;}else{encoder_cnt --;}}
}void setup() {Serial.begin(115200);pinMode(R_PIN, OUTPUT);pinMode(G_PIN, OUTPUT);pinMode(B_PIN, OUTPUT);rgb_turn_off();pinMode(ENCODER_A_PIN, INPUT);pinMode(ENCODER_B_PIN, INPUT);pinMode(ENCODER_SW_PIN, INPUT_PULLUP);attachInterrupt(digitalPinToInterrupt(ENCODER_A_PIN), Interrupt_read_encoder, RISING);Serial.print("RBG runing...\r\n");
}void loop() {noInterrupts();if(cnt_last_state != encoder_cnt){cnt_last_state = encoder_cnt;rgb_change(encoder_cnt);Serial.printf("encoder_cnt=%d.\r\n", encoder_cnt);}interrupts();if(digitalRead(ENCODER_SW_PIN) == LOW){delay(100);if(digitalRead(ENCODER_SW_PIN) == LOW){Serial.println("sw chick...\r\n");rgb_turn_off();encoder_cnt = 0;}}
}

2、执行仿真效果
image

http://www.rkmt.cn/news/9737.html

相关文章:

  • 数1的个数
  • 基于RSSI修正的定位算法分析
  • 接口测试流程+jmeter并发+面试题(总结) - 指南
  • 完整教程:Java多线程初阶
  • 当写脚本循环更新几百万数据发现很慢怎么办 - 孙龙
  • 服装采购跟单系统的高效管理实践 - 详解
  • 服务器CPU、内存、磁盘、网络使用率,东方通CPU使用率东方通内存使用率监控脚本
  • 什么是 AutoModel
  • 深入解析:STM32——WDG看门狗
  • wxpython图形界面_01_最小基本结构
  • 006_字典操作
  • 东方通中间件嵌入式监控脚本
  • 个人作业-第二次软件工程作业
  • 实用指南:告别IP被封!分布式爬虫的“隐身”与“分身”术
  • 别的摄像机都能国标GB28181注册上,就这台海康摄像机注册不上来,国标配置都反复检查没问题
  • 003_for循环操作列表和元组
  • linux 文件传输命令
  • Redis AOF原理
  • ANSYS Electronics 2025 R1 安装与使用全流程图文教程
  • 实用指南:通义DeepResearch论文六连发全面解读
  • Notepad++8.6免费版下载及安装教程(附安装包)2025最新整理
  • mysql表新增字段,基本语法
  • 微波雷达模块WT4101重新定义饮水机茶吧机等智能家居
  • 硝基甲苯之魇
  • 关于串口通信(232、485、422)和常见问题,一篇文章就给你说清楚~
  • day13-Trae之一键换脸APP开发03
  • 摩尔投票法
  • 基于STM32平台的ADS1292心电采集驱动程序
  • C#开发的等待界面类库例子 - 开源研究系列文章
  • 邀您参加丨云栖大会中企出海技术分论坛