esp32s3一个按键按第一下点亮第一个灯按第二下点亮第二个灯按第三下点亮第三个灯
时间: 2024-11-09 21:29:53 浏览: 26
ESP32-S3是一款基于Espressif Systems的单片机,它集成了一颗强大的双核CPU和丰富的外设资源,常用于物联网(IoT)项目。要实现您描述的功能,即通过按键控制LED灯,通常可以按照以下步骤操作:
1. **硬件连接**:
- 将三个LED灯分别连接到ESP32-S3的GPIO输出口,如PD0、PD1和PD2。
- 连接一个按键到GPIO输入口,比如PD4作为按键检测。
2. **软件配置**:
- 使用Espressif的ESP-IDF框架编写程序。
- 创建中断服务函数(ISR),当按键按下时被触发。
- 利用`digitalWrite()`函数设置GPIO口的输出状态,控制LED灯亮灭。
```c
#include "esp_system.h"
#include "esp_event_loop.h"
#include "driver/gpio.h"
// 定义LED和按键的GPIO口
#define LED_0 GPIO_NUM_0
#define LED_1 GPIO_NUM_1
#define LED_2 GPIO_NUM_2
#define BUTTON_GPIO NUM_4
static int led_state[3] = {0}; // 存储每个LED的状态
void app_main() {
// 初始化GPIO口
gpio_config_t io_conf = {
.mode = GPIO_MODE_OUTPUT_PP, // 输出推挽模式
.pin_bitmask = (1 << LED_0) | (1 << LED_1) | (1 << LED_2), // 设置LED口位
.pull_down_en = true, // 上拉模式
};
gpio_set_mode(LED_0, io_conf.mode);
gpio_set_mode(LED_1, io_conf.mode);
gpio_set_mode(LED_2, io_conf.mode);
// 按键初始化为输入模式,带内部上拉
gpio_config_t button_io_conf = {
.mode = GPIO_MODE_INPUT,
.pull_up_down = GPIO_PULLUP_ENABLE,
};
gpio_set_mode(BUTTON_GPIO, button_io_conf.mode);
xTaskCreate(&led_control_task, "LedControl", 4096, NULL, 5, NULL); // 创建任务控制LED状态
// 开启事件循环等待中断
while (true) {
vTaskDelay(pdMS_TO_TICKS(1));
}
}
// 中断处理函数:按键按下后改变LED状态
static void handle_button_isr(void* arg) {
static bool pressed = false;
if (!pressed && gpio_get_level(BUTTON_GPIO)) { // 如果按键第一次按下
pressed = true;
for (int i = 0; i < 3; ++i) {
led_state[i] = i; // LED状态依次为0, 1, 2
}
ESP_LOGI(TAG, "Button pressed, changing LED state to %d", led_state[0]);
change_led_states();
} else {
pressed = false; // 非第一次按下,恢复初始状态
}
}
void change_led_states() {
for (int i = 0; i < 3; ++i) {
gpio_write(LED_i, led_state[i]); // 根据led_state数组更新LED状态
}
}
```
阅读全文