簡易的Arduino溢水偵測器

  • IMG_4614
  • IMG_4612
  • IMG_4663

Description

Description

作者:Andrew Lin

專案緣起

這是最近跟友人聊天時,意外想到而做的一個小專案。我一個朋友在科技公司附設的咖啡吧工作。吧檯的工作區域大概就如下圖這樣,一邊是水槽和一些器具,另一邊是需要處理食材、煮熟食的區域。

S__7479346

水槽旁邊有一台熱水機,它的水龍頭是非常簡單的拉柄裝置,把塑膠拉柄往上扳,就會一直出熱水,直到手動將開關往下扳才會停水。因為店內只有老闆一個人,在忙碌的午餐時段裡,常常為了省時間,老闆會用多工的方式工作: 先在水龍頭下放個量杯,把開關打開,然後轉身先去做其他的餐點,等到 “感覺" 水快滿的時候,再轉身停水。但常常會因為忘記關水而讓熱水溢出量杯,灑了整個工作檯都是熱水。

S__7479345

思考問題

目睹幾次後我有點看不下去,就思考有什麼方式可以解決這個問題?最好的方式應該就是改裝那台熱水機,加上控制系統讓它能做到每次按壓一次就出固定量的熱水。但是我不是很想動到原始的設備本體,對義務幫忙來說,要花的時間和成本也過大。

也曾想過在量杯上動手腳,讓它可以偵測到滿水的水位,然後做出一些反應,例如簡單地發出聲響。但是我觀察老闆出餐的時候,那個量杯很常拿來拿去的,有時候還需要沖洗。那表示若要在量杯上做手腳,就不能讓原本的使用習慣感到礙手礙腳,甚至可能還要處理防水的問題。

後來我就提議,因為熱水機就在洗碗槽的旁邊,不如先用個淺盆當底,做為當溢水發生時的緩衝區,可以挖個洞接水管排到水槽裡。雖然還是會滿出量杯,但不會搞得整個檯面都是水。然後我再設計一個簡單的裝置通知 “已經發生溢水"。

以義務幫忙來說,這應該會是個比較合乎時間成本的方式,先求有再求好吧!

實作原理

我馬上想到的就是土壤溼度感測器的原理。我打算從 Arduino Analog Pin 接出一條線,啟用該 Pin 的內部 pull-up 電阻,這樣就可以省一顆電阻。然後用那根導線與從 GND 接出來的導線來偵測溢水。測試時只要同時將他們接觸到水面,然後觀察 Arduino 能否偵測到電壓的變化,如果可以的話,只要在程式碼裡設定一個閥值,低於這個電壓閥值就讓蜂鳴器發出聲響,這樣我的簡易溢水偵測系統就完成了。

準備材料

  1. Arduino Nano (原因是它有 usb port 而且比 micro 便宜 :p)
  2. 單芯線
  3. 微型可變電阻
  4. 小塑膠盒
  5. 小磁鐵 x4
  6. 洞洞板
  7. 焊接/切割器具

成本:不含工具應該 $250TWD 左右可以搞定
時間:寫程式 & 測試原型 10min + 移植到洞洞板 & 後續外觀處理 5hr (其實看個人,我手很笨 = =)

原型測試

接線的部分很簡單,我都不好意思畫圖了。

Untitled Sketch_bb

一個小改變是多了一個微型的可變電阻,原因是我在測試的時候發現,直接將兩個導線碰觸水面,跟碰觸沾濕的面紙,得到的數據是有點差距的。當時就想雖然說以老闆的用途來說,那個閥值應該固定就好,但是反正還有這麼多接腳可以用,而且再多一顆微型可變電阻就可以自己設定閥值,或許讓應用範圍更廣一點,why not?

程式的部分如下:簡單的說就是從 A0 讀取電壓變化,跟 A7 的可變電阻設定值做比較。若比閥值低就驅使 Pin 4 的蜂鳴器發出聲響(目前僅發出很無聊的 Do Re Mi Fa),以及直接使用內建的 Pin 13 LED 做反應。

