如何使用 Arduino 來(lái)開(kāi)發(fā)灌溉系統(tǒng)
幾周之前,我展示了最近為父親做的一個(gè)項(xiàng)目:Remotely controlling IR/RF devices with an Arduino,他卻抱怨道我還沒(méi)有為他開(kāi)發(fā)一個(gè)可遠(yuǎn)程控制得灌溉系統(tǒng)。我們有幾英畝地需要灌溉,以前是通過(guò)中央水泵加管道的方式灌溉。然而在那時(shí),事實(shí)是他需要一個(gè)遠(yuǎn)程控制水泵,這對(duì)我來(lái)說(shuō)是一個(gè)新的挑戰(zhàn),正如對(duì)你們一樣,所以我詢(xún)問(wèn)了父親他的具體的需求。
他告訴我他需要一個(gè)允許他向一個(gè)手機(jī)號(hào)打電話或者發(fā)短信以控制遠(yuǎn)程的水泵開(kāi)始或者關(guān)閉,以及如果灌溉系統(tǒng)出現(xiàn)問(wèn)題,系統(tǒng)會(huì)發(fā)送短息并及時(shí)關(guān)閉水泵。
以前灌溉就是大量線軸連接到水泵上,但是仍然會(huì)存在一些問(wèn)題,比如缺電、管道連接不正確或管道需要加壓等。由于以上問(wèn)題出現(xiàn)的突然性,一個(gè)及時(shí)提醒你并保存現(xiàn)場(chǎng)數(shù)據(jù)的系統(tǒng)是非常寶貴的, 即使你在事發(fā)12小時(shí)之后回到農(nóng)場(chǎng)仍然會(huì)發(fā)現(xiàn)管道破損之前5分鐘灌溉現(xiàn)場(chǎng)狀況。
Arduino 來(lái)拯救
Arduino非常適合這樣的項(xiàng)目:低成本、只需要一個(gè)電源、沒(méi)有系統(tǒng)會(huì)凍結(jié)/掛起、擁有眾多的標(biāo)準(zhǔn)周邊設(shè)備。聽(tīng)起來(lái)這個(gè)想法適合我做,所以我通過(guò)互聯(lián)網(wǎng)搜索到Arduino GSM模塊。***,我發(fā)現(xiàn)一個(gè)模塊以及開(kāi)放庫(kù)只需要30美元,非常便宜。完整的系統(tǒng)成本大約50美元,和大多數(shù)其他系統(tǒng)成本700美元形成鮮明對(duì)照。
幸運(yùn)的是,GSMLib很容易使用,我一找出哪些針腳能用到,哪些沒(méi)用就開(kāi)始動(dòng)手去做。一個(gè)簡(jiǎn)短的例子,當(dāng)一個(gè)認(rèn)證的手機(jī)號(hào)發(fā)短息給你時(shí),你需要做的就是:
- stat = call.CallStatusWithAuth(number, 1, 3);if(stat == CALL_INCOM_VOICE_AUTH) {
- call.HangUp();
- sms.SendSMS(number, value_str);}
系統(tǒng)描述
最終的水泵控制系統(tǒng)是相當(dāng)簡(jiǎn)單的。開(kāi)始或者關(guān)閉的方法通過(guò)一個(gè)繼電器或者兩個(gè)繼電器系統(tǒng)模擬開(kāi)/關(guān)按鈕實(shí)現(xiàn)。我想要的是兩種方法都支持,這并不是很困難。
除了輸出之外,也有輸入。當(dāng)系統(tǒng)啟動(dòng)并運(yùn)行時(shí),相應(yīng)的繼電器開(kāi)啟和關(guān)閉;當(dāng)有一個(gè)錯(cuò)誤時(shí)(斷電、低壓、高溫),三個(gè)繼電器可能會(huì)開(kāi)啟。我們的軟件一般需要發(fā)送短信,當(dāng)系統(tǒng)開(kāi)始和停止運(yùn)行時(shí)(無(wú)論任何原因,無(wú)論你是否通過(guò)電話開(kāi)啟系統(tǒng)),當(dāng)一個(gè)錯(cuò)誤繼電器觸發(fā)時(shí),一條帶有具體錯(cuò)誤原因的短信將發(fā)送。
我們也想要一種取消SMS發(fā)送的方法,與確保你不會(huì)得到無(wú)關(guān)緊要的信息,如果你手動(dòng)開(kāi)啟/關(guān)閉系統(tǒng),而你在水泵身旁(顯而易見(jiàn)的是當(dāng)你站在水泵旁邊時(shí),關(guān)閉水泵,壓力消失,你不在需要接受短信)通過(guò)簡(jiǎn)單的選擇輸入可實(shí)現(xiàn)開(kāi)啟短息發(fā)送功能或者關(guān)閉。
當(dāng)然也有一些次要的問(wèn)題需要考慮,比如錯(cuò)誤繼電器和其他元件不相關(guān)聯(lián)(當(dāng)關(guān)閉電源后,所有其他的錯(cuò)誤繼電器將繼續(xù)運(yùn)行,所以你只需要發(fā)送“電力消失”信息),錯(cuò)誤條件具體到錯(cuò)誤(例如,關(guān)閉系統(tǒng)觸發(fā)“壓力下降”錯(cuò)誤),但這都非常簡(jiǎn)單。
實(shí)現(xiàn)錯(cuò)誤短信
實(shí)現(xiàn)錯(cuò)誤短息的函數(shù)只需幾行。初始時(shí),我們檢測(cè)繼電器的狀態(tài)是否改變(當(dāng)一個(gè)錯(cuò)誤繼電器保持激活狀態(tài)時(shí),我們想要邊緣觸發(fā)以避免虛假循環(huán)。例如):
- for (char i=0; i < INPUT_LENGTH; i++) {
- pinState = digitalRead(inputPins[i]);
- if (pinState != pinStates[i]) {
- // If the pin's state changed, note it.
- statesChanged[i] = 1;
- }
- // Update the state.
- pinStates[i] = pinState;}
然后我們掌握了所有狀態(tài)的改變以及新?tīng)顟B(tài),決定接下來(lái)做什么就不難了:
- // Decide what happens.if (statesChanged[0] == 1 && pinStates[0] == OFF) {
- // Phase dropped, send message regardless.
- sendSMS("Phase dropped.");} else if (statesChanged[1] == 1 && pinStates[1] == OFF) {
- sendSMS("Thermal dropped.");} else if ((statesChanged[2] == 1 && pinStates[2] == OFF) &&
- (statesChanged[3] == 1 && pinStates[3] == OFF)) {
- // Pressure dropped *and operation stopped simultaneously*.
- // This is because we don't want to be notified of normal
- // pressure drops after we stop the system ourselves.
- sendSMS("Pressure dropped.");} else if (statesChanged[3] == 1 && pinStates[3] == OFF) {
- sendSMS("Pump shut down.");} else if (statesChanged[3] == 1 && pinStates[3] == ON) {
- sendSMS("Pump started.");}
結(jié)束語(yǔ)
最終完成的系統(tǒng)應(yīng)當(dāng)是即插即用的。如果你想要使用它,并且像我一樣擁有兼容好的錯(cuò)誤繼電器,你可以安裝到 Arduino 并且運(yùn)行它。
你能在GitHub上找到完整的代碼:https://github.com/skorokithakis/arduino-irrigation
非常樂(lè)見(jiàn)你提出系統(tǒng)功能上的需求,這是走向成功的故事。失敗的故事也是非常受歡迎的,但是它們使我不怎么幸福。我也將期待你后面的評(píng)論,或者你可以Tweet我。我希望基于Arduino的灌溉系統(tǒng)將至少給提供一些有用的東西,感謝你的閱讀!
英文原文:Arduino-powered irrigation system
譯文鏈接:http://www.oschina.net/translate/arduino-powered-irrigation-system





















