ESP32控制0.96寸OLED显示日期和时间

# 关于本项目 本项目使用了以下开源库:

- **WiFi库**:Arduino的WiFi库,用于连接到无线网络。该库是Arduino IDE的一部分,无需额外安装。

- **TimeLib**:用于处理时间和日期的库。可以从[Arduino Playground](https://playground.arduino.cc/Code/Time/)获取更多信息。

- **U8g2库**:用于驱动各种单色OLED和LCD显示屏的库。详细信息和文档可以在[U8g2的GitHub仓库](https://github.com/olikraus/U8g2_Arduino)找到。

硬件清单:

ESP32、0.96寸OLED(7管脚)、面包板、杜邦线若干。

接线:

OLED   ESP32

GND:GND(右),

VCC :  3V3,

D0   :   D18,

D1   :   D13,

RES :  D15,

DC   :  D2,

CS   :  D4

代码部分:

#include <WiFi.h>  // 引入WiFi库,用于WiFi连接  

#include <TimeLib.h>  // 引入Time库,用于处理时间  

#include <U8g2lib.h>  // 引入U8g2库,用于OLED显示屏的控制 

#define SCREEN_WIDTH 128  // 显示屏宽度 

#define SCREEN_HEIGHT 64  // 显示屏高度  



const char* ssid = "";  // WiFi名称  

const char* password = "";  // WiFi密码  



const char* ntpServer = "ntp.neu.edu.cn";  // 主NTP服务器  

const char* ntpServerBackup = "pool.ntp.org";  // 备用NTP服务器  

const long gmtOffset_sec = 28800; // GMT+8  // GMT+8时区偏移量,单位秒 

// 初始化OLED显示屏对象  

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, 18, 13, 4, 2, 15);  

// 上次从NTP服务器更新时间的时间戳  

unsigned long lastNTPTime = 0;  

// 声明更新时间显示的函数  

void updateTimeDisplay();  



void setup() {  

  Serial.begin(115200);  // 初始化串口通信,设置波特率为115200 



  // 连接到WiFi  

  WiFi.begin(ssid, password);  

  while (WiFi.status() != WL_CONNECTED) {  

    delay(500);  

    Serial.print(".");  // 打印点号表示正在连接  

  }  

  Serial.println("");  

  Serial.println("WiFi连接成功");  



  // 初始化NTP并获取初始时间  

  configTime(gmtOffset_sec, 0, ntpServer, ntpServerBackup);  

  while (time(nullptr) < 1609459200 || (millis() - lastNTPTime) < 30000) {  

    delay(500);  // 等待直到获取到有效时间 

  }  

  lastNTPTime = millis();  // 更新上次NTP更新时间 



  // 初始化OLED显示屏  

  u8g2.begin();  

  u8g2.setFont(u8g2_font_6x12_tr);  // 设置字体 



  // 更新并显示时间  

  updateTimeDisplay();  

}  



void loop() {  

  // 每秒更新显示  

  updateTimeDisplay();  



  // 每小时检查一次是否需要从NTP更新时间  

  if ((millis() - lastNTPTime) > 3600000) {    //millis()函数返回自程序启动以来的毫秒数

    configTime(gmtOffset_sec, 0, ntpServer, ntpServerBackup);  

    while (time(nullptr) <= lastNTPTime) {  

      delay(100);  // 等待直到NTP时间更新  

    }  

    lastNTPTime = millis();  // 更新上次NTP更新时间 

  }  



  delay(1000); // 等待一秒再次更新  

}  



void updateTimeDisplay() {  // 获取当前时间

  time_t now = time(nullptr);  

  struct tm *timeinfo = localtime(&now);  

// 格式化时间和日期字符串

  char timeStr[9];  

  char dateStr[11]; // 为日期字符串分配足够的空间,包括结尾的'\0'

  snprintf(timeStr, sizeof(timeStr), "%02d:%02d:%02d", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);  

  snprintf(dateStr, sizeof(dateStr), "%04d-%02d-%02d", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday);

// 清除显示屏缓冲区并绘制时间和日期 

    u8g2.firstPage();  

    u8g2.clearBuffer();  

    u8g2.setFont(u8g2_font_6x12_tr);  

    u8g2.drawStr(0, 12, "Current Time:");  

    u8g2.drawStr(0, 24, timeStr);  

    u8g2.drawStr(0, 36, "Date:"); // 添加日期标题  

    u8g2.drawStr(50, 36, dateStr); // 从屏幕中央开始显示日期

    u8g2.sendBuffer();  



}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值