三、硬體設計

傻瓜滴定機的硬體接線圖如下所示:
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
 
再玩一陣子應該就可以改玩3D列印,再開模具
然後就是上市
接著是開旗艦店做好它 ,先賺第一筆錢
再來是分店,一間變兩間 ,兩間變四間 ,四間變八間, 八間以後就上市
上市以後再集資,接著就是炒股票 ,然後再炒地皮
接著再分開上市,到時候光是收股息你就削翻了!
 
再玩一陣子應該就可以改玩3D列印,再開模具
然後就是上市
接著是開旗艦店做好它 ,先賺第一筆錢
再來是分店,一間變兩間 ,兩間變四間 ,四間變八間, 八間以後就上市
上市以後再集資,接著就是炒股票 ,然後再炒地皮
接著再分開上市,到時候光是收股息你就削翻了!
老大,我現在的確是在研究 3D 列印,
但是你提到後面的事情應該不會發生,
因為我會繼續研發其他的機器。
口說無憑,來幾張照片
我的新玩具:Prusa Mini+
PH84_210713111604_9800f.jpg

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

相似主題