51单片机使用 ESP8266获取网络天气
ESP8266在硬件区域中是很常见的一款外设,而对于初学者来说,使用ESP8266是比较困难的,但熟悉了它的AT指令就会简单很多
本文章主要介绍51单片机使用ESP8266进行获取网络信息
在使用之前,必须先在串口进行相关调试
连接网络后发送
AT+CIPSTART=“TCP”,“api.seniverse.com”,80
AT+CIPSEND=115
ok >GET https://api.seniverse.com/v3/weather/now.json?key=SXHYpmO63Tt2tNMFu&location=shenzhen&language=zh-Hans&unit=c
发送数据一定要确定好字节数,不然需要多次发送
我使用的是心知天气API
目前有很多支持API接口的,小伙伴们可以自习百度搜索
接下来会接收到
+IPD,267:{“results”:[{“location”:{“id”:“WS10730EM8EV”,“name”:“娣卞湷”,“country”:“CN”,“path”:“娣卞湷,娣卞湷,骞夸笢,涓浗”,“timezone”:“Asia/Shanghai”,“timezone_offset”:“+08:00”},“now”:{“text”:“灏忛洦”,“code”:“13”,“temperature”:“28”},“last_update”:“2020-08-05T12:50:00+08:00”}]}CLOSED
其中 code是天气代码 这就是我们需要获取的数据
在51中,无法全部接收数据(数组定义太大,导致AT发送乱码)
因此需要判断一个标识位
我选择的是 ‘:’
在此是第13个,所以判断13个: 后开始接收数据
代码如下
void time0() interrupt 4
{
uchar ch;
if(RI)
{
RI = 0;
ch = SBUF;
if(ch == ':')
{
count++;
}
else if(ch == '\r')
{
// get_Flag = 1;
ES_pos = 0;
count = 0;
}
if(count == 13 || count == 14) //天气和温度在第13个:后面
{
str_1[ES_pos] = ch;
ES_pos++;
}
else if(count == 15)
{
get_Flag = 1;
}
else
{
ES_pos = 0;
}
}
}
//连接核心代码```
```c
/*是否连接 用于判断是否和服务器连接*/
bit isConnect()
{
bit sta = 0;
uchar a,b;
a = ES_GetByte();
b = ES_GetByte();
if(a == 'C' || b == 'O') //CONNECT
{
sta = 1;
}
else if(a == 'A' || b == 'L') //ALeary
{
sta = 1;
}
return sta;
}
/*发送连接AT指令*/
void ES_ConnectInit()
{
ES_SendStr2(AT_str,37);
ES_delayms(10000);
//getMessage();
}
/*发送获取天气指令*/
void ES_ConnectGet()
{
bit sta = 0;
//连接远程服务端
uint i = 0;
do{
ES_SendStr2(AT_str1,43);
ES_delayms(100);
i++;
sta = isConnect();
}while(sta == 0 && i < 10);
//发送115个字节
ES_SendStr2(AT_str2,16);
ES_delayms(3000);
//发送api接口信息
ES_SendStr(AT_str3);
}
/*发送指令并获取回显信息*/
void ES_ConnectDeal()
{
// showStr("AB");
ES_ConnectGet();
ES_GetStr();
}
之后我们只需要将接收到的数据进行判断就能获取网络天气信息等
若有相关AT指令引发的错误,请查看我的上一篇AT错误内容