基于Arduino的电子时钟实验(时钟模块、1602显示屏)

1、概述

对于模块不了解的,可以先看一下我们的模块教程[传送门],了解掌握模块使用方法后,再尝试本小实验。因为综合实验一般涉及多个模块,我们仅对全部使用我司产品的客户做技术支持,若只是部分使用我司产品的,我们只对我司产品部分是否有故障进行排查。

2、所需材料

1、UNO主控板:官方板 或者 国产板
2、辅助配件:杜邦线
3、传感器和模块:时钟模块1602显示屏IIC版

3、接线

Arduino DS1307 LCD1602-I2C
5V VCC VCC
GND GND GND
A4 SDA SDA
A5 SCL SCL

4、上传时间设置程序,对时钟模块进行时间的设置,设为您计算机的系统时间。

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
   "Jan", "Feb", "Mar", "Apr", "May", "Jun",
   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

tmElements_t tm;

void setup() {
   bool parse=false;
   bool config=false;

  // get the date and time the compiler was run
   if (getDate(__DATE__) && getTime(__TIME__)) {
     parse = true;
     // and configure the RTC with this info
     if (RTC.write(tm)) {
       config = true;
     }
   }

  Serial.begin(9600);
   while (!Serial) ; // wait for Arduino Serial Monitor
   delay(200);
   if (parse && config) {
     Serial.print("DS1307 configured Time=");
     Serial.print(__TIME__);
     Serial.print(", Date=");
     Serial.println(__DATE__);
   } else if (parse) {
     Serial.println("DS1307 Communication Error :-{");
     Serial.println("Please check your circuitry");
   } else {
     Serial.print("Could not parse info from the compiler, Time="");
     Serial.print(__TIME__);
     Serial.print("
", Date="");
     Serial.print(__DATE__);
     Serial.println("
"");
   }
}

void loop() {
}

bool getTime(const char *str)
{
   int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
   tm.Hour = Hour;
   tm.Minute = Min;
   tm.Second = Sec;
   return true;
}

bool getDate(const char *str)
{
   char Month[12];
   int Day, Year;
   uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
   for (monthIndex = 0; monthIndex < 12; monthIndex++) {
     if (strcmp(Month, monthName[monthIndex]) == 0) break;
   }
   if (monthIndex >= 12) return false;
   tm.Day = Day;
   tm.Month = monthIndex + 1;
   tm.Year = CalendarYrToTm(Year);
   return true;
}

上传程序,打开串口监视器,DS1307已被设置为计算机系统时间。(DS1307模块带电池,可以保存并持续运行时间)如图所示:

5、上传显示程序,读取DS1307的时间,随后通过LCD1602显示

/*
DS1307和1602 LCD制作电子时钟
*/
// 引用会使用到的四个库文件
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// 实例化一个名为lcd的LiquidCrysta类型对象,并初始化相关引脚
LiquidCrystal_I2C lcd(0x3F,16,2);

void setup()
{
lcd.init();
   lcd.backlight();
   // 设置LCD有几列几行,1602LCD为162
   lcd.begin(16, 2);
   // 打印一段信息到LCD上
   lcd.print("This is a Clock");

   delay(3000);
   lcd.clear();
}

void loop() {
   tmElements_t tm;
   // 读出DS1307中的时间数据,并存入tm中
   if (RTC.read(tm))
   {
     // 清除屏幕显示内容
     lcd.clear();
     //在LCD第一行输出日期信息
     lcd.setCursor(0, 0);
     lcd.print(tmYearToCalendar(tm.Year));
     lcd.print("-");
     lcd.print(tm.Month);
     lcd.print("-");
     lcd.print(tm.Day);
     //在LCD第二行输出时间信息
     lcd.setCursor(8, 1);
     lcd.print(tm.Hour);
     lcd.print(":");
     lcd.print(tm.Minute);
     lcd.print(":");
     lcd.print(tm.Second);
   }
// 如果读取数据失败,则输出错误提示
else
   {
     lcd.setCursor(0, 1);
     lcd.print("error");
   }
   //每秒钟更新一次显示内容
   delay(1000);
}

上传程序后,LCD1602显示屏显示DS1307的时间。即当前时间。

6、重要提醒

1、第二步和第三步为先后顺序上传程序到Arduino,不能合并一起上传!!请先做完第二步,并实现第二步的步骤,再开始做第三步,并实现第三步的步骤,即最终实验效果。请严格按照教程所说的步骤执行,不按照教程操作,必后悔!必碰壁!!。

2、如果没有I2C 1602,而使用的是排针版1602,将上述程序中的#include <LiquidCrystal_I2C.h>改成#include <LiquidCrystal.h> 将LiquidCrystal_I2C lcd(0x3F,16,2);改成LiquidCrystal lcd(12, 11, 5, 4, 3, 2);随后将1602按照引脚接线。同样可以实现。

3、将Time-master和DS1307RTC-master两个文件夹放进Arduino安装目录下的libraries文件夹里。←←←很重要!!!!!!!

7、相关下载

库文件

8、实验思维拓展:

本次小实验,主要是模拟电子时钟的状态,通过时钟模块来实现了一个数字时间的显示。程序中的温度显示,可以通过连接温度传感器来实现温度的测控和显示。可以开拓思维,如果接上按键或者电位器,稍加更改下代码,是否可以进行时间的调节了呢?

0
分享到:

评论3

请先

  1. 如果使用转接板上传程序后,1602显示屏无法显示完整,可以将LiquidCrystal_I2C.cpp的 inline size_t LiquidCrystal_I2C::write(uint8_t value) { send(value, Rs); return 0; 改为 return 1;
    gh0st2017-04-10 12:31:24
    • 这仅针对,1602只显示首字母。才进行更改的。
      arron2017-04-10 12:32:52
  2. 请问排针1602要接几个引脚呢还是出来电源和地只用接D4D5
    21zrr2019-10-13 16:00:32
原Arduino365.com域名更改为品牌域名ultirobot.com,承载内容要将更丰富,网站也进行了改版,改善阅读体验。
没有账号? 忘记密码?