Почему моя переменная дает неправильное значение?
Я делаю программу для отображения чисел на светодиодах 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;
}
}
}
}
@Lester Therr, 👍0
1 ответ
Лучший ответ:
#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 светодиодов, но вы записываете данные в ОЗУ за пределы допустимого диапазона и уничтожаете хранящиеся в них данные и/или переменные.
- Управлять несколькими полосками WS2812B с разным количеством светодиодов.
- Как определить, какой номинал резистора использовать для светодиодной ленты
- WS2812B работает только пока измеряю напряжение
- NodeMCU сгорел, я что-то сделал не так?
- Использование аккумуляторов 18650 с повышающим преобразователем 3,7 В в 5 В.
- Устранение неисправностей светодиодной ленты WS2812B
- Нужно ли подключать светодиодную ленту WS2812 «последовательно», если я хочу адресовать каждый светодиод отдельно?
- Можно ли сделать FastLED быстрее?
большое спасибо, никогда не думайте об этом, я попробую заменить значение сейчас..., @Lester Therr
лучше переписать полное создание цифр как независимую функцию или использовать neomatrix lib, @Mykolaha99
просто любопытно Mykolaha99, что не так с моим вопросом, похоже, кто-то проголосовал против него... разве это не связано с этим обменом стеками? Извините, я новичок в этом и просто хочу улучшить свои вопросы в следующий раз., @Lester Therr
@LesterTherr Просто игнорируй их. Здесь есть люди, которые просто минусуют вопросы. Мой материал был отклонен, и я модератор. Кому-то ваш вопрос настолько понравился, что он ответил на него, и это главное. :), @Nick Gammon
@NickGammon, спасибо за объяснение., @Lester Therr