用Arduino,0.91英寸OLED和DS1307 RTC创建一个时钟

Creating a Clock with the Arduino, a 0.91" OLED, and the DS1307 RTC

用Arduino,OLED显示屏和DS1307实时时钟(RTC)模块建立一个时钟是一个有趣而实用的项目。即使关闭了Arduino,DS1307 RTC模块也可以保持准确的时间,而OLED为显示当前时间提供了光滑的界面。本教程将逐步指导您完成整个过程。


你需要什么

  1. Arduino董事会 (例如,UNO,Mega,Nano)
  2. 0.91英寸OLED显示 (I2C接口)
  3. DS1307 RTC模块
  4. 面包板和跳线电线
  5. 安装了带有Arduino IDE的计算机
  6. 图书馆: Adafruit SSD1306,Adafruit GFX和RTClib

步骤1:接线组件

OLED显示接线(I2C)

OLED PIN Arduino Pin
VCC 5V
gnd gnd
SDA A4
SCL A5

DS1307 RTC模块接线(I2C)

RTC引脚 Arduino Pin
VCC 5V
gnd gnd
SDA A4
SCL A5

笔记: 如果使用带有专用SDA和SCL引脚(例如Mega)的Arduino板,将OLED和RTC SDA/SCL引脚连接到这些板上。


步骤2:安装所需库

要使用OLED显示器和DS1307 RTC,您需要以下库:

  1. Adafruit SSD1306 (对于OLED)
  2. Adafruit GFX (OLED的图形库)
  3. rtclib (用于RTC功能)

安装库

  1. 打开Arduino IDE。
  2. 草图>包括库>管理库.
  3. 搜索并安装:
    • “ Adafruit SSD1306”
    • “ Adafruit GFX库”
    • “ rtclib”

步骤3:上传代码

这是使用DS1307 RTC模块在OLED上显示当前时间的代码:

示例代码

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>

// OLED display width and height
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32

// Create an instance of the display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Create an instance of the RTC
RTC_DS1307 rtc;

void setup() {
  Serial.begin(9600);

  // Initialize the OLED display
  if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.clearDisplay();

  // Initialize the RTC
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  // Check if the RTC is running
  if (!rtc.isrunning()) {
    Serial.println("RTC is NOT running! Setting the time...");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
}

void loop() {
  DateTime now = rtc.now(); // Get the current time

  // Clear the display
  display.clearDisplay();

  // Display the time
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print(now.hour(), DEC);
  display.print(":");
  if (now.minute() < 10) {
    display.print("0");
  }
  display.print(now.minute(), DEC);

  // Display the date
  display.setTextSize(1);
  display.setCursor(0, 20);
  display.print(now.day(), DEC);
  display.print("/");
  display.print(now.month(), DEC);
  display.print("/");
  display.print(now.year(), DEC);

  // Show the display buffer
  display.display();

  delay(1000); // Update every second
}

步骤4:调整时间

如果RTC未运行或需要更新时间,则在 setup() 功能将RTC设置为当前时间:

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  • F(__DATE__)F(__TIME__) 是在上传代码时自动从计算机设置日期和时间的宏。

要手动设置特定时间,请使用:

rtc.adjust(DateTime(2025, 1, 1, 12, 0, 0)); // YYYY, MM, DD, HH, MM, SS

步骤5:自定义显示器

您可以通过以下方式自定义时钟显示

  1. 更改文本大小: 使用 display.setTextSize() 调整字体尺寸。
  2. 添加图形: 使用Adafruit GFX库来绘制线或矩形等形状。
  3. 格式时间: 根据需要添加AM/PM或24小时格式。

示例:添加AM/PM

int hour = now.hour();
String period = "AM";
if (hour >= 12) {
  period = "PM";
  if (hour > 12) hour -= 12;
}
if (hour == 0) hour = 12;

display.print(hour);
display.print(":");
if (now.minute() < 10) {
  display.print("0");
}
display.print(now.minute());
display.print(" ");
display.print(period);

故障排除

  1. OLED不显示:

    • 确保I2C地址匹配(通常 0x3C 或者 0x3D).
    • 检查接线连接。
  2. 找不到RTC:

    • 验证SDA和SCL连接。
    • 确保正确插入RTC电池。
  3. 不正确的时间:

    • 使用 rtc.adjust() 设置正确的时间。

申请

  1. DIY桌子时钟
  2. 计时器和警报
  3. 具有附加传感器的IoT启用时钟
  4. 教育项目

结论

通过将Arduino,0.91英寸OLED和DS1307 RTC结合在一起,您可以创建一个准确且视觉上吸引人的时钟。通过一些调整,您可以自定义时钟以适应您的需求或将其集成到较大的项目中。实验其他功能。像警报或互联网同步一样,将您的项目提升到一个新的水平!

发表评论

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.