【雕爷学编程】Arduino动手做(84)---DS1307时钟模块5

在这里插入图片描述

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十四:DS1307时钟模块 Tiny RTC I2C模块 24C32存储器 时钟(带电池)

在这里插入图片描述

DS1307时钟模块的实验环境
1、DS1307时钟模块实验所需硬件清单
DS1307时钟模块X1
TM1637四位数码管X1
Arduino Uno开发板 X1
杜邦线 若干(备了9条)
IIC/I2C 1602 LCD液晶屏模块X1
LED发光二极管(蓝、绿色)X2
Proto Shield原型扩展板(带mini面包板)X1

在这里插入图片描述

程序七:查询即时时间
(1)Arduino参考开源代码

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

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

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

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

void setup () {
    
    
  Serial.begin(57600);
  Serial.print("编译:");
  Serial.print(__DATE__);
  Serial.println(__TIME__);

  Rtc.Begin();
  RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  printDateTime(compiled);
  Serial.println();

  if (!Rtc.IsDateTimeValid())
  {
    
    
    if (Rtc.LastError() != 0)
    {
    
    
      Serial.print("RTC 通讯错误 =");
      Serial.println(Rtc.LastError());
    }
    else
    {
    
    
      Serial.println("RTC 对 DateTime 失去信心!");
      Rtc.SetDateTime(compiled);
    }
  }

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

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

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

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

void loop () {
    
    
  if (!Rtc.IsDateTimeValid())
  {
    
    
    if (Rtc.LastError() != 0)
    {
    
    
      Serial.print("RTC 通讯错误 = ");
      Serial.println(Rtc.LastError());
    }
    else
    {
    
    
      // 常见原因:
      // 设备电池电量低甚至丢失,电源线断开
      Serial.println("RTC 对 DateTime 失去信心!");
    }
  }

  RtcDateTime now = Rtc.GetDateTime();

  printDateTime(now);
  Serial.println();

  delay(5000);

  // 读取数据

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

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

    if (gotten != count ||
        count != sizeof(data) - 1) // 移除多余的空终止符字符串 add
    {
    
    
      Serial.print("有些东西不匹配,count = ");
      Serial.print(count, DEC);
      Serial.print(", 得到 = ");
      Serial.print(gotten, DEC);
      Serial.println();
    }
    Serial.print("数据读取 (");
    Serial.print(gotten);
    Serial.print(") = \"");
    for (uint8_t ch = 0; ch < gotten; ch++)
    {
    
    
      Serial.print((char)buff[ch]);
    }
    Serial.println("\"");
  }
  delay(5000);
}

void printDateTime(const RtcDateTime& dt)
{
    
    
  char datestring[20];

  snprintf_P(datestring,
             countof(datestring),
             PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
             dt.Month(),
             dt.Day(),
             dt.Year(),
             dt.Hour(),
             dt.Minute(),
             dt.Second() );
  Serial.print(datestring);
}

(2)实验串口返回情况

在这里插入图片描述
程序八:使用OLED有机屏显示时间
(1)Arduino参考开源代码

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

#include <SPI.h> //导入驱动库
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"

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

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

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

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    
    
    / 地址 0x3C128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  delay(1000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 11);
  // D显示静态文本
  display.println("Digital Clock");
  display.display();
  delay(1000);
  display.clearDisplay();
}

void loop() {
    
    
  display.setTextSize(1);
  DateTime now = RTC.now();
  display.setCursor(40, 30);
  display.setTextSize(1);
  display.print(now.day());
  display.print('/');
  display.print(now.month());
  display.print('/');
  display.print(now.year());
  display.print(' ');
  display.setCursor(40, 40);
  if (now.hour() < 10)
    display.print('0');
  display.print(now.hour());
  display.print(':');
  if (now.minute() < 10)
    display.print('0');
  display.print(now.minute());
  display.print(':');
  if (now.second() < 10)
    display.print('0');
  display.print(now.second());
  delay(1000);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(10, 4);
  // 显示静态文本
  display.println("Digital Clock");
  display.display();
  delay(1000);
}

(2)实验场景图

在这里插入图片描述

在这里插入图片描述

程序九:使用1602 LCD屏显示日期和时间
(1)实验接线示意图

在这里插入图片描述

(2)Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序九:使用1602 LCD屏显示日期和时间
*/

#include <Wire.h>
#include <DS1307.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 运行 ic2_scanner sketch 并获取 IC2 地址,这个例子中是 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
DS1307 rtc; // 初始化 RTC

void setup() {
    
    
  //初始化串口
  Serial.begin(9600);
  lcd.init();      //初始化液晶屏
  while (!Serial); //等待串口连接

  //init RTC
  Serial.println("Init RTC...");
  rtc.begin();

  //初始化实时时钟
  rtc.set(0, 36, 17, 10, 04, 2022);//手动设置秒、分、时、日、月、年

  //停止/暂停RTC
  // rtc.stop();

  //启动实时时钟
  rtc.start();
}

void loop() {
    
    
  uint8_t sec, min, hour, day, month;
  uint16_t year;

  //从RTC获取时间
  rtc.get(&sec, &min, &hour, &day, &month, &year);

  //serial output
  Serial.print("nTime: ");
  Serial.print(hour, DEC);
  Serial.print(":");
  Serial.print(min, DEC);
  Serial.print(":");
  Serial.print(sec, DEC);
  Serial.print("nDate: ");
  Serial.print(day, DEC);
  Serial.print(".");
  Serial.print(month, DEC);
  Serial.print(".");
  Serial.print(year, DEC);
  // set cursor to first line
  lcd.setCursor(5, 0);
  lcd.backlight();
  lcd.print("Hello!");
  lcd.setCursor(1, 1);
  lcd.print("MICRODIGISOFT");
  //等一下
  delay(10);

  lcd.clear(); //LCD显示日期与时间
  lcd.setCursor(1, 0);
  lcd.print("Date:");
  lcd.print(day);
  lcd.print("/");
  lcd.print(month);
  lcd.print("/");
  lcd.print(year);
  lcd.setCursor(1, 1);
  lcd.print("Time:");
  lcd.print(hour);
  lcd.print(":");
  lcd.print(min);
  lcd.print(":");
  lcd.print(sec);
  delay(1000);
  lcd.clear();
}

(3)实验场景图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132353759
今日推荐