|
本帖最后由 kulapika2005 于 2015-5-22 16:43 编辑
刚刚答辩结束~(同类专业请不要吐槽我们学校竟然让使用开源硬件- -)感觉从论坛和网上得到的信息也是很多吧~所以觉得还是把源代码开放吧~毕竟都是原生代码~最难的部分还是感谢Arduino帮我完成了。硬件部分
还是看图片吧我为了演示方便最后加了一组红外遥控(个人感觉加了遥控比不加要好得多,操控和控制好多了~~顺带求时间函数溢出后的解决办法)~~方便答辩现场演示。
系统总体框图
为了使用和最后采集数据方便(是我太懒了~~谁让模拟量数据那么好获取= =!)我全部使用了模拟量传感器,温度使用LM35,湿度是那种最简单的双脚水分模拟量传感器(模拟量~买的时候一定注意~我就被坑了)空气质量传感器是夏普GP2Y10,,自己再焊个辅助电路就好。水位我找到了一种便宜简单的
一个方便的水分传感器
这个把上面用电器包布封号~就是防水的了- -成本很低~~别心疼钱~~用3m吧~~禁得住折腾~垂直拼上你不用花几百块再去买水位计~~你就拥有了全量程水位计~~(一块1.8元哦!)
水泵我找到了一个十分小型的水泵,非自吸但是确实够用了,5V供电实际扬程大概60cm吧,用来做个盆景也够用了。出处请淘宝。
其他的没啥难的了~搭个php+MySQL环境~~一切准备OK
[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弄了个 网络控制面板
最后就是实现数据查看 在现实中也可以通过红外控制手动传输数据 或者浇水
最后感谢奈何COL~写的十分好~~我对比了很多书~~确实是最用心的~还有国外的SmartArduino至少给了我实现的想法
|
|