用Arduino,OLED显示屏和DS1307实时时钟(RTC)模块建立一个时钟是一个有趣而实用的项目。即使关闭了Arduino,DS1307 RTC模块也可以保持准确的时间,而OLED为显示当前时间提供了光滑的界面。本教程将逐步指导您完成整个过程。
你需要什么
- Arduino董事会 (例如,UNO,Mega,Nano)
- 0.91英寸OLED显示 (I2C接口)
- DS1307 RTC模块
- 面包板和跳线电线
- 安装了带有Arduino IDE的计算机
- 图书馆: 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,您需要以下库:
- Adafruit SSD1306 (对于OLED)
- Adafruit GFX (OLED的图形库)
- rtclib (用于RTC功能)
安装库
- 打开Arduino IDE。
- 去 草图>包括库>管理库.
- 搜索并安装:
- “ 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:自定义显示器
您可以通过以下方式自定义时钟显示
-
更改文本大小: 使用
display.setTextSize()
调整字体尺寸。 - 添加图形: 使用Adafruit GFX库来绘制线或矩形等形状。
- 格式时间: 根据需要添加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);
故障排除
-
OLED不显示:
- 确保I2C地址匹配(通常
0x3C
或者0x3D
). - 检查接线连接。
- 确保I2C地址匹配(通常
-
找不到RTC:
- 验证SDA和SCL连接。
- 确保正确插入RTC电池。
-
不正确的时间:
- 使用
rtc.adjust()
设置正确的时间。
- 使用
申请
- DIY桌子时钟
- 计时器和警报
- 具有附加传感器的IoT启用时钟
- 教育项目
结论
通过将Arduino,0.91英寸OLED和DS1307 RTC结合在一起,您可以创建一个准确且视觉上吸引人的时钟。通过一些调整,您可以自定义时钟以适应您的需求或将其集成到较大的项目中。实验其他功能。像警报或互联网同步一样,将您的项目提升到一个新的水平!