const int WaterDetPin = A0;
const int ThdCtlPin = A7; // threshold
const int LEDPin = 13;
const int BuzzerPin = 4;

int duration = 200; // 200 miliseconds

#define DO 264
#define RE 297
#define MI 330
#define FA 352

int melody[] = {
DO, RE, MI, FA
};

void setup() {
Serial.begin(9600);
pinMode(LEDPin, OUTPUT);
pinMode(WaterDetPin, INPUT_PULLUP);
digitalWrite(LEDPin, LOW);
}

void checkStateChange() {
int waterState = analogRead(WaterDetPin);
int sensVal = analogRead(ThdCtlPin);
Serial.print(waterState);
Serial.print(“/");
Serial.println(sensVal);

if (waterState < sensVal) {
digitalWrite(LEDPin, HIGH);
for (int thisNote = 0; thisNote < 4; thisNote++) {
tone(BuzzerPin, melody[thisNote], duration);
delay(300);
}
} else {
digitalWrite(LEDPin, LOW);
}
}

void loop() {
checkStateChange();
delay(1000);
}

IMG_4605

包裝原型

確定原型可以運作之後,剩下的工作就是純手工了。把洞洞板鋸成你想要的大小,然後把所需要的元件都焊接上去,最後再通通塞進小塑膠盒即可。當然還需要挖洞讓導線、蜂鳴器、主電源線可以接出塑膠盒。

如果沒有尺寸的問題,通常我都會在洞洞板上再焊上幾個腳座。塑膠盒內的東西都盡量做到可以插拔,這樣可以保留升級和除錯的彈性 (雖然可能根本沒有那一天 XD)。

IMG_4606IMG_4611

IMG_4612IMG_4614

微調 & 上線

為了要容易安裝、移除,我打算在塑膠盒上黏上四顆小磁鐵。再將整個盒子吸附在熱水機的機身上。結果發現它竟然無法吸附磁鐵! 老闆說他之前買了一個後面有磁鐵的計時器,原本想吸在上面,最後發現它竟然不能吸附磁鐵。

於是我去公司的廢料區找了一片電路板屏蔽罩,背後貼上一片裁切薄薄的發泡棉。然後用膠帶固定在熱水機上,這樣就可以吸附感測器了。會做這個的原因是將來若不需要用感測器了。那個區塊也可以用來吸附計時器用。

IMG_4628IMG_4631

發泡棉是從路由器的包裝盒裡面找到的。原本在想怎樣才能裁切得整齊,後來想到以前在網路上看過的一個標記等高度的做法。就是把刀片夾在書本的翻頁內,就可以用同樣的高度簡單裁切。(不過嘗試後覺得有點難施力 XD)

最後,把所有的東西都放上去,導線尾端插入一小塊泡棉中 (避免他們互相接觸),再垂放在塑膠淺盆中就完成啦。

IMG_4663

後記 & 感想

比較深刻的感想是,我認為其實 “撰寫程式" 在整件事情看來是相對不重要的。根據實際應用的環境調整,在合理的資源花費下能夠 “先求有" 或許才重要吧。

另外在測試水的時候,突然想到以前書上都說鹽水的導電性比較高。我覺得這個方式或許可以用來當作自然科學的教具,測試不同液體的導電性。

其實這個系統有個問題,當偵測器響的時候,表示熱水已經滿出量杯了。那為什麼不把導線伸入量杯中呢? 因為那是要煮食物的,總覺得把實習用的導線跟食用的熱水接觸不太好,或許之後再找看看有沒有其他適合的材質。後來有個 FB 朋友給我看了一個叫做 “公道杯" 的東西,或許也可以用別的方式尋求 “再求好" 的可能。

如果各位有什麼想法或是發現錯誤的地方,煩請不吝指教。

請點看 Demo 影片:

Contact

Contact
  • Category
    Arduino, Safety, Smart Home, Smart Kitchen
  • Location
    No Location
  • Tags
    Arduino, Arduino Nano

您的姓名 〈需填寫〉

您的電子郵件信箱 〈需填寫〉

主旨

您的信件內容