Как упростить код
Я новичок в мире Arduino, насколько это возможно, и экспериментировал с ними. У меня есть несколько плат Arduino Uno, которые я купил и успешно загрузил в них скетчи. Однако у меня возникли проблемы с тем, как написать код простым способом.
Я использую светодиодную ленту из светодиодов WS2812 (аналогично это). Вот чего я хотел бы достичь:
Я хотел бы иметь возможность зажигать, скажем, светодиоды 1, 3, 5, 7
. Затем зажгите светодиоды 2, 4, 6, 8
или любую другую комбинацию «нескольких светодиодов», под этим я имею в виду, возможно, светодиоды 0, 14, 15, 36, 37, 52, 54
. Я уверен, вы поняли идею.
Могу ли я написать однострочный код для включения этих светодиодов или мне придется записывать каждую строку.
Извините, если это упрощенный вопрос, но я искал и не нашел ничего, что могло бы это сделать, или я просто просмотрел это.
Заранее благодарим за помощь
@Weeman, 👍1
Обсуждение1 ответ
Я должен сказать, что у меня нет никакого опыта работы со светодиодной лентой 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
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
О, я думаю, мне следует сказать, что это светодиодные ленты ws2812, @Weeman
пожалуйста, напишите код, @Guy . D
Пожалуйста, отредактируйте свой вопрос, добавив важную информацию о том, что вы используете WS2812. Лучше иметь всю информацию в вопросе, чем ожидать, что люди прочитают комментарии., @per1234
В большинстве случаев вы устанавливаете состояния светодиодов в цикле for, проверяя при этом правило, по которому они должны загораться. Пожалуйста, четко изложите правило, лежащее в основе этого, @chrisl
если вы хотите использовать одну команду для включения нескольких светодиодов, вам придется написать функцию, которая принимает несколько параметров..... каждый из параметров будет номером светодиода, который будет гореть, @jsotola