// 定义引脚
const int buttonPin = 9; // 按键连接的引脚
const int buttonPin2 = 5; // 按键连接的引脚
const int ledPin = 4; // LED连接的引脚
// 定义去抖动相关的变量
const int debounceDelay = 10000; // 去抖动延时(毫秒)
unsigned long lastDebounceTime = 0; // 上次去抖动检查的时间
bool lastButtonState = HIGH; // 上次读取的按键状态(初始化为未按下状态,因为使用了上拉电阻)
bool currentButtonState; // 当前读取的按键状态
// 初始化
void setup() {
// 设置引脚模式
pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入并启用内部上拉电阻
pinMode(buttonPin2, INPUT_PULLUP); // 将按键引脚设置为输入并启用内部上拉电阻
pinMode(ledPin, OUTPUT); // 将LED引脚设置为输出
// 初始化串口通信(可选,用于调试)
Serial.begin(9600);
Serial.println(digitalRead(buttonPin));
}
// 去抖动处理函数
bool debounceButton() {
// 获取当前时间
unsigned long currentTime = millis();
Serial.println(currentTime);
// 读取当前按键状态
int reading = digitalRead(buttonPin);
// 如果当前时间与上次去抖动检查的时间之差大于去抖动延时
if ((currentTime - lastDebounceTime) > debounceDelay) {
Serial.println(lastDebounceTime);
// 如果当前状态与上次状态不同,说明发生了状态变化
if (reading != lastButtonState) {
// 更新上次状态为当前状态
lastButtonState = reading;
// 更新上次去抖动检查的时间为当前时间
lastDebounceTime = currentTime;
// 返回当前按键状态(已去抖动)
return (reading == LOW); // 按键被按下时为LOW
}
}
// 如果没有发生状态变化,返回上次的稳定状态(虽然这里实际上不会用到这个返回值,因为函数会在状态变化时返回)
//return lastButtonState == LOW; // 但为了保持函数逻辑清晰,还是加上这一行
}
void loop() {
if(digitalRead(buttonPin2)==LOW)
{
delay(50);
Serial.println(debounceButton());
fun();
Serial.println("start");
}
delay(500);
}
void fun(){
Serial.println("wait");
// unsigned long currentTime = millis();//记录初始时间
// int reading = digitalRead(buttonPin);//记录读取状态
// do{
// // 如果当前时间与上次去抖动检查的时间之差大于去抖动延时
// if ((currentTime - lastDebounceTime) > debounceDelay) {
// // 如果当前状态与上次状态不同,说明发生了状态变化
// if (reading != lastButtonState) {
// // 更新上次状态为当前状态
// lastButtonState = reading;
// // 更新上次去抖动检查的时间为当前时间
// lastDebounceTime = currentTime;
// // 返回当前按键状态(已去抖动)
// return (reading == LOW); // 按键被按下时为LOW
// }
// }
// }while(reading==LOW);
while(digitalRead(buttonPin)==1){
delay(3000);
}
// 点亮LED
Serial.println("pass");
digitalWrite(ledPin, HIGH);
}