gpt_esp32_控制gpio.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include <stdio.h>
  2. #include "freertos/FreeRTOS.h"
  3. #include "freertos/task.h"
  4. #include "driver/gpio.h"
  5. #include "driver/pwm.h"
  6. #define BUTTON_A_GPIO GPIO_NUM_5
  7. #define BUTTON_B_GPIO GPIO_NUM_6
  8. #define BUTTON_C_GPIO GPIO_NUM_7
  9. #define LED_GPIO GPIO_NUM_16
  10. #define PWM_CHANNEL PWM_CHANNEL_0
  11. #define PWM_FREQ 1000
  12. #define PWM_RES 100
  13. static bool led_on = false;
  14. static int led_brightness = 0;
  15. static void button_a_handler(void *arg) {
  16. int level = gpio_get_level(BUTTON_A_GPIO);
  17. if (level == 1) {
  18. led_brightness++;
  19. if (led_brightness > PWM_RES) {
  20. led_brightness = PWM_RES;
  21. }
  22. pwm_set_duty(PWM_CHANNEL, led_brightness);
  23. pwm_start();
  24. }
  25. else {
  26. vTaskDelay(500 / portTICK_RATE_MS);
  27. while (gpio_get_level(BUTTON_A_GPIO) == 0 && led_brightness > 0) {
  28. led_brightness--;
  29. pwm_set_duty(PWM_CHANNEL, led_brightness);
  30. pwm_start();
  31. vTaskDelay(500 / portTICK_RATE_MS);
  32. }
  33. }
  34. }
  35. static void button_b_handler(void *arg) {
  36. int level = gpio_get_level(BUTTON_B_GPIO);
  37. if (level == 1) {
  38. led_brightness--;
  39. if (led_brightness < 0) {
  40. led_brightness = 0;
  41. }
  42. pwm_set_duty(PWM_CHANNEL, led_brightness);
  43. pwm_start();
  44. }
  45. else {
  46. vTaskDelay(500 / portTICK_RATE_MS);
  47. while (gpio_get_level(BUTTON_B_GPIO) == 0 && led_brightness < PWM_RES) {
  48. led_brightness++;
  49. pwm_set_duty(PWM_CHANNEL, led_brightness);
  50. pwm_start();
  51. vTaskDelay(500 / portTICK_RATE_MS);
  52. }
  53. }
  54. }
  55. static void button_c_handler(void *arg) {
  56. int level = gpio_get_level(BUTTON_C_GPIO);
  57. if (level == 1) {
  58. led_on = !led_on;
  59. if (led_on) {
  60. pwm_set_duty(PWM_CHANNEL, led_brightness);
  61. pwm_start();
  62. }
  63. else {
  64. pwm_stop();
  65. }
  66. }
  67. }
  68. void app_main() {
  69. // 初始化GPIO
  70. gpio_pad_select_gpio(BUTTON_A_GPIO);
  71. gpio_set_direction(BUTTON_A_GPIO, GPIO_MODE_INPUT);
  72. gpio_set_pull_mode(BUTTON_A_GPIO, GPIO_PULLUP_ONLY);
  73. gpio_install_isr_service(0);
  74. gpio_isr_handler_add(BUTTON_A_GPIO, button_a_handler, NULL);
  75. gpio_pad_select_gpio(BUTTON_B_GPIO);
  76. gpio_set_direction(BUTTON_B_GPIO, GPIO_MODE_INPUT);
  77. gpio_set_pull_mode(BUTTON_B_GPIO, GPIO_PULLUP_ONLY);
  78. gpio_isr_handler_add(BUTTON_B_GPIO, button_b_handler, NULL);
  79. gpio_pad_select_gpio(BUTTON_C_GPIO);
  80. gpio_set_direction(BUTTON_C_GPIO, GPIO_MODE_INPUT);
  81. gpio_set_pull_mode(BUTTON_C_GPIO, GPIO_PULLUP_ONLY);
  82. gpio_isr_handler_add(BUTTON_C_GPIO, button_c_handler, NULL);
  83. gpio_pad_select_gpio(LED_GPIO);
  84. gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
  85. // 初始化PWM
  86. pwm_init(PWM_CHANNEL, NULL);
  87. pwm_set_freq(PWM_CHANNEL, PWM_FREQ);
  88. pwm_set_resolution(PWM_CHANNEL, PWM_RES);
  89. while (1) {
  90. vTaskDelay(
  91. portMAX_DELAY);
  92. }
  93. }
  94. //该程序使用了3个GPIO输入引脚和1个GPIO输出引脚,以及1个PWM通道。
  95. //
  96. //程序中定义了三个按钮的GPIO引脚,以及一个LED的GPIO引脚和PWM通道。然后在`app_main`函数中初始化GPIO和PWM,并创建三个GPIO中断处理函数分别处理三个按钮的按下和长按操作。
  97. //
  98. //对于按钮A和B,按下按钮时会逐步增加或减小LED的亮度,而长按按钮时,每500毫秒亮度会逐步减小或增加。对于按钮C,按下时切换LED的开和关。
  99. //
  100. //最后,在`app_main`函数中通过一个死循环让程序一直运行。
  101. //
  102. //请注意,本程序的实现可能与您的ESP32板的具体规格有关,需要根据您的板的规格进行调整。