//基于油管大佬代码备注修改,详见https://www.youtube.com/watch?v=A_S3LAUQHwU&t=45s
#include<Chrono.h>//简单的伪多线程库,走时速度慢,疑似网速问题
#define WS2812_pin 8 //led接在8号引脚
#define numberOfLEDs 256//灯珠数量
#define ds1307SDA 3
#define ds1307SCL 4
byte RGB[768];//led数量的三倍,用于存储所有灯带颜色信息。
int color[21]={255,0,0,255,255,0,146,208,80,0,176,80,0,176,240,0,112,192,112,48,160};
//自建函数
void RGB_update(int LED, byte RED, byte GREEN, byte BLUE);//声明驱动点阵屏函数,具体内筒见SHOW.ino
void mapLEDXY(int x, int y, byte RED, byte GREEN, byte BLUE) {//创建坐标系算法及显示函数
int RGBlocation = 0;
//根据点阵屏排列方式自行算出公式
RGBlocation =(7-y)*32-x+31;
//因为是三色在颜色数组中的位置需要*3;且因为2812是grb,在存储时对位置相应调整
RGB[RGBlocation * 3] = BLUE;
RGB[RGBlocation * 3 + 1] = RED;
RGB[RGBlocation * 3 + 2] = GREEN;
}
void clearLEDs() {//清理RGB内所有数为0 这个不要也可以运行,目前该函数并没有使用
memset(RGB, 0, sizeof(RGB));
}
//初始化时间
byte week = 1;
byte hour10= 2;
byte hour1= 3;
byte minute10 =5;
byte minute1 = 9;
byte second10 = 4;
byte second1 = 5;
bool blinkpoint =0;
Chrono clockTimer;
Chrono delayTimer;
Chrono belinkTimer; // 创建chrono定时器
bool i;//用于闪烁时间点
void setup() {
pinMode(WS2812_pin, OUTPUT);
Serial.begin(9600);
clearLEDs();//清理RGB内所有数为0
RGB_update(-1, 0, 0, 0);//熄灭灯
}
void weekBlink(byte weekday){//需要重构
switch(weekday){
case 1:
for(int ii=0;ii<7;ii++){
delayTimer.restart();
mapLEDXY(12,0,color[0+3*ii],color[1+3*ii],color[2+3*ii]);
RGB_update(-1, 0, 0, 0);
if(delayTimer.hasPassed(50)){;
mapLEDXY(12,0,0,0,0);
RGB_update(-1, 0, 0, 0);
}
}
}
}
void loop() {
mapLEDXY(12,0,146,208,80);mapLEDXY(13,0,146,208,80);mapLEDXY(14,0,146,208,80);mapLEDXY(15,0,146,208,80);mapLEDXY(16,0,146,208,80);mapLEDXY(18,0,255,255,0);mapLEDXY(19,0,255,255,0);
RGB_update(-1, 0, 0, 0);
weekBlink(week);
if(clockTimer.hasPassed(350)){//目前设置的350毫秒+1秒,但是走时还是较慢,疑似网络问题
sec1Black();
second1++;
clockTimer.restart();
}
//下为时间进位,同时在此对需要更改的LED进行熄灭操作
if(second1 == 10){//时间进位
second1 = 0;
second10++;
sec10Black();
sec1Black();
}
if(second10 == 6){
second10 = 0;
minute1 ++;
sec10Black();
minu1Black();
}
if(minute1 == 10){
minute1 = 0;
minute10 ++;
minu1Black();
minu10Black();
}
if(minute10 == 6){
minute10 = 0;
hour1 ++;
minu10Black();
hour1Black();
}
if(hour1 == 10){
hour1 = 0;
hour10 ++;
hour1Black();
hour10Black();
}
if(hour10 == 2&&hour1 ==4){
hour10 = 0;
hour1 = 0;
week++;
hour1Black();
hour10Black();
}
hourShow1(hour1);//小时个位数显示,函数代码见show.ino文件
hourShow10(hour10);//小时十位数显示,函数代码见show.ino文件
minuShow10(minute10);
minuShow1(minute1);
secShow10(second10);
secShow1(second1);
if(belinkTimer.hasPassed(220)){//时间点跳闪
i=!i;
Serial.println(i);
if(i){
mapLEDXY(13,2,218,150,148);mapLEDXY(13,4,218,150,148);mapLEDXY(23,2,218,150,148);mapLEDXY(23,4,218,150,148);
while(!belinkTimer.hasPassed(1));
RGB_update(-1, 0, 0, 0);
while(!belinkTimer.hasPassed(1));
}else{
belinkTimer.hasPassed(500);
mapLEDXY(13,2,0,0,0);mapLEDXY(13,4,0,0,0);mapLEDXY(23,2,0,0,0);mapLEDXY(23,4,0,0,0);
while(!belinkTimer.hasPassed(1));
RGB_update(-1, 0, 0, 0);
while(!belinkTimer.hasPassed(1));
}
belinkTimer.restart();
}
}