29125浏览
查看: 29125|回复: 26

[进阶] 自制简易时钟——IIC四位数码管(进阶版)

[复制链接]
本帖最后由 大连林海 于 2016-1-29 10:10 编辑

现在市面上有简单的RTC实时时钟模块,但是我手上只有一块IIC的四位数码管,如何将它变成一个具有显示时间功能的时钟呢?

首先用四根公对母的杜邦线将数码管与ALPHA MEGA328-U模块连接起来,VCC对5V,GND对GND,C对SCL,D对SDA。
接着,用数据线把ALPHA MEGA328-U模块连接上电脑,并查看端口号。
然后,打开IDE,添加一个驱动库,一个描绘库,编写Arduino代码。


ARDUINO代码:

  1. #include <Wire.h>
  2. #include "Adafruit_LEDBackpack.h"
  3. #include "Adafruit_GFX.h"
  4. Adafruit_7segment matrix = Adafruit_7segment();
  5. void setup() {
  6. #ifndef __AVR_ATtiny85__
  7.   Serial.begin(9600);
  8.   Serial.println("7 Segment Backpack Test");
  9. #endif
  10.   matrix.begin(0x70);
  11. }
  12. void loop() {
  13. int16_t b=0,day_hour =16;                   //现在是16点,所以改day_hour=16;如果是别的小时,改数字即可。
  14. boolean drawDots = true;
  15. for (uint16_t m =31; m <60; m++)             //现在是31分,所以改m=31,如果是别的分,就改数字就可。
  16.    {     b=day_hour*100+m;
  17.          matrix.print(b,DEC);
  18.          matrix.writeDisplay();
  19.         for(uint16_t s=0;s<60;s++)
  20.         {
  21.           matrix.drawColon(drawDots);
  22.           matrix.writeDisplay();
  23.          if (s%2==0)
  24.         {
  25.           drawDots = false; delay(30);
  26.         }
  27.         else {
  28.          drawDots = true; delay(30);
  29.        }
  30.          delay(1000);
  31.         }
  32.    }
  33. for(day_hour =17; day_hour <24; day_hour++ )       //特别提醒,需要将day_hour的时间+1
  34. {      
  35.   for (uint16_t mf =0; mf <60; mf++)
  36.    {     b=day_hour*100+mf;
  37.          matrix.print(b,DEC);
  38.          matrix.writeDisplay();
  39.         for(uint16_t s=0;s<60;s++)
  40.         {
  41.           matrix.drawColon(drawDots);
  42.           matrix.writeDisplay();
  43.          if (s%2==0)
  44.         {
  45.           drawDots = false; delay(30);
  46.         }
  47.         else {
  48.          drawDots = true; delay(30);
  49.        }
  50.          delay(1000);
  51.         }
  52.    }
  53.   }
  54. for(uint16_t year =0; year <366; year++)                              //这里开始,则开始计时365天
  55. for(uint16_t hour =0; hour <24; hour++ )
  56. {      
  57.   for (uint16_t fen =0; fen <60; fen++)
  58.    {     b=hour*100+fen;
  59.          matrix.print(b,DEC);                                     //显示格式为数字
  60.          matrix.writeDisplay();                                  //描绘
  61.         for(uint16_t s=0;s<60;s++)                          //循环秒
  62.         {
  63.           matrix.drawColon(drawDots);                     //显示冒号
  64.           matrix.writeDisplay();
  65.          if (s%2==0)                                           //如果秒为双数
  66.         {            
  67.           drawDots = false; delay(30);                   //冒号不亮30s
  68.         }
  69.         else {
  70.          drawDots = true; delay(30);                     //否则亮30s
  71.        }
  72.          delay(1000);                                           //整体延时
  73.         }
  74.   }      
  75.   }  }
复制代码

效果展示:


总结
程序说明:由于,初始时间需要设定,但是又不能一次性循环成果,所以我分成了分钟循环到初始值0,接着小时循环到下一个小时,以凑60为准,第一个是初始分钟循环,到59分钟结束;第二个是初始时间循环,到23:59分钟结束;第三个循环是从0:0开始,一直循环365天。
更改初始 值的地方已经注释。
60秒体现在中间的冒号上,一闪一闪的。




下载附件Adafruit_GFX_Library.zip下载附件Adafruit_LED_Backpack_Library.zip


由于不是RTC模块制作,没有对准秒,肯定有些小误差,想要更更加精确,自己去调试时间。
此项目纯属灵光一闪,望各位看官,看完支持一下!


转自  自制简易时钟——IIC四位数码管(进阶版) - Powered by Discuz!


归去来兮  初级技师

发表于 2016-2-20 10:44:38

大连林海 发表于 2016-2-1 16:15
厉害 欢迎分享一下

