基于Ethernet以及网络服务器的联网浇水系统-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13223|回复: 14

基于Ethernet以及网络服务器的联网浇水系统

[复制链接]
发表于 2015-5-22 09:54 | 显示全部楼层 |阅读模式
本帖最后由 kulapika2005 于 2015-5-22 16:43 编辑

刚刚答辩结束~(同类专业请不要吐槽我们学校竟然让使用开源硬件- -)感觉从论坛和网上得到的信息也是很多吧~所以觉得还是把源代码开放吧~毕竟都是原生代码~最难的部分还是感谢Arduino帮我完成了。硬件部分
还是看图片吧我为了演示方便最后加了一组红外遥控(个人感觉加了遥控比不加要好得多,操控和控制好多了~~顺带求时间函数溢出后的解决办法)~~方便答辩现场演示。

系统总体框图

系统总体框图

为了使用和最后采集数据方便(是我太懒了~~谁让模拟量数据那么好获取= =!)我全部使用了模拟量传感器,温度使用LM35,湿度是那种最简单的双脚水分模拟量传感器(模拟量~买的时候一定注意~我就被坑了)空气质量传感器是夏普GP2Y10,,自己再焊个辅助电路就好。水位我找到了一种便宜简单的

一个方便的水分传感器

一个方便的水分传感器

这个把上面用电器包布封号~就是防水的了- -成本很低~~别心疼钱~~用3m吧~~禁得住折腾~垂直拼上你不用花几百块再去买水位计~~你就拥有了全量程水位计~~(一块1.8元哦!)
水泵我找到了一个十分小型的水泵,非自吸但是确实够用了,5V供电实际扬程大概60cm吧,用来做个盆景也够用了。出处请淘宝。
其他的没啥难的了~搭个php+MySQL环境~~一切准备OK
000.jpg


[mw_shl_code=c,true]#include <Ethernet.h>
#include <SPI.h>
#include <IRremote.h>
/************ ETHERNET STUFF ************/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //MAC
IPAddress ip(192,168,0,177);     //IP
// 输入MAC地址到控制器.
// 新版本控制器可以把定义的MAC地址烧写到W5100
int measurePin = A3; //Connect dust sensor to Arduino A0 pin
int ledPower = 9;
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
// 如果你不想使用DNS请使用IP而不是服务器的网址:
char server[] = "192.168.0.71";// 服务器IP地址
float LM35,AIR,HM01,LT01,WT01,WT02,WT03;
int Sensor02= 2;
int Sensor01=6;
int body;
int WF = 5;
int read01;
int time01, time02, time03;
int timespan;
int RECV_PIN =7;//定义红外接收器的引脚为11
IRrecv irrecv(RECV_PIN);
long C;
const int ledPin =  9;      // the number of the LED pin

decode_results results;
// 静态IP地址设置不启用用DHCP分配
// 初始化以太网客户端的库、IP地址和服务器端口
// 如果你想连接(默认端口80是默认的HTTP端口)
//EthernetServer server(80);
EthernetClient client;
String readString;
//////////////////START///////////////////
void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  //server.begin();
  Serial.print("Server is at");
  Serial.println(Ethernet.localIP());
  irrecv.enableIRIn(); // 初始化红外接收器
  pinMode(WF, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(Sensor01, INPUT);
  pinMode(Sensor02, INPUT);
  delay(80);
}
/////////////////LOOP/////////////////////
void loop()
{
  if (irrecv.decode(&results)) {
   C=results.value;
    Serial.println(C);
    Serial.println("qq");
    Serial.println(results.value);//以16进制换行输出接收代码, HEX

    Serial.println();//为了便于观看输出结果增加一个空行
    delay(100);
    irrecv.resume(); }// 接收下一个值
  if (C == 16753245)
  {
    digitalWrite(ledPin, HIGH);
    Serial.println("Led On");
    collect_data();
    send_data();
    delay(80);
    digitalWrite(ledPin, LOW);
    Serial.println("Led Off");
    C =0;
    }  
  if (C == 16720605)
  {
    digitalWrite(ledPin, HIGH);
    Serial.println("watering");
    water_flower();
    delay(80);
    digitalWrite(ledPin, LOW);
    Serial.println("water end");
    C =0;
    }
  body=digitalRead(Sensor01)+digitalRead(Sensor02);
  if (body == 2)
  {digitalWrite(ledPin, HIGH);
    Serial.println("watering");
    water_flower();
    delay(80);
    digitalWrite(ledPin, LOW);
    Serial.println("water end");
    body=0;}
  body=0;
}

//////////////water_flower///////////////
void water_flower()
{
  digitalWrite(WF, HIGH);
  delay(5000);
  digitalWrite(WF, LOW);
  Serial.println("Wetering Flower...");
}
/////////////collect_data///////////////
void collect_data()
{
LM35 = (4.2 * analogRead(A0) * 100.0) / 1024;
get_air();
AIR=calcVoltage;
HM01=analogRead(A2);
LT01=analogRead(A1);
WT03=32*(WT01+WT02)/14000;
}
////get air
void get_air()
{
digitalWrite(ledPower,LOW); // power on the LED
  delayMicroseconds(samplingTime);

  voMeasured = analogRead(measurePin); // read the dust value

  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH); // turn the LED off
  delayMicroseconds(sleepTime);
  calcVoltage = voMeasured * (5.0 / 1024.0);
  dustDensity = 0.17 * calcVoltage - 0.1;

  Serial.print("Raw Signal Value (0-1023): ");
  Serial.print(voMeasured);

  Serial.print(" - Voltage: ");
  Serial.print(calcVoltage);

  Serial.print(" - Dust Density: ");
  Serial.println(dustDensity); // unit: mg/m3
}


