分享

使用开源硬件,开发智能农田灌溉系统

 黑传说 2014-03-18

几周之前,我展示了最近为父亲做的一个项目:Remotely controlling IR/RF devices with an Arduino,他却抱怨道我还没有为他开发一个可远程控制得灌溉系统。我们有几英亩地需要灌溉,以前是通过中央水泵加管道的方式灌溉,现在他需要远程控制水泵。

他告诉我他需要一个允许他向一个手机号打电话或者发短信以控制远程的水泵开始或者关闭,以及如果灌溉系统出现问题,系统会发送短息并及时关闭水泵。

灌溉线缆

以前灌溉就是大量线轴连接到水泵上,但是仍然会存在一些问题,比如缺电、管道连接不正确或管道需要加压等。由于以上问题出现的突然性,一个及时提醒你并保存现场数据的系统是非常宝贵的, 即使你在事发12小时之后回到农场仍然会发现管道破损之前5分钟灌溉现场状况。

使用开源智能硬件方案:Arduino

Arduino非常适合这样的项目:低成本、只需要一个电源、没有系统会冻结/挂起、拥有众多的标准周边设备。通过互联网搜索到Arduino GSM模块,发现一个模块以及开发只需要30美元,非常便宜。完整的系统成本大约50美元,和大多数其他系统成本700美元形成鲜明对照。

GSMLib很容易使用,我一找出哪些针脚能用到,哪些没用就开始动手去做。一个简短的例子,当一个认证的手机号发短息给你时,你需要做的就是:

1stat = call.CallStatusWithAuth(number, 1, 3);if(stat == CALL_INCOM_VOICE_AUTH) {
2    call.HangUp();
3    sms.SendSMS(number, value_str);}

系统描述

最终的水泵控制系统是相当简单的。开始或者关闭的方法通过一个继电器或者两个继电器系统模拟开/关按钮实现。我想要的是两种方法都支持,这并不是很困难。

除了输出之外,也有输入。当系统启动并运行时,相应的继电器开启和关闭;当有一个错误时(断电、低压、高温),三个继电器可能会开启。我们的软件一 般需要发送短信,当系统开始和停止运行时(无论任何原因,无论你是否通过电话开启系统),当一个错误继电器触发时,一条带有具体错误原因的短信将发送。

我们也想要一种取消SMS发送的方法,与确保你不会得到无关紧要的信息,如果你手动开启/关闭系统,而你在水泵身旁(显而易见的是当你站在水泵旁边时,关闭水泵,压力消失,你不在需要接受短信)通过简单的选择输入可实现开启短息发送功能或者关闭。

当然也有一些次要的问题需要考虑,比如错误继电器和其他元件不相关联(当关闭电源后,所有其他的错误继电器将继续运行,所以你只需要发送“电力消失”信息),错误条件具体到错误(例如,关闭系统触发“压力下降”错误),但这都非常简单。

实现错误短信

实现错误短息的函数只需几行。初始时,我们检测继电器的状态是否改变(当一个错误继电器保持激活状态时,我们想要边缘触发以避免虚假循环。例如):

1for (char i=0; i < INPUT_LENGTH; i++) {
2    pinState = digitalRead(inputPins[i]);
3    if (pinState != pinStates[i]) {
4        // If the pin's state changed, note it.
5        statesChanged[i] = 1;
6    }
7    // Update the state.
8    pinStates[i] = pinState;}

然后我们掌握了所有状态的改变以及新状态,决定接下来做什么就不难了:

01// Decide what happens.if (statesChanged[0] == 1 && pinStates[0] == OFF) {
02    // Phase dropped, send message regardless.
03    sendSMS("Phase dropped.");} else if (statesChanged[1] == 1 && pinStates[1] == OFF) {
04    sendSMS("Thermal dropped.");} else if ((statesChanged[2] == 1 && pinStates[2] == OFF) &&
05           (statesChanged[3] == 1 &&  pinStates[3] == OFF)) {
06    // Pressure dropped *and operation stopped simultaneously*.
07    // This is because we don't want to be notified of normal
08    // pressure drops after we stop the system ourselves.
09    sendSMS("Pressure dropped.");} else if (statesChanged[3] == 1 && pinStates[3] == OFF) {
10    sendSMS("Pump shut down.");} else if (statesChanged[3] == 1 && pinStates[3] == ON) {
11    sendSMS("Pump started.");}

结束语

最终完成的系统是即插即用的。如果你想要使用它,并且像我一样拥有兼容好的错误继电器,你可以安装到 Arduino 并且运行它。

完整的代码可见:https://github.com/skorokithakis/arduino-irrigation

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多