arduino LED

问题遇到的现象和发生背景

img

用代码块功能插入代码,请勿粘贴截图
我想要达到的结果

img

先安装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);
  }
}