////////////////get word/////////////////

///////////////send data///////////////////
void send_data()
{
  Serial.println("connecting...");//初始化Ethernet服务后串口输出“connecting...”

  // 如果你得到一个连接将通过串口返回报告输出“connected”
  if (client.connect(server, 80)) {
   digitalWrite(ledPin, HIGH);
    Serial.println("Led On");
    Serial.println("connected");
    // 进行一个HTTP响应
    /*
    tag:因为原本的GET参数中要执行$H类似的php格式
    但是为了能正确传参现在不用println
    使用print来连续传入GET指令到服务器
    */
    client.print("GET /mypot2/save.php?");
    client.print("userId=");
    client.print(2);//只在传输时采集数据-直接把端口数据传到服务器
    client.print("&tempSoil=");
    client.print(LM35);
    client.print("&tempAir=");
    client.print(LM35);
    client.print("&rh=");
    client.print(HM01);
    client.print("&light=");
    client.print(LT01);
    client.print("&air=");
    client.print(calcVoltage);
    client.print("&water=");
    client.print(WT03);
    client.println();
    client.println("HTTP/1.1");
    //client.println();
    client.println("Host: 192.168.0.71");
    client.println("Connection: close");
    client.println();
    client.stop();
    digitalWrite(ledPin, LOW);
    Serial.println("Led Off");
  }
  else {
    // 连接失败 串口输出"connection failed"
    Serial.println("connection failed");
  }
}
//////////////////////////////////////////////////[/mw_shl_code]上午脑抽忘了加网络客户端照片了  顺便学了下php弄了个 网络控制面板
WebLab - Free CSS template by ol.tjsfdx.com.png QQ截图20150522164233.png
最后就是实现数据查看 在现实中也可以通过红外控制手动传输数据 或者浇水


最后感谢奈何COL~写的十分好~~我对比了很多书~~确实是最用心的~还有国外的SmartArduino至少给了我实现的想法







发表于 2015-5-22 10:16 | 显示全部楼层
我觉得你们学校让你们用开源软件挺好,至少避免了重复造轮子的工作。
 楼主| 发表于 2015-5-22 13:35 | 显示全部楼层
deadloop 发表于 2015-5-22 10:16
我觉得你们学校让你们用开源软件挺好,至少避免了重复造轮子的工作。

我也是实在讨厌千篇一律的用51来做~虽然说经典~问题哪家会用~~班里也有同学用STM32和AVR做毕设
而且Arduino确实很好用~可以吧更多精力集中于产品的需求上而不是代码编写
发表于 2015-5-25 10:20 | 显示全部楼层
kulapika2005 发表于 2015-5-22 13:35
我也是实在讨厌千篇一律的用51来做~虽然说经典~问题哪家会用~~班里也有同学用STM32和AVR做毕设
而且Ardui ...

但是话说回来,51还是每个搞设计的基本功。51在单片机的地位有点类似C语言在编程语言中的地位,可以说是基石吧。
 楼主| 发表于 2015-5-25 10:22 | 显示全部楼层
deadloop 发表于 2015-5-25 10:20
但是话说回来,51还是每个搞设计的基本功。51在单片机的地位有点类似C语言在编程语言中的地位,可以说是 ...

恩恩~确实~~用C写51才导致了我现在汇编代码阅读完全不行~~但是对于同样用C开发的Arduino简直很容易了~但是还是希望学校至少升级为STM的教学啊~~至少能用用高级总线~~哪怕自己写写也好~~哎~~~都毕业了~以后只能六日自己搞搞了~~
发表于 2015-9-21 09:16 来自手机 | 显示全部楼层
大兄弟能否把毕业论文借来参考?本人今年毕业也想做这方面的东西
发表于 2015-10-29 13:25 | 显示全部楼层
楼主大神!求助,你服务器对应arduino传输数据的PHP代码可以给我一份学习一下吗?
 楼主| 发表于 2015-10-29 13:50 | 显示全部楼层
zhs6617901 发表于 2015-10-29 13:25
楼主大神!求助,你服务器对应arduino传输数据的PHP代码可以给我一份学习一下吗? ...

额~我回家找找啊~~其实不难~~大概就是  使用 get方法 然后php得到值 存好就行~~几行就OK~~
 楼主| 发表于 2015-10-29 14:41 | 显示全部楼层
zhs6617901 发表于 2015-10-29 13:25
楼主大神!求助,你服务器对应arduino传输数据的PHP代码可以给我一份学习一下吗? ...

http://blog.smartarduino.com/    我参考这个来的~~不少代码都是这里给的基本想法~~但是这里用的是串口wifi传输 稍微不同  不过改改就能用  他的 gethub的php文件几乎是对的~~改成储存到数据库就OK  
 楼主| 发表于 2015-10-29 14:42 | 显示全部楼层
930615 发表于 2015-9-21 09:16
大兄弟能否把毕业论文借来参考?本人今年毕业也想做这方面的东西

论文啥含量都木有都是简单介绍~~还不如我上面写的好~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 10:38 , Processed in 0.184385 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表