找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10345|回复: 2
打印 上一主题 下一主题
收起左侧

Arduino电子时钟

[复制链接]
跳转到指定楼层
楼主
第一步:按照接线图接线并上传程序及代码



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



注意:如果时间显示不对,请多发送几次。反应周期有点慢。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:827989 发表于 2020-11-24 19:17 | 只看该作者
头文件是什么??
回复

使用道具 举报

板凳
ID:827989 发表于 2020-11-25 08:55 | 只看该作者
代码不对呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表