基于VScode的platformio软件实现ESP32的WIFI模块获取实时天气数据并利用u8g2库通过i2c协议进行OLED显示

步骤一:硬/软件准备

硬件部分:

1.ESP-32开发板        1块

2.SSD1306的0.96寸OLED屏幕(4,7孔均可)   1块

3.杜邦线  若干

软件部分:

1.Visual Studio Code  Platformio

2.任意串口调试助手

步骤二:ESP-32 WiFi模块代码编写

方法很简单,直接调用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接口获取,下面给出一种方式,可根据个人需求修改

基于VScode的platformio软件实现ESP32的WIFI模块获取实时天气数据并利用u8g2库通过i2c协议进行OLED显示_第1张图片

直接进入网站寻找接口地址 即可 这里是 http://apis.juhe.cn/simpleWeather/query;

密钥获取:直接查看个人API的key即可;

这样我们运行程序,正确连接WiFi,通过串口打印结果即可(波特率预设9600)

正确结果为:

正在连接 Wi-Fi.连接成功
IP 地址:192.168.118.229

步骤三:对得到的JSON格式的天气数据进行提取

利用API接口提取的数据为json格式并不能直接进行使用,需要进行提取

我们需要另外两个库函数 

#include
#include  

其中 在plantfromio的home里面的library里面进行搜索导入即可

(如果导入比较慢,则需要上魔法)

基于VScode的platformio软件实现ESP32的WIFI模块获取实时天气数据并利用u8g2库通过i2c协议进行OLED显示_第2张图片

接着进行数据读取和解析提取 温度(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

步骤四:ESP-32 基于u8g2库的OLED驱动代码编写

获取了相关天气数据后我们最后进行OLED驱动设置即可

u8g2库需要我们在plantfromio的home里面的library里面进行搜索;

基于VScode的platformio软件实现ESP32的WIFI模块获取实时天气数据并利用u8g2库通过i2c协议进行OLED显示_第3张图片

之后进行下载,导入工程文件即可

下面给出示例代码(仅用作参考,后面会进行部分修正)

基于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();
}


最后,显示结果为;

基于VScode的platformio软件实现ESP32的WIFI模块获取实时天气数据并利用u8g2库通过i2c协议进行OLED显示_第4张图片

步骤六:特别鸣谢

1.极客侠Geekman

2.b站up小鱼创意   

你可能感兴趣的:(vscode,ide,编辑器)