Auto Tank: 傻瓜滴定機

三、硬體設計

傻瓜滴定機的硬體接線圖如下所示:
PH84_210501004104_e495f.png

  • DC Motor
    • 考量到預算、經驗以及需求,我使用的是便宜的蠕動泵,一顆不到台幣百元,這是由12V 的 DC 馬達和蠕動頭組成,用三顆可以分別控制 Ca, Mg, KH 的滴定。
    • 經過實測,精密度是 1 ml,符合需求,若未來有更精密的控制,可以改用步進馬達(但最近在研究TMC2209驅動器晶片, 發覺這並不是簡單)。
  • L293D
    • 這三顆 DC Motor 用兩個 L293D 來驅動, L293D 是一顆雙路直流馬達的控制器,用兩顆 L293D 最多可以控制四顆馬達,目前只使用三路。
    • PH84_210501004104_be51d.png
  • ESP32
    • 比Arduino多了WiFi,也比ESP8266有更豐富的pin腳, 當然是用它
    • 使用 PWM 訊號來控制 L293D
    • 使用 WIFI 進行網路連線, 在沒有WIFI連線時為AP模式,可以用手機連上之後進行網路及相關參數設定,設定完之後可變成station模式以WiFi連結上網。(WiFi Manager Library)
    • 使用MQTT協議與Auto Tank溝通
    • 控制指令 - 傻瓜模式,只透過MQTT接受一個move_pump指令,參數如下
      • pumpNumber: 指定馬達
      • orientation: 正轉或是倒轉
      • dutyCycle: PWM 的占空比,0%到100%的數字,太低的話馬達不會動,太高的話馬達會有點大聲,我會固定使用 78%

        PH84_210501004104_019f9.png
      • duration: 運轉時間
  • 電源
    • 12V DC 供電給 L293D 的馬達電源端
    • 12V DC 供電給 LM2596,降壓為 5V DC 後,供電給 ESP32 以及 L293D 的邏輯IC電源
 
四、軟體設計
  • 這裡的軟體功能,如二、系統架構所示,都是指中控 Auto Tank 端的軟體介面,我把「智能」的部分放在 Auto Tank,所以蠕動幫浦那端就真的是很「傻瓜」地接收指令並且執行
  • 手動滴定及校正
    • PH84_210503153444_9f34e.png

      可指定時間控制,可正轉,可逆轉,方便手動校正或是安裝時的手動操作。
      經過校正之後,可獲得運轉時間和滴定容積之間的關係,於是滴定多少ml的需求,可以在 Auto Tank 端轉換為運轉時間,傳給滴定機執行。也可以容積控制,要滴多少就滴多少。因為是 DC 馬達,經過實測,精密度是 1 ml。不高但是夠用。
  • 滴定設定
    • PH84_210503152229_3d9d4.png
    • 魚缸水量:可用於 ppm 與劑量的計算
    • 目標濃度:用於計算達到目標的日期及滴定量,達成目標值之後,可轉換為維持濃度的滴定速率
    • 滴定桶
      • 滴定液容積:添加滴定液之後設定這個值,並且會根據實際使用量扣除,容量不足時發 Line 告警訊息
        PH84_210503152306_6d3fa.png


      • 滴定液濃度:用於計算滴定量
    • 滴定量
      • 預設滴定量:第一次使用時,在量測數據不足的情況下,使用預設的滴定量
      • 調整速度:當滴定濃度不足的情況下,追趕至目標濃度所需天數,若設定太短,則濃度變化太快,若設定太長,則調整過慢。我使用 7 天。

  • 量測輸入與計畫產生
    • 在測量 Ca, Mg, KH 之後,在這個表單輸入濃度,按下‘紀錄’ 按鈕之後,會隨之產生計畫,濃度若不足,會用追趕模式(我用 7 天)去追趕至目標值,濃度若超過,則會暫停滴定。達到目標值之後,會使用前兩次量測所得的濃度平衡滴定量來進行滴定,維持濃度在目標值。若無前兩次數據,則用預設值進行滴定。
    • 下圖顯示兩次量測所產生的計畫
      PH84_210503152448_a93f1.png


    • 濃度若超過,則會暫停滴定,達到目標值之後再繼續滴定。
      PH84_210503152448_e702f.png
  • 平衡滴定速率歷史紀錄
    • 平衡滴定速率也相當於元素消耗速率,每次測量數值之後,可以得出此數值並且做歷史紀錄
      PH84_210503152645_dcb57.png

  • 滴定歷史紀錄
    • 分別顯示 Ca, Mg, KH 的實際滴定紀錄
      PH84_210503152848_81298.png

  • 異常通知
    • 滴定無回應通知或滴定失敗通知: 若是滴定指令送出後一分鐘沒有收到回應,即顯示 Line 訊息通知
      PH84_210503152944_2cef3.png

  • 維護提醒
    • 到達平衡通知
      PH84_210503153021_38c9b.png


    • 滴定桶補充提醒
      PH84_210503152306_6d3fa.png
    • DC馬達校正提醒
      • 在每個月的第一個星期日早上八點,通知要校正馬達
        PH84_210503153138_3c80e.png

 
