版主: wanchong , wangyu , eepwwp , firedom

分享到:
共21条 1/3 1 2 3 »   

【回帖有惊喜】农田节水灌溉模拟系统开发手记——最通俗易懂的手记

    [您是本帖的第10734位阅读者]
Dream2013
我是MM
高级会员

最后登陆时间:2014-07-23 10:29:03

直达楼层
1# 发表于 2014-08-25 10:48:39
由于资料较少,开发进度缓慢。拿到板子也挺久了,开箱的时候没照开箱照,直接上板子图吧!
正面
 

背面

 

购置了电源
 
 


L和N分别接火线和零线,电源线底线不通,没接
 
接好之后
 
下载的Arduino软件打不开,驱动装不上,有待继续研究。




关键词:节水灌溉    模拟    系统    
此帖由Dream2013于2014-10-28 12:37:14最后编辑

RE: 农田节水灌溉模拟系统开发手记1

谦谦公子
我是GG
高级会员

最后登陆时间:2014-08-16 16:12:15

2# 发表于 2014-09-02 16:12:26

朋友第一次手记,果断顶啊,前排

RE: 农田节水灌溉模拟系统开发手记1

宇智波鼬
我是GG
高级会员

最后登陆时间:2014-09-01 19:02:31

3# 发表于 2014-09-04 19:20:04
做开发的妹纸

RE: 农田节水灌溉模拟系统开发手记1

caocheng
我是GG
高级会员

最后登陆时间:2014-07-23 11:45:14

4# 发表于 2014-09-15 14:31:57
好板子,好电源啊, 期待开发进度。。

RE: 农田节水灌溉模拟系统开发手记1

Love2014
我是GG
高级会员

最后登陆时间:2014-09-01 19:29:57

5# 发表于 2014-09-21 20:24:23

赞一个

RE: 农田节水灌溉模拟系统开发手记

Dream2013
我是MM
高级会员

最后登陆时间:2014-07-23 10:29:03

6# 发表于 2014-10-26 20:26:19

之前一直都私下里写来着,现在开始更新!

 

Arduino闪退的原因,查过才发现不能在中文环境下运行,在指导老师的建议下,下载了转区工具

Locale Emulator.1.3.0.0

 

解压后,在Arduino 1.5.3单击右键,出现

 

选择管理通用配置列表

配置如下:

 

保存好,在Arduino上点右键,选择

 

即可打开Arduino

========================================================================================

 

接下来是驱动问题

系统为win7 32位,安装时路径选到D:\arduino-windows-1.0.3\arduino-1.5.3-Intel.1.0.3即可,之前选在drivers结果都找不到安装驱动。

解决啦~

 

安装成功!

============================================================================================

来,测试一下~

测试程序:DigitalReadSerial
用导线将2脚与地相连,串口监视器显示0。

用导线将2脚与+5V相连,串口监视器显示1

准备工作都做完啦~~

下面进入正常的开发过程。

RE: 农田节水灌溉模拟系统开发手记

Dream2013
我是MM
高级会员

最后登陆时间:2014-07-23 10:29:03

7# 发表于 2014-10-26 21:00:50

 调试传感器与Zigbee模块

 

Zigbee模块用鼎泰克的,带有调试模块。Zigbee配置都会吧?就不讲了哈

 

自己焊的转接座,跟Arduino相连的

背面

还不错吧~\(≧▽≦)/~

 

Zigbee的准备工作到此结束

接下来是,土壤湿度传感器

 

原理是通过两个金属片之间的电流判断土壤湿度大小,总之,土壤越干,返回模拟值越大,土壤越湿,返回模拟值越小。

终于,程序来了~

