Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】108种传感器模块系列实验(87)--- DS1307时钟模块

[复制链接]
 楼主| 发表于 2022-4-10 18:13 | 显示全部楼层
备用电池
RTC 模块的背面,有一个用于连接 CR2032 线圈单元的支架。即使在连接到 DS1307 的主电源发生故障时,该备用电池也可用于保持时间准确。该芯片包含一个电源感应电路,用于感应主电源,每当主电源关闭时,它就会切换到备用线圈单元。

6.8-12.jpg

 楼主| 发表于 2022-4-10 18:14 | 显示全部楼层
DS1307串口输出日期和时间之二
1)实验开源图形编程(Mind+、编玩边学)

6.8-21.jpg

 楼主| 发表于 2022-4-10 18:15 | 显示全部楼层
(2)实验串口返回情况


6.8-22.jpg
 楼主| 发表于 2022-4-10 18:16 | 显示全部楼层
程序四:以5 秒间隔读取模块引脚的状态,然后遍历可能的值

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序四:以5秒间隔读取模块引脚的状态,然后遍历可能的值
  4. */

  5. #include "RTClib.h"//导入DS1307驱动库
  6. RTC_DS1307 rtc;
  7. int mode_index = 0;
  8. Ds1307SqwPinMode modes[] = { DS1307_OFF, DS1307_ON, DS1307_SquareWave1HZ, DS1307_SquareWave4kHz, DS1307_SquareWave8kHz, DS1307_SquareWave32kHz};

  9. void print_mode() {
  10.   Ds1307SqwPinMode mode = rtc.readSqwPinMode();

  11.   Serial.print("Sqw 引脚模式:");
  12.   switch (mode) {
  13.     case DS1307_OFF:
  14.       Serial.println("OFF");
  15.       break;
  16.     case DS1307_ON:
  17.       Serial.println("ON");
  18.       break;
  19.     case DS1307_SquareWave1HZ:
  20.       Serial.println("1Hz");
  21.       break;
  22.     case DS1307_SquareWave4kHz:
  23.       Serial.println("4.096kHz");
  24.       break;
  25.     case DS1307_SquareWave8kHz:
  26.       Serial.println("8.192kHz");
  27.       break;
  28.     case DS1307_SquareWave32kHz:
  29.       Serial.println("32.768kHz");
  30.       break;
  31.     default:
  32.       Serial.println("UNKNOWN");
  33.       break;
  34.   }
  35. }

  36. void setup () {
  37.   Serial.begin(57600);

  38. #ifndef ESP8266
  39.   while (!Serial); // 等待串口连接
  40. #endif

  41.   if (! rtc.begin()) {
  42.     Serial.println("找不到 RTC");
  43.     Serial.flush();
  44.     while (1) delay(10);
  45.   }

  46.   print_mode();
  47. }

  48. void loop () {
  49.   rtc.writeSqwPinMode(modes[mode_index++]);
  50.   print_mode();

  51.   if (mode_index > 5) {
  52.     mode_index = 0;
  53.   }

  54.   delay(5000);
  55. }
复制代码


 楼主| 发表于 2022-4-10 18:16 | 显示全部楼层
实验串口返回情况

6.8-23.jpg

 楼主| 发表于 2022-4-10 18:17 | 显示全部楼层
