ESP-IDF代码片段


开关按一下亮起,然后再按 一下关闭,消抖

c++
#include "Arduino.h"

int LED_PIN = 1; // LED灯引脚
int BUTTON_PIN = 4; // 按钮引脚

// 运行态变量
bool g_ledOn = false;                      // LED 当前状态(false=灭,true=亮)
int g_lastStableBtn = 0;                   // 上一次稳定的按钮电平
int g_lastReading = 0;                     // 最近一次读取到的按钮电平
unsigned long g_lastDebounceMs = 0;        // 最近一次电平变化的时间戳
const unsigned long DEBOUNCE_DELAY_MS = 30; // 防抖时间窗口(毫秒)

// 初始化阶段(推荐把 pinMode 放在这里)
void setup() { 
  pinMode(LED_PIN, OUTPUT);                     // 设置 LED 为输出
  pinMode(BUTTON_PIN, INPUT_PULLDOWN);          // 若按钮接 3.3V,使用下拉输入;若按钮接地请改 INPUT_PULLUP
  Serial.begin(115200);                               // 串口调试
  Serial.println("串口启动成功");             // 启动提示

  // LED 初始熄灭
  digitalWrite(LED_PIN, 0); // 初始关灯

  // 读取一次当前按钮电平,作为初始稳定状态
  int initial = digitalRead(BUTTON_PIN);
  g_lastStableBtn = initial;
  g_lastReading = initial;
}

// 循环阶段,Arduino 会自动调用这个函数
void loop() {
  // 读取原始电平(下拉输入:未按=0,按下=1)
  int reading = digitalRead(BUTTON_PIN);

  // 若瞬时读数变化,记录时间用于防抖
  if (reading != g_lastReading) {
    g_lastDebounceMs = millis(); // 变化时间戳
    g_lastReading = reading;     // 更新最近读数
  }

  // 超过防抖窗口后,认为电平已稳定
  if ((millis() - g_lastDebounceMs) > DEBOUNCE_DELAY_MS) {
    // 电平与上次稳定状态不同 -> 出现一个稳定的边沿
    if (reading != g_lastStableBtn) {
      g_lastStableBtn = reading; // 更新稳定电平

      // 采用"释放触发":按下(1) -> 松开(0) 作为一次有效按键
      if (reading == 0) { // 释放边沿(从 1 稳定到 0)
        g_ledOn = !g_ledOn;                               // 切换 LED 状态
        digitalWrite(LED_PIN, g_ledOn ? 1 : 0);           // 同步输出
      }
    }
  }

  delay(1); // 让出时间片,喂狗,避免长时间占用导致 WDT 触发
}

呼吸灯

c++
#include "Arduino.h"

// 定义LED引脚,宏定义常量模式
#define LED_PIN  1

// 初始化阶段(推荐把 pinMode 放在这里)
void setup() { 
  // 设置LED引脚为输出模式
  pinMode(LED_PIN, OUTPUT);
}

// 循环阶段,Arduino 会自动调用这个函数
void loop() {
  // 实现渐亮
  for(int i = 0; i < 256; i++) {
    analogWrite(LED_PIN, i);
    delay(10);
  }
  // 实现渐灭
  for(int i = 255; i >= 0; i--) {
    analogWrite(LED_PIN, i);
    delay(10);
  }
}