Особенность в том, что каждая цифра имеет свой цвет, который можно изменить с пульта.
*1 ввести новое время = цифрами с пульта
*2 изменить цвет цифр = влево/вправо выбор цифры, вверх/вниз цвет , * сохранить изменения по текущей цифре, # выйти обратно в часы
*3 сделать все цифры красными
Схема состоит из arduino nano, ds3231(i2c A4 A5) , 1838(D2), 2812 2 квадрата 8*8 (управление через резисторы 220 ом на D9 и D10).
Цвет 8 бит = красный 4 бита, зеленый 2 бита, синий 2 бита, т.к. красный тусклый по сравнению с остальными.
#include <FastLED.h>
#include <EEPROM.h>
#define NUM_STRIPS 2
#define NUM_LEDS_PER_STRIP 64
#define DATA_PIN 10
#define DATA_PIN2 9
#include <Wire.h> // Если используется аппаратная шина I2C, то подключаем библиотеку Wire, до подключения библиотеки iarduino_RTC.
#include <iarduino_RTC.h>
// Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
iarduino_RTC watch(RTC_DS3231); // Объявляем объект watch для работы с RTC модулем на базе чипа DS3231, используется шина I2C.
const byte fnt[40] = { 62, 65, 65, 62, 0, 0, 127, 0, 98, 81, 73, 70, 34, 65, 73, 54, 15, 8, 8, 127, 79, 73, 73, 49, 62, 73, 73, 50, 1, 97, 25, 7, 54, 73, 73, 54, 38, 73, 73, 62 };
// 00000000000000 11111111111 2222222222222 3333333333333 44444444444 555555555555 666666666666 77777777777 888888888888
// для ИК пульта
byte bn, n = 0;
word keycode = 0;
//#define Sp Serial.print
unsigned long tm = 0;
unsigned long last = 0;
char ch = ' ';
unsigned long mkks;
byte HH, MM, st, h10, h1, m10, m1, hh, mm;
byte i1, i2, ss = 0;
int nn, ik, xt = 0;
byte rf, gf, bf = 0;
byte r, g, b = 0;
byte regim = 0;
//
byte color_dig[10];
// Define the array of leds
CRGB leds[NUM_STRIPS][NUM_LEDS_PER_STRIP];
// Time scaling factors for each component
void setup() {
pinMode(2, INPUT); // ir recv
attachInterrupt(0, irread, FALLING);
Serial.begin(115200);
watch.begin(&Wire); // &Wire1, &Wire2 ... // Инициируем работу с часами, указав ссылку на объект для работы с шиной I2C на которой находится часы (по умолчанию &Wire).
// watch.settime(__TIMESTAMP__); // Записываем время компиляции скетча в модуль.
FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds[0], NUM_LEDS_PER_STRIP);
FastLED.addLeds<WS2812, DATA_PIN2, GRB>(leds[1], NUM_LEDS_PER_STRIP);
r = 2;
g = 1;
b = 0;
delay(2000); // If something ever goes wrong this delay will allow upload.
see_time();
// take from EEprom colors of digits
for (int index = 0; index < 10; index++) {
color_dig[index] = EEPROM[index];
}
delay(1000);
}
void setPixel(int iz) {
leds[ss][iz].r = r; //b
leds[ss][iz].g = g; //r
leds[ss][iz].b = b; //g
}
void fonPixel(int iz) {
leds[ss][iz].r = rf;
leds[ss][iz].g = gf;
leds[ss][iz].b = bf;
}
void color_read(byte dg) {
byte cc;
cc = color_dig[dg];
if (cc == 0) cc = 1;
r = cc & 0b00001111;
g = cc & 0b00110000;
g >>= 4;
b = cc & 0b11000000;
b >>= 6;
// Serial.println();
// Serial.print("dg=");
// Serial.print(dg);
// Serial.print(", cc=");
// Serial.print(cc);
// Serial.print(", r=");
// Serial.print(r);
// Serial.print(", g=");
// Serial.print(g);
// Serial.print(", b=");
// Serial.println(b);
}
void tt1(int nj) {
int anj;
anj = nj * 4;
// 1 stroka
st = fnt[anj];
for (byte ii = 0; ii < 8; ii++) {
nn = 7 - ii;
if (bitRead(st, ii)) setPixel(nn);
else fonPixel(nn);
}
// 2 stroka
anj++;
st = fnt[anj];
for (byte ii = 0; ii < 8; ii++) {
nn = 15 - ii;
if (bitRead(st, ii)) setPixel(nn);
else fonPixel(nn);
}
// 3 stroka
anj++;
st = fnt[anj];
for (byte ii = 0; ii < 8; ii++) {
nn = 23 - ii;
if (bitRead(st, ii)) setPixel(nn);
else fonPixel(nn);
}
// 4 stroka
anj++;
st = fnt[anj];
for (byte ii = 0; ii < 8; ii++) {
nn = 31 - ii;
if (bitRead(st, ii)) setPixel(nn);
else fonPixel(nn);
}
}
void tt2(byte nj) {
if (nj < 0) nj = 0;
if (nj > 9) nj = 9;
int anj;
anj = nj * 4;
// 1 stroka
st = fnt[anj];
for (byte ii = 0; ii < 8; ii++) {
nn = 39 - ii;
if (bitRead(st, ii)) setPixel(nn);
else fonPixel(nn);
}
// 2 stroka
anj++;
st = fnt[anj];
for (byte ii = 0; ii < 8; ii++) {
nn = 47 - ii;
if (bitRead(st, ii)) setPixel(nn);
else fonPixel(nn);
}
// 3 stroka
anj++;
st = fnt[anj];
for (byte ii = 0; ii < 8; ii++) {
nn = 55 - ii;
if (bitRead(st, ii)) setPixel(nn);
else fonPixel(nn);
}
// 4 stroka
anj++;
st = fnt[anj];
for (byte ii = 0; ii < 8; ii++) {
nn = 63 - ii;
if (bitRead(st, ii)) setPixel(nn);
else fonPixel(nn);
}
}
void see_time() {
watch.gettime();
HH = watch.Hours; //часы
MM = watch.minutes; //минуты
ik = HH;
i1 = ik / 10;
i2 = ik - i1 * 10;
ss = 0;
if (i1 > 9) i1 = 9;
if (i2 > 9) i2 = 9;
color_read(i1);
tt1(i1);
color_read(i2);
tt2(i2);
ik = MM;
i1 = ik / 10;
i2 = ik - i1 * 10;
if (i1 > 9) i1 = 9;
if (i2 > 9) i2 = 9;
ss = 1;
color_read(i1);
tt1(i1);
color_read(i2);
tt2(i2);
FastLED.show();
}
void irread() {
tm = micros() - last;
last = micros();
n += 1;
// Serial.print(n);
//Serial.print("=") ;
//Serial.print(tm);
//Serial.print("uS, ") ;
if (tm > 3000) {
keycode = 0;
n = 0;
// Serial.println();
}
if (n > 8) {
if (tm > 1500) keycode += 1;
keycode = keycode << 1;
}
}
void keypressed() {
n = 0;
Serial.print(keycode, HEX); // печатаем символ
switch (keycode) {
case 0x1FE:
ch = '1';
break;
case 0xFE:
ch = '2';
break;
case 0x817E:
ch = '3';
break;
case 0x41BE:
ch = '4';
break;
case 0x40BE:
ch = '5';
break;
case 0xC13E:
ch = '6';
break;
case 0x21DE:
ch = '7';
break;
case 0x20DE:
ch = '8';
break;
case 0xA15E:
ch = '9';
break;
case 0x609E:
ch = '0';
break;
case 0x619E:
ch = '*';
break;
case 0xE11E:
ch = '#';
break;
case 0x51AE:
ch = 'L';
break;
case 0x10EE:
ch = 'U';
break;
case 0xD12E:
ch = 'R';
break;
case 0x30CE:
ch = 'D';
break;
case 0x50AE:
ch = 'M';
break;
default:
ch = '!';
}
Serial.print(ch); // печатаем символ
keycode = 0;
}
byte inp_dg(byte mxx) {
bn = 10;
do {
if (n == 32) {
keypressed();
bn = ch - 48;
}
} while (bn > mxx);
return bn;
}
void set_hhmm() {
//regim set hhmm. 0-9 . OK save. # exit without save. cursor rf gf=1 bf
// черный экран
Serial.println("set hhmm"); // печатаем символ
for (int iiz = 0; iiz < 64; iiz++) {
leds[0][iiz].r = 0;
leds[0][iiz].g = 0;
leds[0][iiz].b = 1;
}
for (int iiz = 0; iiz < 64; iiz++) {
leds[1][iiz].r = 0;
leds[1][iiz].g = 0;
leds[1][iiz].b = 1;
}
FastLED.show();
// ввод 4 цифр
h10 = inp_dg(2);
ss = 0;
//часы
i1 = h10;
tt1(i1);
FastLED.show();
//час
byte hx = 9;
if (i1 == 2) hx = 3;
h1 = inp_dg(hx);
i2 = h1;
tt2(i2);
FastLED.show();
//минуты
m10 = inp_dg(5);
i1 = m10;
ss = 1;
tt1(i1);
FastLED.show();
//минута
m1 = inp_dg(9);
i2 = m1;
tt2(i2);
FastLED.show();
delay(1000);
// h10 h1 m10 m1 < 23 59
hh = h10 * 10 + h1;
mm = m10 * 10 + m1;
if ((hh) < 24)
if ((mm) < 59) {
// write time rts
watch.settime(0, mm, hh); //,27,10,15,2); // Записываем время в модуль: 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник.
}
see_time();
delay(200);
Serial.println("RTC changed");
}
void ch_clr() {
byte dgd, dgd0, cl,i22;
Serial.println("change color digit run");
// слева цифры цветные, лево-право перебор цифр 0-9
// справа код цвета, вверх-вниз перебор 1-63
dgd = 1;
cl = color_dig[dgd];
do { // out screen data
i1 = dgd;
i2 = dgd;
r = cl & 0b00001111;
g = cl & 0b00110000;
g >>= 4;
b = cl & 0b11000000;
b >>= 6;
Serial.println(cl, BIN);
ss = 0;
tt1(i1); // цифра
r = 1;
g = 1;
b = 1;
i22 = cl / 100; // код цвета
tt2(i22);// сотни
ss = 1;
i1 = (cl - i22 * 100) / 10;
i2 = cl - i22 * 100 - i1 * 10;
tt1(i1); // десятки
tt2(i2); // единицы
FastLED.show();
while (n != 32) { // any key
delay(1);
}
keypressed();
dgd0 = dgd;
if (ch == 'U') cl++; // cc++
if (ch == 'D') cl--; // cc--
if (ch == 'L') dgd--; // dgt--
if (ch == 'R') dgd++; // dgt++
if (ch == '*') { // save color
EEPROM[dgd] = cl;
color_dig[dgd] = cl;
};
if (dgd > 9) dgd = 9;
if (cl < 1) cl = 1;
if (dgd != dgd0) cl = color_dig[dgd]; // смена цифры считаем ее цвет
} while (ch != '#'); // exit
Serial.println("change color digit stop"); // печатаем символ
}
void fact_pres() {
//factory preset color
Serial.println("factory preset color"); // печатаем символ
r = 2;
for (int index = 0; index < 10; index++) {
EEPROM[index] = r;
color_dig[index] = r;
}
}
void loop() {
see_time();
mkks = millis() + 4444;
do {
if (n == 32) {
if (ch == '*') {
keypressed();
if (ch == '1') set_hhmm(); // *1 regim set hhmm. 0-9 . OK save. # exit without save. cursor rf gf=1 bf
if (ch == '2') ch_clr(); // *2 change color digit U D digit L R color . OK write # exit without save
if (ch == '3') fact_pres(); // *3 factory preset color
} else keypressed();
};
} while (millis() < mkks);
}