超音波感應播放小綠人動畫

 #include <LedControl.h>


// 超音波感測器引腳定義

#define trigPin 9   // Trig 引腳 (接 HC-SR04)

#define echoPin 8   // Echo 引腳 (接 HC-SR04)


// LED 顯示模組引腳定義

#define DATA_IN 5   // DIN

#define CLK_PIN 7   // CLK

#define LOAD_PIN 6  // CS


// 初始化 LedControl 物件

LedControl lc = LedControl(DATA_IN, CLK_PIN, LOAD_PIN, 1);


// 動作陣列:小綠人動畫 (8 個動作,每幀 8 行)

byte greenMan[8][8] = {

    {B00000000, B11010001, B11110111, B00111100, B00011000, B00000101, B00000011, B00000000}, // 動作1

    {B00000000, B11011011, B11110110, B00111100, B00011000, B00010100, B00001011, B00000000}, // 動作2

    {B00001000, B11010010, B11111010, B00111100, B00010100, B00010010, B00001011, B00000000}, // 動作3

    {B11001010, B11110010, B00111100, B00101000, B00100100, B00010010, B00000011, B00000000}, // 動作4

    {B11001001, B11110001, B00111111, B00011100, B00010100, B00001010, B00000111, B00000000}, // 動作5

    {B11001001, B11110011, B00111100, B00011100, B00010010, B00001011, B00000100, B00000000}, // 動作6

    {B11000000, B11111010, B00111101, B00011110, B00010011, B00001000, B00000000, B00000000}, // 動作7

    {B00000000, B11000000, B11110000, B00111110, B00011010, B00000111, B00000000, B00000000}  // 動作8

};


void setup() {

  Serial.begin(9600);         // 初始化串列監視器

  pinMode(trigPin, OUTPUT);   // 設定 Trig 引腳為輸出

  pinMode(echoPin, INPUT);    // 設定 Echo 引腳為輸入


  // 初始化 LED 顯示模組

  lc.shutdown(0, false);      // 啟用 LED 模組

  lc.setIntensity(0, 8);      // 設定亮度 (0-15)

  lc.clearDisplay(0);         // 清除顯示

}


void loop() {

  long duration, distance;


  // 觸發超音波感測器

  digitalWrite(trigPin, LOW);

  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);


  // 讀取回波時間並計算距離 (cm)

  duration = pulseIn(echoPin, HIGH);

  distance = duration * 0.034 / 2;


  Serial.print("Distance: ");

  Serial.print(distance);

  Serial.println(" cm");


  // 當物體進入範圍 (2 cm 到 10 cm),啟動小綠人動畫

  if (distance > 2 && distance < 10) {

    Serial.println("Object detected! Starting animation.");

    playAnimation(); // 播放小綠人動畫

  }


  delay(200);  // 避免過於頻繁的偵測

}


// 播放小綠人動畫

void playAnimation() {

  for (int frame = 0; frame < 8; frame++) { // 動作1到動作8

    for (int row = 0; row < 8; row++) {    // 每幀顯示 8 行

      lc.setRow(0, row, greenMan[frame][row]); // 設定行資料

    }

    delay(300); // 每幀顯示 300 毫秒

  }

  lc.clearDisplay(0); // 動畫結束後清空顯示

}


留言