基于OneNet平台的传感器监测使用说明(以dht11为例)
1. 将电话卡(SIM900A使用的是标准SIM卡,SIM800C使用的是micro-SIM卡,这里的“卡”指的是联通、移动卡,电信卡不支持)插入GPRS模块后,上点启动,会出现以下画面,提示正在初始化连接,确保已退出其它连接 2.连接OneNet平台,会出现以下画面,表明正在连接Onenet平台 3.如果Onenet连接成功,LCD1602显示屏上会显示“Onenet Is Ready”,但是正常情况下“Onenet Is Ready”字样会一闪而过,被后面的“Data Is Ready”很快覆盖,所以如果长期卡在”Onenet Is Ready”表明传感器的数据读取出现了问题,请检查传感器是否完好。因此正常情况下,我们会看到以下画面 4.紧接着我们会看到上传的进度条显示,像这样(我共分为7步来标识上传进度,具体每步所做工作参照代码)
出现“7 of 7”表明我们的数据上传工作完成,我们将进入下一步 5.判断数据上传是否成功,如果数据上传成功,会出现“SEND OK”,如果上传失败,会出现“SEND FAIL”。当然,上传结果的判断不能保证完全准确,但是经过测试在大多数情况下是准确的,因为跟网络情况有关,有时不能成功检测到成功的标志。(就像原本有检测是否连上网络功能的,但是检测太耗时,故后面删除了相关代码) 6.最后,LCD1602会显示本次上传的传感器数据值,像下图 以上就是基于OneNet平台的传感器监测使用说明,以DHT11温湿度传感器为例,其它的操作方法类似 代码: - //C库
- #include <reg52.h>
- #include <stdio.h>
- #include <string.h>
- //硬件驱动
- #include "lcd.h" //lcd1602
- #include "dht11.h" //dht11温湿度传感器
- //#define FOSC_110592M //看你使用的晶振是什么,选择启用的宏定义
- #define FOSC_12M
- #define DEVID "25336321"
- #define APIKEY "v5lJaPvQHj=qjBUSYmGOVnA5TX8="
- //以下用于保存单片机收到模块发来的AT指令,通过这些指令单片机可以判断模块的状态
- uchar GsmRcv[50] = {0};
- uchar GsmRcvAt[50] = {0};
- uchar GsmRcvCnt = 0;
- uchar GsmAtFlag = 0;
- Sensor_Structure Sensor_Data;
- void SerialInti()//串口初始化程序
- {
- TMOD=0x20;//定时器1操作模式2:8位自动重载定时器
- #ifdef FOSC_12M //在这里根据晶振大小设置不同的数值初始化串口,
- //如果用的12M晶振的话装下面两种值都可以,但
- //个人推荐用6250,能有效减小误码率,保证对GPRS模块返回信息的准确判断
- TH1=0xfb;//装入初值,波特率6250
- TL1=0xfb;
- // TH1=0xf3;//装入初值,波特率2400
- // TL1=0xf3;
- #else
- TH1=0xfd;//装入初值,波特率9600
- TL1=0xfd;
- #endif //
-
- TR1=1;//打开定时器
- SM0=0;//设置串行通讯工作模式
- SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据
- REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)
- EA=1;//开总中断
- ES=1;//开串行口中断
- }
- /*串行通讯中断,收发完成将进入该中断*/
- void Serial_interrupt() interrupt 4
- {
- uchar i = 0;
- if(RI == 1) //收到信息
- {
- RI=0;//接收中断信号清零,表示将继续接收
-
- GsmRcv[GsmRcvCnt] = SBUF;
- GsmRcvCnt++;
- //收到了完整的AT指令,完整的AT指令是以0x0d 0x0a结尾的。故作此判断,在接收的过程中是否收到0x0d 0x0a
- if(GsmRcv[GsmRcvCnt-2] == 0x0d && GsmRcv[GsmRcvCnt-1] == 0x0a && GsmRcvCnt >= 4)
- {
- //一旦收到0x0d 0x0a,就将数据保存起来。用户主函数的判断。
- for(i=0; i<GsmRcvCnt; i++)
- {
- GsmRcvAt[i] = GsmRcv[i];
- GsmRcv[i] = 0;
- }
- GsmRcvCnt = 0;
- GsmAtFlag = 1;//收到了完整的at指令,通过这个标志位置1,这样主函数就知道去判断了。
-
- }
- else if(GsmRcvCnt >= 50)//因为内存有限,收到了50个字符还是没有看到0x0a 0x0d的话,就重新开始接收吧。
- {
- GsmRcvCnt = 0;
- }
-
- }
- }
- void Uart1Send(uchar c)
- {
- SBUF=c;
- while(!TI);//等待发送完成信号(TI=1)出现
- TI=0;
- }
- //串行口连续发送char型数组,遇到终止号/0将停止
- void Uart1Sends(uchar *str)
- {
- while(*str!='\0')
- {
- SBUF=*str;
- while(!TI);//等待发送完成信号(TI=1)出现
- TI=0;
- str++;
- }
- }
- //延时函数大概是1s钟,不过延时大的话不准...
- void DelaySec(int sec)
- {
- uint i , j= 0;
- for(i=0; i<sec; i++)
- {
- for(j=0; j<65535; j++)
- {
- }
- }
- }
- //判断是否上传成功
- void OneNet_RevPro(unsigned char *GsmRcvAt)
- {
- if(strstr((char *)GsmRcvAt, "CLOSED"))
- {
- LcdWriteString("TCP CLOSED",strlen("TCP CLOSED"),0x80+0x40,0);
- }
- else
- {
- //这里用来检测是否发送成功
- if(strstr((char *)GsmRcvAt, "succ"))
- {
- LcdWriteString("SEND OK",strlen("SEND OK"),0x80+0x40,0);
- }
- else
- {
- LcdWriteString("SEND FAIL",strlen("SEND FAIL"),0x80+0x40,0);
- }
- }
- }
- void main()
- {
- uchar i = 0;
- char xdata text[28];
- char xdata buf1[60];
- SerialInti(); //串口初始化
- LcdInit(); //LCD1602初始化
-
- GsmAtFlag = 0;
- while(GsmAtFlag == 0) //确保波特率同步良好
- {
- Uart1Sends("ATI\r\n");
- DelaySec(1);//延时1秒
- }
- GsmAtFlag = 0;
- while(1)
- {
- LcdWriteString("Init Connection",strlen("Init Connection"),0x80,1);
- Uart1Sends("AT+CIPCLOSE\r\n");
- DelaySec(1);
- Uart1Sends("AT+CIPSHUT\r\n");
- DelaySec(1);
- LcdWriteString("Connect Onenet",strlen("Connect Onenet"),0x80,1);
- Uart1Sends("AT+CLPORT=\"TCP\",\"2000\"\r\n");//发送指令指定本地端口
- DelaySec(1);
- Uart1Sends("AT+CIPSTART=\"TCP\",\"183.230.40.33\",\"80\"\r\n");//此处修改你建立服务器的IP,服务器端口号8080
- DelaySec(2);
- if(GsmAtFlag == 1 && strstr(GsmRcvAt, "CONNECT OK") )//检测是否收到 CONNECT OK ,如果这连接成功
- {
- LcdWriteString("Onenet Is Ready",strlen("Onenet Is Ready"),0x80,1);
- Sensor_Data=DHT11_receive();
- LcdWriteString("Data Is Ready",strlen("Data Is Ready"),0x80,1);
- Uart1Sends("AT+CIPSEND\r\n");
- DelaySec(1);
- LcdWriteString("Start Upload",strlen("Start Upload"),0x80,1);
- memset(buf1, 0, sizeof(buf1));
- LcdWriteString("Schedule:",strlen("Schedule:"),0x80,1);
- sprintf(buf1,"POST /devices/%s/datapoints?type=3 HTTP/1.1\r\n",DEVID);
- LcdWriteString("1 of 7",strlen("1 of 7"),0x80+0x40,0);
- Uart1Sends(buf1);//向服务器发送数据
- DelaySec(1);
- memset(buf1, 0, sizeof(buf1));
- sprintf(buf1,"api-key:%s\r\n",APIKEY);
- LcdWriteString("2 of 7",strlen("2 of 7"),0x80+0x40,0);
- Uart1Sends(buf1);
- DelaySec(1);
- LcdWriteString("3 of 7",strlen("3 of 7"),0x80+0x40,0);
- Uart1Sends("Host:api.heclouds.com\r\n");
- DelaySec(1);
- memset(text, 0, sizeof(text));
- memset(buf1, 0, sizeof(buf1));
- strcpy(buf1, "{");
- memset(text, 0, sizeof(text));
- sprintf(text, "\"Temperature\":%f,",Sensor_Data.temp_l*0.01+Sensor_Data.temp_h);
- strcat(buf1, text);
- memset(text, 0, sizeof(text));
- sprintf(text, "\"Humidity\":%f",Sensor_Data.humi_l*0.01+Sensor_Data.humi_h);
- strcat(buf1, text);
- strcat(buf1, "}");
- memset(text, 0, sizeof(text));
- sprintf(text,"Content-Length:%d\r\n",strlen(buf1));
- LcdWriteString("4 of 7",strlen("4 of 7"),0x80+0x40,0);
- Uart1Sends(text);
- LcdWriteString("5 of 7",strlen("5 of 7"),0x80+0x40,0);
- Uart1Sends("\r\n");
- DelaySec(1);
- LcdWriteString("6 of 7",strlen("6 of 7"),0x80+0x40,0);
- Uart1Sends(buf1);
- DelaySec(1);
- LcdWriteString("7 of 7",strlen("7 of 7"),0x80+0x40,0);
- Uart1Send(0x1a);//以0x1a结束
- DelaySec(1);
- LcdWriteString("Upload Result:",strlen("Upload Result:"),0x80,1);
- while(GsmAtFlag==0);
- OneNet_RevPro(GsmRcv);
- DelaySec(6);
- }
-
- }
- }
复制代码
全部资料51hei下载地址:
GSM +DHT11.zip
(88.47 KB, 下载次数: 200)
|