查看: 4766|回复: 0

RGB炫彩时钟

[复制链接]
本帖最后由 川山甲的壳 于 2017-12-29 11:30 编辑

RGB炫彩时钟
“如果迎着风就飞,俯瞰这世界有多美,让烦恼都灰飞,别去理会自我藉慰,如果还有梦就追,至少不会遗憾后悔”上周去春熙路逛街的时候看见一家商场的大屏幕上正在播这首《远走高飞》。那时候真想把这大屏幕给搬回家。就算放在家里看看时间也是很震撼的啊。上班的时候刚好看见同事做了一个炫彩的RGB时钟,然后我就借过来玩了两天(最主要的是我也打算做一个)。大家来看看是不是很炫酷啊。
  
  备用视频地址:RGB炫彩时钟视频
借来的第一天我就想看看它到底是怎样构成的?于是我将它拆开自己又重新装了一下,顺便也了解了解需要哪些配件嘛。
[主要配件]


32x16RGB LED Matrix - 6mm pitch 点阵屏,它可以实现你想把大厦外面的广告牌搬回家的梦想。
32x16 RGB LED点阵屏是由512个RGB led按照32x16网格组成了一款全彩、高亮LED矩阵屏。在一些广告墙和显示屏会经常见到。点阵屏的背后有两个IDC 连接器,一个输入接口,一个输出接口;利用1/8扫描驱动显示屏。屏幕采用高分子防火PC塑胶面罩,该面罩不反光,不褪色,耐紫外线,同时还具备高温阻燃特性和良好的散热性能,在高低温这样恶劣的环境下工作也能保持模块之间不会相互挤压变形;这样可以确保产品的强度和外形稳定性。另外底壳还设计了有便于安装的安装孔。面罩不反光,耐紫外线,不褪色。
另外面板需要用到13个IO 引脚(6个数据位,7个控制位);一个5V电压,2A以上输出电流的电源供电。
注意:此面板在RAM和供电充足的情况下,可以任意级联,这样就能组合成更大的灯板了。但是当级联数量大于4之后,Arduino UNO的运算能力就稍显不足了,这是就需要使用Mega2560、树莓派或者其他的设备来驱动这块RGB面板。
点阵屏的背面主要分三个接口,IN-PUTOUT-PUTPOWER

其中IN-PUT和OUT-PUT引脚顺序一样,POWER电源供电5V。


另外需要选用IO传感器扩展板 V7.1扩展板的理由:
1.       省去了繁琐的面包板接线和故障排除。
2.       外部电源扩展,扩展板角落接线柱为主控器和扩展板供电,中部接线柱为数字口上的舵机供电(刚好RGB屏要外接电源,这样就省去另外找电源外接的麻烦,外接电源连线如下图)。
              外接电源连线


Gravity:I2C SD2405 RTC 实时时钟模块可以实现定时/报警中断输出,年、月、日、星期、时、分、秒的功能显示;该模块内置晶振,支持IIC接口,兼容Gravity接口的高精度时钟模块。

Arduino空气质量监测仪 (PM2.5, 甲醛, 温湿度)可测量PM10和PM2.5数值,同时内置甲醛以及温湿度传感器,可实时监测室内空气质量。据说甲醛浓度是基于电化学的原理检测,具备高精度、高稳定性的特点。

【电路连线示意图】

        RGB面板连线图
