几周之前,我展示了最近为父亲做的一个项目:Remotely controlling IR/RF devices with an Arduino,他却抱怨道我还没有为他开发一个可远程控制得灌溉系统。我们有几英亩地需要灌溉,以前是通过中央水泵加管道的方式灌溉。然而在那时,事实是他需要一个远程控制水泵,这对我来说是一个新的挑战,正如对你们一样,所以我询问了父亲他的具体的需求。
他告诉我他需要一个允许他向一个手机号打电话或者发短信以控制远程的水泵开始或者关闭,以及如果灌溉系统出现问题,系统会发送短息并及时关闭水泵。
以前灌溉就是大量线轴连接到水泵上,但是仍然会存在一些问题,比如缺电、管道连接不正确或管道需要加压等。由于以上问题出现的突然性,一个及时提醒你并保存现场数据的系统是非常宝贵的, 即使你在事发12小时之后回到农场仍然会发现管道破损之前5分钟灌溉现场状况。
Arduino 来拯救
Arduino非常适合这样的项目:低成本、只需要一个电源、没有系统会冻结/挂起、拥有众多的标准周边设备。听起来这个想法适合我做,所以我通过互联网搜索到Arduino GSM模块。***,我发现一个模块以及开放库只需要30美元,非常便宜。完整的系统成本大约50美元,和大多数其他系统成本700美元形成鲜明对照。
幸运的是,GSMLib很容易使用,我一找出哪些针脚能用到,哪些没用就开始动手去做。一个简短的例子,当一个认证的手机号发短息给你时,你需要做的就是:
- stat = call.CallStatusWithAuth(number, 1, 3);if(stat == CALL_INCOM_VOICE_AUTH) {
- call.HangUp();
- sms.SendSMS(number, value_str);}
系统描述
最终的水泵控制系统是相当简单的。开始或者关闭的方法通过一个继电器或者两个继电器系统模拟开/关按钮实现。我想要的是两种方法都支持,这并不是很困难。
除了输出之外,也有输入。当系统启动并运行时,相应的继电器开启和关闭;当有一个错误时(断电、低压、高温),三个继电器可能会开启。我们的软件一般需要发送短信,当系统开始和停止运行时(无论任何原因,无论你是否通过电话开启系统),当一个错误继电器触发时,一条带有具体错误原因的短信将发送。
我们也想要一种取消SMS发送的方法,与确保你不会得到无关紧要的信息,如果你手动开启/关闭系统,而你在水泵身旁(显而易见的是当你站在水泵旁边时,关闭水泵,压力消失,你不在需要接受短信)通过简单的选择输入可实现开启短息发送功能或者关闭。
当然也有一些次要的问题需要考虑,比如错误继电器和其他元件不相关联(当关闭电源后,所有其他的错误继电器将继续运行,所以你只需要发送“电力消失”信息),错误条件具体到错误(例如,关闭系统触发“压力下降”错误),但这都非常简单。
实现错误短信
实现错误短息的函数只需几行。初始时,我们检测继电器的状态是否改变(当一个错误继电器保持激活状态时,我们想要边缘触发以避免虚假循环。例如):
- 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;}
然后我们掌握了所有状态的改变以及新状态,决定接下来做什么就不难了:
- // 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.");}
结束语
最终完成的系统应当是即插即用的。如果你想要使用它,并且像我一样拥有兼容好的错误继电器,你可以安装到 Arduino 并且运行它。
你能在GitHub上找到完整的代码:https://github.com/skorokithakis/arduino-irrigation
非常乐见你提出系统功能上的需求,这是走向成功的故事。失败的故事也是非常受欢迎的,但是它们使我不怎么幸福。我也将期待你后面的评论,或者你可以Tweet我。我希望基于Arduino的灌溉系统将至少给提供一些有用的东西,感谢你的阅读!
英文原文:Arduino-powered irrigation system
译文链接:http://www.oschina.net/translate/arduino-powered-irrigation-system