ESP8266简易WIFI天气时钟
1 HTTP获取网络天气
连网获取网络天气,一般需要通过http的方式,从天气信息提供商的网络地址获取天气信息。
1.1 注册开发者key
这里以心知天气为例,需要先注册一个开发者账号,然后获取自己的私钥,也就是等下要用到的key。

然后可以先在浏览器中输入如下链接,注意要将自己的key替换进去,然后就可以测试一下天气信息的获取情况。
如下即为获取的天气信息,是json格式的:

1.2 http请求基本原理
在编写代码之前,需要先了解一下基础的http请求原理。
url全称是资源描述符,一个url地址,用于描述一个网络上的资源,而http中的get、post、put、delete就对于着这个资源的查、改、增、删4个操作,get一般用于获取/查询资源信息。
url的格式: 【协议】://【主机名(或者叫域名)】【:端口号(可选)】/【文件路径】/【文件名】
例如:
协议:https
域名:api.seniverse.com
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。

服务器HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

根据http协议,可以编写ESP8266进行http请求的代码:
1.3 json数据解析
http请求获取到的天气数据是json格式的,需要对数据进行解析,获取到具体的天气和温度等数据。
可以将获取的json原始数据打印出来,方便确认程序是否获取到的天气数据。
具体代码如下:
原始json格式的天气数据和解析后的天气和温度数据如下:

天气现象代码对照表
解析到的天气数据,除了英文形式的天气信息(text),还有一个对应的天气码(code),如上图的Cloudy对应的天气码是4。通过天气码,也可以转换为天气。天气码的对照表可参考心知天气文档:https://docs.seniverse.com/api/start/code.html

简化起见,这里只使用常用的4种天气。
代码中文英文0晴(国内城市白天晴)Sunny4多云Cloudy9阴Overcast13小雨Light Rain0
2 NTP网络时间
NTP(Network Time Protocol) 是网络时间协议,它是用来同步网络中各个计算机时间的协议。
ESP8266可以连网,那就也可以通过获取网络时间来得到当前的时间:
3 OLED显示页面设计
获取到天气信息和时间后,需要将这些信息显示出来。
这里使用0.96寸OLED显示屏来显示,借助U8g2库,显示文字与天气图标(U8g2库的使用,可参考:https://www.bilibili.com/read/cv15542275)。
具体的显示代码如下:
4 最终效果