注意:图中标有绿色数字的线表示连接在UNO板上的数字端口(2~9,标有蓝色数字的线连接在模拟端口的(0~3)。黑色的接地。
  
Arduino空气质量监测仪和时钟模块的连线图

【实物连线示意图】

发现我除了改进了一下转接板的连线,其他的本没有实质性的改变啊。
后面发现DFRobot官网上的RGB点阵屏产品的配送清单里直接有16pin的IDC转IDC连接线。这样往UNO R3上连线就方便多了。

组装完成后,接上电池就可以看见下面的炫彩效果了。(也可USB供电。)

【实物效果图】
RGB炫彩时钟一共设置了三种颜色,时间显示的是绿色,日期、温湿度、PM2.5则是随机显示红色和蓝色。另外还可以更改代码里的参数设置其他颜色。
  
显示日期。
  
显示温度
显示湿度
  
显示PM2.5
       RGB炫彩时钟的亮度还是很有穿透力的,可以放在比较显眼的地方提示自己几点了,今天的温度是多少。外接电源的rgb屏亮度比较高,在远处也能清晰的看见,如果觉得刺眼睛的话可以在RGB面板的表面加一块遮挡物(如黑色的塑料纸)这样能有效地减弱光线,保护咱们心灵的窗户
【程序代码】
[C++] 纯文本查看 复制代码
#include <SoftwareSerial.h>
#include <Adafruit_GFX.h>   // Core graphics library
#include <RGBmatrixPanel.h> // Hardware-specific library
#include <Wire.h>
#include "GravityRtc.h"
SoftwareSerial Serial1(10, 11);
GravityRtc rtc;
#define CLK 8  // MUST be on PORTB! (Use pin 11 on Mega)
#define LAT A3
#define OE  9
#define A   A0
#define B   A1
#define C   A2
RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);
char col;
unsigned int PMSa = 0, FMHDSa = 0, TPSa = 0, HDSa = 0, PMSb = 0, FMHDSb = 0, TPSb = 0, HDSb = 0;
unsigned int PMS = 0, FMHDS = 0, TPS = 0, HDS = 0, CR1 = 0, CR2 = 0;
unsigned char buffer_RTT[40] = {}; //The serial port receives data
char tempStr[15];
char* str[] = {"error", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
int r, y, b, z;
int model = 1;
void setup()
{
  matrix.begin();
  rtc.setup();
  //rtc.initRtc(2017,9,27,3,16,20,3);//  setup time
  Serial.begin(9600);
}

void loop()
{
  if (model == 3)
  {
    model = 1;
  }
  switch (model) {
    case 1: r = 0; y = 7; b = 0; break;
    case 2: r = 0; y = 0; b = 7; break;
  }
  rtc.update();
  while (Serial.available() > 0) //Check whether there is serial data
  {

    for (int i = 0; i < 40; i++) //Read serial data
    {
      col = Serial.read();
      buffer_RTT[i] = (char)col;
      delay(2);
    }

    Serial.flush();

    CR1 = (buffer_RTT[38] << 8) + buffer_RTT[39];
    CR2 = 0;
    for (int i = 0; i < 38; i++)
      CR2 += buffer_RTT[i];
    if (CR1 == CR2)              //check
    {
      PMSa = buffer_RTT[12];      //Read PM2.5 high octet data
      PMSb = buffer_RTT[13];      //Read PM2.5 low octet data
      PMS = (PMSa << 8) + PMSb;   //PM2.5 data
      FMHDSa = buffer_RTT[28];    //Read the high octet data
      FMHDSb = buffer_RTT[29];    //Read the low octet data
      FMHDS = (FMHDSa << 8) + FMHDSb; //Formaldehyde data
      TPSa = buffer_RTT[30];      //Read the high octet data
      TPSb = buffer_RTT[31];      //Read the low temperature 8-bit data
      TPS = (TPSa << 8) + TPSb;   //Temperature data
      HDSa = buffer_RTT[32];      //Read the humidity high octet data
      HDSb = buffer_RTT[33];      //Read low humidity eight bits of data
      HDS = (HDSa << 8) + HDSb;    //Humidity data
    }
  }


  matrix.fillScreen(0);
  // draw some text!
  // start at top left, with one pixel of spacing
  matrix.setTextSize(1);    // size 1 == 8 pixels high
  matrix.setCursor(0, 0);
  matrix.setTextSize(1);
  matrix.setTextColor(matrix.Color333(0, 7, 0));
  if (rtc.hour < 10)
  {
    matrix.print('0');
    matrix.print(rtc.hour);
  }
  else
    matrix.print(rtc.hour);
  matrix.print(':');
  if (rtc.minute < 10)
  {
    matrix.print('0');
    matrix.print(rtc.minute);
  }
  else
    matrix.println(rtc.minute);
  sprintf(tempStr, "%d%d.%d", TPS / 100, (TPS / 10) % 10, TPS % 10);
  matrix.setTextColor(matrix.Color333(y, r, b));
  matrix.setCursor(0, 8);
  matrix.print(tempStr);
  matrix.print("C");
  matrix.fillRect(30, 9, 30, 2, matrix.Color333(y, r, b));
  delay(5000);

  // draw some text!
  matrix.fillRect(0, 7, 32, 9, matrix.Color333(0, 0, 0));
  matrix.setCursor(12, 0);
  matrix.setTextColor(matrix.Color333(0, 0, 0));
  matrix.print(':');
  delay(300);
  matrix.setCursor(12, 0);
  matrix.setTextColor(matrix.Color333(0, 7, 0));
  matrix.print(':');
  matrix.setCursor(6, 8);
  matrix.setTextColor(matrix.Color333(0, 0, 7));
  matrix.print(str[rtc.week]);
  delay(5000);
  matrix.fillRect(0, 7, 32, 9, matrix.Color333(0, 0, 0));
  matrix.setCursor(12, 0);
  matrix.setTextColor(matrix.Color333(0, 0, 0));
  matrix.print(':');
  delay(300);
  matrix.setCursor(12, 0);
  matrix.setTextColor(matrix.Color333(0, 7, 0));
  matrix.print(':');
  matrix.setTextColor(matrix.Color333(y, r, b));
  matrix.setCursor(0, 8);
  if (rtc.month < 10)
  {
    matrix.print('0');
    matrix.print(rtc.month);
  }
  else
    matrix.print(rtc.month);
  matrix.print('-');
  if (rtc.day < 10)
  {
    matrix.print('0');
    matrix.print(rtc.day);
  }
  matrix.print(rtc.day);
  delay(5000);
  matrix.fillRect(0, 7, 32, 9, matrix.Color333(0, 0, 0));
  matrix.setCursor(12, 0);
  matrix.setTextColor(matrix.Color333(0, 0, 0));
  matrix.print(':');
  delay(300);
  matrix.setCursor(12, 0);
  matrix.setTextColor(matrix.Color333(0, 7, 0));
  matrix.print(':');
  matrix.setTextColor(matrix.Color333(b, r, y));
  matrix.setCursor(0, 8);
  matrix.print(PMS);
  matrix.print("ug");
  delay(5000);
  matrix.fillRect(0, 7, 32, 9, matrix.Color333(0, 0, 0));
  matrix.setCursor(12, 0);
  matrix.setTextColor(matrix.Color333(0, 0, 0));
  matrix.print(':');
  delay(300);
  matrix.setCursor(12, 0);
  matrix.setTextColor(matrix.Color333(0, 7, 0));
  matrix.print(':');
  sprintf(tempStr, "%d%d.%d", HDS / 100, (HDS / 10) % 10, HDS % 10);
  matrix.setTextColor(matrix.Color333(y, r, b));
  matrix.setCursor(0, 8);
  matrix.print(tempStr);
  matrix.print("%");
  delay(5000);
  model += 1;
}
3D打印外壳】
打印文件.zip (92.39 KB, 下载次数: 25)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

硬件清单

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

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

mail