程序六:计算未来 7 12 小时 30 分钟 6 秒后的日期

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序六:计算未来 7 天 12 小时 30 分钟 6 秒后的日期
  4. */

  5. #include "RTClib.h"//导入DS1307驱动库
  6. RTC_DS1307 rtc;
  7. char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

  8. void setup () {
  9.   Serial.begin(57600);

  10. #ifndef ESP8266
  11.   while (!Serial); // 等待串口连接
  12. #endif

  13.   if (! rtc.begin()) {
  14.     Serial.println("找不到 RTC");
  15.     Serial.flush();
  16.     while (1)
  17.       delay(10);
  18.   }

  19.   if (! rtc.isrunning()) {
  20.     Serial.println("RTC 没有运行,让我们设置时间!");
  21.     // 当需要在新设备上设置时间时,或者在断电后
  22.     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  23.     rtc.adjust(DateTime(2022, 4, 10, 15, 35, 0));
  24.   }
  25.   // 此行使用明确的日期和时间设置 RTC,例如设置
  26.   // 2022 年 4 月 10 日下午 15 点,可以这样:
  27.   rtc.adjust(DateTime(2022, 4, 10, 15, 35, 0));
  28. }

  29. void loop () {
  30.   DateTime now = rtc.now();

  31.   Serial.print(now.year(), DEC);
  32.   Serial.print('/');
  33.   Serial.print(now.month(), DEC);
  34.   Serial.print('/');
  35.   Serial.print(now.day(), DEC);
  36.   Serial.print(" (");
  37.   Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  38.   Serial.print(") ");
  39.   Serial.print(now.hour(), DEC);
  40.   Serial.print(':');
  41.   Serial.print(now.minute(), DEC);
  42.   Serial.print(':');
  43.   Serial.print(now.second(), DEC);
  44.   Serial.println();

  45.   Serial.print(" 自 1970 年 1 月 1 日午夜起 =");
  46.   Serial.print(now.unixtime());
  47.   Serial.print("秒 = ");
  48.   Serial.print(now.unixtime() / 86400L);
  49.   Serial.println("天");

  50.   // 计算未来 7 天 12 小时 30 分钟 6 秒后的日期
  51.   DateTime future (now + TimeSpan(7, 12, 30, 6));

  52.   Serial.print(" now + 7d + 12h + 30m + 6s: ");
  53.   Serial.print(future.year(), DEC);
  54.   Serial.print('/');
  55.   Serial.print(future.month(), DEC);
  56.   Serial.print('/');
  57.   Serial.print(future.day(), DEC);
  58.   Serial.print(' ');
  59.   Serial.print(future.hour(), DEC);
  60.   Serial.print(':');
  61.   Serial.print(future.minute(), DEC);
  62.   Serial.print(':');
  63.   Serial.print(future.second(), DEC);
  64.   Serial.println();

  65.   Serial.println();
  66.   delay(3000);
  67. }
复制代码


 楼主| 发表于 2022-4-10 18:18 | 显示全部楼层
实验串口返回情况

6.8-25.jpg

 楼主| 发表于 2022-4-10 18:19 | 显示全部楼层
