Как упростить код

Я новичок в мире Arduino, насколько это возможно, и экспериментировал с ними. У меня есть несколько плат Arduino Uno, которые я купил и успешно загрузил в них эскизы. Однако у меня возникли проблемы с тем, как написать код простым способом.

Я использую светодиодную ленту из светодиодов WS2812 (аналогично это). Вот чего я хотел бы достичь:

Я хотел бы иметь возможность зажигать, скажем, светодиоды 1, 3, 5, 7. Затем зажгите светодиоды 2, 4, 6, 8 или любую другую комбинацию «нескольких светодиодов», под этим я имею в виду, возможно, светодиоды 0, 14, 15, 36, 37, 52, 54. Я уверен, вы поняли идею.

Могу ли я написать однострочный код для включения этих светодиодов или мне придется записывать каждую строку.

Извините, если это упрощенный вопрос, но я искал и не нашел ничего, что могло бы это сделать, или я просто просмотрел это.

Заранее благодарим за помощь

, 👍1

Обсуждение

О, я думаю, мне следует сказать, что это светодиодные ленты ws2812, @Weeman

пожалуйста, напишите код, @Guy . D

Пожалуйста, отредактируйте свой вопрос, добавив важную информацию о том, что вы используете WS2812. Лучше иметь всю информацию в вопросе, чем ожидать, что люди прочитают комментарии., @per1234

В большинстве случаев вы устанавливаете состояния светодиодов в цикле for, проверяя при этом правило, по которому они должны загораться. Пожалуйста, четко изложите правило, лежащее в основе этого, @chrisl

если вы хотите использовать одну команду для включения нескольких светодиодов, вам придется написать функцию, которая принимает несколько параметров..... каждый из параметров будет номером светодиода, который будет гореть, @jsotola


1 ответ


2

Я должен сказать, что у меня нет никакого опыта работы со светодиодной лентой ws2812, но в основном она используется с библиотекой Adafruit_Neopixel, где у вас есть функция pixel_obj.setPixelColor(pixel_number,pixel_obj.Color(R,G, Б) и функция pixel_obj.show(). Теперь вы по сути хотите сделать код в voidloop() чистым, и есть широкий выбор возможностей и методов для использования. Самый простой — не делать этого, но если вы хотите, вы можете написать библиотеку для этого или написать функцию, которая принимает количество контактов и подсвечивает их (все одним цветом), вот так
void Light_pixel(int Pixels[],int Red,int Green,int Blue){ for(int i=0;i<NUMPIXELS;++i){ Pixel_obj.setPixelColor(пиксели[i],pixel_obj.Color(Красный,Зеленый,Синий)); } пиксель_obj.show();
Это работает при условии, что вы объявили Pixel_obj во внешней области видимости и вызовете функцию следующим образом:

#include <Adafruit_NeoPixel.h>
#define PIN //Что бы вы ни прикрепили,
#define NUMPIXELS //Количество пикселей в полосе
Adafruit_NeoPixel pixel_obj = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// Возможно, вам придется изменить третий параметр. Обоснование: вы этого не сделали.
// указал что-нибудь о вашей светодиодной ленте
void setup(){
pixel_obj.begin();
pinMode(PIN, OUTPUT);
}
void light_pixel(int pixels[],int Red, int Green, int Blue){
for(int i=0;i<NUMPIXELS && pixels[I]!=-1 ;++i){
    pixel_obj.setPixelColor(pixels[i],pixel_obj.Color(Red,Green,Blue));
}
pixel_obj.show();
}
void loop(){
int my_pixels[NUMPIXELS]={1,3,5,7,-1}; // Использование -1 в качестве терминатора
// Инициализируем массив. Отказ от ответственности: это не оптимизировано, и вы можете использовать
// новый оператор или лучше передать ссылку на вектор в функцию, чтобы
// что вы можете изменить диапазон вектора и получить более краткую функцию
light_pixel(my_pixels,255,255,255);
delay(1000);
light_pixel(my_pixels,0,0,0);
}

Затем вы можете изменить количество my_pixels с помощью присвоения массива улыбок. Эта функция — всего лишь образец для выполнения работы, но я бы рекомендовал вам дополнительно изучить язык программирования C/C++ в целом, чтобы писать более качественный код
Удачи!

,

sizeof(pixels)/sizeof(*pixels) здесь не будет работать, так как на данный момент pixels — это указатель, а не массив., @Edgar Bonet

@EdgarBonet Это должно сработать, я просто установил фиксированное значение для обоих размеров массива., @Leonardo Silvagni