一、前言


前面两个章节使用了GPIO的输出功能,本章节介绍如何使用ESP32上GPIO的输入功能。

通过一个简单的实验来学习这个功能:

1、开启一个定时器(上一章节学习了),定时器以每100ms的周期来轮询gpio26的电平(按钮被按下 = 电平0,按钮没有被按下 = 电平1)。

2、当按钮被按下时,gpio27输出电平0,让led亮起来。当按钮没有被按下时,gpio27输出电平1,让led熄灭了。

实验视频:

ESP-IDF打印出来的信息:

这个实验的代码只是演示GPIO的输入功能,并不能用于实际项目上,在实际的项目上应该加上软件滤波的代码。

二、VSCODE + ESP-IDF


2.1、快速创建项目

按照第一章节的方式创建一个sample_project的模版。

2.2、选择串口通道,ESP芯片型号

还是按照第一章节的方式来选择串口通道与ESP芯片信号

三、电路



1、gpio26设置输出模式,当gpio26设置电平0时,led灯亮起来。反之,LED就熄灭了。
2、gpio27设置输入模式与设置上拉模式,当按钮按下时,gpio27被拉至电平0。反之,gpio27被内部电阻上拉至电平1。

四、代码


4.1、头文件


跟上一章节一样。

4.2、全局变量


增加一个变量buttom_state,用于保存按钮的状态。

4.3、app_main( )函数

  • 函数gpio_set_direction( )将gpio27设置为输入模式。
  • 函数gpio_set_pull_mode( )将gpio27设置为上拉模式。

4.4、定时器回调函数

  • 函数gpio_set_level( )获取gpio27的电平状态。

4.5、实验代码

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_timer.h"/* 定时器1回调函数 */
void timer1_Callback(void *arg);
/* 用于保存按钮的状态 */
uint16_t buttom_state = 0;  static const char *TAG = "a buttom contorl a LED";
static esp_timer_handle_t timer1_handler;  /* 定时器1的句柄 *//* 定时器1的参数 */
static esp_timer_create_args_t timer_Once_Obj = {.name = "Timer_NUM_1",          /* 定时器的名称 */.arg = NULL,                    /* 传递给回调函数的参数 */.callback = &timer1_Callback,   /* 回调函数 */
};void app_main(void)
{ESP_LOGI(TAG, "Example configured to blink GPIO LED!");/* 复位GPIO的状态 */gpio_reset_pin(26);gpio_reset_pin(27);/* 设置GPIO27为输入模式 */gpio_set_direction(27,GPIO_MODE_INPUT);/* 设置GPIO27为上拉模式 */gpio_set_pull_mode(27,GPIO_PULLUP_ONLY);/* 设置GPIO26为输出模式 */gpio_set_direction(26,GPIO_MODE_OUTPUT);/* 初始化定时器 */esp_timer_init(); /* 创建定时器1 */esp_timer_create(&timer_Once_Obj,&timer1_handler);/* 启动定时器1(周期性) */esp_timer_start_periodic(timer1_handler,100 * 1000);while(1){vTaskDelay(300 / portTICK_PERIOD_MS);   /* 延时300ms */}}/* 定时器1回调函数 */
void timer1_Callback(void *arg)
{buttom_state = gpio_get_level(27);   /* 获取gpio的电平状态,gpio=0时,表示按钮被按下,gpio=1时,表示按钮没有被按下 */ESP_LOGI(TAG, "the state of buttom is %d",buttom_state);/* 如果按钮被按下,LED亮起来 */if(0 == buttom_state)gpio_set_level(26,0);/* 否则LED熄灭 */elsegpio_set_level(26,1);    }

五、相关API


5.1、gpio_set_direction( )

5.2、gpio_set_pull_mode( )

5.3、gpio_get_level( )

