# 生活科技作品 DIY Arduino智慧型垃圾桶
## 程式碼
```cpp=
#include <Servo.h>
int TRIGGER_DISTANCE = 15; //定義小於幾公分距離時, 就要打開蓋子
int JudgeTimes = 6; //要判斷幾次距離才能決定使用者的意圖
boolean DOOR_OPENED = 0; //目前蓋子是打開的嗎?
#define trigPin 6
#define echoPin 7
#define trigPin2 10
#define echoPin2 11
//LED
#define ledBluePin A1
#define ledRedPin A3
#define ledYellowPin A2
Servo myservo;
void setup()
{
Serial.begin(9600);
pinMode (trigPin, OUTPUT);
pinMode (echoPin, INPUT);
pinMode (trigPin2, OUTPUT);
pinMode (echoPin2, INPUT);
pinMode (ledBluePin, OUTPUT);
pinMode (ledRedPin, OUTPUT);
pinMode (ledYellowPin, OUTPUT);
myservo.attach(9); // 連接數位腳位9,伺服馬達的訊號線
}
int distance(String deviceType) {
long cm;
if(deviceType=="Hand") {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
cm = pulseIn(echoPin, HIGH)/58;
}else{
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
cm = pulseIn(echoPin2, HIGH)/58;
Serial.print(cm); Serial.println(" cm");
}
return cm;
}
//設定垃圾桶的垃圾量顯示燈號
void setLEDStatus() {
if(TrashRed()==1) {
Serial.println("LED Red.");
digitalWrite(ledRedPin, HIGH);
digitalWrite(ledBluePin, LOW);
digitalWrite(ledYellowPin, LOW);
}else if(TrashYellow()==1) {
Serial.println("LED Yellow.");
digitalWrite(ledRedPin, LOW);
digitalWrite(ledBluePin, LOW);
digitalWrite(ledYellowPin, HIGH);
}else if(TrashBlue()==1) {
Serial.println("LED Blue.");
digitalWrite(ledRedPin, LOW);
digitalWrite(ledBluePin, HIGH);
digitalWrite(ledYellowPin, LOW);
}
}
//判斷垃圾量是否快滿
char TrashRed() {
int numTimer = 0;
for(int i = 0; i < JudgeTimes; i+=1){
if(distance("Trash")<=3) numTimer++;
}
if(numTimer>(JudgeTimes-2)) {
return 1;
}else{
return 0;
}
}
//判斷垃圾量是否半滿
char TrashYellow() {
int numTimer = 0;
for(int i = 0; i < JudgeTimes; i+=1){
if(distance("Trash")<=8 and distance("Trash")>3) numTimer++;
}
if(numTimer>(JudgeTimes-2)) {
return 1;
}else{
return 0;
}
}
//判斷垃圾量是否不多
char TrashBlue() {
int numTimer = 0;
for(int i = 0; i < JudgeTimes; i+=1){
if(distance("Trash")>8) numTimer++;
}
if(numTimer>(JudgeTimes-2)) {
return 1;
}else{
return 0;
}
}
//處理手接近時的動作
boolean handNear() {
int numTimer = 0;
for(int i = 0; i < JudgeTimes; i+=1){
if(distance("Hand")<TRIGGER_DISTANCE) numTimer++;
}
if(numTimer>(JudgeTimes-2)) {
return 1;
}else{
return 0;
}
}
//處理手移開時的動作
boolean handLeave() {
int numTimer = 0;
for(int i = 0; i < JudgeTimes; i+=1){
if(distance("Hand")>TRIGGER_DISTANCE) numTimer++;
}
if(numTimer>(JudgeTimes-2)) {
return 1;
}else{
return 0;
}
}
//關閉桶蓋的動作
void closeDoor(int numSpeed, int numDelay) {
for(int i = 0; i <= 90; i+=numSpeed){
myservo.write(i); // 使用write,傳入角度,從0度轉到180度
DOOR_OPENED = 0;
delay(numDelay);
}
}
//打開桶蓋的動作
void openDoor(int numSpeed, int numDelay) {
for(int i = 90; i >= 0; i-=numSpeed){
myservo.write(i);// 使用write,傳入角度,從180度轉到0度
DOOR_OPENED = 1;
delay(numDelay);
}
}
void loop()
{
//如果手還在垃圾筒上 (小於定義距離)
if(handNear()==1) {
openDoor(3, 10);
do{
delay(500);
//如果不在垃圾筒上了 (大於定義距離)
if(handLeave()==1) closeDoor(2,15);
} while (DOOR_OPENED==1);
}
setLEDStatus();
delay(500);
}
```