Even if I knew my place, Should I leave it there? Should I give up? Or should I just keep chasin' pavements Even if it leads nowhere? I build myself up~ When I went shopping in the Christmas Day, I walked through the beautiful Chunxi in Chengdu, the large screen was playing Chasing Pavements. Getting lost in the face of Adele, I was totally sank into the video. I even wanted to take this screen to my home (if I could)! Back to home, happy to find that my roommate made a beautiful RGB clock, thinking about the big shopping mall screen, I cannot stop borrow the RGB clock (to DIY my own RGB clock)!
In the first day, I have taken it apart to check the constructions (⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄,thank god I haven’t screwed it up).
Why should I chose Gravity IO Expansion Shield for Arduino V7.1 as the expansion shield?
1.Free from complicated wiring and troubleshooting. 2.External expansion power supply, the terminal in the corner supplies the main controller and the expansion board, the other terminal in the middle supplies the servo connected to any Digital interface(avoid exceptional external power supply to RGB matrix screen, the wiring shown as below).
Wiring Diagram
NOTE: Please connect wires to the DFRduino UNO R3 - Arduino Compatible correctly, Green wires to Digital interfaces (2~9), Blue wires to Analog interfaces (0~3), Black wire to GND.
Wiring Real Time module to Air Quality Monitor
I was planned to make the UNO R3 wiring more convenient, unfortunately, I failed to change the wire except the upgraded adapter wiring. Then I found the parking list of the RGB matrix panel in the DFRobot, it contains 16pin IDC to IDC wire, which realizes my plan!
After the assembly, power on and the colorful RGB can be seen (support both battery supply and USB.
There are 3 colors in the RGB clock, Time is set to be green, date/temperature/humidity/PM2.5 are set to be Red or Blue randomly. You can also modify the parameters and change colors.
Humidity Display
Temperature Display
Date Display
The RGB clock is bright and penetrating. You can put it into the obvious place to remind yourself time. After all, the missing cattle and sheep can be found; but can't find the lost time. The RGB matrix panel connected to external power supply is so bright that can be seen far away. If it is too dazzling, you can put something (e.g. black plastic paper) in the surface of the panel to protect your window of soul.
Code
#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;
}
This article introduces the Mind+(Mindplus) editor, which seamlessly combines block-based and text coding in its interface, facilitating an easier transition.