Почему моя переменная дает неправильное значение?

ws2812 keypad

Я делаю программу для отображения чисел на светодиодах WS2812 и TM1637. Я также использую обычную клавиатуру 4х4.

Светодиод WS2812 изготовлен своими руками с размером 25 x 10. На данный момент на светодиодной матрице можно отображать только два значения. Без светодиодной части программы, только TM1637 и клавиатура, подключенная к Arduino, все в порядке. Но добавив в программу светодиодную часть, я обнаружил, что ввод 2 на клавиатуре приводит к ошибочному значению моей переменной (точнее -256). Я попробовал отладить свой код и обнаружил, что замена последней итерации

for (int i = 225; i <= 231; i++) {

с этой строкой

for (int i = 225; i <= 230; i++) {

таинственным образом решил мою проблему. Есть мысли, почему это происходит?

#include <Keypad.h>
#include <Arduino.h>
#include <TM1637Display.h>
#include <Wire.h>
#include <FastLED.h>
// Контакты подключения модуля (цифровые контакты)
#define CLK 2
#define DIO 3
#define NUM_LEDS  225
#define LED_PIN   12
CRGB leds[NUM_LEDS];
TM1637Display display(CLK, DIO);
int DisplayNos=0;
int KeyNum;
char key;
boolean NewKey = false;
boolean DeleteAll=false;
int SavedNum;
// для 3 цифр
int ExtractDigit[3] = {0, 0, 0};
byte DigitPoint= 1;
const byte ROWS = 4; //четыре строки
const byte COLS = 4; //четыре столбца
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {11, 10, 9, 8}; //подключаемся к выводам строк клавиатуры
byte colPins[COLS] = {7, 6, 5, 4}; //подключаемся к выводам колонки клавиатуры
//Создаем объект клавиатуры
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
  Serial.begin(9600);
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(250);
}
void loop(){
int k;
// uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 };
// uint8_t Blank[] = { 0x00, 0x00, 0x00, 0x00 };
  display.setBrightness(0x0f);
  key = keypad.getKey();// Прочитаем ключ
  // Печатаем, если клавиша нажата
  if (key){
    Serial.print("Key Pressed : ");
    Serial.println(key);
    if (isDigit(key)){
      KeyNum = key-48;
      Serial.println(key);
      Serial.println(DisplayNos);
      if (DigitPoint==1){
        DisplayNos = 0;
        DisplayNos = KeyNum;
      }
      if (DigitPoint==2){
        DisplayNos = KeyNum + (DisplayNos*10);
      }
      if (DigitPoint==3){
        DisplayNos = KeyNum + (DisplayNos*10);
      }
      DigitPoint= DigitPoint+1;
      if (DigitPoint==4){
        DigitPoint=1;
      }
    }
      if (key=='*'){   // клавиша звездочки отменяет все символы
      DisplayNos = 0;
      DigitPoint = 1;
    }
    if (key=='#'){   // клавиша звездочки отменяет все символы

    }
    NewKey = true;
  }
  display.showNumberDec(DisplayNos,false,3,0);
  if (NewKey == true){
    DisplayLED();
    FastLED.show();
  }
}
void DisplayLED(){
int LedNum;
byte digitnos;
NewKey = false;
  ExtractDigit[3] = (DisplayNos/100)%10;
  ExtractDigit[2] = (DisplayNos/10)%10;
  ExtractDigit[1] = (DisplayNos)%10;
  for (int digitnos= 1; digitnos <= 3; digitnos++) {
    LedNum = (digitnos-1)*9;
    if (ExtractDigit[digitnos] == 1){
      leds[21-LedNum]= CRGB::Blue;
      leds[28+LedNum]= CRGB::Blue;
      leds[29+LedNum]= CRGB::Blue;
      leds[71-LedNum]= CRGB::Blue;
      leds[78+LedNum]= CRGB::Blue;
      leds[121-LedNum]= CRGB::Blue;
      leds[128+LedNum]= CRGB::Blue;
      leds[171-LedNum]= CRGB::Blue;
      leds[178+LedNum]= CRGB::Blue;
      leds[221-LedNum]= CRGB::Blue;
      leds[229+LedNum]= CRGB::Blue;
      leds[228+LedNum]= CRGB::Blue; 
      leds[227+LedNum]= CRGB::Blue;
    }
    if (ExtractDigit[digitnos] == 2){
      for (int i = 20; i <= 22; i++) {
        leds[i-LedNum] = CRGB::Blue;
      }     
      leds[26+LedNum]= CRGB::Blue;
      leds[30+LedNum]= CRGB::Blue;
      leds[68-LedNum]= CRGB::Blue;
      leds[74-LedNum]= CRGB::Blue;
      leds[76+LedNum]= CRGB::Blue;
      leds[122-LedNum]= CRGB::Blue;
      leds[128+LedNum]= CRGB::Blue;
      leds[170-LedNum]= CRGB::Blue;
      leds[180+LedNum]= CRGB::Blue;
      leds[218-LedNum]= CRGB::Blue;
      leds[225+LedNum]= CRGB::Blue;
      leds[226+LedNum]= CRGB::Blue;
      leds[227+LedNum]= CRGB::Blue;
      leds[228+LedNum]= CRGB::Blue;
      leds[229+LedNum]= CRGB::Blue;
      for (int i = 225; i <= 231; i++) {
        leds[i-LedNum] = CRGB::Blue;
      } 
    }
  }
  }

, 👍0


1 ответ


Лучший ответ:

2
#define NUM_LEDS  225
...
CRGB leds[NUM_LEDS];
...
  leds[225 + LedNum] = CRGB::Blue;
  leds[226 + LedNum] = CRGB::Blue;
  leds[227 + LedNum] = CRGB::Blue;
  leds[228 + LedNum] = CRGB::Blue;
  leds[229 + LedNum] = CRGB::Blue; 

Ваша матрица RGB имеет 225 светодиодов, но вы записываете данные в ОЗУ за пределы допустимого диапазона и уничтожаете хранящиеся в них данные и/или переменные.

,

большое спасибо, никогда не думайте об этом, я попробую заменить значение сейчас..., @Lester Therr

лучше переписать полное создание цифр как независимую функцию или использовать neomatrix lib, @Mykolaha99

просто любопытно Mykolaha99, что не так с моим вопросом, похоже, кто-то проголосовал против него... разве это не связано с этим обменом стеками? Извините, я новичок в этом и просто хочу улучшить свои вопросы в следующий раз., @Lester Therr

@LesterTherr Просто игнорируй их. Здесь есть люди, которые просто минусуют вопросы. Мой материал был отклонен, и я модератор. Кому-то ваш вопрос настолько понравился, что он ответил на него, и это главное. :), @Nick Gammon

@NickGammon, спасибо за объяснение., @Lester Therr