m0_73928344 2022-10-03 11:08 采纳率: 70%
浏览 67
已结题

arduino LED

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

img

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

img

  • 写回答

1条回答 默认 最新

  • WoodrowKing 2022-10-03 16:44
    关注

    先安装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);
      }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月12日
  • 已采纳回答 10月4日
  • 赞助了问题酬金15元 10月3日
  • 创建了问题 10月3日

悬赏问题

  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计