1.云平台的创建和应用是一个复杂的过程,但中移物联网为用户提供了一个非常实用的平台,屏蔽了复杂的技术细节,用户只要在中移物联网的官网上注册一个账号后就可以进入自己的云平台的创建了,创建流程如图:
OneNET官网可注册账号,登录OneNET云平台后,点击进入界面上右上角的“开发者中心”,然后“添加产品”添加产品进行产品的创建,创建产品时产品的信息可以由用户自己决定,但是最后一项的网络通信格式的选择及其重要,它决定了你下位机发送数据的方式。因之前传输协议选择了HTTP,那么这里也要选择HTTP格式。
2.设备建完后,需要点击进入“设备列表”,在创建的设备后点“数据流”,进行数据流模板管理。添加数据流模板,这是Arduino进行数据传输中post请求中的数据流名称,如果没有对应的数据流,OneNET服务器就接收不到你传的数据。建立如图5.7的数据流:
3.之后,就是应用的创建了,创建应用时要选择将应用添加到先前创建的设备下面,完成了应用的创建就可以对其进行编辑了,有仪表盘、折线图等可以选择。为了使数据更加直观的展现在我们眼前,在应用中为每一个数据流添加显示设备。
4.邮箱报警功能创建,在创建的产品中点击“触发器管理”,然后“添加触发器”。可选数据流和触发条件,建立如图5.7.2的条件触发器。当其中的“humi”或“temp”达到触发条件,即“humi>80”, “temp>35”时,OneNET服务器会发送超限值的信息到设定的邮箱。
好吧,最重要的完整代码。自己保存成相应的文件应该能用,不要弄记事本里面!
#include
#include
#include "DHT11.h"
#define fan 9
#define beep 10
DHT11 myDHT11(11);
SoftwareSerial mySerial(12, 13); // RX, TX
char ssid[] = "FENG"; //这里填写自己的Wifi账号
char password[] = "12345678"; //这里填写自己的Wifi密码
#define DevicesID 516128482
char APIkey[] = "wsZg=kanSndl6XnjadWqwbgDi=E=";
int temp=1;
int humi=1;
void set_ESP8266(void)
{
Serial.begin(115200); //设置esp8266波特率为115200
delay(1000);
Serial.println("AT"); //判断模块是否正常
delay(1000);
Serial.println("AT+CWMODE=3"); //设置WIFI应用模式
delay(1000);
Serial.println("AT+RST"); //重置WIFI模块
delay(3000);
Serial.print("AT+CWJAP=\""); //连接无线路由器
Serial.print(ssid);
Serial.print("\",\"");
Serial.print(password);
Serial.println("\"");
delay(8000);
Serial.println("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80"); //和服务器建立TCP连接
delay(1000);
Serial.println("AT+CIPMODE=1"); //进入透明传输模式
delay(3000);
Serial.println("AT+CIPSEND"); //开始传输
delay(2000);
}
void setup() //Arduino程序初始化程序放在这里,只在开机时候运行一次
{
mySerial.begin(9600); //设置sim900a波特率为9600
pinMode(fan,OUTPUT); //确定引脚的功能, OUTPUT 数字输出
pinMode(beep,OUTPUT);
digitalWrite(fan,HIGH); //设定风扇引脚为高电平
digitalWrite(beep,HIGH);
set_ESP8266(); //连网,与onenet建立连接,开启透传
}
void loop() //Arduino程序的主程序部分,循环运行内部程序
{
myDHT11.DHT11_Read(); //读取温湿度值
ESP8266_SendMessage();
if(myDHT11.TEM_Buffer_Int>30 || myDHT11.HUMI_Buffer_Int>50)
{
digitalWrite(beep,LOW); //输出LOW电平,发声
digitalWrite(fan,LOW);
SIM900A_SendMessage();
}
else
{
digitalWrite(beep,HIGH); //输出HIGH电平, 停止发声
digitalWrite(fan,HIGH);
}
//delay(1000); //延时1s
}
void ESP8266_SendMessage(void) //合成post请求
{
Serial.print("POST /devices/");
Serial.print(DevicesID);
Serial.println("/datapoints HTTP/1.1");
Serial.print("api-key:");
Serial.println(APIkey);
Serial.println("Host:api.heclouds.com");
Serial.println("Content-Length: 59");
Serial.println("");
Serial.print("{\"datastreams\":[{\"id\":\"Temp\",\"datapoints\":[{\"value\":");
Serial.print(myDHT11.TEM_Buffer_Int);
Serial.println("}]}]}");
delay(1000);
Serial.print("POST /devices/");
Serial.print(DevicesID);
Serial.println("/datapoints HTTP/1.1");
Serial.print("api-key:");
Serial.println(APIkey);
Serial.println("Host:api.heclouds.com");
Serial.println("Content-Length: 59");
Serial.println("");
Serial.print("{\"datastreams\":[{\"id\":\"Humi\",\"datapoints\":[{\"value\":");
Serial.print(myDHT11.HUMI_Buffer_Int);
Serial.println("}]}]}");
delay(1000);
}
void SIM900A_SendMessage()
{
mySerial.print("AT+CSCS=\"GSM\"\r\n"); //设置GSM字符集
delay(1000);
mySerial.print("AT+CMGF=1\r\n"); //设置为文本模式
delay(1000);
mySerial.print("AT+CMGS=\"18888888888\"\r\n"); //设置手机号
delay(1000);
mySerial.print("HUMI = ");
mySerial.print(myDHT11.HUMI_Buffer_Int);
mySerial.println(" %RH");
mySerial.print("TMEP = ");
mySerial.print(myDHT11.TEM_Buffer_Int);
mySerial.println(" ℃");
delay(1000);
mySerial.write(0x1A); //“CTRL+Z”的键值,即用于告诉SIM900A,要执行发送操作 (HEX)格式单独发送
delay(1000);
}
#ifndef __DHT11_H__
#define __DHT11_H__
#include
class DHT11
{
public:
DHT11(int pin);
void DHT11_Init();
unsigned char DHT11_Read_Byte();
void DHT11_Read();
unsigned char HUMI_Buffer_Int;
unsigned char TEM_Buffer_Int;
private:
int DHT11_DQ;
};
#endif
#include "DHT11.h"
//定义变量
unsigned char HUMI_Buffer_Int = 0;
unsigned char TEM_Buffer_Int = 0;
DHT11::DHT11(int pin)
{
DHT11_DQ = pin;
}
//****************************************************
//初始化DHT11
//****************************************************
void DHT11::DHT11_Init()
{
pinMode(DHT11_DQ,OUTPUT);
digitalWrite(DHT11_DQ,LOW); //拉低总线,发开始信号;
delay(30); //延时要大于 18ms,以便 DHT11 能检测到开始信号;
digitalWrite(DHT11_DQ,HIGH);
delayMicroseconds(40); //等待 DHT11 响应;
pinMode(DHT11_DQ,INPUT_PULLUP);
while(digitalRead(DHT11_DQ) == HIGH);
delayMicroseconds(80); //DHT11 发出响应,拉低总线 80us;
if(digitalRead(DHT11_DQ) == LOW);
delayMicroseconds(80); //DHT11 拉高总线 80us 后开始发送数据;
}
//****************************************************
//读一个字节DHT11数据
//****************************************************
unsigned char DHT11::DHT11_Read_Byte()
{
unsigned char i,dat = 0;
unsigned int j;
pinMode(DHT11_DQ,INPUT_PULLUP);
delayMicroseconds(2);
for( i=0; i<8; i++)
{
while(digitalRead(DHT11_DQ) == LOW); //等待 50us;
delayMicroseconds(40); //判断高电平的持续时间,以判定数据是‘0’还是‘1’;
if(digitalRead(DHT11_DQ) == HIGH)
dat |= (1<<(7-i)); //高位在前,低位在后;
while(digitalRead(DHT11_DQ) == HIGH); //数据‘1’,等待下一位的接收;
}
return dat;
}
//****************************************************
//读取温湿度值,存放在TEM_Buffer和HUMI_Buffer
//****************************************************
void DHT11::DHT11_Read()
{
DHT11_Init();
HUMI_Buffer_Int = DHT11_Read_Byte(); //读取湿度的整数值
DHT11_Read_Byte(); //读取湿度的小数值
TEM_Buffer_Int = DHT11_Read_Byte(); //读取温度的整数值
DHT11_Read_Byte(); //读取温度的小数值
DHT11_Read_Byte(); //读取校验和
delayMicroseconds(50); //DHT11拉低总线50us
pinMode(DHT11_DQ,OUTPUT);
digitalWrite(DHT11_DQ,HIGH); //释放总线
}
附上我的onenet应用