news 2026/8/29 4:12:12

ESP32 + SSD1306 OLED 显示中文天气与网络时间(U8g2 + WiFi + NTP 完整实战)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ESP32 + SSD1306 OLED 显示中文天气与网络时间(U8g2 + WiFi + NTP 完整实战)

一、简介

本文基于ESP32 开发板 + SSD1306 128×64 OLED 显示屏,实现一个完整的物联网小项目,功能包括:

  • ESP32 通过I2C 驱动 OLED
  • 使用U8g2 库显示中文(无外置字库)
  • 通过HTTP 请求天气 API 获取实时天气
  • 使用NTP 网络时间协议自动校时
  • OLED 实时显示:日期、时间、城市、温度、天气情况
  • 自动刷新时间,天气数据动态更新

适合作为ESP32 + OLED + 网络通信的综合入门示例。


二、硬件连接说明

1. 接线方式(SSD1306 I2C)

OLED 引脚ESP32 引脚
VCC3V3
GNDGND
SDAGPIO 21
SCLGPIO 22

ESP32 默认 I2C 引脚:
SDA → GPIO21,SCL → GPIO22


三、软件环境与依赖库

1. 开发环境

  • Arduino IDE(或 PlatformIO)
  • ESP32 Board Support Package

2. 需要安装的库

U8g2 ArduinoJson NTPClient

WiFi.hHTTPClient.h为 ESP32 自带库。


四、天气 API 说明

本文使用的天气接口:

http://t.weather.itboy.net/api/weather/city/101010100

特点:

  • 免费
  • 无需 Key
  • 返回 JSON,支持中文
  • 城市通过城市代码区分

五、完整示例代码(已添加中文注释)

⚠️ 以下代码为最终整合版本

  • 中文显示
  • 天气获取
  • NTP 自动更新时间
  • OLED 实时刷新
#include<Wire.h>#include<U8g2lib.h>#include<WiFi.h>#include<HTTPClient.h>#include<ArduinoJson.h>#include<NTPClient.h>#include<WiFiUdp.h>/* ================= WiFi 配置 ================= */constchar*ssid="wifi帐号";constchar*password="Wifi密码";/* ================= 天气 API ================= */String apiUrl="http://t.weather.itboy.net/api/weather/city/101010100";/* ================= OLED 初始化 ================= 使用硬件 I2C,ESP32 默认: SDA -> GPIO21 SCL -> GPIO22 */U8G2_SSD1306_128X64_NONAME_F_HW_I2Cu8g2(U8G2_R0,U8X8_PIN_NONE,SCL,SDA);/* ================= NTP 时间配置 ================= 时区偏移:28800 秒(UTC+8,中国时间) 更新时间间隔:60000 ms */WiFiUDP udp;NTPClienttimeClient(udp,"pool.ntp.org",28800,60000);/* ================= 刷新控制 ================= */unsignedlonglastUpdateTime=0;unsignedlonginterval=1000;// 每秒刷新一次显示/* ================= 天气数据结构体 ================= */structWeatherData{String city;// 城市String temperature;// 温度String weatherType;// 天气类型String timedate;// 日期时间};voidsetup(){Serial.begin(115200);/* -------- 连接 WiFi -------- */WiFi.begin(ssid,password);Serial.print("Connecting to WiFi");while(WiFi.status()!=WL_CONNECTED){delay(1000);Serial.print(".");}Serial.println("\nWiFi Connected");Serial.print("IP Address: ");Serial.println(WiFi.localIP());/* -------- OLED 初始化 -------- */u8g2.begin();u8g2.enableUTF8Print();// 必须开启 UTF-8,否则中文乱码/* -------- 启动 NTP -------- */timeClient.begin();}voidloop(){unsignedlongcurrentMillis=millis();/* 每秒更新一次显示 */if(currentMillis-lastUpdateTime>=interval){lastUpdateTime=currentMillis;// 获取天气数据WeatherData weatherData=getWeatherData();if(weatherData.city!=""){// 更新时间timeClient.update();String currentTime=timeClient.getFormattedTime();// OLED 显示u8g2.clearBuffer();u8g2.setFont(u8g2_font_wqy12_t_gb2312);// 中文字体u8g2.setCursor(0,15);u8g2.print("日期: "+extractDate(weatherData.timedate)+" "+currentTime);u8g2.setCursor(0,30);u8g2.print("城市: "+weatherData.city);u8g2.setCursor(0,45);u8g2.print("温度: "+weatherData.temperature);u8g2.setCursor(0,60);u8g2.print("天气: "+weatherData.weatherType);u8g2.sendBuffer();}}}/* ================= 获取天气数据 ================= */WeatherDatagetWeatherData(){HTTPClient http;WeatherData weatherData;http.begin(apiUrl);inthttpCode=http.GET();if(httpCode==200){String payload=http.getString();Serial.println(payload);DynamicJsonDocumentdoc(1024);DeserializationError error=deserializeJson(doc,payload);if(!error){weatherData.timedate=doc["time"].as<String>();weatherData.city=doc["cityInfo"]["city"].as<String>();weatherData.temperature=doc["data"]["wendu"].as<String>();weatherData.weatherType=doc["data"]["forecast"][0]["type"].as<String>();}}http.end();returnweatherData;}/* ================= 日期格式处理 ================= 输入:YYYY-MM-DD HH:MM:SS 输出:MM-DD */StringextractDate(String fullDate){intspaceIndex=fullDate.indexOf(' ');String datePart=fullDate.substring(0,spaceIndex);returndatePart.substring(5);}

