Ответ:#include <Adafruit_NeoPixel.h>#define LED_PIN 6 // Цифровий пін, до якого підключено кільце#define LED_COUNT 12 // Кількість світлодіодів на кільці#define BUTTON_PIN 2 // Цифровий пін, до якого підключено кнопкуAdafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);int currentLeds = 1; // Початкова кількість бігаючих світлодіодівint currentPosition = 0; // Поточна позиція "головного" світлодіодаunsigned long lastDebounceTime = 0; // Час останнього натисканняunsigned long debounceDelay = 50; // Затримка для уникнення "тремтіння" кнопкиvoid setup() { pinMode(BUTTON_PIN, INPUT); // Не використовуємо INPUT_PULLUP, так як є зовнішній резистор strip.begin(); strip.show(); // Ініціалізуємо кільце, вимикаючи всі світлодіоди}void loop() { // Перевіряємо стан кнопки if (digitalRead(BUTTON_PIN) == HIGH) { // Дебоунсинг: перевірка, чи минув час з останнього натискання if ((millis() - lastDebounceTime) > debounceDelay) { // Кнопку натиснуто currentLeds++; // Збільшуємо кількість вогників // Скидаємо лічильник, якщо він досяг 12 if (currentLeds > 12) { currentLeds = 1; } lastDebounceTime = millis(); // Оновлюємо час останнього натискання } } // Запуск анімації "бігаючого" вогника chasingLights(strip.Color(255, 0, 0)); // Колір червоний (можна змінити) delay(100); // Швидкість руху вогника (чим менше, тим швидше)}void chasingLights(uint32_t color) { // Вимикаємо всі світлодіоди перед початком нового циклу strip.clear(); // Вмикаємо необхідну кількість світлодіодів, починаючи з поточної позиції for (int i = 0; i < currentLeds; i++) { int ledIndex = (currentPosition + i) % LED_COUNT; strip.setPixelColor(ledIndex, color); } strip.show(); // Показуємо зміни на кільці // Зсуваємо позицію "головного" світлодіода currentPosition = (currentPosition + 1) % LED_COUNT; }Объяснение:#include <Adafruit_NeoPixel.h>#define LED_PIN 6 // Цифровий пін, до якого підключено кільце#define LED_COUNT 12 // Кількість світлодіодів на кільці#define BUTTON_PIN 2 // Цифровий пін, до якого підключено кнопкуAdafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);int currentLeds = 1; // Початкова кількість бігаючих світлодіодівint currentPosition = 0; // Поточна позиція "головного" світлодіодаunsigned long lastDebounceTime = 0; // Час останнього натисканняunsigned long debounceDelay = 50; // Затримка для уникнення "тремтіння" кнопкиvoid setup() { pinMode(BUTTON_PIN, INPUT); // Не використовуємо INPUT_PULLUP, так як є зовнішній резистор strip.begin(); strip.show(); // Ініціалізуємо кільце, вимикаючи всі світлодіоди}void loop() { // Перевіряємо стан кнопки if (digitalRead(BUTTON_PIN) == HIGH) { // Дебоунсинг: перевірка, чи минув час з останнього натискання if ((millis() - lastDebounceTime) > debounceDelay) { // Кнопку натиснуто currentLeds++; // Збільшуємо кількість вогників // Скидаємо лічильник, якщо він досяг 12 if (currentLeds > 12) { currentLeds = 1; } lastDebounceTime = millis(); // Оновлюємо час останнього натискання } } // Запуск анімації "бігаючого" вогника chasingLights(strip.Color(255, 0, 0)); // Колір червоний (можна змінити) delay(100); // Швидкість руху вогника (чим менше, тим швидше)}void chasingLights(uint32_t color) { // Вимикаємо всі світлодіоди перед початком нового циклу strip.clear(); // Вмикаємо необхідну кількість світлодіодів, починаючи з поточної позиції for (int i = 0; i < currentLeds; i++) { int ledIndex = (currentPosition + i) % LED_COUNT; strip.setPixelColor(ledIndex, color); } strip.show(); // Показуємо зміни на кільці // Зсуваємо позицію "головного" світлодіода currentPosition = (currentPosition + 1) % LED_COUNT; }