/*
使用情境:
這個系統模擬一個智慧型倒車雷達輔助系統(Smart Parking Assistant),可以安
裝在汽車的車尾,用來協助駕駛在倒車或停車時判斷與後方障礙物的距離。
功能介紹:
1.距離感測功能
2. OLED 即時顯示
3.LED 顏色提示
4.蜂鳴器聲音警示*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED 設定
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
bool OLEDStatus = true;
// 超音波腳位
const int trigPin = 5;
const int echoPin = 18;
// LED
const int greenLED = 23;
const int yellowLED = 32;
const int redLED = 25;
// 蜂鳴器
const int buzzer = 26;
long duration;
int distance;
void setup() {
Serial.begin(115200);
// 腳位設定
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(buzzer, OUTPUT);
if(!display.begin(SSD1306_SWITCHCAPVCC,0x3c)) { // 設定位址為 0x3c
Serial.println(F("SSD1306 allocation falled")); // F(字串):將字串儲存在fash並非在RAM
OLEDStatus = false; // 開啟OLED失敗
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
}
void loop() {
// 發送超音波
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 計算距離
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // cm
Serial.print("距離: ");
Serial.print(distance);
Serial.println(" cm");
// 顯示 OLED
display.clearDisplay();
display.setCursor(0, 0);
display.print("Dist: ");
display.print(distance);
display.println(" cm");
// LED 與蜂鳴器邏輯
if (distance > 80) {
digitalWrite(greenLED, HIGH);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, LOW);
noTone(buzzer);
display.println("Safe");
} else if (distance > 40) {
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, HIGH);
digitalWrite(redLED, LOW);
tone(buzzer,1000);
delay(distance*2.5);
noTone(buzzer);
display.println("Caution");
} else if (15<distance && distance <= 40) {
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, HIGH);
tone(buzzer, 1500);
delay(distance*2.5);
noTone(buzzer);
display.println("Warning");
} else {
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, HIGH);
tone(buzzer, 2000);
delay(distance*2.5);
noTone(buzzer);
display.println("Danger");
}
display.display();
delay(300); // 減少顫動
}
/*
void testdrawchar(void) {
display.clearDisplay(); // 清除緩衝區資料
display.setTextSize(1); // 設定文字尺寸為1,1:6x8,2:12x16,3:18x24...etc
display.setCursor(0, 0); // 設定起始點位置(0,0)
display.setTextColor(BLACK, WHITE); // 黑字白底
display.println("0.96 inch OLED") ; // 將"Hello"存入RAM
display.setCursor(0,16); // 設定起始點位置(0,16)
display.setTextSize(2); // 設定文字尺寸為2
display.setTextColor(WHITE); // 設定文字顏色為白色(亮點)
display.println("128 x 64"); // 將"Hello"存入RAM
display.setTextSize(3); // 設定文字尺寸為3
display.println("SSD1306"); // 將"Hello"存入RAM
display.display(); // 顯示所設定文字
}
*/