基于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)
2018-11-9 00:49 上傳
點擊文件名下載附件
|