Подцветка клавиатуры при помощи Ws2812B и Arduino Nano. Не корректно работает. Помогите пожалуйста разобраться!

Александр Вер
Offline
Зарегистрирован: 24.03.2018

Доброго времени суток, увожаемые гуру. Я новичок и очень плохо разбираюсь в Arduino. И при создании подцветки для клавиатуры возникло много вопросов и проблем, на которые я не смог найти ответы. Надеюсь вы мне поможете. Подсвечивать я хочу клавиши клавиатуры, каждую в отдельности. Должно быть два режима подцветки. Первая - общая, для набора текста:  .                                  Вторая - для горячих клавиш программы:.                         Спаял я все по этой схеме:                                  Скетч токой:

#include <Adafruit_NeoPixel.h>


#define BUTTON_PIN   7

#define PIXEL_PIN    12

#define PIXEL_COUNT 60


Adafruit_NeoPixel pixels = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
bool oldState = HIGH;
int showType = 1;

void setup() {
  
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pixels.begin();
}

void loop() {

  
  // Получить текущее состояние кнопки.
  bool newState = digitalRead(BUTTON_PIN);

  
  // Проверьте, не изменилось ли состояние с высокого на низкий (нажмите кнопку).
  if (newState == LOW && oldState == HIGH) {


   // Кнопка короткой задержки для отмены.
    delay(20);

    
   // Проверьте, остается ли кнопка ниже после дребезга.
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 1) // поменять колличество вкладок. сейчас их 2 (0-1).
        showType=0;
      startShow(showType);
    }
  }
  
  oldState = newState;
}


