Arduino的进阶之路01——I2C四位数码管的简易时钟(原创)
Arduino的进阶之路01——I2C四位数码管的简易时钟(原创)
soul董董 发表于2年前
Arduino的进阶之路01——I2C四位数码管的简易时钟(原创)
  • 发表于 2年前
  • 阅读 135
  • 收藏 0
  • 点赞 1
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 一般时钟都是RTC模块制作,但是手上并没有,却只有一个i2c四位数码管模块,以及一块mega328-u的核心板。将两者连接,并载入程序,即可获得一个实时时钟。

事先说明,我手上的数码管与其对应的ALPHA的MEGA328-U均来自OCROBOT系列,它的板子都做的非常简单,使用方便,适合新手入门。OCRBOT系列是对Arduino各类开源板子优化的一个系列。
OCROBOT官网:www.ocrobot.com.

OCROBOT淘宝店:www.ocrobot.taobao.com


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


#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
 
Adafruit_7segment matrix = Adafruit_7segment();
 
void setup() {
#ifndef __AVR_ATtiny85__
  Serial.begin(9600);
  Serial.println("7 Segment Backpack Test");
#endif
  matrix.begin(0x70);
}
 
void loop() {
int16_t b=0,day_hour =16;                   //现在是16点,所以改day_hour=16;如果是别的小时,改数字即可。
boolean drawDots = true;
 
for(uint16_t s=12;s<60;s++)                            //这一段是秒的设定,由于秒的定点时间很快,所以需要预估你的速度,以及下载速度,比如现在2s,那么你需要预估一下上传至完成的时间大概多少秒,我预估在10S左右。所以这里就是一个出现误差的关键所在。
        {
          matrix.drawColon(drawDots);
          matrix.writeDisplay();
         if (s%2==0)
        {
          drawDots = false; delay(30);
        }
        else {
         drawDots = true; delay(30);                
       }
         delay(1000);
        } 
for (uint16_t m =31; m <60; m++)             //现在是31分,所以改m=31,如果是别的分,就改数字就可。
   {     b=day_hour*100+m;
         matrix.print(b,DEC);
         matrix.writeDisplay();
        for(uint16_t s=0;s<60;s++)
        {
          matrix.drawColon(drawDots);
          matrix.writeDisplay();
         if (s%2==0)
        {
          drawDots = false; delay(30);
        }
        else {
         drawDots = true; delay(30);
       }
         delay(1000);
        }
   }
for(day_hour =17; day_hour <24; day_hour++ )       //特别提醒,需要将day_hour的时间+1
{      
  for (uint16_t mf =0; mf <60; mf++)
   {     b=day_hour*100+mf;
         matrix.print(b,DEC);
         matrix.writeDisplay();
        for(uint16_t s=0;s<60;s++)
        {
          matrix.drawColon(drawDots);
          matrix.writeDisplay();
         if (s%2==0)
        {
          drawDots = false; delay(30);
        }
        else {
         drawDots = true; delay(30);
       }
         delay(1000);
        }
 
 
   }
  }
for(uint16_t year =0; year <366; year++)                              //这里开始,则开始计时365天
for(uint16_t hour =0; hour <24; hour++ )
{      
  for (uint16_t fen =0; fen <60; fen++)
   {     b=hour*100+fen;
         matrix.print(b,DEC);                                     //显示格式为数字
         matrix.writeDisplay();                                  //描绘
        for(uint16_t s=0;s<60;s++)                          //循环秒
        {
          matrix.drawColon(drawDots);                     //显示冒号
          matrix.writeDisplay();
         if (s%2==0)                                           //如果秒为双数
        {            
          drawDots = false; delay(30);                   //冒号不亮30s
        }
        else {
         drawDots = true; delay(30);                     //否则亮30s
       }
         delay(1000);                                           //整体延时
        }
 
 
  }      
  }  
  }

效果图:


总结说明:
     关于时间,最主要的是误差,秒的误差,这个需要你预估,所以整体来说,误差还是可见的。

      此项目纯属娱乐,实际用途不大,可供参考,绝对原创!

   未经允许,请勿转载!

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 1
码字总数 716
×
soul董董
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: