极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 47601|回复: 18

12位WS2812灯带制作RGB clock

[复制链接]
发表于 2015-12-1 17:55:54 | 显示全部楼层 |阅读模式
本帖最后由 Cambridge 于 2016-3-5 19:27 编辑

从某宝买来了一个圆形的12位灯带,刚驱动好之后,惊叹于他完美的色彩,这么漂亮的东西,只是驱动一下看看颜色未免太浪费了吧。刚好他是12位的,不正好跟时钟是一样的吗,带着这个想法去睡觉,今天早上翘了节课来完成这个泡妞计划哈哈哈。
先看看几张图片,拍的不太漂亮嘿嘿嘿。

然后就说说效果。最靠近接线的地方就是12点(第0盏灯),渐变色的是秒针,红色的是时针,绿色的是分钟。分针会根据秒针来渐变色,时钟会根据分针来渐变色。当时针分钟重合的时候就会有5分钟的彩虹。
接线比较简单,DS1307的SDA和SCL分别接A4和A5,WS2812的DIN接arduino的D6脚。
  1. #include <Adafruit_NeoPixel.h>
  2. #include <Wire.h>
  3. #include "RTClib.h"

  4. #ifdef __AVR__
  5.   #include <avr/power.h>
  6. #endif

  7. #define PIN 6

  8. RTC_DS1307 rtc;

  9. Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);

  10. int h=0,m=0,s=0;
  11. int lastsecond=0,lastminute=0,lasthour=0,scale=0;

  12. void setup(){
  13.   
  14.   #if defined (__AVR_ATtiny85__)
  15.   if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  16.   #endif
  17.   strip.begin();
  18.   strip.show(); // Initialize all pixels to 'off'
  19. // Serial.begin(9600);

  20. #ifdef AVR
  21.   Wire.begin();
  22. #else
  23.   Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
  24. #endif
  25.   rtc.begin();
  26.   
  27. }
  28. void loop(){
  29.   DateTime now = rtc.now();
  30.   h=now.hour();
  31.   m=now.minute();
  32.   s=now.second();
  33.   if(h>=12)h=h-12;
  34.   strip.setBrightness(64);
  35.   if(h!=m/5){
  36.    
  37. /*hour*/
  38.     if(h!=lasthour){
  39.       strip.setPixelColor(lasthour, strip.Color(0,0,0));//清空上一盏灯
  40.       lasthour=h;
  41.       //if(lasthour==0)lasthour=12;         
  42.     }
  43.     strip.setPixelColor(h, strip.Color(150,0,4*m));
  44.     strip.show();
  45.     delay(20);
  46.   
  47. /*minute*/
  48.     if(m/5!=lastminute){
  49.       strip.setPixelColor(lastminute, strip.Color(0,0,0));//清空上一盏灯
  50.       lastminute=m/5;
  51.       //if(lastminute==0)lastminute=12;   
  52.     }
  53.     scale=m/5;
  54.     scale=50*(m-scale*5);
  55.     strip.setPixelColor(m/5, strip.Color(s+scale,150,0));
  56.     strip.show();
  57.     delay(20);
  58.   }
  59.   
  60. /*second*/
  61.   uint16_t j;
  62.   for(j=0; j<256; j++) {
  63.     DateTime now = rtc.now();
  64.     s=now.second();
  65.     if(s/5!=lastsecond){
  66.       strip.setPixelColor(lastsecond, strip.Color(0,0,0));//清空上一盏灯
  67.       lastsecond=s/5;
  68.       //if(lastsecond==0 )lastsecond=12;        
  69.       strip.show();
  70.       if(lastsecond-1==h || lastminute-1==h)hour1(h);
  71.       if(lastsecond-1==m/5)minute1(m/5);   
  72.     }
  73.     if(h==m/5){
  74.       if(m/5!=lastminute){
  75.         strip.setPixelColor(lastminute, strip.Color(0,0,0));
  76.         lastminute=m/5;
  77.         //if(lastminute==0)lastminute=12;           
  78.       }
  79.       strip.setPixelColor(h, Wheel(((h * 256 / strip.numPixels()) + j) & 255));
  80.     }
  81.     strip.setPixelColor(s/5, Wheel(((s/5 * 256 / strip.numPixels()) + j) & 255));
  82.     strip.show();
  83.     delay(20);
  84.   }
  85.   
  86. }

  87. void hour1(uint8_t hh) {
  88.   strip.setPixelColor(hh, strip.Color(150,0,4*m));
  89.   strip.show();
  90.   delay(20);
  91. }
  92. void minute1(uint8_t mm) {
  93.   strip.setPixelColor(mm, strip.Color(scale+s,150,0));
  94.   strip.show();
  95.   delay(20);
  96. }
  97. uint32_t Wheel(byte WheelPos) {
  98.   WheelPos = 255 - WheelPos;
  99.   if(WheelPos < 85) {
  100.     return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  101.   }
  102.   if(WheelPos < 170) {
  103.     WheelPos -= 85;
  104.     return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  105.   }
  106.   WheelPos -= 170;
  107.   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  108. }
