概括
通过wifi连接网络获取北京时间,在显示屏上显示。
软件:Arduino IDE
硬件:ESP8266板、0.96寸显示屏、杜邦线、下载线(安卓充电线)
接线
LED有4个引脚,分别是GND、VCC、SCL、SDA
GND接地,VCC接3.3V的供电
SCL接D2,SDA接D3
下载库
打开Arduino IDE,找到左侧列表那沓书,点一下,搜索下面的库名字,挨个安装
Adafruit_GFX、Adafruit_SSD1306、ESP8266WiFi
WiFiUdp、NTPClient、TimeLib
安装完成创建项目,把下面代码改一下wifi账号密码(2.4gWIFI),写入就行
代码:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <TimeLib.h>
// 定义I2C引脚(ESP8266的D3=GPIO0, D2=GPIO4)
#define SDA_PIN 0
#define SCL_PIN 4
// WiFi 配置
const char* ssid = "IOT"; // WiFi名称
const char* password = "8888888"; // WiFi密码
// 初始化OLED对象,定义OLED参数128*64像素
Adafruit_SSD1306 display(128, 64, &Wire, -1);
// NTP 客户端配置
WiFiUDP udp;
NTPClient timeClient(udp, "pool.ntp.org", 28800, 60000); // UTC +8小时(时区调整)28800秒为8小时
/**
* Arduino程序初始化函数
*/
void setup() {
Serial.begin(9600); //串口波特率
Wire.begin(SDA_PIN, SCL_PIN); // 初始化I2C
initializeOLED(); // 初始化OLED
connectToWifi(); // 连接WiFi
timeClient.begin(); // 启动 NTP 客户端
}
/**
* Arduino主循环函数
* @details 系统初始化完成后进入此循环,会无限重复执行
*/
void loop() {
// 更新 NTP
timeClient.update();
// 获取时间
String formattedTime = timeClient.getFormattedTime();
//获取日期
long epochTime = timeClient.getEpochTime(); //时间戳
//把时间戳加入setTime,就可以随时提出来了
setTime(epochTime);
//整合
String forDate = String(year()) + "-" + (month() < 10 ? "0" : "") + month() + "-" + (day() < 10 ? "0" : "") + day();
display.clearDisplay(); // 清空显示
CommonDisplayComponent(7, 5, forDate); //日期-调用公共显示组件
CommonDisplayComponent(15, 30, formattedTime); //时间-调用公共显示组件
display.display(); // 刷新显示屏,确保内容显示出来
delay(1000); // 延迟1秒
}
/**
* 初始化SSD1306 OLED显示屏
*
* @details 使用I2C接口初始化OLED屏幕,默认地址为0x3C
* 若初始化失败,将通过串口输出错误信息并进入无限循环
*
* @note 依赖Adafruit_SSD1306库
* @note 需提前定义全局对象:Adafruit_SSD1306 display(OLED_RESET);
*
* @warning 初始化失败会导致程序阻塞,需检查:
* 1. OLED硬件连接是否正确
* 2. I2C地址是否匹配(0x3C或0x3D)
* 3. 电源供应是否稳定
*/
void initializeOLED() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED 初始化失败!");
// 卡住不动
while (1);
} else {
Serial.println("OLED 初始化成功!");
}
}
/**
* 连接到指定的WiFi网络
*
* @note 需要提前定义全局变量:
* - const char* ssid // WiFi名称
* - const char* password // WiFi密码
*
* @note 连接过程中会在OLED屏幕显示连接状态
* @note 连接成功后会在串口输出成功信息
*
* @warning 若WiFi信号弱或密码错误,可能导致长时间阻塞
*/
void connectToWifi() {
WiFi.begin(ssid, password);
display.clearDisplay(); // 清空显示
while (WiFi.status() != WL_CONNECTED) {
Serial.println("正在连接WIFI");
CommonDisplayComponent(15, 30, "WIFI Loca"); //时间-调用公共显示组件
display.display(); // 刷新显示屏,确保内容显示出来
delay(1000);
}
Serial.println("WIFI连接成功");
}
/**
* 在OLED屏幕上显示文本的公共组件函数
*
* @param x 文本起始位置的X坐标 (像素)
* @param y 文本起始位置的Y坐标 (像素)
* @param displayText 要显示的字符串内容
*
* @note 依赖SSD1306库,需提前初始化display对象
* @note 文本大小固定为2,颜色为白色
*/
void CommonDisplayComponent(int x, int y, String displayText) {
display.setTextSize(2); // 文字大小
display.setTextColor(SSD1306_WHITE); // 白色字体
display.setCursor(x, y); // 设置光标位置
display.println(displayText);
}