程序十九:显示时、分、秒和日期的时钟 (1)Arduino参考开源代码
- /*
- 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 程序十九:显示时、分、秒和日期的时钟
- */
-
- //RTC库
- #include <Wire.h>
- #include "RTClib.h"
-
- //使用了 SPI、DMD、TimerOne 和 Font 库
- #include <SPI.h>
- #include <DMD.h>
- #include <TimerOne.h>
- #include "SystemFont5x7.h"
- #include "Font_6x14.h" //这个字体只包含 0-9 的数字。仅用于显示时间。
-
- //配置P10
- #define DISPLAYS_ACROSS 1 //使用的 P10 面板数量,左右。
- #define DISPLAYS_DOWN 1
- DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
-
-
- RTC_DS1307 rtc; //RTC模块初始化
-
- //时间和日期的变量
- int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
- int hr24;
- String st;
- char nameoftheday[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
- char month_name[12][12] = {"January", "February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"};
-
- //Millis 的变量
- const long interval = 1000; //每 1 秒检索一次时间和日期数据
- unsigned long previousMillis = 0;
-
- const long interval_for_date = 75; //滚动速度
- unsigned long previousMillis_for_date = 0;
-
- //显示小时\分钟\秒的变量
- char hr_24 [3];
- String str_hr_24;
- char mn [3];
- String str_mn;
- char sc [3];
- String str_sc;
-
- void ScanDMD() {
- dmd.scanDisplayBySPI();
- }
-
- void setup() {
- Serial.begin(115200);
- Serial.println("Arduino RTC DS1307准备就绪");
- delay(1000);
-
- if (! rtc.begin()) {
- Serial.println("找不到 RTC");
- while (1);
- }
-
- if (! rtc.isrunning()) {
- Serial.println("RTC 没有运行!");
- // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
- // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
- // 根据您的计算机时间和日期设置时间和日期。如果这不起作用,请在“if (!rtc.isrunning())”之外使用这行代码
- // 此行使用明确的日期和时间设置 RTC,例如设置
- // 2022 年 5 月 21 日凌晨 6 点,您可以设置:
- rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
- }
- // 以下行将 RTC 设置为编译此草图的日期和时间(根据您的计算机时间和日期设置时间和日期)
- // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
- // 根据您的计算机时间和日期设置时间和日期。如果在“if (!rtc.isrunning())”中不起作用,请使用这行代码
- // rtc.adjust(DateTime(2022, 5, 21, 6, 0, 0));
- // 如果时间和日期设置成功,则停用代码行(使代码成为注释),然后重新上传代码。
- // 如果没有完成,那么时间和日期将返回到 arduino 重置或重新启动时设置的开头。
-
- Timer1.initialize(1000);
- Timer1.attachInterrupt(ScanDMD);
- dmd.clearScreen(true);
- }
-
- void loop() {
- //millis() 显示时间
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= interval) {
- previousMillis = currentMillis; //保存最后一次
-
- GetDateTime(); //从 DS1307 检索时间和日期数据
-
- dmd.selectFont(Font_6x14);
-
- //在 P10 中显示小时
- str_hr_24 = String(_hour24);
- str_hr_24.toCharArray(hr_24, 3);
-
- if (_hour24 < 10) {
- dmd.drawString(1, 0, "0", 1, GRAPHICS_NORMAL);
- dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
- }
- else {
- dmd.drawString(1, 0, hr_24, 2, GRAPHICS_NORMAL);
- }
-
- //在 P10 中显示“:”
- dmd.drawFilledBox(16, 3, 17, 4, GRAPHICS_NORMAL);
- dmd.drawFilledBox(16, 11, 17, 12, GRAPHICS_NORMAL);
-
- //在 P10 中显示分和秒
- dmd.selectFont(SystemFont5x7);
- str_mn = String(_minute);
- str_mn.toCharArray(mn, 3);
-
- if (_minute < 10) {
- dmd.drawString(20, 0, "0", 1, GRAPHICS_NORMAL);
- dmd.drawString(26, 0, mn, 1, GRAPHICS_NORMAL);
- }
- else {
- dmd.drawString(20, 0, mn, 2, GRAPHICS_NORMAL);
- }
-
- str_sc = String(_second);
- str_sc.toCharArray(sc, 3);
-
- if (_second < 10) {
- dmd.drawString(20, 9, "0", 1, GRAPHICS_NORMAL);
- dmd.drawString(26, 9, sc, 1, GRAPHICS_NORMAL);
- }
- else {
- dmd.drawString(20, 9, sc, 2, GRAPHICS_NORMAL);
- }
-
- //调用 scrolling_date() 子例程来显示日期。
- if (_second == 11) { //秒等于 11 时显示日期
- scrolling_date();
- }
- }
- }
-
- //从 DS1307 检索或更新时间和日期的子程序
- void GetDateTime() {
- DateTime now = rtc.now();
- _day = now.day();
- _month = now.month();
- _year = now.year();
- _hour24 = now.hour();
- _minute = now.minute();
- _second = now.second();
- _dtw = now.dayOfTheWeek();
-
- hr24 = _hour24;
- if (hr24 > 12) {
- _hour12 = hr24 - 12;
- }
- else if (hr24 == 0) {
- _hour12 = 12;
- }
- else {
- _hour12 = hr24;
- }
-
- if (hr24 < 12) {
- st = "AM";
- }
- else {
- st = "PM";
- }
- }
-
- //显示日、月、年的子程序
- void scrolling_date() {
- dmd.clearScreen(true);
- delay(100);
-
- //保存要显示的日期数据
- String Date = String(nameoftheday[_dtw]) + ", " + String(_day) + "-" + String(month_name[_month - 1]) + "-" + String(_year);
- char dt[50];
- Date.toCharArray(dt, 50);
- int i = 32 + 10;
- int j = strlen(dt) + (strlen(dt) * 5);
-
- dmd.selectFont(SystemFont5x7);
-
- while (1) {
- //millis() 显示时间
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= interval) {
- previousMillis = currentMillis; //保存最后一次时间
-
- //在 P10 中显示时钟
- str_hr_24 = String(_hour24);
- str_hr_24.toCharArray(hr_24, 3);
-
- if (_hour24 < 10) {
- dmd.drawString(2, 0, "0", 1, GRAPHICS_NORMAL);
- dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
- }
- else {
- dmd.drawString(2, 0, hr_24, 2, GRAPHICS_NORMAL);
- }
-
- //在 P10 中显示“:”
- GetDateTime(); //从 DS1307 检索时间和日期数据
- if (_second % 2 == 0) {
- dmd.drawString(14, 0, ":", 2, GRAPHICS_OR);
- }
- else {
- dmd.drawString(14, 0, ":", 2, GRAPHICS_NOR);
- }
-
- //在 P10 中显示分钟
- str_mn = String(_minute);
- str_mn.toCharArray(mn, 3);
-
- if (_minute < 10) {
- dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
- dmd.drawString(25, 0, mn, 1, GRAPHICS_NORMAL);
- }
- else {
- dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
- }
- }
-
- //millis() 用于显示和滚动日期
- unsigned long currentMillis_for_date = millis();
- if (currentMillis_for_date - previousMillis_for_date >= interval_for_date) {
- previousMillis_for_date = currentMillis_for_date; //保存最后一次时间
-
- i--;
- dmd.drawString(i, 9, dt, strlen(dt), GRAPHICS_NORMAL);
- if (i <= ~j) {
- dmd.clearScreen(true);
- delay(100);
- return;
- }
- }
- }
- }
复制代码
|