五、滴定計畫產生原理

1. 沒有歷史數據的計算
在傻瓜滴定機上線後,要做的第一件事情就是把濃度調整到目標值。假設所測得的濃度為 D0, 目標值是De, 預計在 7 天數內把濃度拉到目標值,要怎麼計算 Plan [(Now, R0),(Te, Re)] ? R0 是馬上要執行的滴定速率,Te 則是到達濃度的時間,Re 是到達 Te 之後要執行的滴定速率。
答案是真的很直覺

如果 D0 < De 濃度低於目標
=> R0 = (De-D0)/7
=> Te = 七天後
=> Re = 自己輸入的滴定速度

如果 D0 > De 濃度高於目標
=> 只記錄濃度,然後不滴定
那麼這樣做有什麼好處?當然有,你已經開始在紀錄濃度,下次再量測時就可以用來計算元素消耗速度,並且在七天內把濃度拉到目標值附近。

2. 例行量測的計畫產生原理
上面提到,我是把 7 天當作是追趕模式,七天之後就會改為平衡模式,兩者滴定速率不同,如果兩次量測的時間是在七天內,那麼我把這段時間內,元素的消耗速度當作是一個常數,元素的滴定速度當然也是個常數,用線性的計算可以得到
元素的消耗速率 Re = (D0 + R0*dT - D1) / dT
D0 是上一次量測濃度
R0 是上一次滴定速度
dT 是兩次量測的時間長度
D1 是實際測量的濃度
如果元素不消耗,從上一次量測到 D0 開始以 R0 的速率滴定 dT 時間,到本次量測時的濃度應為 D0 + R0*dT
但實際濃度為 D1,所以元素的平衡消耗速率應該為
Re = (D0 + R0*dT - D1) / dT

如果 D1 < De 濃度低於目標
=> 追趕模式
=> 馬上要執行的滴定速率 R1 = Re + (De-D1)/7 (元素平衡消耗速度+追趕速度)
=> 到達平衡的時間 Te 就是七天後

PH84_210514161756_da899.png



如果 D1 > De 濃度高過目標
=> 暫時不作為
=> 馬上要執行的滴定速率 R1 = 0 (不滴定直到元素消耗到目標值)
=> 到達平衡的時間 (D1-De)/Re 這段時間之後

PH84_210514161756_b9afe.png


所以可求得 Plan [(Now, R1),(Te, Re)]

3.如果說這次測量的時間已經過了七天平衡期之後了,計算原理雷同,只不過要再多處理一段線性,這裏我就不多做解釋了,直接上公式

已知 (T0, D0, R0), (T1, D1, R1), (T2, D2), De => T0為上一次的量測時間,T1為上一次預估的平衡時間,T1 跟 D1 都是猜測的不是實際測量,所以要把 T0, D0 納入考量,T2為目前時刻,要求得 Plan [(T2, R2),(Te, Re)] 該怎麼計算?
dT0 = T1-T0
dT1 = T2-T1
Re = (D0+R0*dT0+R1*dT1-D2)/(dT0 + dT1)
R2 和 Te 的計算方式同 2.
所以可求得 Plan [(NOW, R2),(Te, Re)]


PS. 我一直很猶豫要不要寫這一段,但願沒有讓讀者們昏頭....
 
五、滴定計畫產生原理

1. 沒有歷史數據的計算
在傻瓜滴定機上線後,要做的第一件事情就是把濃度調整到目標值。假設所測得的濃度為 D0, 目標值是De, 預計在 7 天數內把濃度拉到目標值,要怎麼計算 Plan [(Now, R0),(Te, Re)] ? R0 是馬上要執行的滴定速率,Te 則是到達濃度的時間,Re 是到達 Te 之後要執行的滴定速率。
答案是真的很直覺

如果 D0 < De 濃度低於目標
=> R0 = (De-D0)/7
=> Te = 七天後
=> Re = 自己輸入的滴定速度

如果 D0 > De 濃度高於目標
=> 只記錄濃度,然後不滴定
那麼這樣做有什麼好處?當然有,你已經開始在紀錄濃度,下次再量測時就可以用來計算元素消耗速度,並且在七天內把濃度拉到目標值附近。

