Упростите операторы if then else для проекта Neopixel/compass.
Я работаю над проектом, в котором поворотный энкодер генерирует выходной сигнал в диапазоне 0–359°, и я передаю его на кольцо Neopixel 60, но мне нужен способ упростить или придумать лучший способ для группы если-то-иначе. Вот пример кода.
// Дисплей NeoPixel
if ((counter >=3) && (counter <=9))
(
strip.setPixelColor(0, 255, 0, 0); //устанавливаем номер пикселя 1 и устанавливаем красный цвет
strip.show(); //отправляем цвет в пиксель 1 на NeoPixel Ring
)
else if strip.setPixelColor(0, 0, 0, 0);
strip.show();
if ((counter >=10) && (counter <=15))
(
strip.setPixelColor(1, 255, 0, 0); //устанавливаем номер пикселя 2 и устанавливаем красный цвет
strip.show(); //отправляем цвет на пиксель 2 на NeoPixel Ring
)
else if strip.setPixelColor(1, 0, 0, 0);
strip.show();
if ((counter >=16) && (counter <=21))
(
strip.setPixelColor(2, 255, 0, 0); //устанавливаем номер пикселя 3 и устанавливаем красный цвет
strip.show(); //отправляем цвет в пиксель 3 на NeoPixel Ring
)
else if strip.setPixelColor(2, 0, 0, 0);
strip.show();
@Bkukuk62, 👍3
1 ответ
Вы используете неправильный синтаксис. Я предполагаю, что вы имеете в виду:
// Дисплей NeoPixel
if ((counter >=3) && (counter <=9))
{
strip.setPixelColor(0, 255, 0, 0); //устанавливаем номер пикселя 1 и устанавливаем красный цвет
strip.show(); //отправляем цвет в пиксель 1 на NeoPixel Ring
}
else
{
strip.setPixelColor(0, 0, 0, 0)
strip.show();
}
И аналогично для других цветов.
Во-первых, вы видите, что существует множество вызовов setPixelColor и show. Мы создаем функцию, в которой параметризуются цвет и значение красного:
void setPixel(int pixelNumber, int red)
{
strip.setPixelColor(pixelNumber, red, 0, 0);
}
Теперь мы можем написать ваш код как
// Дисплей NeoPixel
if ((counter >=3) && (counter <=9))
{
setPixel(0, 255);
}
else
{
setPixel(0, 0);
}
void setPixel(int pixelNumber, int red)
{
strip.setPixelColor(pixelNumber, red, 0, 0);
strip.show();
}
И аналогично для других цветов.
Теперь мы избавимся от операторов if. Для первого цвета это будет:
// Дисплей NeoPixel
setPixel(0, ((counter >= 3) && (counter <= 9)) ? 255 : 0);
В сочетании с другими цветами получаем
// Дисплей NeoPixel
setPixel(0, ((counter >= 3) && (counter <= 9)) ? 255 : 0);
setPixel(1, ((counter >= 10) && (counter <= 15)) ? 255 : 0);
setPixel(2, ((counter >= 16) && (counter <= 21)) ? 255 : 0);
void setPixel(int pixelNumber, int red)
{
strip.setPixelColor(pixelNumber, red, 0, 0);
strip.show();
}
Однако условия можно упростить, добавив их в функцию. Итак, мы получаем
// Дисплей NeoPixel
setPixel(0, counter, 3, 9);
setPixel(1, counter, 10, 15);
setPixel(2, counter, 16, 21);
void setPixel(int pixelNumber, int counter, int lowValue, int highValue)
{
strip.setPixelColor(pixelNumber,
((counter >= lowValue) && (counter <= highValue)) ? 255 : 0,
0, 0);
strip.show();
}
Если вам нужно больше проверок на предмет того, находится ли значение в диапазоне, вы можете сделать это специальной функцией. Это увеличит объем кода, но облегчит его повторное использование. Итак, вы получите:
// Дисплей NeoPixel
setPixel(0, counter, 3, 9);
setPixel(1, counter, 10, 15);
setPixel(2, counter, 16, 21);
void setPixel(int pixelNumber, int counter, int lowValue, int highValue)
{
strip.setPixelColor(pixelNumber,
inRange(counter, lowValue, highValue) ? 255 : 0,
0, 0);
strip.show();
}
int inRange(int counter, int lowValue, int highValue)
{
return ((counter >= lowValue) && (counter <= highValue));
}
- Управлять несколькими полосками WS2812B с разным количеством светодиодов.
- Светодиодная лента WS2812B + First Pixel продолжает ломаться
- Использование кольца NeoPixel без Arduino
- Странное поведение со светодиодной лентой WS2812B RGB
- Какая хорошая альтернатива Arduino Nano, которую можно использовать с Neopixels?
- Как сгладить переход на другой цвет NEOPIXELS
- Как запрограммировать кнопку на цвет для полоски неопикселей?
- Реструктурировать код для многозадачности Neopixel + ИК-пульт + ардуино
Спасибо за большую помощь, я многому научился. Теперь перейдем к Roary Encoder, который будет питать кольцо NeoPixel., @Bkukuk62
Удачи в проекте, рад слышать, что вы чему-то научились (я до сих пор делаю это ежедневно)., @Michel Keijzers
Я бы проголосовал за этот ответ дважды, если бы мог! Хорошая работа! Мне нравится использование тернарного оператора и итеративный подход к созданию программы., @linhartr22