#include <HCSR04.h>
#include "pitch.h"
// LED接続端子
#define LED_NEAR 4 // 近い
#define LED_MID 6 // 中間
#define LED_FAR 8 // 遠い
const int distIndicator[] = {LED_NEAR, LED_MID, LED_FAR};
typedef struct { // 配列を関数の引数に使用するための型
int *array; // 配列のポインタ
int num; // 配列の要素数
} arrayInfo;
#define SPEAKER_PIN A0 // スピーカー接続端子
const int note[] = {DO_4, RE_4, MI_4, FA_4, SO_4, RA_4, SI_4, DO_5};
// 超音波センサーHCSR04端子
#define TRIG_PIN 2 // トリガー端子
#define ECHO_PIN 3 // エコー端子
#define BLOCK_LENGTH 40 // 1ブロックの長さ(cm)
#define measureDistTime 200 // 距離測定間隔 (ms)
// HCSR04のオブジェクト生成
UltraSonicDistanceSensor distSensor(TRIG_PIN, ECHO_PIN);
//----------------------------------------------------------------------------------
// 指定したインデックスのLEDだけ点灯させる
void setLedIdx(arrayInfo led, int idx, int value=HIGH, bool onlyOne=true) {
int reverseValue = (value == LOW) ? HIGH : LOW;
for(int i=0; i < led.num; i++) {
if(idx == i) {
digitalWrite(led.array[i], value);
}else{
if(onlyOne) {
digitalWrite(led.array[i], reverseValue);
}
}
}
}
void setDistIndicator(float distance) { // 距離をLEDと音で示す
arrayInfo led {distIndicator, sizeof(distIndicator)/sizeof(int)};
int block = distance / BLOCK_LENGTH;
if(distance > 0.0) { // 測定できた場合
if(block == 0 || block == 1) {
setLedIdx(led, 0);
tone(SPEAKER_PIN, note[0]);
}else if(block >= 2 && block <= sizeof(note)/sizeof(int)) {
setLedIdx(led, 1);
tone(SPEAKER_PIN, note[block-1]);
}else{
setLedIdx(led, 2);
noTone(SPEAKER_PIN);
}
}else{ // 測定できなかった場合
setLedIdx(led, -1, LOW); // 全LED点灯
noTone(SPEAKER_PIN);
}
}
//----------------------------------------------------------------------------------
void setup() {
// LED接続端子を出力制御にする
pinMode(LED_NEAR, OUTPUT);
pinMode(LED_MID, OUTPUT);
pinMode(LED_FAR, OUTPUT);
//シリアルモニタの初期化
Serial.begin(9600);
}
void loop() {
// 距離測定&シリアルモニタ表示
float distance = distSensor.measureDistanceCm();
Serial.println(distance);
setDistIndicator(distance);
delay(measureDistTime); // 時間待ち
}
//----------------------------------------------------------------------------------