Реверсивный "бегущий огонь" для ардуины нано

У меня “бегущие огни” на адресной светодиодной ленте движутся только в одном направлении. можно ли как то поменять его в противоположном направлении задействовав один из входов на плате ардуино нано. например на входе 0 (ноль - низкий уровень напряжения) , то бегущие огни движутся в одну сторону, а если 1 (единица - высокий уровень напряжения), то бегущие огни движутся в противоположное - резко меняют направление

Можно.
Например: Настраиваем порт на ввод и опрашиваем его после каждой “отрисовки”. А далее направление следующего сдвига “бегущих огней” устанавливаем по значению, которое получено из порта.

1 лайк

Не пойдет. Автор хочет, чтобы огни разворачивались “резко”

А это значит, что реагировать на кнопку надо сразу, а не ждать пока огни добегут до края

что значит “резко”?
я не предлагаю ждать пока “огни добегут до края”. Я предлагаю опрашивать порт и при необходимости менять после каждой “отрисовки”, в смысле после каждого “кадра”.

1 лайк

можно.

Только не спрашивайте как это сделать, пока не покажете своего скетча.

Звуковой сигнал, например музыка - это как бы не совсем “ноль” либо “единица”.
Да и частота там может намного превышать частоту кадров в вашей светодиодной ленте. Даже не представляю что Вы надеетесь получить в таком случае.

условно говоря нет звука =0, есть звук = 1 ?
То есть когда тихо - огонечки бегут вправо, когда громко - влево?
А что, прикольно…

1 лайк

там получается что как бы аналоговый сигнал преобразуется в цифровой - я выше выложел видео моей бывшей ЦМУ - теперь мне надо это сделать с адресной лентой а не обычными лампочками или светодиодными МОЕ ЦМУ

#include "Adafruit_NeoPixel.h" // подключаем библиотеку

#define PIN 5             // указываем пин для подключения ленты
#define NUMPIXELS 60  // указываем количество светодиодов в ленте

// создаем объект strip с нужными характеристиками
Adafruit_NeoPixel strip (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
   strip.begin();                     // инициализируем ленту
   strip.setBrightness(5);  // указываем яркость светодиодов (максимум 255)
}