年前弄好的,用了timerone.h的库,这个库作为中断的计时,中断操作:
void zd() {
  if (millis() - time > 300)
    a++;
  time = millis();
}
这样来控制a的加或减
回复

使用道具 举报

吹口琴的钢铁侠  初级技匠

发表于 2016-1-29 20:50:02

归去来兮 发表于 2016-1-29 13:49
我现在做的是有一个中断,在其中自加,但每次增加几是不可控的,不知道怎么控制 ...

我以前做过,我用的是按键扫描
中断的话,你可以在加个按键去抖的时间,时间合适的话,就可以控制住增加的速率
回复

使用道具 举报

归去来兮  初级技师

发表于 2016-1-29 13:49:20

归去来兮 发表于 2016-1-29 13:48
请教一个问题,我也是用的四位数码馆,做倒计时功能,现在想加入一个按键,每按下一次倒计时的时间增加一分 ...

我现在做的是有一个中断,在其中自加,但每次增加几是不可控的,不知道怎么控制
回复

使用道具 举报

孙毅  初级技匠

发表于 2016-1-29 10:37:49

恩,跟定时炸弹相比,就差炸弹了。。。。
回复

使用道具 举报

吹口琴的钢铁侠  初级技匠

发表于 2016-1-29 10:39:56

绿色这个颜色很赞
但是电子钟要加个调整时间的按键之类的吧....
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-29 11:00:34

孙毅 发表于 2016-1-29 10:37
恩,跟定时炸弹相比,就差炸弹了。。。。

第一个肯定是要炸掉你
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-29 11:00:56

吹口琴的钢铁侠 发表于 2016-1-29 10:39
绿色这个颜色很赞
但是电子钟要加个调整时间的按键之类的吧....

没有时钟模块
回复

使用道具 举报

吹口琴的钢铁侠  初级技匠

发表于 2016-1-29 11:13:03


就是在它上电工作之后,你可以通过几个按钮来修改时间啊
回复

使用道具 举报

孙毅  初级技匠

发表于 2016-1-29 13:38:40

大连林海 发表于 2016-1-29 11:00
第一个肯定是要炸掉你

为毛。。。。我这么nice的一个人。。。
回复

使用道具 举报

归去来兮  初级技师

发表于 2016-1-29 13:48:33

请教一个问题,我也是用的四位数码馆,做倒计时功能,现在想加入一个按键,每按下一次倒计时的时间增加一分钟,这个功能要如何实现?
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-29 19:31:00

吹口琴的钢铁侠 发表于 2016-1-29 11:13
就是在它上电工作之后,你可以通过几个按钮来修改时间啊

可以试试看
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-29 19:31:17

孙毅 发表于 2016-1-29 13:38
为毛。。。。我这么nice的一个人。。。

是的 因为你太优秀
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-29 19:31:32

归去来兮 发表于 2016-1-29 13:48
请教一个问题,我也是用的四位数码馆,做倒计时功能,现在想加入一个按键,每按下一次倒计时的时间增加一分 ...

我这个也是转的 我还得继续研究
回复

使用道具 举报

归去来兮  初级技师

发表于 2016-1-30 11:43:16

吹口琴的钢铁侠 发表于 2016-1-29 20:50
我以前做过,我用的是按键扫描
中断的话,你可以在加个按键去抖的时间,时间合适的话,就可以控制住增加 ...

好的,我试试。。。
回复

使用道具 举报

归去来兮  初级技师

发表于 2016-1-30 15:37:41

吹口琴的钢铁侠 发表于 2016-1-29 20:50
我以前做过,我用的是按键扫描
中断的话,你可以在加个按键去抖的时间,时间合适的话,就可以控制住增加 ...

多谢,现在已搞定
回复

使用道具 举报

吹口琴的钢铁侠  初级技匠

发表于 2016-1-30 17:46:08


一个小技巧哈哈哈
回复

使用道具 举报

孙毅  初级技匠

发表于 2016-1-31 23:05:03

大连林海 发表于 2016-1-29 19:31
是的 因为你太优秀

好吧,你这样我会骄傲的。。哈哈哈
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-2-1 00:00:36

孙毅 发表于 2016-1-31 23:05
好吧,你这样我会骄傲的。。哈哈哈

大圣 不要骄傲吗
回复

使用道具 举报

dsweiliang  初级技神

发表于 2016-2-1 08:52:26

很好看
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-2-1 16:15:11

吹口琴的钢铁侠 发表于 2016-1-29 20:50
我以前做过,我用的是按键扫描
中断的话,你可以在加个按键去抖的时间,时间合适的话,就可以控制住增加 ...

按键防抖的这个教我一下
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-2-1 16:15:22


厉害 欢迎分享一下
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail