Нужно сделать переключение режимов ленты при помощи кнопки. Код (C++): #include "FastLED.h" // библиотека для работы с лентой #define LED_COUNT 120 // число светодиодов в кольце/ленте #define LED_DT 13 // пин, куда подключен DIN ленты int max_bright = 255; // максимальная яркость (0 - 255) boolean adapt_light = 1; // адаптивная подсветка (1 - включить, 0 - выключить) byte fav_modes[] = {2, 3, 33, 37, 27, 30,}; // список "любимых" режимов byte num_modes = sizeof(fav_modes); // получить количество "любимых" режимов (они все по 1 байту..) unsigned long change_time, last_change, last_bright; int new_bright; int ledMode = 3; /* Стартовый режим 0 - все выключены 1 - все включены 3 - кольцевая радуга 888 - демо-режим */ // цвета мячиков для режима byte ballColors[3][3] = { {0xff, 0, 0}, {0xff, 0xff, 0xff}, {0 , 0 , 0xff} }; // ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ----------------- int BOTTOM_INDEX = 0; // светодиод начала отсчёта int TOP_INDEX = int(LED_COUNT / 2); int EVENODD = LED_COUNT % 2; struct CRGB leds[LED_COUNT]; int ledsX[LED_COUNT][3]; //-ARRAY FOR COPYING WHATS IN THE LED STRIP CURRENTLY (FOR CELL-AUTOMATA, MARCH, ETC) int thisdelay = 20; //-FX LOOPS DELAY VAR int thisstep = 10; //-FX LOOPS DELAY VAR int thishue = 0; //-FX LOOPS DELAY VAR int thissat = 255; //-FX LOOPS DELAY VAR int thisindex = 0; int thisRED = 0; int thisGRN = 0; int thisBLU = 0; int idex = 0; //-LED INDEX (0 to LED_COUNT-1 int ihue = 0; //-HUE (0-255) int ibright = 0; //-BRIGHTNESS (0-255) int isat = 0; //-SATURATION (0-255) int bouncedirection = 0; //-SWITCH FOR COLOR BOUNCE (0-1) float tcount = 0.0; //-INC VAR FOR SIN LOOPS int lcount = 0; //-ANOTHER COUNTING VAR // ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ----------------- void setup() { Serial.begin(9600); // открыть порт для связи LEDS.setBrightness(max_bright); // ограничить максимальную яркость LEDS.addLeds<WS2811, LED_DT, GRB>(leds, LED_COUNT); // настрйоки для нашей ленты (ленты на WS2811, WS2812, WS2812B) one_color_all(0, 0, 0); // погасить все светодиоды LEDS.show(); // отослать команду randomSeed(analogRead(0)); } void loop() { if (adapt_light) { // если включена адаптивная яркость if (millis() - last_bright > 500) { // каждые полсекунды last_bright = millis(); // сброить таймер new_bright = map(analogRead(6), 1, 1000, 3, max_bright); // считать показания с фоторезистора, перевести диапазон LEDS.setBrightness(new_bright); // установить новую яркость } } if (millis() - last_change > change_time) { change_time = random(50000, 200000); // получаем новое случайное время до следующей смены режима ledMode = fav_modes[random(0, num_modes - 1)]; // получаем новый случайный номер следующего режима change_mode(ledMode); // меняем режим через change_mode (там для каждого режима стоят цвета и задержки) last_change = millis(); } /* if (Serial.available() > 0) { // если что то прислали ledMode = Serial.parseInt(); // парсим в тип данных int change_mode(ledMode); // меняем режим через change_mode (там для каждого режима стоят цвета и задержки) } */ switch (ledMode) { case 999: break; // пазуа case 2: rainbow_fade(); break; // плавная смена цветов всей ленты case 3: rainbow_loop(); break; // крутящаяся радуга case 27: rgb_propeller(); break; // RGB пропеллер case 30: new_rainbow_loop(); break; // крутая плавная вращающаяся радуга case 33: colorWipe(0x00, 0xff, 0x00, thisdelay); break; // плавное заполнение цветом case 37: rainbowCycle(thisdelay); break; // очень плавная вращающаяся радуга } } void change_mode(int newmode) { thissat = 255; switch (newmode) { case 0: one_color_all(0, 0, 0); LEDS.show(); break; //---ALL OFF case 1: one_color_all(255, 255, 255); LEDS.show(); break; //---ALL ON case 2: thisdelay = 60; break; //---STRIP RAINBOW FADE case 3: thisdelay = 20; thisstep = 10; break; //---RAINBOW LOOP case 27: thisdelay = 100; thishue = 0; break; //---RGB PROPELLER case 30: thisdelay = 15; break; //---NEW RAINBOW LOOP case 33: thisdelay = 50; break; // colorWipe case 37: thisdelay = 20; break; // rainbowCycle case 101: one_color_all(255, 0, 0); LEDS.show(); break; //---ALL RED case 102: one_color_all(0, 255, 0); LEDS.show(); break; //---ALL GREEN case 103: one_color_all(0, 0, 255); LEDS.show(); break; //---ALL BLUE case 104: one_color_all(255, 255, 0); LEDS.show(); break; //---ALL COLOR X case 105: one_color_all(0, 255, 255); LEDS.show(); break; //---ALL COLOR Y case 106: one_color_all(255, 0, 255); LEDS.show(); break; //---ALL COLOR Z } bouncedirection = 0; one_color_all(0, 0, 0); ledMode = newmode; } И можно еще добавить этот режим Код (C++): #include "FastLED.h" #define PIN 4 #define NUM_LEDS 22 //Number of LEDs in the strip CRGBArray<NUM_LEDS> leds; uint8_t hue[NUM_LEDS]; void setup(){ FastLED.addLeds<NEOPIXEL, PIN>(leds, NUM_LEDS); for(int i = 0; i< NUM_LEDS; i++){ hue[i] = 255/NUM_LEDS * i; } //Random RGB Sparkle Animation for(int j = 0; j < 100 ; j++){ int dot = random(0,23); int hue = random(0,256); leds[dot] = CHSV(hue,255,175); FastLED.show(); delay(50); leds[dot] = CRGB::Black; } } void loop(){ //Rainbow Effect for(int i = 0; i< NUM_LEDS; i++){ leds[i] = CHSV(hue[i]++, 255, 175); } FastLED.show(); delay(8); }
Да , код надо вставлять правильно. Ты про прерывания почитай и операторы сравнения и всё будет просто.