欢迎光临
我们一直在努力

Arduino电子时钟

QQ图片20170525124059

通过对Arduino基础知识的了解和掌握,现在我们就手头上有的一些模块,来做一个基于Arduino的电子时钟。

本次是以小实验的方式写的,对于模块不了解的,可以先看一下我们的模块教程,了解掌握模块使用方法后,再尝试本小实验。

(对于非本店模块不提供技术支持!如果无法做通,可能是不兼容导致,请自行尝试)。

所需材料:

ZHONGBEST UNO R3主控板一块购买链接

DS3231时钟模块:购买链接

LCD1602显示屏:购买链接

杜邦线若干:购买链接

四节五号电池盒:购买链接

 

zhongbest时钟套件(配套):购买链接

第一步:按照接线图接线(注意检查线路不要接错或者短路)。

DS1307Arduino 1602_bb_副本

Arduino                    DS1307                  LCD1602-I2C

5V                                 VCC                         VCC

GND                             GND                        GND

A4                                 SDA                        SDA

A5                                 SCL                          SCL

 

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

#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模块带电池,可以保存并持续运行时间)如图所示:

QQ图片20170525125913_副本

第三步:上传显示程序,读取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的时间。即当前时间。

QQ图片20170525124059

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

如果没有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按照引脚接线。同样可以实现。

==相关下载==

库文件:点我下载

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

实验思维拓展:

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

              

未经允许不得转载:Arduino-Maker » Arduino电子时钟

支付宝扫码打赏 微信打赏

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

分享到:更多 ()

评论 2

评论前必须登录!

 

  1. #1

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

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

      arron2年前 (2017-04-10)

线上商城

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