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

基于esp32,控制IO1高低电平 和读取IO0按键的c程序

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"// 引脚定义
#define OUTPUT_IO     GPIO_NUM_1    // 输出控制引脚
#define BUTTON_IO     GPIO_NUM_0    // 按键输入引脚// 按键检测参数
#define DEBOUNCE_TIME_MS  50       // 消抖时间(毫秒)
#define SHORT_PRESS_MS    500       // 短按时间阈值
#define LONG_PRESS_MS     2000      // 长按时间阈值// 全局变量
volatile uint32_t button_press_time = 0;
volatile bool button_active = false;
volatile bool button_long_press = false;// 初始化GPIO
void init_gpio() {// 配置输出引脚gpio_config_t io_conf = {.pin_bit_mask = (1ULL << OUTPUT_IO),.mode = GPIO_MODE_OUTPUT,.pull_up_en = GPIO_PULLUP_DISABLE,.pull_down_en = GPIO_PULLDOWN_DISABLE,.intr_type = GPIO_INTR_DISABLE};gpio_config(&io_conf);// 配置输入引脚(按键)io_conf.pin_bit_mask = (1ULL << BUTTON_IO);io_conf.mode = GPIO_MODE_INPUT;io_conf.pull_up_en = GPIO_PULLUP_ENABLE;  // 使用内部上拉io_conf.intr_type = GPIO_INTR_NEGEDGE;    // 下降沿触发中断gpio_config(&io_conf);// 安装GPIO中断服务gpio_install_isr_service(0);// 添加中断处理函数gpio_isr_handler_add(BUTTON_IO, button_isr_handler, NULL);
}// 按键中断服务程序
void IRAM_ATTR button_isr_handler(void* arg) {uint32_t current_time = xTaskGetTickCount() * portTICK_PERIOD_MS;if (!gpio_get_level(BUTTON_IO)) {// 按键按下(下降沿)button_press_time = current_time;button_active = true;button_long_press = false;} else if (button_active) {// 按键释放(上升沿)且之前是按下状态uint32_t press_duration = current_time - button_press_time;if (press_duration >= DEBOUNCE_TIME_MS) {if (press_duration >= LONG_PRESS_MS) {button_long_press = true;printf("长按 detected\n");} else if (press_duration >= DEBOUNCE_TIME_MS) {printf("短按 detected\n");}}button_active = false;}
}// 主任务
void app_main() {// 初始化GPIOinit_gpio();// 初始状态: IO1输出低电平gpio_set_level(OUTPUT_IO, 0);while (1) {// 示例: 每5秒切换一次IO1状态printf("Setting IO1 HIGH\n");gpio_set_level(OUTPUT_IO, 1);vTaskDelay(5000 / portTICK_PERIOD_MS);printf("Setting IO1 LOW\n");gpio_set_level(OUTPUT_IO, 0);vTaskDelay(5000 / portTICK_PERIOD_MS);// 这里可以根据按键状态做其他操作// 例如:// if (button_long_press) {//     // 处理长按事件//     button_long_press = false;// }}
}

程序说明
1. 引脚定义:
◦ OUTPUT_IO (GPIO1): 用于输出高低电平
◦ BUTTON_IO (GPIO0): 用于连接按键(注意: GPIO0在ESP32上通常有特殊用途,如启动模式选择)
2. 按键检测功能:
◦ 使用中断方式检测按键
◦ 实现了消抖处理(50ms)
◦ 区分短按(500ms以内)和长按(2000ms以上)
◦ 按键释放时判断是短按还是长按
3. 输出控制:
◦ 示例中每5秒切换一次IO1的电平状态
◦ 实际应用中可以根据按键状态来控制输出
注意事项
1. GPIO0在ESP32开发板上通常连接有自动下载电路,用作按键输入可能会有问题。如果遇到问题,可以尝试改用其他GPIO(如GPIO2、GPIO4等)。
2. 按键需要连接在GPIO0和地之间,内部已启用上拉电阻。
3. 中断处理函数标记为IRAM_ATTR确保它被放置在IRAM中。
4. 实际应用中,可以根据需要调整短按和长按的时间阈值。
5. 如果需要更复杂的按键处理(如双击、多击等),可以考虑使用状态机或专门的按键库。

http://www.xdnf.cn/news/9804.html

相关文章:

  • ByteBuddy入门:静态方法增强实战
  • 4.1.3 操作数据帧
  • 005 ElasticSearch 许可证过期问题
  • 深入剖析 Docker 容器化原理与实战应用,开启技术新征程!
  • VCS elab选项 -simprofile功能
  • 微软 Azure AI Foundry(国际版)十大重要更新
  • EXCEL中的TEXTJOIN用法(基础版),将Excel 多个单元格内容按条件合并到一个单元格
  • 【计算机网络】第2章:应用层—DNS
  • 详细说说Redis分布式锁和ZK分布式锁
  • 动手学深度学习pytorch学习笔记 —— 第四章(2)
  • 2023年6级第一套长篇阅读
  • Mybatis中的懒加载
  • 高密爆炸警钟长鸣:AI为化工安全戴上“智能护盾”
  • 基于MATLAB实现SFA(Slow Feature Analysis,慢特征分析)算法
  • Java八股-Java优缺点,跨平台,jdk、jre、jvm关系,解释和编译
  • Java 微服务架构设计:服务拆分与服务发现的策略
  • 信息学奥赛一本通 1551:维护序列
  • 为什么在我的Flask里面有两个路由,但是在网页里有一个却不能正确访问到智能体
  • JDBC 核心执行流程详解
  • 如何在矩池云实例上开启应用服务的访问端口
  • 测试策略:AI模型接口的单元测试与稳定性测试
  • ADQ108-1通道8bit 6~7G USB2.0 PXIe cPCIe采集
  • 【大模型面试每日一题】Day 31:LoRA微调方法中低秩矩阵的秩r如何选取?
  • 解决matlab两个库文件名冲突的问题
  • 据传苹果将在WWDC上发布iOS 26 而不是iOS 19
  • 第一章 Linux的例行性工作(计划任务)
  • 大模型深度学习之双塔模型
  • 从 “金屋藏娇” 到 自然语言处理(NLP)
  • 汽车EPS系统的核心:驱动芯片的精准控制原理
  • 高校大数据采集平台产品特色