程序七:查询即时时间
Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序七:查询即时时间
  4. */

  5. #define countof(a) (sizeof(a) / sizeof(a[0]))

  6. #include <Wire.h> // 导入驱动库
  7. #include <RtcDS1307.h>
  8. RtcDS1307<TwoWire> Rtc(Wire);

  9. const char data[] = "现在几点?";

  10. void setup () {
  11.   Serial.begin(57600);
  12.   Serial.print("编译:");
  13.   Serial.print(__DATE__);
  14.   Serial.println(__TIME__);

  15.   Rtc.Begin();
  16.   RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  17.   printDateTime(compiled);
  18.   Serial.println();

  19.   if (!Rtc.IsDateTimeValid())
  20.   {
  21.     if (Rtc.LastError() != 0)
  22.     {
  23.       Serial.print("RTC 通讯错误 =");
  24.       Serial.println(Rtc.LastError());
  25.     }
  26.     else
  27.     {
  28.       Serial.println("RTC 对 DateTime 失去信心!");
  29.       Rtc.SetDateTime(compiled);
  30.     }
  31.   }

  32.   if (!Rtc.GetIsRunning())
  33.   {
  34.     Serial.println("RTC 没有运行,现在开始");
  35.     Rtc.SetIsRunning(true);
  36.   }

  37.   RtcDateTime now = Rtc.GetDateTime();
  38.   if (now < compiled)
  39.   {
  40.     Serial.println("RTC 早于编译时间!(更新日期时间)");
  41.     Rtc.SetDateTime(compiled);
  42.   }

  43.   // 永远不要假设 Rtc 是你上次配置的,所以
  44.   // 只需将它们清除到需要的状态
  45.   Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low);

  46.   /* 注释掉第二次运行以查看信息是否长期存储 */
  47.   // 在 RTC 的内存中存储一​​些东西
  48.   Rtc.SetMemory(0, 13);
  49.   uint8_t written = Rtc.SetMemory(13, (const uint8_t*)data, sizeof(data) - 1); // 删除空终止符字符串 add
  50.   Rtc.SetMemory(1, written);
  51.   /* 注释掉部分结束 */
  52. }

  53. void loop () {
  54.   if (!Rtc.IsDateTimeValid())
  55.   {
  56.     if (Rtc.LastError() != 0)
  57.     {
  58.       Serial.print("RTC 通讯错误 = ");
  59.       Serial.println(Rtc.LastError());
  60.     }
  61.     else
  62.     {
  63.       // 常见原因:
  64.       // 设备电池电量低甚至丢失,电源线断开
  65.       Serial.println("RTC 对 DateTime 失去信心!");
  66.     }
  67.   }

  68.   RtcDateTime now = Rtc.GetDateTime();

  69.   printDateTime(now);
  70.   Serial.println();

  71.   delay(5000);

  72.   // 读取数据

  73.   // 从地址 0 获取我们存储数据的偏移量
  74.   uint8_t address = Rtc.GetMemory(0);
  75.   if (address != 13)
  76.   {
  77.     Serial.println("地址不匹配");
  78.   }
  79.   else
  80.   {
  81.     // 从地址 1 获取数据的大小
  82.     uint8_t count = Rtc.GetMemory(1);
  83.     uint8_t buff[20];

  84.     // 从给定大小的地址获取我们的数据
  85.     uint8_t gotten = Rtc.GetMemory(address, buff, count);

  86.     if (gotten != count ||
  87.         count != sizeof(data) - 1) // 移除多余的空终止符字符串 add
  88.     {
  89.       Serial.print("有些东西不匹配,count = ");
  90.       Serial.print(count, DEC);
  91.       Serial.print(", 得到 = ");
  92.       Serial.print(gotten, DEC);
  93.       Serial.println();
  94.     }
  95.     Serial.print("数据读取 (");
  96.     Serial.print(gotten);
  97.     Serial.print(") = "");
  98.     for (uint8_t ch = 0; ch < gotten; ch++)
  99.     {
  100.       Serial.print((char)buff[ch]);
  101.     }
  102.     Serial.println(""");
  103.   }
  104.   delay(5000);
  105. }

  106. void printDateTime(const RtcDateTime& dt)
  107. {
  108.   char datestring[20];

  109.   snprintf_P(datestring,
  110.              countof(datestring),
  111.              PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
  112.              dt.Month(),
  113.              dt.Day(),
  114.              dt.Year(),
  115.              dt.Hour(),
  116.              dt.Minute(),
  117.              dt.Second() );
  118.   Serial.print(datestring);
  119. }
复制代码


 楼主| 发表于 2022-4-10 18:19 | 显示全部楼层
实验串口返回情况

6.8-26.jpg

 楼主| 发表于 2022-4-10 18:20 | 显示全部楼层
程序八:使用OLED有机屏显示时间
Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序八:使用OLED有机屏显示时间
  4. */

  5. #include <SPI.h> //导入驱动库
  6. #include <Wire.h>
  7. #include <Adafruit_GFX.h>
  8. #include <Adafruit_SSD1306.h>
  9. #include "RTClib.h"

  10. #define SCREEN_WIDTH 128 // OLED 显示宽度,以像素为单位
  11. #define SCREEN_HEIGHT 64 // OLED 显示高度,以像素为单位

  12. // 连接到 I2C 的 SSD1306 显示器的声明(SDA、SCL 引脚)
  13. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, 4);
  14. RTC_DS1307 RTC;

  15. void setup() {
  16.   Serial.begin(115200);

  17.   if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  18.     / 地址 0x3C 为 128x64
  19.     Serial.println(F("SSD1306 allocation failed"));
  20.     for (;;);
  21.   }
  22.   delay(1000);
  23.   display.clearDisplay();
  24.   display.setTextSize(1);
  25.   display.setTextColor(WHITE);
  26.   display.setCursor(0, 11);
  27.   // D显示静态文本
  28.   display.println("Digital Clock");
  29.   display.display();
  30.   delay(1000);
  31.   display.clearDisplay();
  32. }

  33. void loop() {
  34.   display.setTextSize(1);
  35.   DateTime now = RTC.now();
  36.   display.setCursor(40, 30);
  37.   display.setTextSize(1);
  38.   display.print(now.day());
  39.   display.print('/');
  40.   display.print(now.month());
  41.   display.print('/');
  42.   display.print(now.year());
  43.   display.print(' ');
  44.   display.setCursor(40, 40);
  45.   if (now.hour() < 10)
  46.     display.print('0');
  47.   display.print(now.hour());
  48.   display.print(':');
  49.   if (now.minute() < 10)
  50.     display.print('0');
  51.   display.print(now.minute());
  52.   display.print(':');
  53.   if (now.second() < 10)
  54.     display.print('0');
  55.   display.print(now.second());
  56.   delay(1000);
  57.   display.setTextSize(1);
  58.   display.setTextColor(WHITE);
  59.   display.setCursor(10, 4);
  60.   // 显示静态文本
  61.   display.println("Digital Clock");
  62.   display.display();
  63.   delay(1000);
  64. }
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-2 03:48 , Processed in 0.071071 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表