void loop() {
   
   strip.setPixelColor(0, strip.Color(255, 0, 0));
   strip.setPixelColor(12, strip.Color(255, 0, 0));
   strip.setPixelColor(24, strip.Color(255, 0, 0));
   strip.setPixelColor(36, strip.Color(255, 0, 0));
   strip.setPixelColor(48, strip.Color(255, 0, 0));
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   
   strip.setPixelColor(1, strip.Color(192, 0, 64));  
   strip.setPixelColor(13, strip.Color(192, 0, 64));
   strip.setPixelColor(25, strip.Color(192, 0, 64));
   strip.setPixelColor(37, strip.Color(192, 0, 64));
   strip.setPixelColor(49, strip.Color(192, 0, 64));
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   
   strip.setPixelColor(2, strip.Color(128, 0, 128));  
   strip.setPixelColor(14, strip.Color(128, 0, 128));
   strip.setPixelColor(26, strip.Color(128, 0, 128));
   strip.setPixelColor(38, strip.Color(128, 0, 128));
   strip.setPixelColor(50, strip.Color(128, 0, 128));
   
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
 
   strip.setPixelColor(3, strip.Color(64, 0, 192));
   strip.setPixelColor(15, strip.Color(64, 0, 192));
   strip.setPixelColor(27, strip.Color(64, 0, 192));
   strip.setPixelColor(39, strip.Color(64, 0, 192));
   strip.setPixelColor(51, strip.Color(64, 0, 192));
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   strip.setPixelColor(4, strip.Color(0, 0, 255));
   strip.setPixelColor(16, strip.Color(0, 0, 255));
   strip.setPixelColor(28, strip.Color(0, 0, 255));
   strip.setPixelColor(40, strip.Color(0, 0, 255));
   strip.setPixelColor(52, strip.Color(0, 0, 255));
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   strip.setPixelColor(5, strip.Color(0, 64, 192));
   strip.setPixelColor(17, strip.Color(0, 64, 192));
   strip.setPixelColor(29, strip.Color(0, 64, 192));
   strip.setPixelColor(41, strip.Color(0, 64, 192));
   strip.setPixelColor(53, strip.Color(0, 64, 192));
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   strip.setPixelColor(6, strip.Color(0, 128, 128));
   strip.setPixelColor(18, strip.Color(0, 128, 128));
   strip.setPixelColor(30, strip.Color(0, 128, 128));
   strip.setPixelColor(42, strip.Color(0, 128, 128));
   strip.setPixelColor(54, strip.Color(0, 128, 128));

   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   strip.setPixelColor(7, strip.Color(0, 192, 64));
   strip.setPixelColor(19, strip.Color(0, 192, 64));
   strip.setPixelColor(31, strip.Color(0, 192, 64));
   strip.setPixelColor(43, strip.Color(0, 192, 64));
   strip.setPixelColor(55, strip.Color(0, 192, 64));
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   strip.setPixelColor(8, strip.Color(0, 255, 0));
   strip.setPixelColor(20, strip.Color(0, 255, 0));
   strip.setPixelColor(32, strip.Color(0, 255, 0));
   strip.setPixelColor(44, strip.Color(0, 255, 0));
   strip.setPixelColor(56, strip.Color(0, 255, 0));
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   strip.setPixelColor(9, strip.Color(64, 192, 0));
   strip.setPixelColor(21, strip.Color(64, 192, 0));
   strip.setPixelColor(33, strip.Color(64, 192, 0));
   strip.setPixelColor(45, strip.Color(64, 192, 0));
   strip.setPixelColor(57, strip.Color(64, 192, 0));

   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   strip.setPixelColor(10, strip.Color(128, 128, 0));
   strip.setPixelColor(22, strip.Color(128, 128, 0));
   strip.setPixelColor(34, strip.Color(128, 128, 0));
   strip.setPixelColor(46, strip.Color(128, 128, 0));
   strip.setPixelColor(58, strip.Color(128, 128, 0));
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды
   
   strip.setPixelColor(11, strip.Color(192, 64, 0));
   strip.setPixelColor(23, strip.Color(192, 64, 0));
   strip.setPixelColor(35, strip.Color(192, 64, 0));
   strip.setPixelColor(47, strip.Color(192, 64, 0));
   strip.setPixelColor(59, strip.Color(192, 64, 0));
   
   strip.show();   // отправляем сигнал на ленту
   delay(1000);
   strip.clear();   // выключаем все светодиоды 
}

Отредактируйте сообщение, а впредь не только пишите, но и читайте, что Вам пишут!

я поредактировал

1 лайк

если держать кнопку - побежит в другую сторону

1 лайк

Для начала читаем про циклы (for), для продолжения - статью “blink без delay”.

А зачем такой страшный скетч? Ну я понимаю, когда программисту на работе платят за написанный им код построчно.
Но если это не тот случай, можно же написать покороче, что-то типа так:

...
const byte R[12] = {255, 192, 128,  64,   0,   0,   0,   0,   0,  64, 128, 192};
const byte G[12] = {  0,   0,   0,   0,   0,  64, 128, 192, 255, 192, 128,  64};
const byte B[12] = {  0,  64, 128, 192, 255, 192, 128,  64,   0,   0,   0,   0};
byte pos=0;
...
void loop() {
  byte dir;
  strip.clear();
  for (int i=0;i<5;i++) { strip.setPixelColor(i*12+pos, strip.Color(R[pos], G[pos], B[pos]));}
  strip.show();
  delay(1000);
  digitalRead(PinForInputMusic, dir); // читаем состояние входа
  pos=(pos+11+dir+dir)%12;   // двигаем огонь вправо или влево в зависимости от состояния входа
}

Не, ну ты не горячись. Ситуации разные бывают. Может где и позакрученнее надо.)

ну много времени не заняло да и опыта у меня - неделя всего

тяп-ляп - в продакшен ?

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

сообщает об ошибки - не грузится

Это как?

Компилирует с точками, понятно дело.