以下为从机1的程序

  1. String comdata = "";        //接收字符串初始化   
  2.   
  3. int humValue;           //土壤湿度变量定义   
  4.   
  5.   
  6. //初始化   
  7.   
  8. void setup()   
  9.   
  10. {   
  11.   
  12.   Serial.begin(9600);                //初始化串口波特率   
  13.   
  14. }   
  15.   
  16.   
  17. void loop()   
  18.   
  19. {   
  20.   
  21.     humValue = analogRead(A0);           //从A0口读取土壤湿度传感器的值   
  22.   
  23.     while ( Serial.available() > 0 )            //判断串口(Zigbee)   
  24.   
  25.     {   
  26.   
  27.       comdata += char(Serial.read());           //取值放入字符串   
  28.   
  29.       delay(2);   
  30.   
  31.     }   
  32.   
  33.     if (comdata.length() > 0)           //判断字符串里的内容   
  34.   
  35.     {   
  36.   
  37.       if( comdata == "1" )               //判断索取从机1的信息   
  38.   
  39.         Serial.println(humValue);                   //发送传感器模拟值   
  40.   
  41.       comdata = "";                //清除字符串数组的内容   
  42.   
  43.     }   
  44.   
  45. }   
  46.   
  47. 从机2的程序与1相同,无非就是判断字符串内容时,if语句中的条件是if( comdata == "2" )   
  48.   
  49.   
  50. 主机程序:   
  51.   
  52. String comdata1 = "";               //接收从机1内容的字符串   
  53.   
  54. String comdata2 = "";               //接收从机2内容的字符串   
  55.   
  56. int a, b, i;   
  57.   
  58.   
  59. //初始化串口   
  60.   
  61. void setup()   
  62.   
  63. {   
  64.   
  65.   Serial.begin(9600);   
  66.   
  67. }   
  68.   
  69. void loop()   
  70.   
  71. {   
  72.   
  73.   Serial.print('1');             //索要从机1检测的土壤情况   
  74.   
  75.   while ( Serial.available()==0 )                //如果未收到,重复索取   
  76.   
  77.   {   
  78.   
  79.     Serial.print('1');   
  80.   
  81.     delay(2000);   
  82.   
  83.   }   
  84.   
  85.   while ( Serial.available() > 0 )                 //如果收到,读取内容   
  86.   
  87.   {   
  88.   
  89.     comdata1 += char(Serial.read());   
  90.   
  91.     delay(2);   
  92.   
  93.   }   
  94.   
  95.   if (comdata1.length() > 0)             //将字符转换成数字并储存在变量a中   
  96.   
  97.   {   
  98.   
  99.     for( i=0, a=0; comdata1[i]!='\0'; i++, a*=10 )   
  100.   
  101.       if( comdata1[i]<=57&&comdata1[i]>=48 )   
  102.   
  103.         a+=comdata1[i]-48;   
  104.   
  105.     a/=10;   
  106.   
  107.     comdata1 = "";                  //清空接收字符串   
  108.   
  109.   }   
  110.   
  111.   delay(5000);                   //延时5秒   
  112.   
  113.   Serial.print('2');             //索取从机2检测的土壤的情况,以下程序同理   
  114.   
  115.   while ( Serial.available()==0 )   
  116.   
  117.   {   
  118.   
  119.     Serial.print('2');   
  120.   
  121.     delay(2000);   
  122.   
  123.   }   
  124.   
  125.   while ( Serial.available() > 0 )   
  126.   
  127.   {   
  128.   
  129.     comdata2 += char(Serial.read());   
  130.   
  131.     delay(2);   
  132.   
  133.   }   
  134.   
  135.   if (comdata2.length() > 0)   
  136.   
  137.   {   
  138.   
  139.     for( i=0, b=0; comdata2[i]!='\0'; i++, b*=10 )   
  140.   
  141.       if( comdata2[i]<=57&&comdata2[i]>=48 )   
  142.   
  143.         b+=comdata2[i]-48;   
  144.   
  145.       b/=10;   
  146.   
  147.     comdata2 = "";   
  148.   
  149.   }   
  150.   
  151.   delay(5000);   
  152.   
  153. }  

 

 

 

调试情况

1、  主机放在转接座上,测试从机程序

一个小灯闪烁,另一个小灯常亮,表示模块已与电脑连接

全景图

 

发送1

 

返回数值1002,发送2

 

返回数值1023

 

2、测试从机程序

取从机2Zigbee模块,主机插回到SBS板子上

屏幕上,串口监视器显示索要从机2的信息,即主机没有收到从机2的信号,重复发送字符2。

 

