Introduction: Intelligent Music Restroom

Motivation 製作動機

上公共廁所時,總是覺得聲音很讓人害羞嗎?

總是覺得上大號很久很無趣,但滑手機又使人分心便秘? 等廁所時讓人不耐煩,滑手機怕被誤會偷拍? 糊塗如你有時忘記鎖門,造成春光外洩的尷尬? 音樂化妝室可以解決你的問題^^

門鎖特殊設計,利用磁鐵互斥,使門是常開狀態。當有人進入把門鎖上,就會啟動音樂,並搭配現有的LED顯示版“使用中”(參考湖口休息站廁所),讓自己確認門有上鎖,外面的人也能得知此間有人使用。

音樂部分是採用音軌模式,每間都有不同的音軌(ex:鼓聲、吉他、人聲…),當所有廁所都被佔用時,就能欣賞到一首完整音軌的歌曲。 音樂可以採用跟歌手合作,達到幫忙打廣告的效果,就不會有版權問題。

purpose 目的

(A)使用端:
1.廁所目前使用狀況(可使用/使用中/多次使用)

2.確保使用時,門確實鎖上(磁鐵)

3.音樂播放,放鬆身心

4.使用過久提醒

5.緊急按鈕

(B)監控端:
1.廁所目前使用狀況(可使用/使用中/需打掃)

2.使用者使用時間

3.廁所使用次數

4.緊急呼救提醒

5.廁所溫濕度管理(抽風機)

6.衛生紙剩餘狀況

Step 1: Prepare Module and Material 使用材料

以下為製作一間廁所需要用到的材料,若要做n間廁所則需n份使用者端的材料,但監控端若腳位足夠,則只需要一份。

(A)使用者端
麵包版 大 *1
杜邦線、單芯線 *數十條(公公 公母 母母 皆需)
雙色LED燈 *1
藍色LED燈 *1
220 ohm電阻 *6 (可以利用其他ohm的電阻代替)
Arduino Uno *1 (可以利用其他種類Arduino代替)
普通開關6mm x 6mm *1 (可用其他種開關替代)
限位開關(小) *1
DFPlayer MP3模組 *1
小喇叭 *1
雷切門板 (見附加檔案 door_template.dwg)
3D列印門軸 *4 (見附加檔案 door_pivot.prt)
門軸用長型螺絲 *2 、螺帽 *4

(B)監控端
麵包版 大 *1
杜邦線、單芯線 *數十條(公公 公母 母母 皆需)
220 ohm電阻 *6 (可以利用其他ohm的電阻代替)
Arduino Uno *1 (可以利用其他種類Arduino代替)
普通開關6mm x 6mm *2 (可用其他種開關替代)
筆電*1 (含Matlab)

Step 2: Wiring and Schematic 接線

附件PDF檔為清楚的接線圖

Step 3: Arduino Code for User Side

