esp开发与应用(按键和状态机)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

人机交互的方式很多,有语音、有触摸屏、有按键。不过最经济的方法来说,还是按键。毕竟和其它方式相比,按键还是太便宜了。当然按键也有自己的一个小问题,那就是抖动。只要解决好了这个问题,按键就可以帮助我们解决很多事情。作为一个基础电路,按键的自身其实意义不大,它的存在就是可以帮助我们构建状态机,并且在这个状态机下面衍生出很多的软件功能。

1、按键和屏幕

如果不是特别好的屏幕,简单的spi屏幕价格也不是很贵。但它和按键搭配之后,就可以构建出各种状态,实现各种功能。这些功能可以是消费级的,可以是工业的,也可以是医疗的。

2、按键电路

大部分按键电路都是上拉电路。也就是如上面图片所示,按键没有按下去的时候,vcc透过电阻直连gpio口,这个时候gpio的输入都是1。等到按键按下去的时候,vcc通过电阻就直接泄压到gnd,而gnd直连到gpio,这个时候gpio的输入就是0。这就是按键的基本原理。

有人说,不要电阻行不行。按键没有按下去的时候,可能问题不大。但是一旦按键按下去,就短路了。

3、去抖的原理

去抖的原理其实比较简单,就是按键按下去的时候,别着急修改状态,而是记录当前状态改变时的起始时间。等到这个时间超过一定阈值的时候,我们就可以说当前按键被按下去,或者是松开了。

当然在等待超时的过程中,还有可能发生反转,没有关系,重新计时即可。

4、ai生成代码

了解了去抖的基本原理之后,我们其实可以自己写代码。当然想偷懒一点的话,就可以让ai帮助我们做到这一点。比如说,告诉ai,用esp32的d12口,写一个按键响应代码,中间注意防抖处理。不出意外的话,就可以得到下面这些内容,

复制代码
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"

// Button Configuration
#define BUTTON_GPIO     12          // D12 for button input
#define DEBOUNCE_DELAY  50          // Debounce delay in milliseconds

// Button state variables
static bool button_pressed = false;
static uint32_t last_debounce_time = 0;

/**
 * @brief Button debounce detection function
 * @return true if button is pressed (debounced), false otherwise
 */
bool button_is_pressed(void)
{
    bool current_state = gpio_get_level(BUTTON_GPIO) == 0;  // Active LOW
    uint32_t current_time = xTaskGetTickCount() * portTICK_PERIOD_MS;
    
    // Check if button state has changed
    if (current_state != button_pressed)
    {
        last_debounce_time = current_time;
        button_pressed = current_state;
    }
    
    // Return stable state after debounce delay
    if ((current_time - last_debounce_time) > DEBOUNCE_DELAY)
    {
        return button_pressed;
    }
    
    return false;
}

/**
 * @brief Button task - monitors button state with debounce
 */
void button_task(void *arg)
{
    // Configure GPIO pin for button
    gpio_config_t io_conf = {
        .pin_bit_mask = (1ULL << BUTTON_GPIO),
        .mode = GPIO_MODE_INPUT,
        .pull_up_en = GPIO_PULLUP_ENABLE,    // Enable internal pull-up resistor
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
        .intr_type = GPIO_INTR_DISABLE,      // No interrupt
    };
    gpio_config(&io_conf);

    printf("Button Detection Task Started\n");
    printf("Button GPIO: %d (D12)\n", BUTTON_GPIO);
    printf("Debounce Delay: %dms\n", DEBOUNCE_DELAY);
    printf("Button is Active LOW (press to trigger)\n\n");

    bool last_button_state = false;

    while (1)
    {
        bool current_button_state = button_is_pressed();
        
        // Detect button press event
        if (current_button_state && !last_button_state)
        {
            printf("Button Pressed!\n");
        }
        
        // Detect button release event
        if (!current_button_state && last_button_state)
        {
            printf("Button Released!\n");
        }
        
        last_button_state = current_button_state;
        
        // Small delay to reduce CPU usage
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
}

void app_main(void)
{
    printf("ESP32 Button Detection Demo with Debounce\n\n");

    // Start button detection task
    xTaskCreate(button_task, "button_task", 2048, NULL, 5, NULL);
}

5、测试和验证

老规矩,拿到代码之后,首先编译一下,看看能不能编译过。没有的话,就继续改进。接着,把编译好的image烧入到板子里面,观察结果是否符合预期。最后,就是需要自己分析一下这边的代码,看看有没有需要查漏补缺的地方,本身软件的完备性够不够。这样,基本的按键代码就做好了。

相关推荐
workflower几秒前
智能体-企业行政问答助手
人工智能·机器学习·机器人·云计算·无人机
武子康5 分钟前
Agent 的工具没变,SGLang 缓存为什么没命中?
人工智能·llm·agent
hyunbar7778 分钟前
LangChain 实战:Agent 4类结构化输出方式
人工智能
咖啡星人k11 分钟前
2026 可观测性实战:把观测契约写进SPEC,MonkeyCode 云端跑通
人工智能·机器学习
阿里云大数据AI技术11 分钟前
基于阿里云Milvus 知识库服务,快速搭建智能客服问答系统实践
人工智能·agent
RAOY的AI笔记13 分钟前
GPT-6 Astra开发指南:API调用、工具使用与AI Agent应用思路
大数据·人工智能·gpt
Code_Artist22 分钟前
从 Tool Calling 到能力编排:重新理解 Agent Skill 的运行机制——以 tRPC-Agent-Go 为例
人工智能·openai·agent
geneculture25 分钟前
融智学视域下的心灵哲学范式重审--行为主义、功能主义与中文屋论证的融智学对照分析 (高级科普 · 学术论文)
人工智能·信息科学·融智学的重要应用·哲学与科学统一性·融智时代(杂志)·心智哲学重审·中文屋论题
chuntian_tester28 分钟前
AI自动化第3步【用例设计】
人工智能·测试工具·ai·自动化
科技每日热闻31 分钟前
中国企业出海开展业务,如何挑选可安全合规使用国际大模型的云平台?Amazon Bedrock 在同一平台完成国际模型接入、区域选择与合规治理
大数据·人工智能·安全·ai