六、关键技术点总结

  1. U8g2 显示中文

    • 必须使用u8g2_font_wqy12_t_gb2312
    • 必须调用enableUTF8Print()
  2. ESP32 网络请求

    • 使用HTTPClient
    • JSON 解析推荐ArduinoJson
  3. 时间自动更新

    • NTPClient 负责时间
    • millis()控制刷新频率,避免阻塞
  4. 性能注意

    • 不建议每秒请求天气 API
    • 可后续改为:天气 10 分钟更新一次,时间每秒更新
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 14:43:31

UE5 C++(24-2):

&#xff08;138&#xff09; &#xff08;139&#xff09; 谢谢

作者头像 李华
网站建设 2026/8/26 10:08:53

护网攻防演练全流程详解:从准备到复盘,小白速成指南

护网攻防演练全流程&#xff0c;网安小白必看&#xff01; 演练全流程拆解 准备阶段&#xff1a; ◦ 组织方&#xff1a;确定参演单位、制定规则、组建紫队。 ◦ 蓝队&#xff1a;资产盘点、漏洞修复、安全加固、预案演练。 ◦ 红队&#xff1a;情报收集、武器制备、环境搭…

作者头像 李华
网站建设 2026/8/27 14:54:25

最新面向自然科学领域机器学习与深度学习技术应用

随着观测技术、数值模拟与计算基础设施的迅猛发展&#xff0c;地球系统科学、生态学、环境科学等自然科学领域正迈入“大数据智能模型”驱动的新阶段。传统的统计建模方法虽具可解释性&#xff0c;却难以应对高维、非线性、多源异构的复杂自然系统&#xff1b;而以机器学习和深…

作者头像 李华
网站建设 2026/8/25 5:00:05

内联数组内存优化实战(20年专家经验倾囊相授)

第一章&#xff1a;内联数组内存优化在高性能编程中&#xff0c;内存布局对程序执行效率具有显著影响。内联数组作为一种将数据直接嵌入结构体或对象中的技术&#xff0c;能够有效减少内存碎片和指针跳转开销&#xff0c;从而提升缓存命中率。内联数组的优势 避免动态内存分配带…

作者头像 李华
网站建设 2026/8/29 1:10:21

蓝牙产品申请BQB认证需要准备哪些材料?

申请蓝牙 BQB 认证的材料可按企业资质、产品技术文档、测试相关文件、样品四大核心类别准备&#xff0c;且会根据认证路径&#xff08;完整认证 / 模块复用列名&#xff09;略有差异&#xff0c;以下是覆盖全场景的详细清单&#xff0c;可直接用于实操准备&#xff1a;一、企业…

作者头像 李华
网站建设 2026/8/26 23:56:07

你还在用线程池?下一代分布式调度已全面转向虚拟线程

第一章&#xff1a;你还在用线程池&#xff1f;下一代分布式调度已全面转向虚拟线程随着Java 21正式引入虚拟线程&#xff08;Virtual Threads&#xff09;&#xff0c;传统基于平台线程的线程池模式正面临根本性颠覆。虚拟线程由JVM在用户空间轻量级调度&#xff0c;无需绑定操…

作者头像 李华