В детскую часы на 2812 8х8 и пульт

Особенность в том, что каждая цифра имеет свой цвет, который можно изменить с пульта.
*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);
}

Все это, конечно, интересно, но без фотографий совсем не познавательно. Да и схема не помешала бы ))


А зачем матрицы отдельно подключены? Они же прекрасно соединяются последовательно, получилась бы матрица 8х16

Насчет схемы просто - я написал выше куда к чему.
А если кто будет делать, то сам pinout каждого модуля посмотрит.
1838 = ик приемник для пульта
3231 = у меня модуль RTC 1307
Питание всех элементов 5в. Единственно припаял 1000uFx16v прямо на NANO V3 и на длинные ноги электролита цеплял проводочки питания остального.
Большую яркость матриц не делал, USB порт материнки держит ток.
Колхозить надо рассеиватель, т.к. без него плохо.
На фото использован лист бумаги А4.

Вот тут посмотрите

Я побоялся, что дальние светодиоды начнут шум ловить, т.к. в начале изучения у меня некоторые промаргивали.
А тут много ресурсов.
Также была мысль не обновлять лишний раз матрицу часов.
А. Еще и выписал одну, а только потом другую.
Вообщем исторически сложилось :slight_smile:

супер.

FastLED этим не страдает

Словесное описание не заменяет схему.

#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 dgd, dgd0, cl, i22, rx, gx, bx, cl0;
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 take_color() {
  r = cl & 0b00001111;
  g = cl & 0b00110000;
  g >>= 4;
  b = cl & 0b11000000;
  b >>= 6;
}

void ch_clr() {
  Serial.println("change color digit run");
  // слева цифры цветные,  лево-право перебор цифр 0-9
  // справа  код цвета,  вверх-вниз перебор 1-63
  dgd = 1;
  cl = color_dig[dgd];
  do {  // out screen data
    r = 1;
    g = 1;
    b = 1;
    i22 = cl / 100;  // код цвета
    ss = 0;
    tt2(i22);  // сотни
    ss = 1;
    i1 = (cl - i22 * 100) / 10;
    i2 = cl - i22 * 100 - i1 * 10;
    tt1(i1);  // десятки
    tt2(i2);  // единицы
    i1 = dgd;
    i2 = dgd;
    take_color();
    Serial.println(cl, BIN);
    ss = 0;
    tt1(i1);  // цифра

    FastLED.show();
    while (n != 32) {  // any key
      delay(1);
    }
    keypressed();
    dgd0 = dgd;
    cl0 = cl;
    if (ch == 'U') cl++;  // cc++   редактирование цвета цифры
    if (ch == 'D') cl--;  // cc--
    if (ch == '1') r++;   // красный
    if (ch == '7') r--;
    if (ch == '2') g++;  // зеленый
    if (ch == '8') g--;
    if (ch == '3') b++;  // синий
    if (ch == '9') b--;
    if (r > 15) r = 0;  // обрезание
    if (g > 3) g = 0;
    if (b > 3) b = 0;
    cl = r + g * 16 + b * 64;  // формируем код цветности
    if (cl < 1) cl = 1;
    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 (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);
}

добавил для простоты редактирования цвета
управление кнопками
1 4 + - красный
2 8 + - зеленый
3 9 + - синий

а то долго стрелочками перебирать

Код, конечно, огонь… :)))

1 лайк

из жо


Ну тогда монтаж на какую эмоцию потянет? :slight_smile:

Что то конкретное в коде или всё? :slight_smile:

Названия переменных ремня просят…

ты зачем разделочную доску сломал, на ней колбасу режут!

1 лайк

ТС, Вы молодец. Спасибо за напоминание монтажа из моего детства. Отверстия просверлены, я бы гвоздём разогретым на газу прожёг :slight_smile: Переменные названы как я люблю - хрен кто кроме меня поймёт (через месяц сам не вспомню). Вы не используете библиотеку для работы с ИК приёмником. Уже по этому скетч сдеру себе :slight_smile: