Домик с подсветкой на светодиодах

SkuLLsakH

✩✩✩✩✩✩✩
Добрый всем!
Как-то в том году сыну переделал китайский новогодний домик (ночник) с подсветкой собирал на к561ие8.
в этом году доча захотела. вот решил замахнутся на adruino nano. а так как я не занимался этим просьба помочь.
что у меня есть 10 светодиодов. (pin D3,D4,D5,D6.D7.D8.D9.D10,D11,D12) 1 кнопка сенсорная TTP223 (pin D2)
задача. каждый раз при нажатии кнопки переключались режимы.
1.нажал загорелся D3, нажал загорелся D4, D3 погас. и.т.д. (можно плавно)
2.режим плавного бегущего огня. ну тут надо еще как то добавить PWM на pin D4,D7,D8,D12.
3.режим можно добавить любой, если есть возможность=)
Вот что у меня получилось.
led 10:
int ButPin = 2;
int flag = 0;
int regim = 0;
int A_LedPin = 3;
int A;
int B_LedPin = 4;
int B;
int C_LedPin = 5;
int C;
int D_LedPin = 6;
int D;
int E_LedPin = 7;
int E;
int F_LedPin = 8;
int F;
int G_LedPin = 9;
int G;
int H_LedPin = 10;
int H;
int I_LedPin = 11;
int I;
int J_LedPin = 12;
int J;
int value = 0;
void setup() {
  ;
}
void loop() {
  if (digitalRead(ButPin) == HIGH && flag == 0) {
    regim++;
    flag = 1;
    if (regim > 11) {
      regim = 0;
    }
  }
  if (digitalRead(ButPin) == LOW && flag == 1)
    flag = 0;

  {
    digitalWrite(A_LedPin, LOW);
    digitalWrite(B_LedPin, LOW);
    digitalWrite(C_LedPin, LOW);
    digitalWrite(D_LedPin, LOW);
    digitalWrite(E_LedPin, LOW);
    digitalWrite(F_LedPin, LOW);
    digitalWrite(G_LedPin, LOW);
    digitalWrite(H_LedPin, LOW);
    digitalWrite(I_LedPin, LOW);
    digitalWrite(J_LedPin, LOW);
  }
  if (regim == 1) {
    digitalWrite(A_LedPin, HIGH);
    digitalWrite(B_LedPin, LOW);
  }
  if (regim == 2) {
    digitalWrite(B_LedPin, HIGH);
    digitalWrite(A_LedPin, LOW);
  }
  if (regim == 3) {
    digitalWrite(C_LedPin, HIGH);
    digitalWrite(B_LedPin, LOW);
  }
  if (regim == 4) {
    digitalWrite(D_LedPin, HIGH);
    digitalWrite(C_LedPin, LOW);
  }
  if (regim == 5) {
    digitalWrite(E_LedPin, HIGH);
    digitalWrite(D_LedPin, LOW);
  }
  if (regim == 6) {
    digitalWrite(F_LedPin, HIGH);
    digitalWrite(E_LedPin, LOW);
  }
  if (regim == 7) {
    digitalWrite(G_LedPin, HIGH);
    digitalWrite(F_LedPin, LOW);
  }
  if (regim == 8) {
    digitalWrite(H_LedPin, HIGH);
    digitalWrite(G_LedPin, LOW);
  }
  if (regim == 9) {
    digitalWrite(I_LedPin, HIGH);
    digitalWrite(H_LedPin, LOW);
  }
  if (regim == 10) {
    digitalWrite(J_LedPin, HIGH);
    digitalWrite(I_LedPin, LOW);
  }
  if (regim == 11) {
    A = 0;
    B = 0;
    C = 0;
    D = 0;
    E = 0;
    F = 0;
    G = 0;
    H = 0;
    I = 0;
    J = 0;
    for (A = 0; A <= 255; A++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (A = 255; A >= 0; A--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (A = 0; B <= 255; B++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (B = 255; B >= 0; B--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (B = 0; C <= 255; C++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (C = 255; C >= 0; C--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (C = 0; D <= 255; D++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (D = 255; D >= 0; D--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (D = 0; E <= 255; E++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (E = 255; E >= 0; E--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (F = 0; F <= 255; F++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (F = 255; F >= 0; F--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (F = 0; G <= 255; G++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (G = 255; G >= 0; G--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (G = 0; H <= 255; H++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (H = 255; H >= 0; H--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (H = 0; I <= 255; I++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (I = 255; I >= 0; I--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (I = 0; J <= 255; J++)
      setRGB(A, B, C, D, E, F, G, H, I, J);
    for (J = 255; J >= 0; J--)
      setRGB(A, B, C, D, E, F, G, H, I, J);
  }
}
void setRGB(int A, int B, int C, int D, int E, int F, int G, int H, int I, int J) {
  analogWrite(A_LedPin, A);
  analogWrite(B_LedPin, B);
  analogWrite(C_LedPin, C);
  analogWrite(D_LedPin, D);
  analogWrite(E_LedPin, E);
  analogWrite(F_LedPin, F);
  analogWrite(G_LedPin, G);
  analogWrite(H_LedPin, H);
  analogWrite(I_LedPin, I);
  analogWrite(J_LedPin, J);
  delay(10);
}
ну возникла беда после regim == 11 кнопка не работает не выходит в другой режим. и после reset яркость светодиодов на regim == 1 не восстанавливается.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,271
1,303
Москва
11-ый режим надолго подвешивает МК.
10 светодиодов. Каждый меняет свою яркость 255 раз в обе стороны. Итого 5100 изменений яркости. С задержкой 10 мс, Это будет 51 секунда. И только через 51 секунду будет возможность опросить кнопку, а опросить для нажатия ее надо 2 раза.

Сделайте работу кнопки по прерыванию.

Возможно тут удобнее уже будет использовать адресную ленту
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
491
142
@SkuLLsakH,
В дополнение к предыдущему ответу.
NANO имеет только 6 выводов с аппаратным ШИМ, остальные при использовании analogWrite работают вкл - выкл с порогом переключения 128
В сети есть примеры программного ШИМ на любых выводах (например у Гайвера https://alexgyver.ru/lessons/pwm-signal/). Как писали выше, возможно с адресной лентой будет удобнее.
 

SkuLLsakH

✩✩✩✩✩✩✩
Ребят ну помогите кто сможет 1000р закину). вам то проще уже знаете что да как. еще времени нет разбираться со всем этим. да и если еще бы занимался ардуинками бы. с адресной лентой бы по экспериментировал ну уже на другом домики.
 

Krypt0n

✩✩✩✩✩✩✩
3 Авг 2018
12
1
Ребят ну помогите кто сможет 1000р закину). вам то проще уже знаете что да как. еще времени нет разбираться со всем этим. да и если еще бы занимался ардуинками бы. с адресной лентой бы по экспериментировал ну уже на другом домики.
есл плавность не критична - могу сделать за 2500. Либо, если плавность критична, то с созданием схемы с динамической индикацией сделаю за 4к