先安装Bounce2库 https://blog.csdn.net/hp150119/article/details/114358170 ,用来消抖,然后写一个按钮灯控,再加个时间记录和串口输出就可以了
#include <Bounce2.h>
int BUTTON_PIN = 2;//按钮连接的针脚
Bounce2::Button button = Bounce2::Button();//实例化一个抖动对象
int LED = 13; // 灯
int ledState = LOW;
int onTime=0;
void setup() {
pinMode(LED, OUTPUT);
digitalWrite(LED, ledState);
button.attach( BUTTON_PIN, INPUT_PULLUP); // 初试化按钮
button.interval(5); //间隔是5ms
Serial.begin(9600);//用于串口输出
}
void ledOn(){
ledState = HIGH;
digitalWrite(LED, ledState );
}
void ledOff(){
ledState = LOW;
digitalWrite(LED, ledState );
Serial.println("LED亮"+String(onTime/100)+"s"); // 计算输出亮灯时间
onTime=0;
}
void loop() {
button.update(); //更新
if(ledState==HIGH){
if(onTime>=1000)
ledOff();
else{
onTime++;
delay(10); // 10ms一个循环
}
}
if ( button.pressed() ) {
if(ledState==HIGH)
ledOff();
else
ledOn();
}
}
再来一个不掉库的消抖版本
int BUTTON_PIN = 2;//按钮连接的针脚
int bounce_time = 5; // 抖动时间
long last_time = millis();
int LED = 13; // 灯
int ledState = LOW;
int buttonClick = HIGH; // 按钮状态
long last_led_time = millis();
void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON_PIN,INPUT_PULLUP);
digitalWrite(LED, ledState);
Serial.begin(9600);//用于串口输出
}
void ledOn(long currentTime){
ledState = HIGH;
last_led_time = currentTime;
digitalWrite(LED, ledState );
}
void ledOff(long currentTime){
ledState = LOW;
digitalWrite(LED, ledState );
Serial.println("LED亮"+String((currentTime-last_led_time)/1000)+"s"); // 计算输出亮灯时间
}
bool getButton(long currentTime){
int reading = digitalRead(BUTTON_PIN);
if(reading==buttonClick)
last_time = currentTime;
if(currentTime-last_time>bounce_time){
buttonClick=reading;
if(reading==LOW)
return true;
}
return false;
}
void loop() {
long currentTime = millis();
if(ledState==HIGH){
if(currentTime-last_led_time>=10000)
ledOff(currentTime);
}
if ( getButton(currentTime) ) {
if(ledState==HIGH)
ledOff(currentTime);
else
ledOn(currentTime);
}
}