sun20100480 发表于 2015-8-12 10:34:56

8*8 LED点阵多彩时钟

楼主前一阵子弄来一块8*8的LED模块,想用来做贪吃蛇或俄罗斯方块吧来玩玩看吧,又觉得似乎有一点老套。思来想去,觉得不如做个小“手表”吧,方方的和现在很多智能手表一样呢 :) ,大小也比较合适。
由于一块点阵上一共只有64个点,楼主只能把表盘浓缩一下,用独特一些的方式来表示时间,来猜猜看下面的视频中显示的是几点吧~

https://v.youku.com/v_show/id_XMTMwNzUyNDUwMA==.html

铛铛铛~正确答案是11:59分到12:00的转换!你猜对了嘛~下面就让我来解释一下怎么读懂这块表吧




图中的紫色部分,应该是最好看懂的吧,一亮一灭代表1秒的流逝
而蓝色部分,就如我们日常的表一样,显示的是小时,最顶端为12,最下端为6;
橙色部分所显示的是具体的分钟,范围是0-15;但一小时有60分钟,就用绿色部分显示的是当前时间是一小时内的第几个15分钟,
因此右上角亮为0-14,右下角则代表15-29,左下角20-44,左上角45-59; 60则又会循环回0

视频中左上角的三角亮起,外围红灯亮起14颗,所以代表45+14=59分,跳转后右上角亮起,红灯亮15颗,代表0
在这里楼主选择了用亮15颗代表0/15,是想让在如9:15时灯全部亮起,当然你也可以修改代码用全灭来代表0/15

怎么样,是不是很“搞”啊,楼主其实也是不愿意这样的啊!

在构思这块表盘的时候,楼主可是煞费苦心,要知道,因为8是偶数,只要有一行是亮奇数个像素点的话,就会导致整个图案的不对称,尝试了各种可能性发现如上的排列方式还算不错,不仅15是60的分子,剩下来的像素点也正好分成了四块,真是一件不容易的事情!

废话不多说啦,来看看这个有些小“蛇精”的表是怎么做的吧!

一、所需元件

8*8 双色I2C点阵 *1
Arduino Uno *1
DS1370时钟模块 *1
导线若干

二、连线

将各部件按下图所示连接:



小贴士:Uno上的SCL,SDA在 数字端Aref的左边,可以通过观察UNO的背面找到标识;




三、库文件安装





四、识别点阵模块地址

I2C地址位模块后有A0 A1 A2三个空焊盘 断开为零 短接为1
A0A1A2地址码
0000x70
1000x71
0100x72
1100x73
0010x74
1010x75
0110x76
1110x77





五、烧入代码
在理解完以下的代码以后,如果有别的显示时间的想法,比如你有更多的点阵模块的话,你大可以改动代码,做出不同的动画效果,期待更多作品哟~
/*
Finished by YU SUN on 08/11/2015
This is the code for an 8*8 LED Matrix Clock.
The time can be set everytime the program is compiled.
*/

#include <Wire.h>
#include <Adafruit_LEDBackpack.h>
#include <Adafruit_GFX.h>
#include <RTClib.h>

RTC_DS1307 RTC; //utilize the RTC library to keep track of time
Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); //utilize the Adafruit library to drive the LED matrix

long currentTime=0;
long prevTime=0;
int h =0;//hour
int m =0;//minute
int part=0;//which 15 mins segment it's in
boolean first = true;// the first time to display time

void setup() {
Serial.begin(9600);
RTC.begin();
matrix.begin(0x72);// pass in the address
matrix.clear();
   if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
}
    RTC.adjust(DateTime(2015, 8, 11,16, 16, 10));// manually set the time
    DateTime now = RTC.now(); // get the time from RTC
h = (now.hour());
if(h >= 12){
    h = (h - 12); //-12 because RTC is 24 Hour but there are only 12 LEDS on inner ring
   
}
part=((now.minute()/15))%4;// get which 15min section time is in
m=(now.minute());

}

void loop(){
//reset hour once it reaches 12
if (h==12){
h=0;
}
Serial.print("hour");//for debugging purposes
Serial.println(h,DEC);
   for(h;h<12;h++){
hoursAnimation(h);// show the animation for hour
//reset minute once it reaches 60
if (m==60){
m=0;
}
   for(m;m<60;m++){// the minute loop
   //increment part as time passes by
   if (first!=true && m%15==0){
   part++;
      if (part==4){//reset part
      part=0;
      }
   }
minutesAnimation(m%15);//animation for mins
Serial.print("part");
Serial.println(part);
partAnimation(part);//animation for part
// Seconds loop
   for(int s=0; s<60; s++){
      while(currentTime - prevTime < 0.5){ // waits for RTC to advance 1 second before continuing
      DateTime now = RTC.now();
          prevTime = currentTime;
          currentTime = now.unixtime();
      }
   if(s != 0 ){
         matrix.drawPixel(4,4,LED_GREEN);
         matrix.writeDisplay();
         delay(500);
         matrix.drawPixel(4,4,0);
         matrix.writeDisplay();
         delay(500);
         }
}
   }
   }
}

