esp32两个按键控制三个呼吸灯的频率,上电后灯不亮,通过一个按键选择相应的灯,然后再通过另一个按键控制频率 c语言代码
时间: 2024-10-06 10:03:27 浏览: 47
ESP32平台使用GPIO模块来控制LED灯,并通过按键中断来切换灯的频率。首先,你需要设置三个GPIO口连接到呼吸灯,以及两个按键的中断处理函数。以下是一个基本的示例代码,假设我们已经配置了GPIO的输入输出模式:
```c
#include <driver/gpio.h>
#include <soc/dport_reg.h>
#define LED_1 GPIO_NUM_4 // 第一个LED的GPIO编号
#define LED_2 GPIO_NUM_5 // 第二个LED的GPIO编号
#define LED_3 GPIO_NUM_13 // 第三个LED的GPIO编号
#define KEY_1 GPIO_NUM_0 // 第一个按键的GPIO编号
#define KEY_2 GPIO_NUM_2 // 第二个按键的GPIO编号
// 定义灯的频率数组
const int freq[] = {1000, 500, 250}; // 频率值(毫秒)
void led_breath(int led_num, uint16_t freq_val) {
for (int i = 0; i <= freq_val; i++) {
gpio_set_level(led_num, HIGH);
delay_us(freq[freq_val]);
gpio_set_level(led_num, LOW);
}
}
void key_isr(int pin, void* arg) {
if (pin == KEY_1) {
// 切换灯光
switch ((int)arg) {
case 1:
led_breath(LED_1, freq[0]); // LED_1频率为1000ms
break;
case 2:
led_breath(LED_2, freq[0]); // LED_2频率同上
break;
case 3:
led_breath(LED_3, freq[0]); // LED_3频率同上
break;
}
} else if (pin == KEY_2) {
// 控制当前LED的频率
led_breath((int)arg, freq[0] + 1); // 增加100ms频率
}
}
void setup() {
// 初始化GPIO
gpio_matrix_inout(GPIO_ID_PIN(KEY_1), KEY_1, GPIO_MODE_INPUT_PULLUP, GPIO_INOUT_LOW);
gpio_matrix_inout(GPIO_ID_PIN(KEY_2), KEY_2, GPIO_MODE_INPUT_PULLUP, GPIO_INOUT_LOW);
// 设置按键中断
gpio_install_isr(GPIO_ID_PIN(KEY_1), NULL, key_isr, (void*)1); // 对于KEY_1,初始设置LED_1
gpio_install_isr(GPIO_ID_PIN(KEY_2), NULL, key_isr, (void*)2); // 对于KEY_2,增加频率
// 灯的初始化
gpio_set_mode(LED_1, GPIO_MODE_OUTPUT);
gpio_set_mode(LED_2, GPIO_MODE_OUTPUT);
gpio_set_mode(LED_3, GPIO_MODE_OUTPUT);
}
void loop() {
// 持续监听按键事件
while (1) {}
}
//
阅读全文