#include <LedControl.h>
// HC-SR04 超音波感測器引腳定義
#define trigPin 9 // 觸發引腳
#define echoPin 8 // 回波引腳
// 8x8 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);
bool umbrellaShown = false; // 控制是否顯示小雨傘動畫
// 小雨傘動畫 (僅舉例展示幾個幀畫面)
byte umbrellaFrames[3][8] = {
{
0b00011000, // 第一行:雨傘頂部
0b00111100, // 第二行:雨傘向外展開的部分
0b01111110, // 第三行:雨傘的寬展範圍
0b11111111, // 第四行:雨傘的主體
0b10001001, // 第五行:雨傘支撐的基部
0b00001010, // 第六行:側邊裝飾
0b00101000, // 第七行:側邊裝飾
0b00011000 // 第八行:雨傘柄
},
{
0b00000000, // 第一行:雨傘頂部
0b00111100, // 第二行:雨傘向外展開的部分
0b01111110, // 第三行:雨傘的寬展範圍
0b11111111, // 第四行:雨傘的主體
0b00001000, // 第五行:雨傘支撐的基部
0b10001001, // 第六行:側邊裝飾
0b01101010, // 第七行:柄偏移位置
0b00011010 // 第八行:側邊裝飾
},
{
0b00011000, // 第一行:雨傘頂部
0b00111100, // 第二行:雨傘向外展開的部分
0b01111110, // 第三行:雨傘的寬展範圍
0b11111111, // 第四行:雨傘的主體
0b00001000, // 第五行:雨傘支撐的基部
0b00001000, // 第六行:側邊裝飾
0b00101000, // 第七行:柄偏移位置
0b10011010 // 第八行:側邊裝飾
}
};
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// 設置 LED 顯示模組
lc.shutdown(0, false);
lc.setIntensity(0, 8);
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");
// 偵測物體是否進入範圍 (假設小於 10cm 表示物體靠近)
if (distance > 2 && distance < 10) {
if (!umbrellaShown) {
showUmbrellaAnimation(); // 顯示小雨傘動畫
umbrellaShown = true;
Serial.println("Object detected! Showing umbrella.");
}
} else {
umbrellaShown = false; // 重置狀態
lc.clearDisplay(0); // 清除顯示
}
delay(200); // 避免過度偵測
}
// 顯示小雨傘動畫
void showUmbrellaAnimation() {
for (int frame = 0; frame < 3; frame++) {
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, umbrellaFrames[frame][row]);
}
delay(300); // 每幀停留 300 毫秒
}
}
留言
張貼留言