void startShow(int i) {
  switch(i){

    
    // Вкладки вписывать сюда.

    case 0:
    pixels.setPixelColor(0, pixels.Color(40,0,110)); // `.

    pixels.show();  

    pixels.setPixelColor(1, pixels.Color(0,100,0)); // 1.

    pixels.show();  

    pixels.setPixelColor(2, pixels.Color(0,100,0)); // 2.

    pixels.show();  
   
    pixels.setPixelColor(3, pixels.Color(0,100,0)); // 3.

    pixels.show();  
    
    pixels.setPixelColor(4, pixels.Color(0,100,0)); // 4.

    pixels.show();  
    
    pixels.setPixelColor(5, pixels.Color(0,100,0)); // 5.

    pixels.show();  
    
    pixels.setPixelColor(6, pixels.Color(0,100,0)); // 6.

    pixels.show();  
    
    pixels.setPixelColor(7, pixels.Color(0,100,0)); // 7.

    pixels.show();  
    
    pixels.setPixelColor(8, pixels.Color(0,100,0)); // 8.

    pixels.show();  
    
    pixels.setPixelColor(9, pixels.Color(0,100,0)); // 9.

    pixels.show();  
    
    pixels.setPixelColor(10, pixels.Color(0,100,0)); // 0.

    pixels.show();  
    
    pixels.setPixelColor(11, pixels.Color(0,100,0)); // -.

    pixels.show();  
    
    pixels.setPixelColor(12, pixels.Color(0,100,0)); // +.

    pixels.show();  
    
    pixels.setPixelColor(13, pixels.Color(40,0,110)); // Backspace.

    pixels.show();  
    
    pixels.setPixelColor(14, pixels.Color(40,0,110)); // \.

    pixels.show();  
    
    pixels.setPixelColor(15, pixels.Color(100,0,0)); // ].

    pixels.show();  
    
    pixels.setPixelColor(16, pixels.Color(100,0,0)); // [.

    pixels.show();  
    
    pixels.setPixelColor(17, pixels.Color(100,0,0)); // P.

    pixels.show();  
    
    pixels.setPixelColor(18, pixels.Color(100,0,0)); // O.

    pixels.show();  
    
    pixels.setPixelColor(19, pixels.Color(100,0,0)); // I.

    pixels.show();  
    
    pixels.setPixelColor(20, pixels.Color(100,0,0)); // U.

    pixels.show();  
    
    pixels.setPixelColor(21, pixels.Color(100,0,0)); // Y.

    pixels.show(); 
    
    pixels.setPixelColor(22, pixels.Color(100,0,0)); // T.

    pixels.show(); 
    
    pixels.setPixelColor(23, pixels.Color(100,0,0)); // R.

    pixels.show(); 
    
    pixels.setPixelColor(24, pixels.Color(100,0,0)); // E.

    pixels.show(); 
    
    pixels.setPixelColor(25, pixels.Color(100,0,0)); // W.

    pixels.show(); 
    
    pixels.setPixelColor(26, pixels.Color(100,0,0)); // Q.

    pixels.show(); 
    
    pixels.setPixelColor(27, pixels.Color(40,0,110)); // TAB.

    pixels.show(); 
    
    pixels.setPixelColor(28, pixels.Color(40,0,110)); // CAPSLOCK.

    pixels.show(); 
    
    pixels.setPixelColor(29, pixels.Color(100,0,0)); // A.

    pixels.show(); 
    
    pixels.setPixelColor(30, pixels.Color(100,0,0)); // S.

    pixels.show(); 
    
    pixels.setPixelColor(31, pixels.Color(100,0,0)); // D.

    pixels.show(); 
    
    pixels.setPixelColor(32, pixels.Color(100,0,0)); // F.

    pixels.show(); 
    
    pixels.setPixelColor(33, pixels.Color(100,0,0)); // G.

    pixels.show(); 
    
    pixels.setPixelColor(34, pixels.Color(100,0,0)); // H.

    pixels.show(); 
    
    pixels.setPixelColor(35, pixels.Color(100,0,0)); // J.

    pixels.show(); 
    
    pixels.setPixelColor(36, pixels.Color(100,0,0)); // K.

    pixels.show(); 
    
    pixels.setPixelColor(37, pixels.Color(100,0,0)); // L.

    pixels.show(); 
    
    pixels.setPixelColor(38, pixels.Color(100,0,0)); // ж.

    pixels.show(); 
    
    pixels.setPixelColor(39, pixels.Color(100,0,0)); // э.

    pixels.show(); 
    
    pixels.setPixelColor(40, pixels.Color(40,0,110)); // ENTER.
    pixels.show(); 
    
    pixels.setPixelColor(41, pixels.Color(40,0,110)); // RIGHT SHIFT.

    pixels.show(); 
    
    pixels.setPixelColor(42, pixels.Color(100,0,0)); // /.

    pixels.show(); 
    
    pixels.setPixelColor(43, pixels.Color(100,0,0)); // .

    pixels.show(); 
    
    pixels.setPixelColor(44, pixels.Color(100,0,0)); // ,.

    pixels.show(); 
    
    pixels.setPixelColor(45, pixels.Color(100,0,0)); // M.
    pixels.show(); 
    
    pixels.setPixelColor(46, pixels.Color(100,0,0)); // N.

    pixels.show();
    
    pixels.setPixelColor(47, pixels.Color(100,0,0)); // B.

    pixels.show(); 
    
    pixels.setPixelColor(48, pixels.Color(100,0,0)); // V.

    pixels.show();
    
    pixels.setPixelColor(49, pixels.Color(100,0,0)); // C.

    pixels.show(); 
    
    pixels.setPixelColor(50, pixels.Color(100,0,0)); // X.

    pixels.show();
    
    pixels.setPixelColor(51, pixels.Color(100,0,0)); // Z.

    pixels.show();
    
    pixels.setPixelColor(52, pixels.Color(40,0,110)); // LEFT SHIFT.

    pixels.show(); 
    
    pixels.setPixelColor(53, pixels.Color(40,0,110)); // CTRL.

    pixels.show(); 
    
    pixels.setPixelColor(54, pixels.Color(40,0,110)); // WINDOWS.

    pixels.show(); 
    
    pixels.setPixelColor(55, pixels.Color(40,0,110)); // ALT.

    pixels.show();
    
    pixels.setPixelColor(56, pixels.Color(40,0,110)); // ПРОБЕЛ.

    pixels.show(); 
    
    pixels.setPixelColor(57, pixels.Color(40,0,110)); // ALT.

    pixels.show(); 
    
    pixels.setPixelColor(58, pixels.Color(40,0,110)); // OMEN.

    pixels.show(); 
    
    pixels.setPixelColor(59, pixels.Color(40,0,110)); // прав кла мыши.

    pixels.show(); 
    
    pixels.setPixelColor(60, pixels.Color(40,0,110)); // CTRL.

    pixels.show();
    
    break;








    // 3DsMax
    
            
    case 1:  pixels.setPixelColor(0, pixels.Color(40,0,110)); // `.

    pixels.show();  

    pixels.setPixelColor(1, pixels.Color(0,100,0)); // 1.

    pixels.show();  

    pixels.setPixelColor(2, pixels.Color(0,100,0)); // 2.

    pixels.show();  
   
    pixels.setPixelColor(3, pixels.Color(0,100,0)); // 3.

    pixels.show();  
    
    pixels.setPixelColor(4, pixels.Color(0,100,0)); // 4.

    pixels.show();  
    
    pixels.setPixelColor(5, pixels.Color(0,100,0)); // 5.

    pixels.show();  
    
    pixels.setPixelColor(6, pixels.Color(0,30,100)); // 6.

    pixels.show();  
    
    pixels.setPixelColor(7, pixels.Color(0,100,0)); // 7.

    pixels.show();  
    
    pixels.setPixelColor(8, pixels.Color(0,100,0)); // 8.

    pixels.show();  
    
    pixels.setPixelColor(9, pixels.Color(0,100,0)); // 9.

    pixels.show();  
    
    pixels.setPixelColor(10, pixels.Color(0,100,0)); // 0.

    pixels.show();  
    
    pixels.setPixelColor(11, pixels.Color(0,100,0)); // -.

    pixels.show();  
    
    pixels.setPixelColor(12, pixels.Color(0,100,0)); // +.

    pixels.show();  
    
    pixels.setPixelColor(13, pixels.Color(40,0,110)); // Backspace.

    pixels.show();  
    
    pixels.setPixelColor(14, pixels.Color(40,0,110)); // \.

    pixels.show();  
    
    pixels.setPixelColor(15, pixels.Color(0,15,50)); // ].

    pixels.show();  
    
    pixels.setPixelColor(16, pixels.Color(0,15,50)); // [.

    pixels.show();  
    
    pixels.setPixelColor(17, pixels.Color(0,15,50)); // P.

    pixels.show();  
    
    pixels.setPixelColor(18, pixels.Color(100,0,0)); // O.

    pixels.show();  
    
    pixels.setPixelColor(19, pixels.Color(100,0,0)); // I.

    pixels.show();  
    
    pixels.setPixelColor(20, pixels.Color(100,0,0)); // U.

    pixels.show();  
    
    pixels.setPixelColor(21, pixels.Color(100,0,0)); // Y.

    pixels.show(); 
    
    pixels.setPixelColor(22, pixels.Color(40,0,110)); // T.

    pixels.show(); 
    
    pixels.setPixelColor(23, pixels.Color(40,0,110)); // R.

    pixels.show(); 
    
    pixels.setPixelColor(24, pixels.Color(100,0,0)); // E.

    pixels.show(); 
    
    pixels.setPixelColor(25, pixels.Color(100,0,0)); // W.

    pixels.show(); 
    
    pixels.setPixelColor(26, pixels.Color(100,0,0)); // Q.

    pixels.show(); 
    
    pixels.setPixelColor(27, pixels.Color(40,0,110)); // TAB.

    pixels.show(); 
    
    pixels.setPixelColor(28, pixels.Color(40,0,110)); // CAPSLOCK.

    pixels.show(); 
    
    pixels.setPixelColor(29, pixels.Color(0,100,0)); // A.

    pixels.show(); 
    
    pixels.setPixelColor(30, pixels.Color(0,100,0)); // S.

    pixels.show(); 
    
    pixels.setPixelColor(31, pixels.Color(0,100,0)); // D.

    pixels.show(); 
    
    pixels.setPixelColor(32, pixels.Color(0,252,0)); // F.

    pixels.show(); 
    
    pixels.setPixelColor(33, pixels.Color(0,15,50)); // G.

    pixels.show(); 
    
    pixels.setPixelColor(34, pixels.Color(0,15,50)); // H.

    pixels.show(); 
    
    pixels.setPixelColor(35, pixels.Color(0,15,50)); // J.

    pixels.show(); 
    
    pixels.setPixelColor(36, pixels.Color(0,15,50)); // K.

    pixels.show(); 
    
    pixels.setPixelColor(37, pixels.Color(0,15,50)); // L.

    pixels.show(); 
    
    pixels.setPixelColor(38, pixels.Color(0,15,50)); // ;.

    pixels.show(); 
    
    pixels.setPixelColor(39, pixels.Color(0,15,50)); // '.

    pixels.show(); 
    
    pixels.setPixelColor(40, pixels.Color(40,0,110)); // ENTER.
    pixels.show(); 
    
    pixels.setPixelColor(41, pixels.Color(40,0,110)); // RIGHT SHIFT.

    pixels.show(); 
    
    pixels.setPixelColor(42, pixels.Color(100,0,0)); // /.

    pixels.show(); 
    
    pixels.setPixelColor(43, pixels.Color(100,0,0)); // .

    pixels.show(); 
    
    pixels.setPixelColor(44, pixels.Color(100,0,0)); // ,.

    pixels.show(); 
    
    pixels.setPixelColor(45, pixels.Color(100,0,0)); // M.
    pixels.show(); 
    
    pixels.setPixelColor(46, pixels.Color(100,0,0)); // N.

    pixels.show();
    
    pixels.setPixelColor(47, pixels.Color(100,0,0)); // B.

    pixels.show(); 
    
    pixels.setPixelColor(48, pixels.Color(40,0,110)); // V.

    pixels.show();
    
    pixels.setPixelColor(49, pixels.Color(40,0,110)); // C.

    pixels.show(); 
    
    pixels.setPixelColor(50, pixels.Color(100,0,0)); // X.

    pixels.show();
    
    pixels.setPixelColor(51, pixels.Color(100,0,0)); // Z.

    pixels.show();
    
    pixels.setPixelColor(52, pixels.Color(40,0,110)); // LEFT SHIFT.

    pixels.show(); 
    
    pixels.setPixelColor(53, pixels.Color(40,0,110)); // CTRL.

    pixels.show(); 
    
    pixels.setPixelColor(54, pixels.Color(40,0,110)); // WINDOWS.

    pixels.show(); 
    
    pixels.setPixelColor(55, pixels.Color(40,0,110)); // ALT.

    pixels.show();
    
    pixels.setPixelColor(56, pixels.Color(40,0,110)); // ПРОБЕЛ.

    pixels.show(); 
    
    pixels.setPixelColor(57, pixels.Color(40,0,110)); // ALT.

    pixels.show(); 
    
    pixels.setPixelColor(58, pixels.Color(40,0,110)); // OMEN.

    pixels.show(); 
    
    pixels.setPixelColor(59, pixels.Color(40,0,110)); // Moderately bright green color.

    pixels.show(); 
    
    pixels.setPixelColor(60, pixels.Color(40,0,110)); // CTRL.

    pixels.show();
    
    break;

  }
}

