Auto Tank: 透過自建雲端服務來監控魚缸 pH 及溫度

samuel0318

🏅🔰🔰
註冊時間
2018/05/28
文章
230
按讚
217
經驗點數
356
位置
新北土城
金幣
914
魚缸大小
2 呎底部過濾缸
系統類別
柏林+厚砂
生物種類
魚, LPS
前言

我使用兼容Arduino 的 ESP8266 板子,連結 pH 和溫度傳感器,經由 Wifi 連線, 將傳感器數據透過 MQTT 協議發佈到自建私有雲服務。 在雲上,使用Node-RED訂閱MQTT傳感器數據並將其存儲到InfluxDB數據庫。 Grafana用於顯示傳感器數據圖表,並且設定警報條件,若符合條件就會發 Slack 訊息通知。也可以用語音要求 Siri 回報魚缸的最新狀態。

系統架構圖
architect.png

成果

1.用語音要求 Siri 回報魚缸的最新狀態(謝謝齊大教學文)

2.Slack (手機或是電腦App) 接收到的通知

pH 低於 8.4 (測試用), 發通知
slack-ph-alert.png

pH 回到 8.4 以上, 通知狀態解除
slack-ph-OK.png


溫度告警,通知溫度低於 24度(測試用)
slack-temp-alert.png


3.雲端網頁(Grafana),可顯示 pH 以及溫度的歷史資料
- 由於 pH 值與燈光有很大的關係,所以在 pH 圖表上,白底表示主缸開燈,黑底表示藻缸開燈
- 在 temperature 圖表上,紅底表示白天(06:00),黑底表示晚上(18:00), 左側鋸齒狀表示那幾天天氣冷,加溫棒開始運作了。我還需要調整,目標是讓溫度變化低於1度 (或 0.5度)
- 可以加上自己的註解,如pH 圖表上的垂直藍線
- 可以在這裡設定警報條件
grafana_screenshot.png



準備項目及費用
以下是需要準備的項目
  1. NodeMcu 物聯網開發板 ESP8266 wifi模組 NT$205
  2. Analog pH Meter Pro Sensor (工業等級 pH 探針) NT$2,457
  3. 標準校正液20ml(ph7 + ph10) 迷你瓶 NT$84
  4. 2米防水探針型熱電偶溫度感測器 不銹鋼封裝 防水型 DS18b20溫度感測 NT$114
  5. 麵包板 NT$57
  6. 麵包板連接線 NT$48
  7. MicroUSB 以及 USB 插座:拿沒在用的,free

以上總共花費 NT$2,965, 主要是貴在這個 pH electrode 是工業等級比較貴,因為網頁上面寫著 "本pH計非常適合需要長期線上監測的場合”, 我就買了,但 pH electrode是消耗品,下次換便宜的試試。
這次DIY不強調手工藝,不需要焊接,只需插麵包板,也還沒有好看的外殼封裝, 目前還在規劃中
breadboard_prototype.jpg



自己動手做, But...
所需要的技能:
  1. Arduino 基本操作,會編寫程式碼更好
  2. MQTT 的運作原理, publish / subscribe
  3. Linux (Ubuntu) 的基本指令
  4. Docker, Swarm 的基本操作
  5. Node-Red 基本操作
  6. InfluxDB SQL 語法
技能可以不會,有熱情就可以(就自己Google, Youtube邊做邊學囉!)

Let’s Go!
Github 開放原始碼, 並且 README 會教如何設定。 為了國際化,我用英文寫文件 :)
https://github.com/samuelchiang/auto_tank
 
好讚,可以請問如何處理DS18b20 的防水的部分呢?

畢竟DS18b20 雖然防水但並不耐酸鹼

網路上有賣塑膠包覆的 DS18b20, 不過我覺得價格偏貴, 剛好手邊黏魚缸的矽利康還有,用來包覆金屬部分。國外也看過有人這樣用,
應該沒問題。
 
分享一下使用體驗,今天早上看到這張圖
PH84_191122093302_445aa.png

我猜測是昨天晚上快八點左右,下了班回家,在廚房煎牛排,廚房到魚缸所在的客廳,門沒關,窗戶只開一小縫,所以可以想像有大量的CO2溶解到魚缸內,造成 pH 值下降,溫度略升。
當然如果在客廳安裝個 CO2以及室溫Sensor,應該就可以佐證我的想法。
而紅色線表示已經低於 pH 8.3 了, 有發 Slack 通知我,那麼為什麼我早上才知道,那是因為昨天晚上手機被小孩拿去看影片了:ROFLMAO:
 
