硬件:51單片機,ESP8266
云平臺:OneNet平臺
功能:51單片機通過ESP8266連接OneNet平臺,通過GET方法得到OneNet發送的數據,進而單片機讀取進行下一步操作。
這是2018年編寫的程序,由于年代久遠,可能不是很好用,但大體思路是這樣的。讀者該修改的地方修改,OneNET平臺該注冊的注冊,注意用的是HTTP協議。
代碼:
注意,我注釋了的地方也有用,讀者可根據實際情況修改。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint a,i,flag,temp;
sbit DQ=P2^4;
sbit k1=P1^0;
char bb[1]="";
char aa[1]="";
sbit b=P1^4;
uchar datalen = 0;
uchar value;
uchar cnt = 0;
uchar recbuffer[51]=""; //接收緩沖
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit LED5=P0^4;
//void delay(uint i) //延時5us
//{
// do
// {
// _nop_();
// _nop_();
// _nop_();
// i--;
// }
// while(i);
//}
void delay1(uint z) //延時1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void sendChar(uchar a) //單片機發送一個字節
{
SBUF = a;
while(TI==0);
TI=0;
}
void sendString(uchar *s) //發送一個字符串
{
while(*s!='\0')
{
sendChar(*s);
s++;
}
}
void init()
{
/*串口中斷定時器初始化*/
TMOD=0x20; //定時器1工作在方式2
TH1=0xfd; //波特率為9600,精振為11.0592MHz
TL1=0xfd;
REN=1; //啟動串行口接收數據
SM0=0; //串口工作在方式1
SM1=1; //串行口工作方式選擇
EA=1; //打開總中斷
TR1=1; //打開定時器中斷
/*esp8266初始化*/
sendString("AT\r\n");
delay1(1000);
sendString("AT+RST\r\n");
delay1(1000);
sendString("AT+CWMODE=3\r\n"); //設置WIFI應用模式
delay1(1000);//設置WIFI應用模式
sendString("AT+RST\r\n"); //重置WIFI模塊
delay1(1000);
sendString("AT+CIFSR\r\n"); //查詢本地IP
delay1(1000);
sendString("AT+CWJAP=\"123456\",\"wds123456\"\r\n"); //連接無線路由器
delay1(1000);
}
//void chuansu() //單片機通過8266給OneNET傳送數據
//{
// sendString("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n");//和服務器建立TCP連接
// delay1(1000);
// sendString("AT+CIPMODE=1\r\n"); //進入透明傳輸模式
// delay1(1000);
// sendString("AT+CIPSEND\r\n"); //開始傳輸
// delay1(1000);
// sendString("POST /devices/527602572/datapoints?type=3 HTTP/1.1\r\n");
// delay1(1000);
// sendString("api-key:sggrqbMr4YanhJ2YyjP6E=EwWd4=\r\n");
// delay1(1000);
// sendString("Host:api.heclouds.com\r\n");
// delay1(1000);
// sendString("Content-Length:11\r\n");
// delay1(1000);
// sendString("\r\n");
// delay1(1000);
// sendString("{\"temp\":");
// delay1(1000);
// sendString("30"); //aa為溫度數據
// delay1(1000);
// sendString("}");
// delay1(1000);
// sendString("\r\n");
// delay1(1000);
// ES=1; //開串口中斷
//}
void kg1()
{
sendString("AT+CIPMUX=0\r\n");
delay1(1000);
sendString("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n"); //和服務器建立TCP連接
delay1(1000);
sendString("AT+CIPMODE=1\r\n"); //進入透明傳輸模式
delay1(1000);
sendString("AT+CIPSEND\r\n"); //開始傳輸
delay1(1000);
sendString("GET /devices/527602572/datastreams/kg1 HTTP/1.1\r\n");
delay1(800);
sendString("api-key:BfVl=mcQuY7JB9BAnAEW=UZdIB8=\r\n");
delay1(800);
sendString("Host:api.heclouds.com\r\n");
delay1(800);
sendString("\r\n");
ES=1;
}
void main()
{
init();
while(1)
{
// if(k1==0) //當k1按下時就給OneNET平臺發送一次溫度數據
// {
// delay1(10);
// if(k1==0)
// {
// chuansu();
// }
// }
kg1();
// if(value == '1')
// LED1=0;
// if(value == '0')
// LED1=1;
// if(value == '3')
// LED2=0;
// if(value == '2')
// LED2=1;
// if(value == '5')
// LED3=0;
// if(value == '4')
// LED3=1;
// if(value == '7')
// LED4=0;
// if(value == '6')
// LED4=1;
// if(value == '9')
// LED5=0;
// if(value == '8')
// LED5=1;
switch(value)
{
case '1':
LED1=0;
break;
case '0':
LED1=1;
break;
case '3':
LED2=0;
break;
case '2':
LED2=1;
break;
case '5':
LED3=0;
break;
case '4':
LED3=1;
break;
case '7':
LED4=0;
break;
case '6':
LED4=1;
break;
case '9':
LED5=0;
break;
case '8':
LED5=1;
break;
}
}
}
void Usart() interrupt 4
{
uchar rec;
if(RI != 0)
{
rec = SBUF;
RI = 0;
}
if(rec == '{')
cnt = 1;
if(cnt == 1)
{
if(rec != '}')
{
recbuffer[datalen++] = rec;
}
else
{
cnt = 0;
value = recbuffer[datalen - 1];
datalen = 0;
}
}
}
|