// Заполните точки один за другим цветом

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<pixels.numPixels(); i++) {
    pixels.setPixelColor(i, c);
    pixels.show();
    ;
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<pixels.numPixels(); i++) {
      pixels.setPixelColor(i, Wheel((i+j) & 255));
    }
    pixels.show();
    ;
  }
}

// Немного отличается, что радуга равномерно распределяется по всему

void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< pixels.numPixels(); i++) {
      pixels.setPixelColor(i, Wheel(((i * 256 / pixels.numPixels()) + j) & 255));
    }
    pixels.show();
    ;
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < pixels.numPixels(); i=i+3) {
        pixels.setPixelColor(i+q, c);    //turn every third pixel on
      }
      pixels.show();

      ;

      for (int i=0; i < pixels.numPixels(); i=i+3) {
        pixels.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (int i=0; i < pixels.numPixels(); i=i+3) {
        pixels.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      pixels.show();

      ;

      for (int i=0; i < pixels.numPixels(); i=i+3) {
        pixels.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Проблемы: 1) после работы в одном режиме болше 30 мин(примерно), зависате и не переключается на другой режим. 2) После выключения напряжения и включения менше чем за 5 мин, начинает работать только один пиксель.                                 Возникают следующие выводы: 1) Проблема в скетче (кривой и не оптимизированный - "говно-код"). 2) Проблема в схеме подключения (не правильно подключил, резисторы не те, блок питания другой...). Буду благодарен любой подсказке, совету и помощи в реализации задуманной идеи.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

