arduino STM32时钟屏幕显示

Orbit 发布于 2025-05-28 18 次阅读


使用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' 格式");
  }
}
此作者没有提供个人介绍。
最后更新于 2025-05-28