第一步:按照接线图接线并上传程序及代码
Arduino DS3231 LCD1602-I2C
5V VCC VCC
GND GND GND
A4 SDA SDA
A5 SCL SCL
第二步:上传程序代码,调试模块,检验程序效果
将连接好的Arduino插在电脑上,打开Arduino IDE,上传代码到板子里。
/*
*/
#include
#include
#include
DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;
uint8_t bell[8] = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
LiquidCrystal_I2C lcd(0x3F,16,2);
char data[15];
char Str_year[3], Str_month[3], Str_date[3], Str_DoW[3], Str_hour[3], Str_minute[3], Str_second[3];
void setup() {
// Start the I2C interface
Wire.begin();
Serial.begin(9600);
lcd.init();
lcd.backlight();
Serial.println("Please enter the time: year[2]month[2]date[2]DoW[2]hour[2]minute[2]second[2]");
Serial.println("example: 2014-12-3 Wednesday 14:15:15 enter:14120303141515");
}
void settime(){
if (Serial.available() >=14) //串口读取数据
{
for (int a = 0; a <14; a++)
{
data[a] = Serial.read();
}
Str_year[0] = data[0]; //拆包
Str_year[1] = data[1];
Str_month[0] = data[2];
Str_month[1] = data[3];
Str_date[0] = data[4];
Str_date[1] = data[5];
Str_DoW[0] = data[6];
Str_DoW[1] = data[7];
Str_hour[0] = data[8];
Str_hour[1] = data[9];
Str_minute[0] = data[10];
Str_minute[1] = data[11];
Str_second[0] = data[12];
Str_second[1] = data[13];
//Str to byte
year = atoi(Str_year); //转换数据类型
month = atoi(Str_month);
date = atoi(Str_date);
DoW = atoi(Str_DoW);
hour = atoi(Str_hour);
minute = atoi(Str_minute);
second = atoi(Str_second);
Clock.setSecond(second);//Set the second
Clock.setMinute(minute);//Set the minute
Clock.setHour(hour); //Set the hour
Clock.setDoW(DoW); //Set the day of the week
Clock.setDate(date); //Set the date of the month
Clock.setMonth(month); //Set the month of the year
Clock.setYear(year); //Set the year (Last two digits of the year)
}
}
void loop() {
int second,minute,hour,date,month,dow,year,temperature;
settime();
second= Clock.getSecond();
minute=Clock.getMinute();
hour=Clock.getHour(h12, PM);
date=Clock.getDate();
month=Clock.getMonth(Century);
year=Clock.getYear();
dow=Clock.getDoW();
temperature=Clock.getTemperature();
Serial.print("20");
Serial.print(year,DEC);
Serial.print('-');
Serial.print(month,DEC);
Serial.print('-');
Serial.print(date,DEC);
Serial.print(' ');
Serial.print(hour,DEC);
Serial.print(':');
Serial.print(minute,DEC);
Serial.print(':');
Serial.print(second,DEC);
Serial.print('');
Serial.print("Temperature=");
Serial.print(temperature);
Serial.print('');
lcd.setCursor(0, 0);
lcd.print("20"); // 显示20世纪
if (year>=10) // 显示年份
{
lcd.print(year,DEC);
}
else
{
lcd.print("0");
lcd.print(year,DEC);
}
lcd.print('-');
lcd.setCursor(5, 0);
if (month>=10) // 显示月份
{
lcd.print(month,DEC);
}
else
{
lcd.print("0");
lcd.print(month,DEC);
}
lcd.print('-');
lcd.setCursor(8, 0);
if (date>=10) // 显示日期
{
lcd.print(date,DEC);
}
else
{
lcd.print("0");
lcd.print(date,DEC);
}
lcd.setCursor(11, 0);
switch (dow) // 显示星期
{
case 1: // 当dow等于1时,执行以下语句
lcd.print("Mon");
break;
case 2: // 当dow等于2时,执行以下语句
lcd.print("Tue");
break;
case 3:
lcd.print("Wed");
break;
case 4:
lcd.print("Thu");
break;
case 5:
lcd.print("Fri");
break;
case 6:
lcd.print("Sat");
break;
case 7:
lcd.print("Sun");
break;
}
lcd.setCursor(0, 1); //光标移至第2行
if (hour>=10) // 显示小时
{
lcd.print(hour,DEC);
}
else
{
lcd.print("0");
lcd.print(hour,DEC);
}
lcd.print(':');
lcd.setCursor(3, 1);
if (minute>=10) // 显示分钟
{
lcd.print(minute,DEC);
}
else
{
lcd.print("0");
lcd.print(minute,DEC);
}
lcd.print(':');
lcd.setCursor(6, 1);
if (second>=10) // 显示秒钟
{
lcd.print(second,DEC);
}
else
{
lcd.print("0");
lcd.print(second,DEC);
}
lcd.setCursor(9, 1);
if (Clock.checkAlarmEnabled(1)) // 显示闹钟标识
{
lcd.write(0x00);
}
else
{
lcd.print(' ');
}
lcd.setCursor(12, 1);
lcd.print(temperature); // 显示温度
lcd.write(0xdf); // 显示温度单位
lcd.print("C");
delay(1000);
}
结果:上电后发现,模块成功运行,但是显示的时间不对。
第三步:通过串口,对时钟模块进行校准,使得时间正常显示
找到上面代码中的如下这一段,你可以了解到,图中红框内的文字,是程序本身对校准时间定义了格式,还举例说明了。所以,可以通过固定的格式,在串口对时钟模块进行校准
。
首先,查看你目前情况下的年月日、北京时间、星期,随后打开Arduino IDE 的串口监视器,在串口发送框里输入当前北京时间,并点击发送,原先的时间就变成了你所要设定的时间。
例:2017年2月28日 星期二 11:45:55秒
串口输入的就是:2017022802114555
注意:如果时间显示不对,请多发送几次。反应周期有点慢。
|