ESP8266获取网络时钟、天气

ESP8266获取网络时钟、天气,第1张

硬件平台

正点原子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("%s\r\n",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));
	}
}

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/791698.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存