不知道你是否有試過測量鈣鎂鈉的 Sensor ,
之前有找過類似鈣離子計 不過太貴了 也不知道有沒有用
 
不知道你是否有試過測量鈣鎂鈉的 Sensor ,
之前有找過類似鈣離子計 不過太貴了 也不知道有沒有用

我沒試過,鈣鎂鈉的 Sensor 有連結嗎?
目前市面上的商用機種, 如 KHG, Apex Trident 是自動用滴定法比色計來判斷 KH, Ga, Ma 濃度,
可能是一種成本考量,也可能是商業考量 (可以賣藥水)
如果有價格合理的鈣鎂鈉的 Sensor, 那麼 KHG, Apex Trident 應該就沒有存在的空間

另外,我下個階段會是加上 EC Meter 來測量電導率->鹽度, 作為自動補淡水, 海水的依據。
 
https://www.vernier.com/products/sensors/ion-selective-electrodes/labquest-ise/ca-bta/
鈣離子計 還有NO3的 不過都買不下手

另外想問一下電導率換算鹽度公式是不是下面這樣子?

電導率和鹽度在0〜40℃之間的換算公式為:

若鹽度值(以NaCl計算)記為yNaCl(單位為PPm),電導率值記為x(單位為μs/ cm),當前水溫為t,則換算公式為:

yNaCl = 1.3888 * x-0.02478 * x * t-6171.9
 
最後編輯:
https://www.vernier.com/products/sensors/ion-selective-electrodes/labquest-ise/ca-bta/
鈣離子計 還有NO3的 不過都買不下手

另外想問一下電導率換算鹽度公式是不是下面這樣子?

電導率和鹽度在0〜40℃之間的換算公式為:

若鹽度值(以NaCl計算)記為yNaCl(單位為PPm),電導率值記為x(單位為μs/ cm),當前水溫為t,則換算公式為:

yNaCl = 1.3888 * x-0.02478 * x * t-6171.9
那個鈣離子probe的精確度是正負10%,在魚缸內不太合用,我記得以前好像有討論過類似的東西,不知道最近有沒有什麼新的產品。

鹽度的部分,我覺得能測到導電度也不錯了,一般魚缸溫度不太會變,導電度穩的話鹽度也飄不到哪裡去。
 
https://www.vernier.com/products/sensors/ion-selective-electrodes/labquest-ise/ca-bta/
鈣離子計 還有NO3的 不過都買不下手

另外想問一下電導率換算鹽度公式是不是下面這樣子?

電導率和鹽度在0〜40℃之間的換算公式為:

若鹽度值(以NaCl計算)記為yNaCl(單位為PPm),電導率值記為x(單位為μs/ cm),當前水溫為t,則換算公式為:

yNaCl = 1.3888 * x-0.02478 * x * t-6171.9

這個鈣離子計不能用,因為規格寫著 pH Range: 2 to 8, 而海水缸大多在 pH8.4

這個電導率換算鹽度公式看來合理,相關的參數 (1.3888, 0.02478, 6171.9) 需要根據 Calibration 的結果來決定
 
透過電話來通知魚缸溫度變化

最近看了一些魚友魚缸分享,發覺溫度失控是倒缸常見的原因之一,如何在第一時間就通知到人,很重要。上面的例子顯示即時訊息( Slack ) 通知還不夠,所以這邊提出透過打電話的方式來進行通知。


我採用 IFTTT「if this then that」 所提供的免費服務來串接,我的方式是 if this (Webhooks) then that (VoIP Calls),設定步驟如下:

  1. 註冊 IFTTT
  2. 點一下大頭照 > 按 Create > 按 +This > Choose a service > 搜尋 Webhooks > 點左邊藍色方塊 > Event Name 填入 “temperature_alarm” > Create trigger > 按 +That > 搜尋 VoIP Calls > 點左邊藍色方塊 > 輸入 Voice message (不支援中文) > Create action > Finish, 下圖是我的設定參考

    PH84_191127175344_d18e8.png


  3. Webhook, 點選 Documentation, {event} 請填入剛剛輸入的 Event Name “temperature_alarm”, 於是就可以利用 https://maker.ifttt.com/trigger/temperature_alarm/with/key/{your key} 來觸發 VoIP Call
  4. 手機安裝 IFTTT App (iOS) (Android), 這是用來收 VoIP Call 的
  5. 在你自己的 Grafana Dashboard > Alerting > Notiifcation channels > New channel, type 選 webhook, Url 就是步驟3的 Webhooks, 如下圖所示, 點選 Send Test 就可以看手機 App 有沒有收到電話通知

    PH84_191127175344_65e9c.png
  6. 最後在 Grafana Dashboard, temperature > edit > Add Alert > Condition 選擇 27 以上 or 23 以下, Notifications 選擇 Send to 步驟5 的 channel name, 即完成設定
    PH84_191127175344_f739a.png

