/*
* スマートごみ箱
*/
#include <Servo.h>
const int PIN_HCSR04_TRIG = 8;
const int PIN_HCSR04_ECHO = 7;
const int PIN_LED_GREEN = 4;
const int PIN_PIR = 3;
const int PIN_LED_RED = 10;
const int PIN_SERVO = 9;
Servo servo;
int pos = 0; // サーボモーターの角度
int state_led_red = LOW; // 赤色LEDの状態
void setup() {
pinMode(PIN_HCSR04_TRIG, OUTPUT);
pinMode(PIN_HCSR04_ECHO, INPUT);
pinMode(PIN_LED_GREEN, OUTPUT);
pinMode(PIN_PIR, INPUT);
pinMode(PIN_LED_RED, OUTPUT);
servo.attach(PIN_SERVO);
servo.write(0); // 初期値: ごみ箱の蓋を閉める
digitalWrite(PIN_LED_GREEN, LOW);
// 割り込み設定
// 引数1 → 割り込み番号
// 引数2 → 割り込み関数
// 引数3 → トリガーの種類(CHANGE: HIGH&LOWエッジトリガー)
attachInterrupt(1, trashbox_full_alert, CHANGE);
digitalWrite(PIN_LED_RED, LOW);
Serial.begin(115200);
}
void loop() {
// 手までの距離を計測
int distance_to_hand = measure_distance();
if (distance_to_hand < 10) // 10cm未満=手をかざしている
{
// 緑色LED点灯
digitalWrite(PIN_LED_GREEN, HIGH);
// ごみ箱の蓋オープン
for (pos = 0; pos <= 90; pos++)
{
servo.write(pos);
delay(15);
}
// 手をかざしている間は蓋が閉まらないようにする
do {
delay(3000); // 3秒間待つ
distance_to_hand = measure_distance();
} while (distance_to_hand < 10);
// 緑色LED消灯
digitalWrite(PIN_LED_GREEN, LOW);
// ごみ箱の蓋クローズ
for (pos = 90; pos >= 0; pos--)
{
servo.write(pos);
delay(15);
}
}
// 0.25秒間隔で動作
delay(250);
}
// 超音波距離センサー測定関数
// センサーに手をかざしたときごみ箱の蓋が開く
int measure_distance() {
// 測定開始トリガー
digitalWrite(PIN_HCSR04_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_HCSR04_TRIG, LOW);
// 測定した距離を取得
int distance = pulseIn(PIN_HCSR04_ECHO, HIGH);
int distance_cm = distance / 58;
Serial.print("距離[cm]: ");
Serial.println(distance_cm);
return distance_cm;
}
// PIRセンサー関数(割り込み)
// ごみが溜まっているか検知する
void trashbox_full_alert() {
Serial.print("割り込み発生!: ");
// 赤色LEDの状態を反転
state_led_red = !state_led_red;
digitalWrite(PIN_LED_RED, state_led_red);
Serial.println(state_led_red);
}