硬件部分:
1.ESP-32开发板 1块
2.SSD1306的0.96寸OLED屏幕(4,7孔均可) 1块
3.杜邦线 若干
软件部分:
1.Visual Studio Code Platformio
2.任意串口调试助手
方法很简单,直接调用Arduino库函数
#include
//预设WiFi热点账号与密码
const char* ssid = "预设WiFi账号";
const char* password = "预设WiFi密码";
//预设接口地址 城市 API接口密钥
String url = "(不唯一)具体参考聚合数据网页版的天气预报模块";
String city = "(城市名称)";
String key = "个人API接口密钥";
void setup() {
//串口初始化
Serial.begin(9600);
// 连接 WiFi
WiFi.begin(ssid, password);
Serial.print("正在连接 Wi-Fi");
// 检测是否连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("连接成功");
Serial.print("IP 地址:");
Serial.println(WiFi.localIP());
}
具体API接口获取,下面给出一种方式,可根据个人需求修改
直接进入网站寻找接口地址 即可 这里是 http://apis.juhe.cn/simpleWeather/query;
密钥获取:直接查看个人API的key即可;
这样我们运行程序,正确连接WiFi,通过串口打印结果即可(波特率预设9600)
正确结果为:
正在连接 Wi-Fi.连接成功
IP 地址:192.168.118.229
利用API接口提取的数据为json格式并不能直接进行使用,需要进行提取
我们需要另外两个库函数
#include
#include
其中
(如果导入比较慢,则需要上魔法)
接着进行数据读取和解析提取 温度(temp) 天气(info) 空气指数(aqi)
// 创建 HTTPClient 对象
HTTPClient http;
// 发送GET请求
http.begin(url+"?city="+city+"&key="+key);
int httpCode = http.GET();
// 获取响应状态码
Serial.printf("HTTP 状态码: %d\n", httpCode);
// 获取响应正文
String response = http.getString();
//Serial.println("响应数据");
//Serial.println(response);
http.end();
// 创建 DynamicJsonDocument 对象
DynamicJsonDocument doc(1024);
// 解析 JSON 数据
deserializeJson(doc, response);
// 从解析后的 JSON 文档中获取值
unsigned int temp = doc["result"]["realtime"]["temperature"].as();
String info = doc["result"]["realtime"]["info"].as();
int aqi = doc["result"]["realtime"]["aqi"].as();
Serial.println("徐州");
Serial.printf("温度: %d\n", temp);
Serial.printf("天气: %s\n", info);
Serial.printf("空气指数: %d\n", aqi);
HTTP 状态码: 200
[ 1266][E][WiFiClient.cpp:517] flush(): fail on fd 48, errno: 11, "No more processes"
徐州
温度: 30
天气: 晴
空气指数: 109
获取了相关天气数据后我们最后进行OLED驱动设置即可
u8g2库需要我们在plantfromio的home里面的library里面进行搜索;
之后进行下载,导入工程文件即可
下面给出示例代码(仅用作参考,后面会进行部分修正)
基于i2c协议
Vcc 3.3v
Gnd vee
D0 OLED_SCK
D1 OLED_SCA
#include
#include
#define WIDTH 128
#define HEIGHT 64
#define OLED_SCA 13
#define OLED_SCK 18
#define OLED_REST 15
//基于u8g2库i2c协议构造结构体u8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,OLED_REST,OLED_SCK,OLED_SCA);
void setup() {
// Serial.begin(115200);
// u8g2.setBusClock(800000);
//u8g2(OLED)初始化
u8g2.begin();
//u8g2库字体使能
u8g2.enableUTF8Print();
}
void loop() {
// static unsigned int start = millis();
//清除显示
u8g2.clearBuffer();
//设置英文字符字体
u8g2.setFont(u8g2_font_ncenB12_tf);
//设置光标位置并绘制字体
u8g2.drawStr(0,13,"Hello World!");
//切换中文GB字体
u8g2.setFont(u8g2_font_wqy14_t_gb2312);
//设置光标位置
u8g2.setCursor(0,30);
//绘制中文
u8g2.print("你好");
设置光标位置并绘制中文
u8g2.drawUTF8(0,50,"嘿嘿");
//选择字体大小并绘制图案
u8g2.setFont(u8g2_font_open_iconic_weather_4x_t);
u8g2.drawGlyph(90,60,0x0045);
//显示绘制内容
u8g2.sendBuffer();
// static unsigned int end = millis();
// Serial.println(end-start);
}
u8g2库是一种很强的库,基本涵盖了OLED所有的开与显示可能。
最后,把得到的数据利用u8g2.print();进行显示即可,下面是完整整合代码
#include
#include
#include
#include
#include
#define WIDTH 128
#define HEIGHT 64
#define OLED_SCA 13
#define OLED_SCK 18
#define OLED_REST 15
//基于u8g2库i2c协议构造结构体u8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,OLED_REST,OLED_SCK,OLED_SCA);
//WIFI账号密码设置
const char* ssid = "预设WiFi账号";
const char* password = "预设WiFi密码";
//预设接口地址 城市 API接口密钥
String url = "(不唯一)具体参考聚合数据网页版的天气预报模块";
String city = "(城市名称)";
String key = "个人API接口密钥";
unsigned int temp;
String info;
int aqi;
void setup() {
//u8g2(OLED)初始化
u8g2.begin();
//u8g2库字体使能
u8g2.enableUTF8Print();
//初始化串口
Serial.begin(9600);
// 连接 WiFi
WiFi.begin(ssid, password);
Serial.print("正在连接 Wi-Fi");
// 检测是否连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("连接成功");
Serial.print("IP 地址:");
Serial.println(WiFi.localIP());
// 创建 HTTPClient 对象
HTTPClient http;
// 发送GET请求
http.begin(url+"?city="+city+"&key="+key);
int httpCode = http.GET();
// 获取响应状态码
Serial.printf("HTTP 状态码: %d\n", httpCode);
// 获取响应正文
String response = http.getString();
//Serial.println("响应数据");
//Serial.println(response);
http.end();
// 创建 DynamicJsonDocument 对象
DynamicJsonDocument doc(1024);
// 解析 JSON 数据
deserializeJson(doc, response);
// 从解析后的 JSON 文档中获取值
temp = doc["result"]["realtime"]["temperature"].as();
info = doc["result"]["realtime"]["info"].as();
aqi = doc["result"]["realtime"]["aqi"].as();
Serial.println("徐州");
Serial.printf("温度: %d\n", temp);
Serial.printf("天气: %s\n", info);
Serial.printf("空气指数: %d\n", aqi);
}
void loop() {
//等待数据延时
delay(3000);
//清除显示
u8g2.clearBuffer();
//切换中文GB字体
u8g2.setFont(u8g2_font_wqy14_t_gb2312);
u8g2.setFontDirection(0);
//设置光标位置并显示数据
u8g2.setCursor(0,15);
u8g2.print("徐州 ");
u8g2.print("温度:");
u8g2.print(temp);
u8g2.print("℃");
u8g2.setCursor(0,35);
u8g2.print("天气:");
u8g2.print(info);
u8g2.setCursor(0,55);
u8g2.print("空气指数:");
u8g2.print(aqi);
//选择字体大小并绘制图案
u8g2.setFont(u8g2_font_open_iconic_weather_4x_t);
u8g2.drawGlyph(90,60,0x0045);
//显示绘制内容
u8g2.sendBuffer();
}
最后,显示结果为;
1.极客侠Geekman
2.b站up小鱼创意