2. 例行量測的計畫產生原理
上面提到,我是把 7 天當作是追趕模式,七天之後就會改為平衡模式,兩者滴定速率不同,如果兩次量測的時間是在七天內,那麼我把這段時間內,元素的消耗速度當作是一個常數,元素的滴定速度當然也是個常數,用線性的計算可以得到
元素的消耗速率 Re = (D0 + R0*dT - D1) / dT
D0 是上一次量測濃度
R0 是上一次滴定速度
dT 是兩次量測的時間長度
D1 是實際測量的濃度
如果元素不消耗,從上一次量測到 D0 開始以 R0 的速率滴定 dT 時間,到本次量測時的濃度應為 D0 + R0*dT
但實際濃度為 D1,所以元素的平衡消耗速率應該為
Re = (D0 + R0*dT - D1) / dT

如果 D1 < De 濃度低於目標
=> 追趕模式
=> 馬上要執行的滴定速率 R1 = Re + (De-D1)/7 (元素平衡消耗速度+追趕速度)
=> 到達平衡的時間 Te 就是七天後

PH84_210514161756_da899.png



如果 D1 > De 濃度高過目標
=> 暫時不作為
=> 馬上要執行的滴定速率 R1 = 0 (不滴定直到元素消耗到目標值)
=> 到達平衡的時間 (D1-De)/Re 這段時間之後

PH84_210514161756_b9afe.png


所以可求得 Plan [(Now, R1),(Te, Re)]

3.如果說這次測量的時間已經過了七天平衡期之後了,計算原理雷同,只不過要再多處理一段線性,這裏我就不多做解釋了,直接上公式

已知 (T0, D0, R0), (T1, D1, R1), (T2, D2), De => T0為上一次的量測時間,T1為上一次預估的平衡時間,T1 跟 D1 都是猜測的不是實際測量,所以要把 T0, D0 納入考量,T2為目前時刻,要求得 Plan [(T2, R2),(Te, Re)] 該怎麼計算?
dT0 = T1-T0
dT1 = T2-T1
Re = (D0+R0*dT0+R1*dT1-D2)/(dT0 + dT1)
R2 和 Te 的計算方式同 2.
所以可求得 Plan [(NOW, R2),(Te, Re)]


PS. 我一直很猶豫要不要寫這一段,但願沒有讓讀者們昏頭....
太強了
已昏頭 @_@
 
六、滴定量換算原理

上一篇說明了如何決定滴定速率(Rate) ppm/day
那麼,這一篇來說說要如何換算為每日滴定量 (Dosing_Volume) ml/day?

舉例來說
Ca -> 一天要補 2 ppm
150L 的水量來說,一天要補充的 Ca 為 150*1000*2/1000000=0.3g Ca
Ca 分子量:40.08
CaCl2 分子量:110.98
0.3g Ca 相當於多少無水氯化鈣 => 0.3/40.08*110.98= 0.84g CaCl2
0.84g CaCl2 相當於多少氯化鈣滴定液,如果是 5% 的濃度 => 0.84 / 5% = 16.61 ml
16.61 ml 就是一天要滴定的份量

所以依此推算公式

滴定 CaCl2
CaCl2_Constant = 0.272
Ca_Dosing_Volume (ml/day) = CaCl2_Constant * TankVolume * Rate / Ca_percent

滴定 MgCl2.6H2O
MgCl2_6H2O_Constant = 0.836
Mg_Dosing_Volume (ml/day) = MgCl2_6H2O_Constant * TankVolume * Rate / Mg_percent

滴定 NaHCO3
NaHCO3_Constant = 3 (因為每 1L 提升 1dKH 需要 NaHCO3 0.03 g)
KH_Dosing_Volume (ml/day) = NaHCO3_Constant *TankVolume * Rate / KH_percent

參數說明
TankVolume (L):魚缸水量
Rate (for Ca, Mg is ppm/day, for KH is dKH/day) :滴定速率
Ca_percent (%) 0~100 :Ca 滴定液濃度
Mg_percent (%) 0~100:Mg 滴定液濃度
KH_percent (%) 0~100:KH 滴定液濃度

ps. 這就是 App “魚缸小幫手”背後的運算原理喔!
 
七、自動排程原理

上一篇說明了如何決定每日滴定量 ml/day
這一篇來說說如何排程去執行滴定量

說到排程,做軟體的一定會想到 Linux 的 cron, 在 Node-Red 裡面,則是有對應的 cronplus 節點可以使用。Cron 的用途一般來說,就是指定年、月、日、時、分、秒,想指定特定的時間、指定星期幾,或是指定每小時 X 分都啟動一次,也可以!
更方便的是,如果把經緯度給輸入進去,配合正確網路校正時間,你可以指定日出、正中午、日落時間來執行想要做的事情。

但我只用簡單的功能,就是每小時 0 分,去查詢 Ca 的每日滴定量,若為 A ml/day, 因為滴定泵的精度只到 1 ml, 所以將 A 區分為四類
  • 24 < A
    • 分成 24 等分,每小時滴定
  • 12 < A < 24
    • 分成 4 等分,每天 0, 6, 12, 18時做一次
  • 6 < A < 12
    • 分成 2 等分,每天 0, 12 時做一次
  • A < 6
    • 每天 0 時一次滴定全部的劑量

