ESP32 + ESP-IDF |GPIO 03 - 定时器轮询按钮的状态,控制LED亮或者灭
一、前言
前面两个章节使用了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亮或者灭相关推荐
- C# 定时器轮询 设计思路
[C#] 定时器设计过程的记录 在Windows 系统上 C# 常用定时器有三种,而最高进度的定时器误差 58ms 则个误差数字无法应用 16ms 级别的定时轮询,但还有另外的高精度定时器,这不是还有 ...
- python 定时器 ms_python 定时器,轮询定时器的示例
python 定时器默认定时器只执行一次,第一个参数单位S,几秒后执行 import threading def fun_timer(): print('Hello Timer!') timer = ...
- Vue定时器轮询 及 销毁定时器
项目中我们经常需要实现轮询 每隔几秒请求一次接口刷新数据 一般都会使用setInterval,但要注意单纯使用它可能导致页面卡死 原因是setInterval不会清除定时器队列,每重复执行1次都会导致 ...
- js setInterval+setTimeout定时器轮询+终止轮询
常见的轮询方式: window.timer = setInterval(()=>{this.promiseFun()},1000) 大家一般都会使用setInterval,但要注意单纯使用它可能 ...
- 创建订单轮询查看支付状态
const state = reactive({showPay:false,orderNo:'',aliyun:'',wechat:'' }) const handleCreateOrder = () ...
- 启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考
提示:启明智显专为智能产品提供一站式彩屏显示+连接+云端服务+APP软件开发.维护等解决方案,帮厂商快速实现硬件的智能化.作为启明云端旗下方案公司,我们用心整理了开发小伙伴在开发过程中可能会遇到的问题 ...
- 恒烁M0+系列CX32L003单片机定时器控制LED亮灭
定时器是单片机最重要的一个模块,有了定时器就可以做任何需要的功能. 本例采用通用定时器2来实现基本的定时功能--控制灯的亮灭,时间间隔设置成1S. 定时器需要设置2部分:初始化定时器.中断优先级.需要 ...
- 使用GPIO输出控制Led亮灭(CC2530)
1.实验目的: a.通过实验掌握CC2530芯片GOIP的配置方法 b.掌握Led驱动电路以及开光Led的原理 c.查看cc2530-datasheet.pdf手册查找各个寄存器的意思. 二.实验相关 ...
- Tiny4412裸机程序,按键检测(轮询方式)
由于前几天出差,博客没有更新,今天看了看Tiny4412的原理图,把按键扫描程序写了一下,用的是轮询方式,后面会有中断方式的实现,闲话少说,进入正题,程序由前一个实验Tiny4412之C语言实现流水灯 ...
最新文章
- 张杰和机器人_《80后脱口秀》吐槽高考 张杰化身“机器人”
- linux 用户和权限管理
- Ubuntu 进阶命令——长期不定时更新
- Android Studio 常用快捷键分类整理
- wsl子系统添加开机启动任务
- 使用PuTTY、Xshell远程连接Linux,密钥认证连接
- z-index的学习整理转述
- 想提高用户访问的响应速度和成功率还不赶快学习CDN
- 月薪7万,还想着赚“外快”,吃百万回扣, 这名大公司85后员工结局唏嘘
- 最土家乡话,莫过于栖霞
- mysql企业版安装_mysql企业版怎么安装图解
- idea设置Maven本地仓库
- HttpClient4.X 升级 入门 + http连接池使用
- 面试题:一个人走到岔道处,有2人,一人只说真话一人只说假话,只能问其中一人一个问题,怎么解决?
- 僵尸网络是什么;僵尸网络有什么特点
- 什么是DNS污染?DNS污染怎么办怎么解决?
- python txt文本转json格式
- Distiller tutorial: Pruning Filters Channels
- 求c语言学习的教程网站
- 计算机组成原理-机器数、浮点数
热门文章
- Laravel 的安装使用
- 如何在SQL Server数据库中加密数据
- 常见排序算法(比较排序)及比较
- Xamarin.Android开发实践(十四)
- StarkSoft题库管理系统(二)--生成word格式试卷
- Python下使用optparse模块实现对多个文件进行统计【二】
- 使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine
- HTML DOM教程 19-HTML DOM Button 对象
- 翻译 《Why Indy?》计划进度表
- 在众多编程语言中,你可知哪种语言的安全性更高,安全漏洞最少?