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

[ESP32] 编码旋钮驱动

此驱动适用于(2个引脚ENA,ENB)编码旋钮,当旋钮转动时会产生2个脉冲,若采用定时轮询的方式来获取引脚的电平序列则有可能会丢包。采用中断方式来处理会比较合适;

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "driver/gpio.h"
#include "esp_log.h"// 定义:旋钮引脚+确认健
#define KNOB_ENA_IO 7
#define KNOB_ENB_IO 8
#define KNOB_KEY_IO 9static SemaphoreHandle_t g_gpio_sem;// 顺时针扭动
void turn_clock_wise_proc()
{static uint8_t cnt = 0;printf("[%ld] CLOCK_WISE.%02X \n", esp_log_timestamp(), cnt++);
}// 逆时针扭动
void turn_not_clk_wise_proc()
{static uint8_t cnt = 0;printf("[%ld] N_CLK_WISE.%02X \n", esp_log_timestamp(), cnt++);
}
// 确认键按下
void click_middle_proc()
{static uint8_t cnt = 0;printf("[%ld] MIDD_BTN.\n", esp_log_timestamp(), cnt++);
}static void IRAM_ATTR gpio_isr_handler(void *arg)
{xSemaphoreGiveFromISR(g_gpio_sem, NULL);
}static void knob_intr_handle(void *arg)
{uint8_t pin_ena = 0;uint8_t pin_enb = 0;uint8_t knob_value = 0;uint8_t knob_value_old = 0;uint8_t pin_mid = 0;     // 0:Down,1:Upuint8_t pin_mid_old = 1; // Default:Upuint8_t last_pos = 0;    // 100:顺时针,200:逆时针printf("knob_intr_handle() start,configTICK_RATE_HZ=%d \n", configTICK_RATE_HZ);while (1){if (xSemaphoreTake(g_gpio_sem, pdMS_TO_TICKS(25))) // raw:portMAX_DELAY{pin_ena = gpio_get_level(KNOB_ENA_IO);pin_enb = gpio_get_level(KNOB_ENB_IO);knob_value = pin_ena << 1 | pin_enb;// printf("info=> %d,%d; old=%d, curr=%d \n", pin_ena,pin_enb,knob_value_old,knob_value);if (knob_value == 2 && knob_value_old == 1){last_pos = 100;}else if (knob_value == 3 && knob_value_old == 0){last_pos = 200;}knob_value_old = knob_value;if (knob_value == 2 || knob_value == 1){//if(last_pos==100)//防止误触turn_clock_wise_proc();}else if (knob_value == 3 || knob_value == 0){//if(last_pos==200)//防止误触turn_not_clk_wise_proc();}}pin_mid = gpio_get_level(KNOB_KEY_IO);if (pin_mid_old != pin_mid){pin_mid_old = pin_mid;if (pin_mid == 0)click_middle_proc();}}
}/*Init Knob & key*/
void Knob_key_Init(void)
{gpio_config_t io_cfg = {.intr_type = GPIO_INTR_DISABLE,.mode = GPIO_MODE_INPUT,.pin_bit_mask = BIT64(KNOB_ENA_IO) | BIT64(KNOB_ENB_IO) | BIT64(KNOB_KEY_IO),};gpio_config(&io_cfg);// install gpio isr servicegpio_install_isr_service(0); // 0=ESP_INTR_FLAG_DEFAULT// zero-initialize the config structure.gpio_config_t io_conf = {};// interrupt of rising edge//  GPIO_INTR_ANYEDGE;//GPIO_INTR_POSEDGE;//GPIO_INTR_NEGEDGEio_conf.intr_type = GPIO_INTR_ANYEDGE; // GPIO_INTR_POSEDGE;//GPIO_INTR_NEGEDGEio_conf.pin_bit_mask = 1ULL << KNOB_ENA_IO;io_conf.mode = GPIO_MODE_INPUT;io_conf.pull_up_en = 1;gpio_config(&io_conf);g_gpio_sem = xSemaphoreCreateBinary();// start gpio taskxTaskCreate(knob_intr_handle, "knob_intr_handle", 1024 * 5, NULL, 10, NULL);gpio_isr_handler_add(KNOB_ENA_IO, gpio_isr_handler, NULL);
}

相关文章:

  • 备考ICA----Istio实验7---故障注入 Fault Injection 实验
  • 一种基于约化因子上三角矩阵求逆方法与MATLAB仿真
  • 【数据结构】栈与队列
  • transfomer知识点梳理
  • 工业相机采图方式、图像格式(BYTE、HObject和Mat)转换
  • 队列的实现(C语言链表实现队列)
  • JS+CSS3点击粒子烟花动画js特效
  • Spark与flink计算引擎工作原理
  • MySQL存储引擎的区别与选择
  • 【数据可视化】使用Python + Gephi,构建中医方剂关系网络图!
  • 微服务鉴权的几种实现方案
  • 记录解决问题--activiti8.2 流程图图片由png改为svg前端不显示图片问题
  • 20240323
  • 算法 之 排序算法
  • LeetCode第一天(495.提莫攻击)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • AWS实战 - 利用IAM对S3做访问控制
  • Docker入门(二) - Dockerfile
  • js中forEach回调同异步问题
  • Node项目之评分系统(二)- 数据库设计
  • Swift 中的尾递归和蹦床
  • ViewService——一种保证客户端与服务端同步的方法
  • 高程读书笔记 第六章 面向对象程序设计
  • 关于extract.autodesk.io的一些说明
  • 观察者模式实现非直接耦合
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 算法系列——算法入门之递归分而治之思想的实现
  • 小程序 setData 学问多
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (07)Hive——窗口函数详解
  • (70min)字节暑假实习二面(已挂)
  • (C语言)fgets与fputs函数详解
  • (ibm)Java 语言的 XPath API
  • (pojstep1.1.2)2654(直叙式模拟)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (笔试题)合法字符串
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (四)linux文件内容查看
  • (一)插入排序
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET CLR Hosting 简介
  • .Net MVC + EF搭建学生管理系统
  • .net web项目 调用webService
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET框架
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @Conditional注解详解
  • @Pointcut 使用
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @TableId注解详细介绍 mybaits 实体类主键注解