栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

ESP8266获取网络时钟、天气

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ESP8266获取网络时钟、天气

硬件平台

正点原子ESP8266

前提

烧录到ESP8266的固件版本不要太老了,用比较新的(具体界限不清楚)

以安信可官网提供的AT固件举例,第5个不支持获取网络时间(AT指令不支持),我用的是第4个。

烧录固件

烧写固件需要注意的端口

端口连接
rst低电平复位(内部上拉)
io_00:烧录模式 1:运行模式(内部上拉)

1、io_0接地
2、点击下载工具的START之后,复位ESP8266,接地之后拔开

获取网络时间

其实就两个AT指令,都不用连接(热点/路由器)

AT+CIPSNTPCFG=1,8		
AT+CIPSNTPTIME?			

下图中,返回的时间格式:周 月 日 时:分:秒 年
提取时间可以识别 TIME: 这个字符串,不能仅仅识别 TIME 这个字符串,因为串口会回传发送的AT指令,其中有 TIME? 这个字符串。

这里我在使用的时候都会有时间不对的情况(原因未知),30s以内都会恢复到正常的时间上。

获取天气情况
AT+CWMODE=1
AT+CWJAP="SSID","password"			
AT+CIPMUX=0
AT+CIPSTART="TCP","api.seniverse.com",80		
AT+CIPMODE=1	
AT+CIPSEND										

配置完ESP8266之后就发送获取天气情况的代码

GET https://api.seniverse.com/v3/weather/now.json?key=xxxxxx&location=chongqing&language=zh-Hans&unit=c

"xxxxxx"对应申请的密钥,地点也可以修改,我获取的是重庆的天气
发送完成之后,服务器会返回你一个固定的格式

其中‘code’后面对应的数字就是天气代码,查看心知天气的官网文档可知道实际的天气
‘temperature’对应天气温度
官网天气代码 — 天气实际情况对应图如下

https://seniverse.yuque.com/books/share/e52aa43f-8fe9-4ffa-860d-96c0f3cf1c49/yev2c3
如何提取数据

使用C语言标准库函数:strstr(); 查找子串,返回一个指针,指向字串的首地址
注意:串口接收到的是字符!!!要转化为数值

unsigned int Char_To_Decimalism(unsigned char Char){
    if(Char == '0')         return 0;
    else    if(Char == '1') return 1;
    else    if(Char == '2') return 2;
    else    if(Char == '3') return 3;
    else    if(Char == '4') return 4;
    else    if(Char == '5') return 5;
    else    if(Char == '6') return 6;
    else    if(Char == '7') return 7;
    else    if(Char == '8') return 8;
    else    if(Char == '9') return 9;
    else                    return 0;

}

void Get_Weather_Data(unsigned int *code,unsigned int *temp){
    unsigned char temp_h,temp_l;
    unsigned int data1,data2;

	if(strstr((const char *)esp8266_buf, ""code"") != NULL){
		WeatherPtr = strstr((const char *)esp8266_buf, ""code"");
		temp_h = (*(WeatherPtr+8));
        temp_l = (*(WeatherPtr+9));
        if(temp_l == '"'){
            data1 = Char_To_Decimalism(temp_h);
            *code = data1;
        }  
        else{
            data1 = Char_To_Decimalism(temp_h);
            data2 = Char_To_Decimalism(temp_l);
            *code = data1*10+data2;
        }
            
	}
	if(strstr((const char *)esp8266_buf, ""temperature"") != NULL){
		WeatherPtr = strstr((const char *)esp8266_buf, ""temperature"");
		temp_h = (*(WeatherPtr+15));
        temp_l = (*(WeatherPtr+16));
		if(temp_l == '"'){
            data1 = Char_To_Decimalism(temp_h);
            *temp = data1;
        }  
        else{
            data1 = Char_To_Decimalism(temp_h);
            data2 = Char_To_Decimalism(temp_l);
            *temp = data1*10+data2;
        }
	}
}

void Get_Net_Time(){
    Usart2_SendString(get_time_buf,sizeof(get_time_buf));
    if(strstr((const char *)esp8266_buf, "TIME:") != NULL){
		TimePtr = strstr((const char *)esp8266_buf, "TIME:");
		printf("%srn",TimePtr+5);
        sprintf(time_buf,"%.8s",TimePtr+16);
        LCD_ShowString(100,110,200,24,24,(u8 *)time_buf);
        memset(esp8266_buf,0,sizeof(esp8266_buf));
	}
}

这部分实现的一个效果如下

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847475.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号