在上面几周,我们已经完成了数据采集终端的制作,各种传感器的连接与使用,无线串口的使用,而且了解了http协议的基本工作原理,现在我们要做的就是将我们数据采集终端采集到的环境数据,通过SIM900模块发送至指定服务器上。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SIM900模块:
sim900模块是一块轻巧实用的模块,能够支持插卡,打电话,发短信,同时能够通过它进行gprs上网,它的工作与控制基于AT指令实现,在在实际的使用中,我们通过SIM900
轻松满足了我们的数据上网的要求,一开始我们直接将其用串口调试助手发送AT指令老控制模块工作,后来,我们直接将其指令封装到Arduino程序中,再将其通过硬件接线的方
式连接到Arduino控制板上,这样就能直接不通过电脑而实现数据上传到服务器的工作。
无线串口:
在第四周的时候,我们在无线串口上实现了数据的接收与发送,现在我们要实现的功能是将其数据通过数据采集终端(传感器部分)采集到的数据通过无线串口发送出去,再在
中间节点上用另一个无线串口接收,然后SIM900模块将串口接收到的数据通过post的方式将其发送到指定的服务器上,然后服务器上编写对应的程序来接受中间节点上传上来的数据,这样,一个环境数据采集系统的雏形已经出来了,再经过一些优化就可以完工了。
#include<SoftwareSerial.h>
SoftwareSerial serial1(8,9);
SoftwareSerial myserial(10, 11);
long previousMillis = 0; // will store last time LED was updated
long interval = 17000; // interval at which to get (milliseconds)
unsigned long currentMillis = 0;
String DH22TemperatureC = "";
String DH22Humidity = "";
String Light = "";
String ultraviolet = "";
String temperature = "";
String humidity = "";
String dewpoint = "";
String Wind = "";
String Dust = "";
void setup()
{
Serial.begin(9600);
serial1.begin(9600);
while(!gprsINI());
}
void loop()
{
myserial.listen();
if (myserial.available() > 0)
{
readData();
}
serial1.listen();
currentMillis = millis();
while(serial1.available())
{
char c =serial1.read();
Serial.print(c);
}
if(currentMillis - previousMillis > interval)
{
sendData();
}
}
boolean gprsINI()
{
String msg;
msg = sim800MSG("AT+SAPBR=2,1");
Serial.println(msg);
sim800MSG("ATE");
if(msg.indexOf("OK") > 0)
if(msg.indexOf("0.0.0.0") > 0)
{
sim800MSG("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
sim800MSG("AT+SAPBR=3,1,\"APN\",\"CMNET\"");
sim800MSG("AT+SAPBR=1,1");
}
else return 1;
delay(2000);
return 0;
}
String sim800MSG(String msg)
{
String str;
boolean ActionFlag = false;
if(msg.indexOf("HTTPACTION")>0)
ActionFlag = true;
serial1.println(msg);
while(!serial1.available())
delay(10);
while(serial1.available())
{
char c = serial1.read();
str += c;
delayMicroseconds(1200);
// delay(2);
}
if(ActionFlag)
{
while(!serial1.available())
delay(10);
while(serial1.available())
{
char c = serial1.read();
str += c;
delay(2);
}
}
// Serial.println(str);
return str;
}
void sendData()
{
previousMillis = currentMillis;
sim800MSG("AT+CIPSTART=\"TCP\",\"test_url\",\"80\"");
delay(3500);
sim800MSG("AT+CIPSEND");
delay(200);
String ss;
ss= "POST saveData.php?\r\n";
//DHT22温湿度传感器
ss +="temperature=DH22TemperatureC\r\n";//温度
ss +="&humidity=DH22Humidity"; //湿度
//光照传感器
ss +="&Light=Light\r\n"; //光照
//紫外线传感器
ss +="&uv=ultraviolet\r\n"; //紫外线
//风速风向传感器
ss +="&&winSpeed=Wind\r\n"; //风速
ss +="&winDir=winDir\r\n"; //风向
//土壤温湿度传感器
ss +="&soilTem=temperature\r\n"; //土壤温度
ss +="&soilHum=humidity\r\n"; //土壤湿度
ss +="&soilDew=dewpoint\r\n"; //露点
//粉尘传感器
ss +="$Dust=Dust\r\n"; //粉尘
ss +="HTTP/1.1\r\n";
ss += "Host: test_url\r\n";
ss += "Accept: *";
ss += "/";
ss += "*\r\n";
ss +="Content-Length: 0\r\n";
ss += "Content-Type: application/x-www-form-urlencoded\r\n";
ss += "Connection: close\r\n\r\n";
Serial.println(sim800MSG(ss));
}
void readData()
{
while (myserial.peek() != '\n')
{
DH22TemperatureC += (char)myserial.read();
delay(10);
}
myserial.read();
while (!myserial.available()) {}
while (myserial.peek() != '\n')
{
DH22Humidity += (char)myserial.read();
delay(10);
}
myserial.read();
while (!myserial.available()) {}
while (myserial.peek() != '\n')
{
Light += (char)myserial.read();
delay(10);
}
myserial.read();
while (!myserial.available()) {}
while (myserial.peek() != '\n')
{
ultraviolet += (char)myserial.read();
delay(10);
}
myserial.read();
while (!myserial.available()) {}
while (myserial.peek() != '\n')
{
temperature += (char)myserial.read();
delay(10);
}
myserial.read();
while (!myserial.available()) {}
while (myserial.peek() != '\n')
{
humidity += (char)myserial.read();
delay(10);
}
myserial.read();
while (!myserial.available()) {}
while (myserial.peek() != '\n')
{
dewpoint += (char)myserial.read();
delay(10);
}
myserial.read();
while (!myserial.available()) {}
while (myserial.peek() != '\n')
{
Wind += (char)myserial.read();
delay(10);
}
myserial.read();
while (!myserial.available()) {}
while (myserial.peek() != '\n')
{
Dust += (char)myserial.read();
delay(10);
}
myserial.read();
Serial.println(DH22TemperatureC);
Serial.println(DH22Humidity);
Serial.println(Light);
Serial.println(ultraviolet);
Serial.println(temperature);
Serial.println(humidity);
Serial.println(dewpoint);
Serial.println(Wind);
Serial.println(Dust);
}