#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include <sys/time.h> typedef enum {
KEY_SHORT_PRESS = 1,
KEY_LONG_PRESS =2,
} alink_key_t; #define GPIO_LED_IO 13
#define GPIO_LED_PIN_SEL 1ULL<<GPIO_LED_IO
#define GPIO_KEY_IO 14
#define GPIO_KEY_PIN_SEL 1ULL<<GPIO_KEY_IO static xQueueHandle gpio_evt_queue = NULL; //获取系统时间
static int64_t get_time(){
struct timeval tv_now;
gettimeofday(&tv_now, NULL);
int64_t time_us = (int64_t)tv_now.tv_sec * 1000000L + (int64_t)tv_now.tv_usec;
return time_us;
} //按键中断处理函数
static void IRAM_ATTR gpio_isr_handler(void* arg)
{
uint32_t gpio_num = (uint32_t) arg;
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
} //任务处理
static void led_task(void* arg)
{
uint32_t io_num;
BaseType_t press_key = pdFALSE;
BaseType_t lift_key = pdFALSE;
int backup_time = 0; for(;;) {
if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num)); //记录下用户按下按键的时间点
if (gpio_get_level(io_num) == 0) {
press_key = pdTRUE;
backup_time = get_time();
//如果当前GPIO口的电平已经记录为按下,则开始减去上次按下按键的时间点
} else if (press_key) {
//记录抬升时间点
lift_key = pdTRUE;
backup_time = get_time() - backup_time;
} //按下标志位和按键弹起标志位都为1时候
if (press_key & lift_key) {
press_key = pdFALSE;
lift_key = pdFALSE; //大于1秒为长按
if (backup_time > 1000000) {
printf("长按 ... \r\n");
//关闭LED灯
gpio_set_level(GPIO_LED_IO, 0);
} else {
printf("短按 ... \r\n");
//打开LED灯
gpio_set_level(GPIO_LED_IO, 1);
}
}
}
}
} void app_main(void)
{
//LED引脚配置
gpio_config_t io_conf;
io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pin_bit_mask = GPIO_LED_PIN_SEL;
io_conf.pull_down_en = 0;
io_conf.pull_up_en = 0;
gpio_config(&io_conf); //按键中断配置
io_conf.intr_type = GPIO_INTR_ANYEDGE;
io_conf.pin_bit_mask = GPIO_KEY_PIN_SEL;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pull_up_en = 1;
gpio_config(&io_conf); //创建消息队列处理引脚中断事件
gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
//创建任务
xTaskCreate(led_task, "led_task", 2048, NULL, 10, NULL); //第一个处理器核安装中断处理程序
gpio_install_isr_service(0);
//添加中断处理函数
gpio_isr_handler_add(GPIO_KEY_IO, gpio_isr_handler, (void*) GPIO_KEY_IO); printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size()); }

参考:https://gitee.com/EspressifSystems/esp-idf

长按短按控制LED灯-ESP32中断处理的更多相关文章

  1. 按键控制LED灯-ESP32中断处理

    #include <driver/gpio.h> #include <esp_task_wdt.h> #include <freertos/FreeRTOS.h> ...

  2. 云中树莓派(4):利用声音传感器控制Led灯

    云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...

  3. arduino 红外遥控器控制LED灯

    /* 日期:2016.9.1 功能:红外遥控器控制LED灯 开,关,闪烁,呼吸 元件: 跳线公公头 * 5 led 220欧电阻 红外接收管,红外遥控 接线: 红外灯面向自己从左到右分别接 IO3 , ...

  4. 嵌入式Linux学习入门:控制LED灯

    记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...

  5. arduino入门学习实现语音控制LED灯

    需要的准备的硬件arduino+PC+麦克风实现语音命令控制LED灯的亮灭. 首先需要将写好的arduino程序烧录到arduino uno主板中,下面是代码如下: int val;//定义变量val ...

  6. C#与Arduino通过串口通信来控制LED灯的状态

    一.引言 最近摆弄了一段时间的Arduino,发现Arduino做一些电子类项目.监控.机器人.电子玩具比较容易,并且Arduino与.NET程序集成也不难.接下来介绍一个简单的小程序,C#做的一个W ...

  7. BLE 安卓APP控制LED灯的实现(转)

    源:BLE 安卓APP控制LED灯的实现 //注:参考AmoMcu源代码修改. 打开APP,检查蓝牙是否打开 BluetoothAdapter mBluetoothAdapter; final Blu ...

  8. enc28J60 网页控制LED灯

    软件IDE:Arduino 1.6.3 1.库的安装: 从https://github.com/jcw/ethercard 下载源码包,解压,复制ethercard-master文件夹到Arduino ...

  9. 树莓派开机运行Python脚本 控制LED灯闪烁

    一.新建一个开机运行文件 在 /home/pi/.config 下创建一个文件夹,名称为 autostart,并在该文件夹下创建一个led.desktop文件(文件名以.desktop结尾) 编辑le ...

随机推荐

  1. C语言编程 菜鸟练习100题(41-50)

    [练习41]字符串翻转 0. 题目: 字符串翻转 1. 分析: 学习递归思想和方法. 2. 程序: 方法一: #include <stdio.h> void reverseSentence ...

  2. l初识CSRF(跨站请求伪造)

    一 CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常 ...

  3. Linux(CentOS7)下rpm安装MySQL8.0.16

    记录一下自己在 CentOS7 下 rpm 安装 MySQL8.0.16 的过程. 一.准备工作 1. 下载MySQL所需要的安装包 从 MySQL官网 下载,上传至 CentOS 系统 /usr/l ...

  4. 在gin框架中使用JWT

    在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么 ...

  5. grasshopper DataTree 树形数据以及Graft Flatten Simplify的理解

    问题的来源: 要在grasshopper里面输出 类似于二维数组的数据 但是在 grasshopper里的 C# 电池里面,无法显示 二维ArrayList里面的数据. 在 C# 电池里参考这个帖子: ...

  6. MindSpore应用目标

    MindSpore应用目标 以下将展示MindSpore近一年的高阶计划,会根据用户的反馈诉求,持续调整计划的优先级. 总体而言,会努力在以下几个方面不断改进. 1. 提供更多的预置模型支持. 2. ...

  7. 编译原理-DFA的化简(最小化)

    对于给定的DFA    M,寻找一个状态数比M小的DFA    M'使得L(M)=L(M') 1.状态的等价性: 假设s和t为M的两个状态 ①若分别从状态s和状态t出发都能读出某个字α而停止于终态,则 ...

  8. 作为一名双非本科毕业的Java程序员,我该如何在日益严重的内卷化中避免被裁?

    前言 对一个 Java 程序员而言,并发编程能否熟练掌握是判断他是不是优秀的重要标准之一.因为并发编程在 Java 语言中最为晦涩的知识点,它涉及内存.CPU.操作系统.编程语言等多方面的基础能力,更 ...

  9. 七、Nginx反向代理

    调度器调度后端服务器 : web高可用  负载均衡   解决web单点故障 部署后端服务器---配置Nginx服务器(定义集群.请求转发)---起服务.测试----配置集群池属性(权重.失败次数.失败 ...

  10. python学习笔记04-了解操作符与条件分支

    先来了解一下条件操作符: 运算符 描述 示例 == 检查两个操作数的值是否相等,如果是则条件变为真. 如a=3,b=3则(a == b) 为 true. != 检查两个操作数的值是否相等,如果值不相等 ...