Mg 和 KH 處理方式一樣,只是 Ca 排程是在每小時 0 分, Mg 排程是在每小時 20 分, KH 排程是在每小時 40 分
 
八、PCB Layout!

PH84_210525155453_8977f.jpg


從硬體電路的學習開始用麵包板,再來是洞洞板,也想要找個適合的作品切入學習 PCB 設計
對!就是現在!於是人生的第一次:PCB 設計成就解鎖
由於都是從網路上自學,眾多 Youtuber 所介紹的就是 EasyEDA + JLCPCB 這一套 ecosystem
那就來試試看吧!
  1. 使用EasyEDA
    1. 先畫原理圖 Schematics (當然也可以跳過此步驟,但這個步驟其實對於導出 PCB Layout 幫助很大)
      PH84_210525155606_93a71.jpg
    2. 導出後設計PCB Layout
      PH84_210525155750_03cfc.png


      PH84_210525155751_2a54c.png


    3. PCB 2D 預覽
      PH84_210525155652_430cf.png


      PH84_210525155652_2b29d.png
    4. PCB 3D 預覽
      PH84_210525155829_0055b.png
  2. 在 EasyEDA 下單到 JLPCB 製造,第一次有優惠,打版費比運費還便宜...
    PH84_210525155857_cba6a.png
過幾天就可以拿到板子了,但疫情關係,移動受限,手邊暫時沒有 L293D,擺上大部分的零件看看感覺,成就感滿滿!
PH84_210525155918_3f7d4.jpg
 
九、滴定管排空校正
一直以來發現 KH 一直無法達到目標,而我的軟體內紀錄了滴定桶的溶液剩餘容量,執行滴定後會自動扣除,只剩 20% 時會發警告,完全沒了也會警告。但我實際觀察,滴定液沒有想像中的少。另外就是手動執行少量滴定,比如說 1 ml 時,可以看得出來,沒有半滴流出來,因為可以看得出來滴定管內已經空了,我猜已經是流光光了。
這系統原本就是依賴滴定管內隨時都充滿滴定液,需要多少滴多少,看來改善措施有兩個方式:
  1. 在滴定管的尾端安裝限流器,有點像是我們使用 Safari 檢測劑 1ml 所使用的那種粉紅色的塑膠針頭,應該可以有效地防治滴定液流失。
  2. 每次執行滴定時,執行以下四個步驟
    1. 排空滴定管內的液體
    2. 把滴定管填剛好滿
    3. 執行滴定
    4. 排空滴定管內的液體

我選擇使用第二種方式,因為我想要確保每次滴定的時候,一定可以執行。但這個方式也不是沒有缺點:
  1. 需要校正:需要量測每個管路的排空時間以及注滿時間
  2. 誤差較大:管路越長,不是那麼容易就剛好把滴定管填滿

而讓誤差縮小的方法還有兩種,我想這應該跟市售滴定機也通用:
  1. 降低滴定液濃度:濃度降低,滴定量就會增,誤差可以縮小
  2. 提高單次滴定量:相對的就會減少滴定次數, 減少排空和填滿的次數來降低誤差

所以我就這樣多了一樣校正工作,想知道有經驗的網友有沒有遇到類似的問題以及解決方法。
PH84_210618161545_7f3d0.png
 
這個系列還有三個部分還會發表,分別是「實際操作心得」「開放原始碼」「結語」
但是目前還在封測階段,程式碼也還在一邊使用,一邊 Debug,
有興趣的人還請耐心等待
 
再玩一陣子應該就可以改玩3D列印,再開模具
然後就是上市
接著是開旗艦店做好它 ,先賺第一筆錢
再來是分店,一間變兩間 ,兩間變四間 ,四間變八間, 八間以後就上市
上市以後再集資,接著就是炒股票 ,然後再炒地皮
接著再分開上市,到時候光是收股息你就削翻了!
 
再玩一陣子應該就可以改玩3D列印,再開模具
然後就是上市
接著是開旗艦店做好它 ,先賺第一筆錢
再來是分店,一間變兩間 ,兩間變四間 ,四間變八間, 八間以後就上市
上市以後再集資,接著就是炒股票 ,然後再炒地皮
接著再分開上市,到時候光是收股息你就削翻了!
老大,我現在的確是在研究 3D 列印,
但是你提到後面的事情應該不會發生,
因為我會繼續研發其他的機器。
口說無憑,來幾張照片
我的新玩具:Prusa Mini+
PH84_210713111604_9800f.jpg

Hottop 咖啡烘焙機改機-使用ESP32無線連接(Websocket)咖啡烘焙軟體Artisan
PH84_210713111603_fd74d.jpg
 
返回
上方 下方