Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间

概括

通过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),写入就行

代码:

cpp 复制代码
#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);
}
相关推荐
FreakStudio12 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
✎ ﹏梦醒͜ღ҉繁华落℘17 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
u1521096484917 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd84510150017 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼17 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
wohoo_wangzi17 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
✎ ﹏梦醒͜ღ҉繁华落℘18 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展18 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司18 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设
踏着七彩祥云的小丑18 天前
嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
单片机·嵌入式硬件·学习