2025年12月6日 星期六

ESP32 Control LED with Push button (ESP-IDF)

ESP32 Control LED with Push button (ESP-IDF)

源自於 https://esp32tutorials.com/esp32-push-button-esp-idf-digital-input/#more-168





#define LED_PIN         27
#define PUSH_BUTTON_PIN 33



 main.c

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"

#define LED_PIN         27
#define PUSH_BUTTON_PIN 33

// 使用一個靜態變數來追蹤按鈕的前一個狀態
static int last_pb_state = -1; // 初始化為 -1 確保程式碼一開始就會印出狀態

void app_main(void)
{
    // 配置 GPIO
    gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
    gpio_set_direction(PUSH_BUTTON_PIN, GPIO_MODE_INPUT);

    // 啟動時偵測並顯示初始狀態
    int current_pb_state = gpio_get_level(PUSH_BUTTON_PIN);
    last_pb_state = current_pb_state; // 儲存初始狀態

    // 啟動時,LED 狀態應與按鈕初始狀態一致
    gpio_set_level(LED_PIN, current_pb_state);
   
    // 透過序列埠顯示初始狀態
    if (current_pb_state == 1) {
        printf("啟動時按鈕狀態: High (已按下或上拉) \n");
    } else {
        printf("啟動時按鈕狀態: Low (未按下或下拉) \n");
    }

    // 主迴圈
    while(1) {
        current_pb_state = gpio_get_level(PUSH_BUTTON_PIN);

        // 偵測按鈕狀態是否改變
        if (current_pb_state != last_pb_state) {
            // 狀態已改變,透過序列埠印出新狀態
            if (current_pb_state == 1) {
                printf("按鈕狀態改變: High\n");
            } else {
                printf("按鈕狀態改變: Low\n");
            }

            // 更新 LED 狀態
            gpio_set_level(LED_PIN, current_pb_state);

            // 更新 last_pb_state 以追蹤新的狀態
            last_pb_state = current_pb_state;
        }
        // 如果狀態未改變,則不做任何事 (LED 狀態保持不變)

        vTaskDelay(pdMS_TO_TICKS(10)); // 延遲 10ms 進行消抖和降低 CPU 負載
    }
}


diagram.json

{
  "version": 1,
  "author": "alex wu",
  "editor": "wokwi",
  "parts": [
    { "type": "wokwi-breadboard-mini", "id": "bb1", "top": -59, "left": -184.8, "attrs": {} },
    {
      "type": "board-esp32-devkit-c-v4",
      "id": "esp",
      "top": -153.6,
      "left": 33.64,
      "attrs": { "builder": "esp-idf" }
    },
    {
      "type": "wokwi-pushbutton",
      "id": "btn1",
      "top": 44.6,
      "left": -240,
      "attrs": { "color": "green", "xray": "1" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r1",
      "top": 13.55,
      "left": -105.6,
      "attrs": { "value": "1000" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r2",
      "top": -24.85,
      "left": -105.6,
      "attrs": { "value": "1000" }
    },
    {
      "type": "wokwi-led",
      "id": "led1",
      "top": -70.8,
      "left": -130.6,
      "attrs": { "color": "red" }
    }
  ],
  "connections": [
    [ "esp:TX", "$serialMonitor:RX", "", [] ],
    [ "esp:RX", "$serialMonitor:TX", "", [] ],
    [ "esp:27", "bb1:14t.a", "green", [ "h-47.85", "v-19.2" ] ],
    [ "esp:GND.1", "bb1:7t.e", "black", [ "h-95.85", "v0", "h-57.6" ] ],
    [ "esp:GND.1", "bb1:14b.g", "black", [ "h-19.05", "v105.6" ] ],
    [ "r1:1", "bb1:8b.f", "", [ "$bb" ] ],
    [ "r1:2", "bb1:14b.f", "", [ "$bb" ] ],
    [ "r2:1", "bb1:8t.d", "", [ "$bb" ] ],
    [ "r2:2", "bb1:14t.d", "", [ "$bb" ] ],
    [ "led1:A", "bb1:8t.c", "", [ "$bb" ] ],
    [ "led1:C", "bb1:7t.c", "", [ "$bb" ] ],
    [ "esp:33", "bb1:8b.i", "violet", [ "h-38.25", "v105.6" ] ],
    [ "esp:3V3", "bb1:1b.f", "red", [ "h-239.85", "v28.8" ] ],
    [ "btn1:1.r", "bb1:1b.j", "", [ "$bb" ] ],
    [ "bb1:8b.j", "btn1:2.r", "green", [ "v28.8" ] ]
  ],
  "dependencies": {}
}


原來程式

#include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #define LED_PIN 27 #define PUSH_BUTTON_PIN 33 void app_main(void) { gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(PUSH_BUTTON_PIN, GPIO_MODE_INPUT); while(1) { if (gpio_get_level(PUSH_BUTTON_PIN) == 1) { gpio_set_level(LED_PIN, 1); } else { gpio_set_level(LED_PIN, 0); } vTaskDelay(1); } }


ESP-IDF GPIO APIs for Digital Input & Digital Output

#include "driver/gpio.h"


Set Direction of GPIO Pins

gpio_set_direction(GPIO_NUM_27, GPIO_MODE_OUTPUT);
gpio_set_direction(GPIO_NUM_33, GPIO_MODE_INPUT);

Set Output Level of Digital Pin

gpio_set_level(GPIO_NUM_27, 1);


Read Digital Input (Get Output Level of Input Pin)

int gpio_get_level(GPIO_NUM_33);




沒有留言:

張貼留言

8-QAM Signal 4 Phases 2 Amplitudes + 8PSK

 8-QAM Signal 4 Phases 2 Amplitudes + 8PSK import tkinter as tk from tkinter import messagebox import math import cmath # --- 8-QAM 參數設定 ---...