发送信息1023,有点照花了,凑合着看吧

 

 

发送后,主机继续索要从机1的信息(囧,也照花了)

 

调试完成,再来一幅全景照。(可以看到主机收到从机1的信号后又开始索要从机2的数据。)

放大,也看不太清。。╮(╯▽╰)╭凑合一下

至此,主从机的土壤湿度检测及无线通讯部分调试成功。

~\(≧▽≦)/~

此帖由Dream2013于2014-10-27 15:13:06最后编辑

RE: 农田节水灌溉模拟系统开发手记

Dream2013
我是MM
高级会员

最后登陆时间:2014-07-23 10:29:03

8# 发表于 2014-10-26 21:20:32
 网络及远程监控端

这个学期老师好像一直都没空,以我个人之力编写网络部分的程序实在是困难,无奈,最后决定用SBS开发板做服务器程序,却发现网口部分的程序还是要调用串口函数,底层的,修为不够,也改不了,迫不得已又拿一块Arduino转接一下。

所谓转接,就是用1Arduino板子将从Zigbee读取的信号,转换成模拟值在模拟口输出。

这就是最后传说中的主机。囧(能力有限,想不坑都不行)

 

服务器的程序:

  1. #include <SPI.h>  
  2. #include <Ethernet.h>  
  3.   
  4. // Enter a MAC address and IP address for your controller below.  
  5. // The IP address will be dependent on your local network:  
  6. byte mac[] = {   
  7.   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
  8. IPAddress ip(192,168,1,177);  
  9.   
  10. // Initialize the Ethernet server library  
  11. // with the IP address and port you want to use   
  12. // (port 80 is default for HTTP):  
  13. EthernetServer server(80);  
  14.   
  15. void setup() {  
  16.   // Open serial communications and wait for port to open:  
  17.   Serial.begin(9600);  
  18.    while (!Serial) {  
  19.     ; // wait for serial port to connect. Needed for Leonardo only  
  20.   }  
  21.   
  22.   
  23.   // start the Ethernet connection and the server:  
  24.   Ethernet.begin(mac, ip);  
  25.   server.begin();  
  26.   Serial.print("server is at ");  
  27.   Serial.println(Ethernet.localIP());  
  28. }  
  29.   
  30.   
  31. void loop() {  
  32.   // listen for incoming clients  
  33.   EthernetClient client = server.available();  
  34.   if (client) {  
  35.     Serial.println("new client");  
  36.     // an http request ends with a blank line  
  37.     boolean currentLineIsBlank = true;  
  38.     while (client.connected()) {  
  39.       if (client.available()) {  
  40.         char c = client.read();  
  41.         Serial.write(c);  
  42.         // if you've gotten to the end of the line (received a newline  
  43.         // character) and the line is blank, the http request has ended,  
  44.         // so you can send a reply  
  45.         if (c == '\n' && currentLineIsBlank) {  
  46.           // send a standard http response header  
  47.           client.println("HTTP/1.1 200 OK");  
  48.           client.println("Content-Type: text/html");  
  49.           client.println("Connection: close");  
  50.           client.println();  
  51.           client.println("<!DOCTYPE HTML>");  
  52.           client.println("<html>");  
  53.           // add a meta refresh tag, so the browser pulls again every 5 seconds:  
  54.           client.println("<meta http-equiv=\"refresh\" content=\"5\">");  
  55.           // output the value of each analog input pin  
  56.           for (int analogChannel = 0; analogChannel < 2; analogChannel++) {  
  57.             int sensorReading = analogRead(analogChannel);  
  58.             client.print("The soil humidity of node ");  
  59.             client.print(analogChannel+1);  
  60.             client.print(" is ");  
  61.             client.print(sensorReading);  
  62.             client.println("<br />");         
  63.           }  
  64.           client.println("</html>");  
  65.           break;  
  66.         }  
  67.         if (c == '\n') {  
  68.           // you're starting a new line  
  69.           currentLineIsBlank = true;  
  70.         }   
  71.         else if (c != '\r') {  
  72.           // you've gotten a character on the current line  
  73.           currentLineIsBlank = false;  
  74.         }  
  75.       }  
  76.     }  
  77.     // give the web browser time to receive the data  
  78.     delay(1);  
  79.     // close the connection:  
  80.     client.stop();  
  81.     Serial.println("client disonnected");  
  82.   }  
  83. }  

 

调试,从机正常工作

 

从机1土壤湿度传感器短接(模拟土壤湿度达到最大),可以看到服务器页面节点1的土壤湿度显示模拟值为1

 

看不清?放大,是不是能清楚点

 

从机2土壤湿度传感器短接(模拟土壤湿度达到最大),可以看到服务器页面节点2的土壤湿度显示模拟值为1

再稍大点看

 

有时候这个服务器网页也会出现这个情况,毕竟没有来得及加校验,囧。

 

服务器网页的功能也整合进来了,也算是大部分功能实现了~

~\(≧▽≦)/~

 

此帖由Dream2013于2014-10-27 15:15:17最后编辑

RE: 农田节水灌溉模拟系统开发手记

Dream2013
我是MM
高级会员

最后登陆时间:2014-07-23 10:29:03

9# 发表于 2014-10-26 21:32:02
 

最后,关于水泵的控制。

 

 

表示有一个12V的水泵,无奈没有12V的继电器啊。反正继电器部分的控制也比较简单,就拿LED来模拟水泵的开关吧。

拿从机2做演示,把程序作了一点点改动。

  1. String comdata = "";   
  2.   
  3. int humValue;   
  4.   
  5.   
  6. void setup()   
  7.   
  8. {   
  9.   
  10.   Serial.begin(9600);   
  11.   
  12.   pinMode( 8, OUTPUT );                 //加入了两个用来控制LED的数字口   
  13.   
  14.   pinMode( 9, OUTPUT );   
  15.   
  16. }   
  17.   
  18.   
  19. void loop()   
  20.   
  21. {   
  22.   
  23.     humValue = analogRead(A0);   
  24.   
  25.     if( humValue>700 )   
  26.   
  27.     {   
  28.   
  29.       digitalWrite(9, HIGH);          //控制LED的程序   
  30.   
  31.       digitalWrite(8, LOW);   
  32.   
  33.     }   
  34.   
  35.     else   
  36.   
  37.     {   
  38.   
  39.       digitalWrite(9, LOW);   
  40.   
  41.       digitalWrite(8, LOW);   
  42.   
  43.     }   
  44.   
  45.     while ( Serial.available() > 0 )   
  46.   
  47.     {   
  48.   
  49.       comdata += char(Serial.read());   
  50.   
  51.       delay(2);   
  52.   
  53.     }   
  54.   
  55.     if (comdata.length() > 0)   
  56.   
  57.     {   
  58.   
  59.       if( comdata == "2" )   
  60.   
  61.         Serial.println(humValue);   
  62.   
  63.       comdata = "";   
  64.   
  65.      }   
  66.   
  67. }   

 

 

测试

明显看到小灯亮起,服务器网页上显示的数值较大,模拟检测的土壤较干。

 

将土壤湿度传感器两铁片短接,可以看到服务器网页上2节点的值为1,小灯熄灭

 

功能全都完成啦~

最后两张光线极暗,屏幕上都能映出我的影子o(╯□╰)o

算啦, 最后爆张照片,纪念一下这个我和这个小项目~

小妹跟Q2187的亲密合影不是什么人都能看的。果断改成回复可见

——回复可见内容——

 

 

~\(≧▽≦)/~独立完成的,虽然没多少技术含量,但还是心情愉悦~

 

此帖由Dream2013于2014-10-27 16:30:54最后编辑

动手能力蛮强的胖妹纸

二叔
我是GG
高级会员

最后登陆时间:2014-10-23 10:40:53

10# 发表于 2014-10-27 09:46:12

表示有一个12V的水泵,无奈没有12V的继电器啊。反正继电器部分的控制也比较简单,就拿LED来模拟水泵的开关吧。

晓芙,12V的水泵不用12V的继电器,用5V,继续搞吧~

共21条 1/3 1 2 3 »   
快速回复主题
  • 匿名不能发帖!请先 [ 登陆 注册 ]