37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
** 【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块 IIC/I2C接口 实时计时传感器**
实验模块接线示意图
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块 IIC/I2C接口 实时计时传感器
项目之十:将时间居中显示在 OLED 屏幕上
安装RTClib.h库 (https://github.com/adafruit/RTClib)
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块 IIC/I2C接口 实时计时传感器
项目之十:将时间居中显示在 OLED 屏幕上
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块 IIC/I2C接口 实时计时传感器
项目之十:将时间居中显示在 OLED 屏幕上
*/
#include <Wire.h> // **引入 I2C 通信库**
#include <Adafruit_GFX.h> // **引入 Adafruit GFX 图形库**
#include <Adafruit_SSD1306.h> // **引入 Adafruit SSD1306 OLED 显示库**
#include <RTClib.h> // **引入 DS3231 RTC 库**
#define SCREEN_WIDTH 128 // **OLED 屏幕宽度(单位:像素)**
#define SCREEN_HEIGHT 64 // **OLED 屏幕高度(单位:像素)**
// **创建 SSD1306 OLED 显示对象,使用 I2C 进行通信**
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// **创建 DS3231 RTC 对象**
RTC_DS3231 rtc;
// **用于存储时间字符串**
String time;
void setup() {
Serial.begin(9600); // **初始化串口通信**
// **初始化 OLED 显示屏**
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // **设置 I2C 地址为 0x3C**
Serial.println(F("SSD1306 显示屏初始化失败"));
while (true); // **进入死循环,防止继续执行错误代码**
}
delay(2000); // **等待 2 秒,确保 OLED 组件启动**
oled.clearDisplay(); // **清空 OLED 屏幕**
oled.setTextSize(1); // **设置文本大小**
oled.setTextColor(WHITE); // **设置文本颜色**
oled.setCursor(0, 10); // **设置文本显示位置**
// **初始化 DS3231 RTC 模块**
if (!rtc.begin()) {
Serial.println("找不到 RTC 模块");
Serial.flush();
while (true); // **进入死循环,避免继续执行错误代码**
}
// **同步 RTC 时间,设置为编译时的日期和时间**
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// **预留 10 个字节内存,优化 String 变量存储,避免碎片化**
time.reserve(10);
}
void loop() {
// **从 RTC 读取当前时间**
DateTime now = rtc.now();
time = ""; // **清空字符串**
time += now.hour(); // **获取小时**
time += ':';
time += now.minute(); // **获取分钟**
time += ':';
time += now.second(); // **获取秒数**
oledDisplayCenter(time); // **调用 OLED 显示函数**
}
/*****************************************************************************************************
* **oledDisplayCenter**
* - 计算文本大小,使其居中显示在 OLED 屏幕上
* - 然后将时间数据显示在屏幕中央
*****************************************************************************************************/
void oledDisplayCenter(String text) {
int16_t x1, y1;
uint16_t width, height;
// **获取文本的宽度和高度**
oled.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);
// **清屏**
oled.clearDisplay();
// **计算居中位置**
oled.setCursor((SCREEN_WIDTH - width) / 2, (SCREEN_HEIGHT - height) / 2);
// **显示时间字符串**
oled.println(text);
oled.display(); // **刷新 OLED 屏幕**
}
代码简单解读
这段代码使用 DS3231 实时时钟(RTC)模块 和 OLED 显示屏,通过 I2C 通信 实现 时间显示,核心逻辑如下:
-
初始化硬件
✅ Wire.begin(); → 启动 I2C 通信
✅ oled.begin(…); → 初始化 OLED 显示屏(I2C 地址 0x3C)
✅ rtc.begin(); → 初始化 DS3231 RTC -
设置 RTC 时间
✅ rtc.adjust(DateTime(F(DATE), F(TIME))); → 自动设置 RTC 时间为编译时的系统时间
✅ 确保 RTC 运行正确,否则进入死循环 -
获取当前时间
✅ rtc.now(); → 从 RTC 读取当前时间
✅ 格式化为 “小时:分钟:秒” 形式 并存入 String time -
显示时间在 OLED 屏幕上
✅ oledDisplayCenter(time); → 将时间居中显示
✅ 计算文本大小,确保居中
✅ 清除屏幕并更新显示 -
采集间隔
✅ 每秒刷新一次时间,保证实时性
这段代码让 OLED 显示当前时间,并不断更新。
实验场景图