備註:
注意到 iOS 有個新功能, 會卸載未使用的App, 如果 IFTTT 一但被卸載了就無法收到電話通知,所以可以把這個功能關掉
iOS 「設定」→「iTunes與App Store」畫面上,將"卸載未使用的App”關閉
 
溢水偵測器

動機

最近開始發現魚缸底部積水,這讓我很洩氣,因為底缸是我自己黏的,換缸是件大工程,但左看右看,又查不出來,所以才有想要做一個溢水偵測器,即時電話通知,讓我馬上檢查哪裡有問題。

硬體
PH84_191228232157_62541.jpg

黑線接的是 3.3V, 白線接 A0
//For Wemos D1 mini, A0 is Analog input, max 3.3V input, no pull-up

Arduino
Source code

電線不導通, A0 會收到 2~3 很低的數值
電線短路, A0 會收到 最高 1024 的數值
電線插到水中, A0 高於 300 便開始發送 MQTT (Topic: event/WaterDetector) 到雲端的 MQTT Broker

Node-Red
Subscriber MQTT (Topic: event/WaterDetector), 一旦收到, 就會發送 IFTTT Webhook, 這會驅動 IFTTT 發出 VoIP Call, 打電話到手機端, 說明魚缸淹水了, 趕快處理. ( IFTTT 的 VoIP Call, 在前一篇文章有解釋)
如果最後一個 MQTT 發送後 60 秒沒有再收到, 警報移除, 不另外通知
PH84_191228232157_eec04.png


Grafana
PH84_191228232157_70b9f.png

透過MQTT發送的數值會存在 InfluxDB, 透過 Grafana 做追蹤
但不採用 Grafana 內部的 Alert 機制, 是因為 Grafana 只能 polling database 來確認, 通知上會有延遲,大約20秒才會通知
而在 Node-Red 一收到 MQTT 就馬上通知是最即時的, 兩秒內就收到電話了

心得
  1. 板子還沒弄好就找到問題,是補水桶出水處橡膠鬆脫,還好不是魚缸漏水
  2. 這個溢水偵測器要用一個Analog Port, 我下一個想要做的電導率也要用一個 Analog Port, 但不管是 NodeMCU 或是 Wemos 都只有一個 Analog Port, 溢水偵測單獨就占用一個板子感覺有點浪費, 所以專案告一段落,未來會用在 ESP32上
  1. 可以加上電源控制設備, 即時把該關的關一關 (到底有哪些要關呢?主馬?蛋白?)

參考
簡易的Arduino溢水偵測器
 
幫我的水草缸好友設計的感測盒
用來紀錄淡水缸的 pH 值、水溫、TDS 以及室內溫濕度
Server 採用同樣的架構,供各位參考。

PH84_200731135344_75087.jpg


PH84_200731135345_1f5bd.jpg


PH84_200731135345_ab91d.png


值得一提的是,TDS主要是量電壓,透過三次方程式以及溫度補償把電壓轉換為TDS (總溶解固體, 單位為 ppm)
那麼?這跟我想要用 EC 電導率來測量海水鹽度有何不同,我的論點是"可以"但"不可行"。
"可以"的意思是我測到我的海水缸大約在 600 ppm 左右,理論上可以對照光學鹽度計而得出鹽度值
"不可行"的理由是,這個 TDS 探頭是金屬的,不確定材質,雖然採用交流信號,可有效防止探頭極化,但在海水中難免有腐蝕的疑慮,而這點 Gravity EC 就採用玻璃包鉑黑電極,可以試試看。

在這邊想請教有 Apex 系統的朋友,你的 APEX CONDUCTIVITY/SALINITY PROBE 如何防止海水腐蝕?
 
返回
上方 下方