#include <SoftwareSerial.h><br>#include <DFPlayer_Mini_Mp3.h>
//defined Pins on Arduino
int LimSwiPin=4;//限位開關腳位
int GreenPin=5;//LED綠色腳位
int RedPin=6;//LED紅色腳位
int EmergPin=7;//緊急按鈕
int SwitchGive=12; //Give the limit switch message to the monitor
int EmergGive=13; //Give the Emergency switch message to the monitor
//defined variables
int SwitchTime; //counting how many times the Limit Switch been pressed
int UseCount; //counting how many times tthe toilet been used
int Emergency;
int loop_delay=250;
int Max_SwitchTime=60;
bool Toolong=0;  //the time that means too long is loop_delay*Max_SwitchTime(ms) 
SoftwareSerial music(2, 3); // RX, TX
void setup() {  
  Serial.begin (9600);
  music.begin (9600);
  mp3_set_serial (music); //set Serial for DFPlayer-mini mp3 module 
  delay(1);  //wait 1ms for mp3 module to set volume
  mp3_set_volume (0);  
    
  Serial.println("Program Start Here") ;
  pinMode(LimSwiPin, INPUT);
  pinMode(GreenPin, OUTPUT); 
  pinMode(RedPin, OUTPUT);   
  pinMode(SwitchGive, OUTPUT); 
  pinMode(EmergGive, OUTPUT); 
  mp3_reset ();
  mp3_stop();
  mp3_next();
  delay (200);
}
void loop() { 
  Serial.println();  
  mp3_play();  
  int switchStatus = digitalRead(LimSwiPin);  
  Emergency = digitalRead(EmergPin); 
  if(switchStatus==1){  
    SwitchTime++;
    digitalWrite(SwitchGive, 1);
  }
  else if(switchStatus==0){
    SwitchTime=0;
    digitalWrite(SwitchGive, 0);  
  }
  //Determine that the door is opened or closed or in danger
  if(SwitchTime<4 && Emergency==0 && Toolong==0){
    digitalWrite(GreenPin, 1); 
    digitalWrite(RedPin, 0);  
    digitalWrite(EmergGive, 0);
    mp3_set_volume (0);
    Serial.print("door open") ;     
  }  
   else if(SwitchTime>=4 && Emergency==0 && Toolong==0){
    digitalWrite(GreenPin, 0); 
    digitalWrite(RedPin, 1);        
    digitalWrite(EmergGive, 0); 
    mp3_set_volume (30);    
    Serial.print("door close") ;
  }  
  else if(Emergency==1||Toolong==1){
    digitalWrite(GreenPin, 0); 
    digitalWrite(RedPin, 1);   
    digitalWrite(EmergGive, 1);
    mp3_set_volume (21);
    Serial.println("Warning!!!");
    Serial.println("Warning!!!");
    Serial.println("Warning!!!");
    Serial.println();
    delay(100);
    digitalWrite(GreenPin, 0); 
    digitalWrite(RedPin, 0); 
  }
  //means using toilet too long
  if(SwitchTime>Max_SwitchTime){    
    Toolong=1;
    Serial.println("Toolong~Toolong~Toolong~");
  }   
  else
  Toolong=0;
  //counting for how many times the toilet been used
  if(SwitchTime==4){
    UseCount++;
  }   
    
  Serial.println();
  Serial.print("switchStatus=");
  Serial.println(switchStatus);
  Serial.print("SwitchTime=");
  Serial.println(SwitchTime);
  Serial.print("UseCount=");
  Serial.println(UseCount);
  Serial.print("Emergency=");
  Serial.println(Emergency); 
  delay(loop_delay);  
}

Step 4: Construct the Monitor System

Arduino可以連接到電腦,並使用不同的程式設計軟體進行互動,並且可以建立使用這操作介面已達成不同的需求,而我們選擇使用Matlab作為程式設計軟體。以下將分兩個部分介紹我們如何建立監控系統、使用這介面。

將Arduino連接到Matlab

若要將Arduino連接到Matlab,必須在Arduino灌上驅動程式,並且在Matlab安裝相關toolbox

(1)下載Arduino驅動程式(見附加檔按Arduino_matlab.zip)
檔案中read me.txt有介紹每一組arduino code可以與以matlab使用的功能,根據我們要的功能,打開pde資料夾中的adioes,並以Arduino IDE執行,上傳到Arduino中。

(2)安裝Arduino的toolbox到Matlab中
在Matlab的Home介面,點開add-ons,選擇get hardware support packages,並下載安裝Matlab Support Packages for Arduino,最後必須將.m與之後要打Matlab的主程式放在同一個資料夾。

(3)將Matlab與Arduino連接
將Arduino以USB線連接到電腦,並確認其連接序列埠,像我的是:/dev/cu.usbmodem1421(Ios linux windows名稱會不一樣),在Matlab中打入
a = arduino('/dev/cu.usbmodem1421') 即可連接
delete(instrfind({'Port'},{'/dev/cu.usbmodem1421'}))即可斷開連接
之後會將這兩個code寫在主程式,因此無需額外撰寫

在Matlab上以GUIDE建立監控系統

在Matlab上以gui介面建立使用這介面,是給予監控者(打掃人員)使用,並且利用與Arduino連接可以使用的input,output指令讀取資訊傳遞指令,詳細內容見read me.txt ,以下為Matlab code。

(見附加檔案intelligent_music_restroom.zip)

Step 5: Assembling the Model (組裝模型)

組裝方式見附圖

線路凌亂可使用吸管或熱縮套管使之整齊。
門把使用帳簿釘和墊片來固定在門上;門使用3D列印的門軸固定在隔間板上。
門把上加裝螺絲和螺帽為增重用,因為雷切門把重量比實際大小的門把輕很多,無法啟動限位開關。

需要幾間廁所模型,就用幾塊Arduino版,但監控端若腳位足夠,則只需要一塊。

SD卡內建議只放一個音檔,因為MP3模組不太穩定,可能會播出非指定的歌曲。

Step 6: Prototype Video