Необъяснимое поведение int в кодировщике/светодиодном проекте
Я пытаюсь использовать поворотный энкодер, чтобы переключаться между самыми яркими версиями R, G & Б. И это работает! Красный отлично переходит в синий. Затем происходит Г. По какой-то причине int для зеленого совершенно бесполезен. И это делается одинаково на двух Ардуино.
Итак, мой вопрос таков: почему две переменные с одинаковым назначением обрабатывают ++
совершенно по-разному? После нескольких часов (и часов, и часов) поиска у меня полностью закончились возможные ответы.
#include <Encoder.h>
#include <FastLED.h>
/* Encoder */
Encoder myEnc(2, 3);
const int swPin = 4 ;
long oldPosition = -999;
/* LEDs */
#define LED_PIN 7
#define NUM_LEDS 150
CRGB leds[NUM_LEDS];
/* RGB Loop */
volatile int cycle = 1;
volatile int brightness = 0;
volatile int r = 127;
volatile int g = 0;
volatile int b = 0;
void setup() {
pinMode(swPin, INPUT);
Serial.begin(9600);
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
// Чтение с поворотного энкодера.
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition); /* Sends elsewhere */
}
/* Will eventually move this inside the above if
* statement so the color shift is controlled by
* a rotary encoder. Down here for debugging.
*/
delay(50);
updateColor( );
}
void updateColor( ) {
Serial.println(" "); // Для удобства чтения.
if ( brightness >= 127 ) {
brightness = 1;
if ( cycle > 6 ) {
cycle = 1;
} else {
cycle++;
}
} else {
brightness++;
}
if ( cycle == 1) {
b++;
}
else if ( cycle == 2) { /* rb --> b */
r--;
}
else if ( cycle == 3) { /* b --> bg */
g++;
}
else if ( cycle == 4) { /* bg --> g */
b--;
}
else if ( cycle == 5) { /* g --> rg */
r++;
}
else if ( cycle == 6) { /* g --> rg */
g--;
}
else {
Serial.print("==================== ");
}
/* Debugging */
Serial.print("brightness:");
Serial.print(brightness);
Serial.print(" cycle:");
Serial.print(cycle);
Serial.print(" r:");
Serial.print(r);
Serial.print(" g:");
Serial.print(g); // совсем сходит с ума
Serial.print(" b:");
Serial.print(b);
Serial.println(" ");
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i].setRGB( r, g, b );
}
FastLED.show();
}
выдает в монитор последовательного порта следующее:
brightness:1 cycle:1 r:127 g:0 b:1
brightness:2 cycle:1 r:127 g:127 b:2
brightness:3 cycle:1 r:127 g:32639 b:3
brightness:4 cycle:1 r:127 g:32639 b:4
brightness:5 cycle:1 r:127 g:32639 b:5
brightness:6 cycle:1 r:127 g:32639 b:6
Красный и синий делают именно то, что я хочу. Зеленый на Марсе выключен.
Любая помощь будет чрезвычайно признательна. Заранее спасибо.
@laffan, 👍2
Обсуждение1 ответ
Лучший ответ:
Здесь:
CRGB leds[NUM_LEDS];
вы определяете массив объектов NUM_LEDS
типа CRGB
.
Допустимые индексы для этого массива находятся в диапазоне от 0
до NUM_LEDS-1
.
Здесь:
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i].setRGB( r, g, b );
}
вы обращаетесь к элементам массива с индексами от 0
до NUM_LEDS
.
последняя итерация - это доступ за пределами границ, что приводит к
коррупция. Вместо этого вы должны написать
for (int i = 0; i < NUM_LEDS; i++) ...
Огромное спасибо @edgar-bonet — не думаю, что я бы когда-нибудь это понял., @laffan
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Как напечатать несколько номеров через Serial с очень небольшим количеством строк кода?
- Акцептант векселей ИКТ
- Проблема с массивом + последовательным монитором
- Arduino wrap или подкласс print() для работы с несколькими Serial
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
- Проверка входной строки последовательной связи Arduino
127 = 0x7F, 32639 = 0x7F7F., @Jot
Я пока не могу комментировать, поэтому здесь. Не могли бы вы попробовать передать распечатки RGB в uint8_t? Может быть, он выходит за пределы или что-то в этом роде? Я не вижу ничего плохого в коде, так что, может быть, какой-то указатель меняет значение g?, @Tarick Welling
Я не вижу связи между кодировщиком и значениями r,g,b. Или между кодировщиком и вашей проблемой RGB. Кстати: значения RGB являются байтовыми, а не целыми., @DataFiddler
Лаффан, мы не видим проблемы. Это может быть ошибка компилятора или оптимизации (маловероятно, но возможно) или ошибка в библиотеке, которая перезаписывает память. Вам придется попробовать несколько вещей. Начните с примера и медленно меняйте его в направлении вашего эскиза. setRGB — это встроенная функция с параметрами uint8_t. Я думаю, нет необходимости делать переменные изменчивыми., @Jot
Спасибо вам всем! @Jot, я думаю, ты что-то задумал. Я не уверен, что именно вы имеете в виду, но это, по крайней мере, объясняет число. Похоже, мне нужно узнать больше о шестнадцатеричных числах. И приятно знать об этой переменной волатильности (я хватался за соломинку). Тарик Веллинг - Боюсь, этот хоббист еще не дошел до указателей, но я посмотрю. DataFiddler. Новая/старая позиция — это часть поворотного энкодера (см. комментарии), которая работает невероятно. Спасибо за байтовый совет., @laffan
пару вещей, которые стоит попробовать..... закомментировать код FastLed..... поменять местами
b++
иg--
в блокахif
, @jsotola