欢迎光临
我们一直在努力

基于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为16列2行
   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、实验思维拓展:

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

未经允许不得转载:Arduino-Maker » 基于Arduino的电子时钟实验(时钟模块、1602显示屏)

支付宝扫码打赏 微信打赏

原创文章,若帮到您,欢迎打赏

分享到:更多 ()

评论 3

评论前必须登录!

 

  1. #2

    如果使用转接板上传程序后,1602显示屏无法显示完整,可以将LiquidCrystal_I2C.cpp的
    inline size_t LiquidCrystal_I2C::write(uint8_t value) {
    send(value, Rs);
    return 0; 改为 return 1;

    gh0st3年前 (2017-04-10)
    • 这仅针对,1602只显示首字母。才进行更改的。

      arron3年前 (2017-04-10)
  2. #1

    请问排针1602要接几个引脚呢还是出来电源和地只用接D4D5

    21zrr1个月前 (10-13)

线上商城

中贝斯特创客空间蘑菇云创客教育