void minutesAnimation(int c){
Serial.print("min");
Serial.println(c);
// draw the whole min line if it's the first time operating
if (first== true){
    if(0<c&&c<=8){
      if (c==1){
      clearmin();// clear the min display before writing new ones
      }
   matrix.drawLine(0,0,c-1,0,LED_GREEN);
   matrix.writeDisplay();
   }else if (8<c&&c<15){
   matrix.drawLine(0,0,7,0,LED_GREEN);
   matrix.drawLine(0,0,0,c-8,LED_GREEN);
   matrix.writeDisplay();
   }else if (c==0){
   matrix.drawLine(0,0,0,7,LED_GREEN);
   matrix.drawLine(0,0,7,0,LED_GREEN);
   matrix.writeDisplay();
   }
   first = false;
}else {// draw one pixel at one time
   if(0<c&&c<=8){
   
   if (c==1){
   clearmin();
   }
   matrix.drawPixel(c-1,0,LED_GREEN);
   matrix.writeDisplay();
   }else if (8<c&&c<15){
   matrix.drawPixel(0,c-8,LED_GREEN);
   matrix.writeDisplay();
   }else if (c==0){
   matrix.drawLine(0,0,0,7,LED_GREEN);
   matrix.drawLine(0,0,7,0,LED_GREEN);
   matrix.writeDisplay();
   }
}
}
void clearmin(){
matrix.drawLine(0,0,0,7,0);
matrix.drawLine(0,0,7,0,0);
matrix.writeDisplay();

}
void hoursAnimation(int a){
//lines for all hour displays
matrix.drawLine(4,1,7,4,0);
matrix.drawLine(7,4,4,7,0);
matrix.drawLine(4,7,1,4,0);
matrix.drawLine(1,4,4,1,0);

matrix.drawLine(4,1,7,4,LED_RED);
matrix.drawLine(7,4,4,7,LED_RED);
matrix.drawLine(4,7,1,4,LED_RED);
matrix.drawLine(1,4,4,1,LED_RED);
matrix.writeDisplay();

Serial.print(a);
//show the exact hour
    if (0<=a&&a<=2){
   matrix.drawPixel(7-a,4+a,0);
    matrix.drawPixel(7-a,a+4,LED_GREEN);
    matrix.writeDisplay();
   
    }else if (3<=a&&a<=5){
    matrix.drawPixel(4-a%3,7-a%3,0);
    matrix.drawPixel(4-a%3,7-a%3,LED_GREEN);
    matrix.writeDisplay();
    }else if (6<=a&&a<=8){
    matrix.drawPixel(1+a%3,4-a%3,0);
    matrix.drawPixel(1+a%3,4-a%3,LED_GREEN);
    matrix.writeDisplay();
    }else{
    matrix.drawPixel(4+a%3,1+a%3,0);
    matrix.drawPixel(4+a%3,1+a%3,LED_GREEN);
    matrix.writeDisplay();
    }
}

void partAnimation(int b){
if (b==3){
   matrix.fillTriangle(3,1,1,1,1,3,0);
   matrix.fillTriangle(5,1,7,1,7,3,LED_YELLOW);
   matrix.writeDisplay();
}else if (b ==0){
   matrix.fillTriangle(5,1,7,1,7,3,0);
   matrix.fillTriangle(7,5,7,7,5,7,LED_YELLOW);
   matrix.writeDisplay();
}else if (b ==1){
   matrix.fillTriangle(7,5,7,7,5,7,0);
   matrix.fillTriangle(1,5,1,7,3,7,LED_YELLOW);
   matrix.writeDisplay();
}else if (b ==2){
   matrix.fillTriangle(1,5,1,7,3,7,0);
   matrix.fillTriangle(3,1,1,1,1,3,LED_YELLOW);
   matrix.writeDisplay();
}
}








touchfree 发表于 2015-8-12 11:02:17

够创意,比苹果表好看多了

dbc0301 发表于 2015-8-12 12:30:11

楼主还可以在程序里加入一些表情。:)

Jane 发表于 2015-8-12 15:52:16

很有创意~楼主脑洞挺大哈~

sun20100480 发表于 2015-8-12 17:41:55

dbc0301 发表于 2015-8-12 12:30
楼主还可以在程序里加入一些表情。

是啊,如果有按钮的话就可以设置成休眠模式时显示表情,按钮按了以后显示时间,还有挺多可能性哒~

caojinrong 发表于 2017-5-13 12:37:29

您好,我在学习您的这个,在我的电脑上,提示缺少C:\Users\lucky\AppData\Local\Temp\arduino_modified_sketch_284844\bicolor8x8.pde:19:20: fatal error: RTClib.h: No such file or directory
这个库文件,您这个库文件在哪呢?谢谢您:'(

袋鼠_zgz13 发表于 2021-9-14 15:11:24

您好,请问是否可以用arduino nano代替UNO,代码要怎么修改?
页: [1]
查看完整版本: 8*8 LED点阵多彩时钟