复制代码


-------------------------------------------------------------分割线---------------------------------------------------------------------------------
最新更新,把分散的电路整理到一起了,做成了一个成品的时钟
下面共享stl文件,可以自己3d打印出来,也可以找我打印哈哈哈。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-12-1 18:13:27 | 显示全部楼层
mark 不错,我也有见过ws2812,封装到LED内节省了体积。
回复 支持 反对

使用道具 举报

发表于 2016-2-29 11:51:15 | 显示全部楼层
你好,我是新手,請問一下假如DS1307 換成DS 3231 要如何編寫, 因為考慮到時間的精準問題
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-5 19:16:12 | 显示全部楼层
mosqui 发表于 2016-2-29 11:51
你好,我是新手,請問一下假如DS1307 換成DS 3231 要如何編寫, 因為考慮到時間的精準問題

1307和3231代码通用
回复 支持 反对

使用道具 举报

发表于 2016-3-10 11:41:15 | 显示全部楼层
庫文件一樣通用??
回复 支持 反对

使用道具 举报

发表于 2016-3-10 13:51:30 | 显示全部楼层
太好了,可以了,現在嘗試增加12864 IIC 顯示時間
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-11 16:40:15 | 显示全部楼层
mosqui 发表于 2016-3-10 13:51
太好了,可以了,現在嘗試增加12864 IIC 顯示時間

嗯挺好的,加油
回复 支持 反对

使用道具 举报

发表于 2017-3-4 11:47:54 | 显示全部楼层
强烈要求学习、争取尽快仿制
回复 支持 反对

使用道具 举报

发表于 2017-3-5 10:34:29 | 显示全部楼层
呵呵,我也从某宝入手过一块24位的模块,也想做一个时钟,受水平限制,一直没有成功,现在有了参考,非常感谢!
回复 支持 反对

使用道具 举报

发表于 2017-3-9 22:05:37 | 显示全部楼层
用60位的不是更好吗
回复 支持 反对

使用道具 举报

发表于 2017-7-29 13:11:34 | 显示全部楼层
楼主,模型传的不对吧,有两个是盖子,少了两个腿~~~
回复 支持 反对

使用道具 举报

发表于 2017-8-9 07:14:50 | 显示全部楼层
我也搞了一个,确实漂亮
回复 支持 反对

使用道具 举报

发表于 2017-12-3 23:43:34 | 显示全部楼层
好像没按钮调时间?
回复 支持 反对

使用道具 举报

发表于 2017-12-4 17:35:42 | 显示全部楼层

谢谢楼主分享好资源  60位的应该更漂亮
回复 支持 反对

使用道具 举报

发表于 2017-12-13 09:57:07 | 显示全部楼层
我用楼主的代码怎么只有一个灯在渐变?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 03:15 , Processed in 0.051672 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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