#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); // 動畫結束後清空顯示
}
留言
張貼留言