Contents ...
udn網路城邦
Arduino 按鈕按2秒 led閃爍5次
2025/01/13 21:01
瀏覽114
迴響0
推薦0
引用0
#include <avr/io.h>

#include <avr/interrupt.h>


const int buttonPin = 2; // 按鈕接腳

const int ledPin = 13;   // LED 接腳


volatile bool buttonLow = false;       // 記錄按鈕是否為 LOW 狀態

volatile unsigned long lowDuration = 0; // 記錄按鈕為 LOW 的時間

volatile unsigned long debounceTime = 0; // 去抖動時間計時


void setup() {

  pinMode(buttonPin, INPUT_PULLUP); // 設定按鈕為輸入,啟用內建上拉電阻

  pinMode(ledPin, OUTPUT);         // 設定 LED 為輸出

  digitalWrite(ledPin, LOW);       // 初始化 LED 為關閉


  // 停止 Timer1

  TCCR1A = 0;

  TCCR1B = 0;

  TCNT1 = 0;


  // 設定 Timer1 預分頻器為 1024

  TCCR1B |= (1 << CS12) | (1 << CS10);


  // 啟用 CTC 模式

  TCCR1B |= (1 << WGM12);


  // 設定比較值,每 1 毫秒觸發一次中斷 (16 MHz 主頻,預分頻 1024)

  OCR1A = 15;


  // 啟用 Timer Compare A 中斷

  TIMSK1 |= (1 << OCIE1A);


  // 啟用全局中斷

  sei();

}


void loop() {

  if (lowDuration >= 2000 && buttonLow) {

    // 如果按鈕為 LOW 狀態持續 2 秒,LED 閃爍

    for (int i = 0; i < 5; i++) { // 閃爍 5 次

      digitalWrite(ledPin, HIGH);

      delay(200);

      digitalWrite(ledPin, LOW);

      delay(200);

    }

    lowDuration = 0; // 重置計時

    buttonLow = false; // 重置狀態

  }


  // 去抖動處理,只有按鈕穩定為 LOW 一段時間才開始計時

  if (digitalRead(buttonPin) == LOW) {

    if (debounceTime == 0) {

      debounceTime = millis(); // 開始記錄去抖動時間

    }

    if (millis() - debounceTime > 50) { // 50ms 去抖動時間

      buttonLow = true; // 按鈕為 LOW 狀態

    }

  } else {

    buttonLow = false; // 按鈕恢復到非 LOW 狀態

    lowDuration = 0;   // 重置計時

    debounceTime = 0;  // 重置去抖動計時

  }

}


// Timer1 中斷服務例程,每 1 毫秒執行一次

ISR(TIMER1_COMPA_vect) {

  if (buttonLow) {

    lowDuration++; // 計算按鈕為 LOW 的時間

  }

}
全站分類:興趣嗜好 其他
自訂分類:Arduino
上一則: 超音波感測器 範例
下一則: atmega328 使用暫存器控制led方向

限會員,要發表迴響,請先登入