изучай пока массивы и циклы.  массивы можно даже в PROGMEM запхать

Александр Вер
Offline
Зарегистрирован: 24.03.2018

Если я вас правильно понял, то тем самым я уменьшу код и возможно, ардуино перестанет зависать на одном режиме подцветки или же, ардуине так проще будет читать данный скетч?  Спасибо вам за наводку! Завтра обязательно начну изучать данную тему!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

просто код существенно сократится, легче будет искать ошибку

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Александр Вер, поверьте моему опыту:

// тут было много текста, но кто ж его будет читать?

Обычная непрозрачная клавиатура с цветными наклейками, подсвеченная обычным источником света (настольной лампой для работы, 1-3 Вт светодиодом для игр/кино) гораздо удобнее.

Если очень хочется, то:

1.

const <тип> <символ>[<длина>] PROGMEM = {<JSON-подобная информация, всм значения через запятую>}; - способ затолкать статические данные во флеш-память.

<тип> <экз_символа> = pgm_read_<тип>(&<адрес, меньше или равный длине>); - этих функций несколько, но вам надо скорее всего byte - способ вытащить инфу из флеша в оперативу.

Далее используем.

2.

В функциях *rainbow*();, написанных явно не вами, setPixelColor() кастуются в цикле, а потом show() однократно. У вас же после каждого setPixelColor() закономерный show(). Зачем? Почему? Это может переполнять стек.

Александр Вер
Offline
Зарегистрирован: 24.03.2018

Понял, спасибо. Постараюсь разобраться. 

Александр Вер
Offline
Зарегистрирован: 24.03.2018

Очень хочется, простой вариант с настольно лампой не устраивает. Спасибо вам что отозвались на мою проблему! Теперь буду разбираться в скрипте, в который я накидал, все что только нашёл в интернете. Знания мои очень малы в этой области, поэтому и не знал где капать и как лучше все оптимизировать. Буду пробовать!