当前位置: 首页 > 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.hskmm.com/?act=detail&tid=13601

相关文章:

  • mysql/oracle LEFT JOIN 取时间最大的数据
  • 6月6日证书 - 工信部人才交流中心PostgreSQL中级PGCP高级PGCM认证
  • 基于遗传算法与非线性规划的混合优化算法在电力系统最优潮流中的实现
  • 【下一款产品】
  • 数1的个数
  • 通过ML.Net调用Yolov5的Onnx模型
  • Java-如何在Eclipse开发-数组
  • 常用数据生成器
  • 基于RSSI修正的定位算法分析
  • c# 反射动态添加Attribute
  • MyBatis-Plus 全方位深度指南:从入门到精通
  • 鸿蒙项目实战(十):web和js交互
  • 【9.24 直播】集群数据管理实战:时序数据库 IoTDB 数据分区、同步与备份详解
  • 函数计算进化之路:AI 应用运行时的状态剖析
  • 01_进程与线程
  • 第六届医学人工智能国际学术会议(ISAIMS 2025)
  • redis 6.0 多线程
  • docker 常用命令与端口映射
  • linux重启mysql服务,几种常见的方法
  • opencv学习记录3
  • 统计分析神器 NCSS 2025 功能亮点+图文安装教程
  • mysql常用语句,常用的语句整理
  • 当写脚本循环更新几百万数据发现很慢怎么办 - 孙龙
  • 服装采购跟单系统的高效管理实践 - 详解
  • 和汽车相关的国内期刊
  • 服务器CPU、内存、磁盘、网络使用率,东方通CPU使用率东方通内存使用率监控脚本
  • 3 网络基础知识+web基础知识+部署Server
  • wxpython图形界面_01_最小基本结构
  • 服务器总资源监控脚本
  • 一个身体,两个身体