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