123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #include <stdio.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "driver/gpio.h"
- #include "driver/pwm.h"
- #define BUTTON_A_GPIO GPIO_NUM_5
- #define BUTTON_B_GPIO GPIO_NUM_6
- #define BUTTON_C_GPIO GPIO_NUM_7
- #define LED_GPIO GPIO_NUM_16
- #define PWM_CHANNEL PWM_CHANNEL_0
- #define PWM_FREQ 1000
- #define PWM_RES 100
- static bool led_on = false;
- static int led_brightness = 0;
- static void button_a_handler(void *arg) {
- int level = gpio_get_level(BUTTON_A_GPIO);
- if (level == 1) {
- led_brightness++;
- if (led_brightness > PWM_RES) {
- led_brightness = PWM_RES;
- }
- pwm_set_duty(PWM_CHANNEL, led_brightness);
- pwm_start();
- }
- else {
- vTaskDelay(500 / portTICK_RATE_MS);
- while (gpio_get_level(BUTTON_A_GPIO) == 0 && led_brightness > 0) {
- led_brightness--;
- pwm_set_duty(PWM_CHANNEL, led_brightness);
- pwm_start();
- vTaskDelay(500 / portTICK_RATE_MS);
- }
- }
- }
- static void button_b_handler(void *arg) {
- int level = gpio_get_level(BUTTON_B_GPIO);
- if (level == 1) {
- led_brightness--;
- if (led_brightness < 0) {
- led_brightness = 0;
- }
- pwm_set_duty(PWM_CHANNEL, led_brightness);
- pwm_start();
- }
- else {
- vTaskDelay(500 / portTICK_RATE_MS);
- while (gpio_get_level(BUTTON_B_GPIO) == 0 && led_brightness < PWM_RES) {
- led_brightness++;
- pwm_set_duty(PWM_CHANNEL, led_brightness);
- pwm_start();
- vTaskDelay(500 / portTICK_RATE_MS);
- }
- }
- }
- static void button_c_handler(void *arg) {
- int level = gpio_get_level(BUTTON_C_GPIO);
- if (level == 1) {
- led_on = !led_on;
- if (led_on) {
- pwm_set_duty(PWM_CHANNEL, led_brightness);
- pwm_start();
- }
- else {
- pwm_stop();
- }
- }
- }
- void app_main() {
- // 初始化GPIO
- gpio_pad_select_gpio(BUTTON_A_GPIO);
- gpio_set_direction(BUTTON_A_GPIO, GPIO_MODE_INPUT);
- gpio_set_pull_mode(BUTTON_A_GPIO, GPIO_PULLUP_ONLY);
- gpio_install_isr_service(0);
- gpio_isr_handler_add(BUTTON_A_GPIO, button_a_handler, NULL);
- gpio_pad_select_gpio(BUTTON_B_GPIO);
- gpio_set_direction(BUTTON_B_GPIO, GPIO_MODE_INPUT);
- gpio_set_pull_mode(BUTTON_B_GPIO, GPIO_PULLUP_ONLY);
- gpio_isr_handler_add(BUTTON_B_GPIO, button_b_handler, NULL);
- gpio_pad_select_gpio(BUTTON_C_GPIO);
- gpio_set_direction(BUTTON_C_GPIO, GPIO_MODE_INPUT);
- gpio_set_pull_mode(BUTTON_C_GPIO, GPIO_PULLUP_ONLY);
- gpio_isr_handler_add(BUTTON_C_GPIO, button_c_handler, NULL);
- gpio_pad_select_gpio(LED_GPIO);
- gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
- // 初始化PWM
- pwm_init(PWM_CHANNEL, NULL);
- pwm_set_freq(PWM_CHANNEL, PWM_FREQ);
- pwm_set_resolution(PWM_CHANNEL, PWM_RES);
- while (1) {
- vTaskDelay(
- portMAX_DELAY);
- }
- }
- //该程序使用了3个GPIO输入引脚和1个GPIO输出引脚,以及1个PWM通道。
- //
- //程序中定义了三个按钮的GPIO引脚,以及一个LED的GPIO引脚和PWM通道。然后在`app_main`函数中初始化GPIO和PWM,并创建三个GPIO中断处理函数分别处理三个按钮的按下和长按操作。
- //
- //对于按钮A和B,按下按钮时会逐步增加或减小LED的亮度,而长按按钮时,每500毫秒亮度会逐步减小或增加。对于按钮C,按下时切换LED的开和关。
- //
- //最后,在`app_main`函数中通过一个死循环让程序一直运行。
- //
- //请注意,本程序的实现可能与您的ESP32板的具体规格有关,需要根据您的板的规格进行调整。
|