赞
踩
硬件部分:
1.ESP-32开发板 1块
2.SSD1306的0.96寸OLED屏幕(4,7孔均可) 1块
3.杜邦线 若干
软件部分:
1.Visual Studio Code Platformio
2.任意串口调试助手
方法很简单,直接调用Arduino库函数<WIFI.h>文件即可
- #include <WiFi.h>
- //预设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 <HTTPClient.h>
#include <ArduinoJson.h>
其中<ArduinoJson.h> 在plantfromio的home里面的library里面进行搜索导入即可
(如果导入比较慢,则需要上魔法)
接着进行数据读取和解析提取 温度(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<unsigned int>();
- String info = doc["result"]["realtime"]["info"].as<String>();
- int aqi = doc["result"]["realtime"]["aqi"].as<int>();
-
- 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 <Arduino.h>
- #include <U8g2lib.h>
-
-
- #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 <Arduino.h>
- #include <WiFi.h>
- #include <HTTPClient.h>
- #include <ArduinoJson.h>
- #include <U8g2lib.h>
-
- #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<unsigned int>();
- info = doc["result"]["realtime"]["info"].as<String>();
- aqi = doc["result"]["realtime"]["aqi"].as<int>();
- 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小鱼创意
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。