开关按一下亮起,然后再按 一下关闭,消抖
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);
}
}