使用stm32f411开发板,以及ds3231时钟芯片以及SSD1315/SSD1306 的0.96寸 OLED屏幕。实现简单的时间显示和温度显示。

#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED 显示设置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// DS3231 RTC
RTC_DS3231 rtc;
void setup() {
Serial.begin(115200);
Wire.begin();
// 初始化 OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("无法初始化OLED");
while (1);
}
display.clearDisplay();
display.display();
// 初始化 RTC
if (!rtc.begin()) {
Serial.println("无法找到DS3231 RTC模块");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC失去电源,正在重设时间...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.println("输入 'set yyyy-mm-dd hh:mm:ss' 来设置时间");
}
void loop() {
DateTime now = rtc.now();
float temperature = rtc.getTemperature() ;
// 显示在串口
Serial.print("时间:");
Serial.print(now.year()); Serial.print("/");
Serial.print(now.month()); Serial.print("/");
Serial.print(now.day()); Serial.print(" ");
Serial.print(now.hour()); Serial.print(":");
Serial.print(now.minute()); Serial.print(":");
Serial.println(now.second());
Serial.print("温度:");
Serial.print(temperature);
Serial.println(" °C");
// 显示在OLED
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("Date: ");
display.printf("%04d-%02d-%02d", now.year(), now.month(), now.day());
display.setCursor(0, 16);
display.print("Time: ");
display.printf("%02d:%02d:%02d", now.hour(), now.minute(), now.second());
display.setCursor(0, 32);
display.print("Temp: ");
display.print(temperature);
display.println(" C");
display.display();
// 处理串口命令
if (Serial.available()) {
String input = Serial.readStringUntil('\n');
input.trim();
if (input.startsWith("set ")) setTime(input);
}
delay(1000);
}
void setTime(String command) {
command = command.substring(4);
int year = command.substring(0, 4).toInt();
int month = command.substring(5, 7).toInt();
int day = command.substring(8, 10).toInt();
int hour = command.substring(11, 13).toInt();
int minute = command.substring(14, 16).toInt();
int second = command.substring(17, 19).toInt();
if (year > 2000 && month > 0 && month <= 12 && day > 0 && day <= 31 &&
hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0 && second < 60) {
rtc.adjust(DateTime(year, month, day, hour, minute, second));
Serial.println("时间设置成功!");
} else {
Serial.println("时间格式无效,请使用 'set yyyy-mm-dd hh:mm:ss' 格式");
}
}