查看: 310|回复: 6

TM1637+DS1307 0.56英寸LED数字钟

[复制链接]
  • TA的每日心情
    开心
    2020-2-25 09:54
  • 签到天数: 480 天

    [LV.9]以坛为家II

    发表于 2020-1-19 13:10 | 显示全部楼层 |阅读模式
      这个0.56英寸LED数字钟具有以下功能:
    1.循环显示时间,日期,星期(时间6秒,月日2秒,星期2秒).
    2.24小时内定闹.
    3.99分内定时器(可用于橱房定时).
    4.断电不掉时.
    5.可调DS1307的minute值(消除因精度有限而产误差).
      使用方法:
    1.24小时内定闹.按压设置键设两次来调定闹小时值(上调键或下调键,短按慢调,长按快调),再按一次设置键来调定闹分钟值(上调键和下调键,短按慢调,长按快调).
    最后再按一次设置键返回正常时钟显示状态.此时要压下定时开关(时钟秒点不闪烁代表在定闹状态).设定时间到后后蜂鸣器会发出报警声.再次按压下定时开关会取消报警声.
    2.调DS1307的minute值,首先压下定时开关(时钟秒点不闪烁)然后按压设置键一次调分钟值与当前时间相同后再按压设置键三次返回正常时钟显示状态.最后必需按压弹起定时开关.
    3.99分内定时器,按压上调键或下调键(短按慢调,长按快调),达到设定值,按压定时起停键,到计时零分零秒后报警声响起.再次按压定时起停键可终止报警声.
      到计时期间按压上调键或下调键可修改定时时间,按压定时起停键也可暂停到计时.
    若有需求再上代码.

    微信图片_20200119130532.jpg
    微信图片_20200119130550.jpg
    微信图片_20200119130603.jpg
  • TA的每日心情
    开心
    2020-2-26 10:49
  • 签到天数: 1421 天

    [LV.10]以坛为家III

    发表于 2020-1-20 06:50 | 显示全部楼层
    主芯片是什么?
  • TA的每日心情
    开心
    2020-2-25 09:54
  • 签到天数: 480 天

    [LV.9]以坛为家II

     楼主| 发表于 2020-1-20 10:17 | 显示全部楼层
    middfat 发表于 2020-1-20 06:50
    主芯片是什么?

    arduino nano
  • TA的每日心情
    奋斗
    2020-1-26 14:51
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2020-1-25 19:43 | 显示全部楼层
    这个时钟看来也能作为学生用提醒器使用.请楼主发一下电路图和程序吧.
  • TA的每日心情
    开心
    2020-2-25 09:54
  • 签到天数: 480 天

    [LV.9]以坛为家II

     楼主| 发表于 2020-1-25 21:03 | 显示全部楼层
    tnn0220 发表于 2020-1-25 19:43
    这个时钟看来也能作为学生用提醒器使用.请楼主发一下电路图和程序吧.

      本人因嫌成品的TM1637时钟模块的LED屏是0.36,感觉太小.所以买的TM1637和0.56的时钟屏自制的模块,为了方便
    制作建议大家还是用成品模块.下面电路图中的A103J是一个10K排阻.也可用普通的10K电阻.程序如下:


    #include <MsTimer2.h>
    #include <Wire.h>
    #include "Sodaq_DS3231.h"
    #include "TM1637.h"
    int8_t  weekDay[] = {8, 1, 2, 3, 4, 5, 6 };
    //DateTime dt(2020, 1, 18, 15, 00, 0, 6); //上传程序时要据填写当时的年,月,日,时,分,秒.周.(上传程序后要去除它再上传程序一次)
    int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
    int ClockPoint = 1;
    int a = 0;
    int b = 0;
    int k = 0;
    int i = 0;
    int j = 0;
    int m = 0;
    int n = 0;
    int c = 12;
    int d = 0;
    int e = 0;
    int p = 0;

    uint32_t pTime=0;
    uint32_t dTime=0;

    #define CLK 6
    #define DIO 4
    TM1637 tm1637(CLK,DIO);
    void flash()  
    {
    ClockPoint= ClockPoint*(-1);
    if(m==1)b--;
    if((a>0)&&(b<0)){
      b=59;
      a--;
    }
    else if(b<0){
      b=0;
    }
      i++;
    if(i>2){
       k++;
        if(k>5)k=0;
         i=0;
        }
       
    }
    void setup ()
    {  MsTimer2::set(1000, flash);
       MsTimer2::start();
        Serial.begin(57600);
        Wire.begin();
        rtc.begin();
       // rtc.setDateTime(dt);//上传程序后要去除它再上传程序一次
         tm1637.set();
      tm1637.init();
    pinMode(5,OUTPUT);//蜂鸣器
    analogWrite(5,0);
      pinMode(7,INPUT);//定时起停键
    digitalWrite(7,HIGH);
      pinMode(8,INPUT);//上调键
    digitalWrite(8,HIGH);
    pinMode(9,INPUT);//下调键
    digitalWrite(9,HIGH);
    pinMode(10,INPUT);//定时开关
    digitalWrite(10,HIGH);
    pinMode(11,INPUT);//设置键
    digitalWrite(11,HIGH);
    }
    void loop ()
    {  uint32_t cTime = millis();
    if ( cTime - pTime > 100) {
    j++;
    pTime= cTime;}
    if((p==0)&&((digitalRead(8)==LOW)||(digitalRead(9)==LOW))){
    p=1;
    dTime=cTime;
    }
    if((digitalRead(8)==HIGH)&&(digitalRead(9)==HIGH))p=0;

    if((n==0)&&( pTime - dTime > 3000)&&(digitalRead(8)==LOW))a++;
    if(a>59)a=59;
    if((n==0)&&( pTime - dTime > 3000)&&(digitalRead(9)==LOW))a--;
    if(a<0)a=0;
    if((n==2)&&( pTime - dTime > 3000)&&(digitalRead(8)==LOW))c++;
    if(c>23)c=0;
    if((n==2)&&( pTime - dTime > 3000)&&(digitalRead(9)==LOW))c--;
    if(c<0)c=23;
    if((n==3)&&( pTime - dTime > 3000)&&(digitalRead(8)==LOW))d++;
    if(d>59)d=0;
    if((n==3)&&( pTime - dTime > 3000)&&(digitalRead(9)==LOW))d--;
    if(d<0)d=59;
    if((n==1)&&( cTime - dTime > 3000)&&(digitalRead(8)==LOW))e++;
    if(e>59)e=0;
    if((n==1)&&( cTime - dTime > 3000)&&(digitalRead(9)==LOW))e--;
    if(e<0)e=59;

    if(j>9)
    {
    j=0;
    if(digitalRead(11)==LOW)n++;
    if(n>3)n=0;

    if((n==0)&&(digitalRead(8)==LOW))a++;
    if(a>59)a=59;
    if((n==0)&&(digitalRead(9)==LOW))a--;
    if(a<0)a=0;
    if((n==2)&&(digitalRead(8)==LOW))c++;
    if(c>23)c=0;
    if((n==2)&&(digitalRead(9)==LOW))c--;
    if(c<0)c=23;
    if((n==3)&&(digitalRead(8)==LOW))d++;
    if(d>59)d=0;
    if((n==3)&&(digitalRead(9)==LOW))d--;
    if(d<0)d=59;
    if((n==1)&&(digitalRead(8)==LOW))e++;
    if(e>59)e=0;
    if((n==1)&&(digitalRead(9)==LOW))e--;
    if(e<0)e=59;
    }

      if((digitalRead(7)==LOW)&&(a>0))m=1;
      if((digitalRead(7)==LOW)&&((a)==0)&&((b)==0))m=0;

      tm1637.display(TimeDisp);
        DateTime now = rtc.now();
        int year=now.year();
    int hour=now.hour();
    int minute=now.minute();
    int month=now.month();
    int date=now.date();
    int week=weekDay[now.dayOfWeek()];
      if((((m==1)&&((a)==0)&&(b==0))||((digitalRead(10)==LOW)&&(hour==c)&&(minute==d)))&&(ClockPoint==1))analogWrite(5,127);
    else analogWrite(5,0);
       if(n==1){
      if(ClockPoint==1){
         tm1637.point(POINT_ON);
      TimeDisp[0] = "-";
      TimeDisp[1] = "-";
      TimeDisp[2] = e / 10;
      TimeDisp[3] = e % 10;
      }
      else{
        tm1637.point(POINT_OFF);

      }
      delay(50);
    }
    else if(n==2){
      if(digitalRead(10)==LOW){
      DateTime dt(year,month, date, hour,e, 0, week);
        rtc.setDateTime(dt);
    }
         tm1637.point(POINT_ON);
      TimeDisp[0] = c / 10;
      if((c/10)==0)TimeDisp[0] ="-";
      TimeDisp[1] = c % 10;
      TimeDisp[2] = "-";
      TimeDisp[3] = "-";

      
      delay(50);
    }

    else if(n==3){
      
         tm1637.point(POINT_ON);
      TimeDisp[0] = "-" ;
      TimeDisp[1] = "-" ;
      TimeDisp[2] = d / 10;
      TimeDisp[3] = d % 10;

      delay(50);
    }

    else{
    if(a||b>0){
       tm1637.point(POINT_ON);
      TimeDisp[0] = a / 10;
      if((a/10)==0)TimeDisp[0] ="-";
      TimeDisp[1] = a % 10;
      TimeDisp[2] = b / 10;
      TimeDisp[3] = b % 10;
      
    }
    else{
    if(k<4){
    if(ClockPoint==1){
      
    tm1637.point(POINT_ON);
      TimeDisp[0] = hour / 10;
      if((hour/10)==0)TimeDisp[0] ="-";
      TimeDisp[1] = hour % 10;
      TimeDisp[2] = minute / 10;
      TimeDisp[3] = minute % 10;
    }

    else{
      tm1637.point(POINT_OFF);
      if(digitalRead(10)==LOW)tm1637.point(POINT_ON);
      TimeDisp[0] = hour / 10;
      if((hour/10)==0)TimeDisp[0] ="-";
      TimeDisp[1] = hour % 10;
      TimeDisp[2] = minute / 10;
      TimeDisp[3] = minute % 10;
    }

    }
    if(k==4){
      tm1637.point(POINT_OFF);
    TimeDisp[0] = month/ 10;
    if((month/10)==0)TimeDisp[0] ="-";
    TimeDisp[1] = month % 10;
    TimeDisp[2] = date / 10;
    TimeDisp[3] = date % 10;
    }
    if(k==5){
    TimeDisp[0] ="-";
    TimeDisp[1] ="-";
    TimeDisp[2] ="-";
    TimeDisp[3] = week;
    }
    }
    }
    delay(50);

    }

    NOWCLOK.png
  • TA的每日心情
    奋斗
    2020-1-26 14:51
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2020-1-26 14:50 | 显示全部楼层
    lwq1947 发表于 2020-1-25 21:03
    本人因嫌成品的TM1637时钟模块的LED屏是0.36,感觉太小.所以买的TM1637和0.56的时钟屏自制的模块,为了方 ...

    不错不错,但8050没有基极电阻不会烧坏吗?
  • TA的每日心情
    开心
    2020-2-25 09:54
  • 签到天数: 480 天

    [LV.9]以坛为家II

     楼主| 发表于 2020-1-26 15:22 | 显示全部楼层
    就这台数字钟是不会的,你也可在基极回路中串一个1K电阻.这台数字钟整机工作电流最流大为23毫安.
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    [限时福利]5分钟带你快速了解新一代开发板:M5STACK
    [限时福利]5分钟带你快速
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    天猫精灵接入语音提示找不到该设备?
    天猫精灵接入语音提示找不
    今天又刷了一遍代码,天猫精灵提示 没有找到你要操作的设备! 怎么回事啊??? 折腾
    引入库的问题,不知道怎么叙述 看图吧
    引入库的问题,不知道怎么
    最左边的是主文件 也就是启动的文件 后边三个是引入的 在后边这个文件再引入库就报错
    blinker电源插座
    blinker电源插座
    这台blinker电源插座有blinker控制和手动控制两种工作方式. 1.blinker控制:滑条用于设
    blinker灯、环境传感器套件意见收集
    blinker灯、环境传感器套
    计划春节后推出blinker氛围灯和环境检测套件。 本帖收集相关建议,如若采纳,发红包(
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表