超音波感應顯示雨傘動畫

 


#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 毫秒

  }

}

留言