ESP32 + ESP-IDF |GPIO 03 - 定时器轮询按钮的状态,控制LED亮或者灭相关推荐

  1. C# 定时器轮询 设计思路

    [C#] 定时器设计过程的记录 在Windows 系统上 C# 常用定时器有三种,而最高进度的定时器误差 58ms 则个误差数字无法应用 16ms 级别的定时轮询,但还有另外的高精度定时器,这不是还有 ...

  2. python 定时器 ms_python 定时器,轮询定时器的示例

    python 定时器默认定时器只执行一次,第一个参数单位S,几秒后执行 import threading def fun_timer(): print('Hello Timer!') timer = ...

  3. Vue定时器轮询 及 销毁定时器

    项目中我们经常需要实现轮询 每隔几秒请求一次接口刷新数据 一般都会使用setInterval,但要注意单纯使用它可能导致页面卡死 原因是setInterval不会清除定时器队列,每重复执行1次都会导致 ...

  4. js setInterval+setTimeout定时器轮询+终止轮询

    常见的轮询方式: window.timer = setInterval(()=>{this.promiseFun()},1000) 大家一般都会使用setInterval,但要注意单纯使用它可能 ...

  5. 创建订单轮询查看支付状态

    const state = reactive({showPay:false,orderNo:'',aliyun:'',wechat:'' }) const handleCreateOrder = () ...

  6. 启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考

    提示:启明智显专为智能产品提供一站式彩屏显示+连接+云端服务+APP软件开发.维护等解决方案,帮厂商快速实现硬件的智能化.作为启明云端旗下方案公司,我们用心整理了开发小伙伴在开发过程中可能会遇到的问题 ...

  7. 恒烁M0+系列CX32L003单片机定时器控制LED亮灭

    定时器是单片机最重要的一个模块,有了定时器就可以做任何需要的功能. 本例采用通用定时器2来实现基本的定时功能--控制灯的亮灭,时间间隔设置成1S. 定时器需要设置2部分:初始化定时器.中断优先级.需要 ...

  8. 使用GPIO输出控制Led亮灭(CC2530)

    1.实验目的: a.通过实验掌握CC2530芯片GOIP的配置方法 b.掌握Led驱动电路以及开光Led的原理 c.查看cc2530-datasheet.pdf手册查找各个寄存器的意思. 二.实验相关 ...

  9. Tiny4412裸机程序,按键检测(轮询方式)

    由于前几天出差,博客没有更新,今天看了看Tiny4412的原理图,把按键扫描程序写了一下,用的是轮询方式,后面会有中断方式的实现,闲话少说,进入正题,程序由前一个实验Tiny4412之C语言实现流水灯 ...

最新文章

  1. 张杰和机器人_《80后脱口秀》吐槽高考 张杰化身“机器人”
  2. linux 用户和权限管理
  3. Ubuntu 进阶命令——长期不定时更新
  4. Android Studio 常用快捷键分类整理
  5. wsl子系统添加开机启动任务
  6. 使用PuTTY、Xshell远程连接Linux,密钥认证连接
  7. z-index的学习整理转述
  8. 想提高用户访问的响应速度和成功率还不赶快学习CDN
  9. 月薪7万,还想着赚“外快”,吃百万回扣, 这名大公司85后员工结局唏嘘
  10. 最土家乡话,莫过于栖霞
  11. mysql企业版安装_mysql企业版怎么安装图解
  12. idea设置Maven本地仓库
  13. HttpClient4.X 升级 入门 + http连接池使用
  14. 面试题:一个人走到岔道处,有2人,一人只说真话一人只说假话,只能问其中一人一个问题,怎么解决?
  15. 僵尸网络是什么;僵尸网络有什么特点
  16. 什么是DNS污染?DNS污染怎么办怎么解决?
  17. python txt文本转json格式
  18. Distiller tutorial: Pruning Filters Channels
  19. 求c语言学习的教程网站
  20. 计算机组成原理-机器数、浮点数

热门文章

  1. Laravel 的安装使用
  2. 如何在SQL Server数据库中加密数据
  3. 常见排序算法(比较排序)及比较
  4. Xamarin.Android开发实践(十四)
  5. StarkSoft题库管理系统(二)--生成word格式试卷
  6. Python下使用optparse模块实现对多个文件进行统计【二】
  7. 使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine
  8. HTML DOM教程 19-HTML DOM Button 对象
  9. 翻译 《Why Indy?》计划进度表
  10. 在众多编程语言中,你可知哪种语言的安全性更高,安全漏洞最少?