#include <LedControl.h>
LedControl lc = LedControl(11, 13, 10, 1);
const int trigA = 2, echoA = 3;
const int trigB = 4, echoB = 5;
const int threshold = 25;
const float distance_cm = 10.0;
unsigned long startTime = 0;
int state = 0;
// 字元點陣庫,索引 15 定義為 "+"
const byte font[16][8] = {
{0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00}, // 0
{0x10,0x30,0x50,0x10,0x10,0x10,0x7C,0x00}, // 1
{0x3C,0x42,0x02,0x3C,0x40,0x40,0x7E,0x00}, // 2
{0x3C,0x42,0x02,0x3C,0x02,0x42,0x3C,0x00}, // 3
{0x08,0x18,0x28,0x48,0x7E,0x08,0x08,0x00}, // 4
{0x7E,0x40,0x7C,0x02,0x02,0x42,0x3C,0x00}, // 5
{0x3C,0x40,0x7C,0x42,0x42,0x42,0x3C,0x00}, // 6
{0x7E,0x02,0x04,0x08,0x10,0x10,0x10,0x00}, // 7
{0x3C,0x42,0x42,0x3C,0x42,0x42,0x3C,0x00}, // 8
{0x3C,0x42,0x42,0x3E,0x02,0x42,0x3C,0x00}, // 9
{0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00}, // c (10)
{0x00,0x6C,0x92,0x92,0x82,0x82,0x82,0x00}, // m (11)
{0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x00}, // / (12)
{0x00,0x3C,0x40,0x38,0x04,0x44,0x38,0x00}, // s (13)
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // Space (14)
{0x00,0x18,0x18,0x7E,0x7E,0x18,0x18,0x00} // + Plus sign (15)
};
byte letterA[8] = {0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00};
byte letterB[8] = {0x7C,0x66,0x66,0x7C,0x66,0x66,0x7C,0x00};
void setup() {
lc.shutdown(0, false);
lc.setIntensity(0, 3);
lc.clearDisplay(0);
pinMode(trigA, OUTPUT); pinMode(echoA, INPUT);
pinMode(trigB, OUTPUT); pinMode(echoB, INPUT);
}
float getDistance(int trig, int echo) {
digitalWrite(trig, LOW); delayMicroseconds(2);
digitalWrite(trig, HIGH); delayMicroseconds(10);
digitalWrite(trig, LOW);
long duration = pulseIn(echo, HIGH, 15000);
if (duration <= 0) return 999;
return duration * 0.034 / 2;
}
void showStatic(byte pattern[]) {
for (int i = 0; i < 8; i++) lc.setRow(0, i, pattern[i]);
}
void loop() {
float dA = getDistance(trigA, echoA);
float dB = getDistance(trigB, echoB);
if (state == 0) {
showStatic(font[15]); // 無感應時顯示 + 號
if (dA < threshold) {
startTime = millis();
state = 1;
showStatic(letterA);
delay(100);
} else if (dB < threshold) {
startTime = millis();
state = 2;
showStatic(letterB);
delay(100);
}
}
else if (state == 1) {
if (dB < threshold) {
showStatic(letterB);
delay(400);
calculate(millis() - startTime);
}
}
else if (state == 2) {
if (dA < threshold) {
showStatic(letterA);
delay(400);
calculate(millis() - startTime);
}
}
}
void calculate(unsigned long timeDiff) {
if (timeDiff < 20) {
state = 0;
return;
}
float speed = distance_cm / (timeDiff / 1000.0);
// 每 2.3 cm/s 一格,最多 8 格
int bars = (int)(speed / 2.3);
if (bars > 8) bars = 8;
lc.clearDisplay(0);
// 畫長條圖 (bars 從下往上)
for (int i = 0; i < bars; i++) {
lc.setRow(0, 7 - i, 0xFF);
}
delay(1000); // 顯示一秒
state = 0;
lc.clearDisplay(0);
}
留言
張貼留言