For и светодиоды

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Уважаемые форумчане!

А помогите ,пожалуйста, реализовать такой эффект при помощи цикла for(). N-ное количество светодиов в рядок. Зажигаются они сначала навстречу друг другу до середины( N / 2), а потом ,расходясь друг от друга , гаснут.

Вот в одном направлении гонять огонек - все понятно)) А тут че-то ступор) 

vov4ik
Offline
Зарегистрирован: 10.09.2013
void setup() {
pinMode(2, OUTPUT);  
pinMode(3, OUTPUT);  
pinMode(4, OUTPUT);  
pinMode(5, OUTPUT);  
pinMode(6, OUTPUT);  
pinMode(7, OUTPUT);  
pinMode(8, OUTPUT);  
pinMode(9, OUTPUT); 
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);  
pinMode(12, OUTPUT);  
pinMode(13, OUTPUT);  
pinMode(14, OUTPUT);  
pinMode(15, OUTPUT);  
pinMode(16, OUTPUT);  
pinMode(17, OUTPUT);  
pinMode(18, OUTPUT);    
pinMode(19, OUTPUT);
}
void loop() {
for (int i=2; i <= 10; i++){
       digitalWrite(i, HIGH);
       digitalWrite((21 - i), HIGH);
      delay(100);
   }
for (int i=10; i >= 2; i--){
       digitalWrite(i, LOW);
       digitalWrite((21 - i), LOW);
      delay(100);
   }
}

 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Ага, понятно.  Все достаточно просто)  Спасибо. Работает ,как нужно. 

А такой рисунок можно сделать? зажигаем светодиоды (все равно как-все сразу или по одному) , а потом рандомно все зажженные светодиоды тушим по одному.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

dimOnOff пишет:

а потом рандомно все зажженные светодиоды тушим по одному.

http://arduino.ru/Reference/Random

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Вот про саму функцию random() читал и пробовал помигать светодиодом в режиме "рандомно включил - выключил". Все понятно. А как именно выключить уже горящих N-ное количество светодиодов. Не перебирать контакты до бесконечности пока последний горящий светодиод не совпадет с рандом-числом, а сразу ,допустим, выключить 5 горящих светодиодов за пять проходов в произвольном порядке. Вот)

vov4ik
Offline
Зарегистрирован: 10.09.2013

void setup() {
pinMode(2, OUTPUT);  
pinMode(3, OUTPUT);  
pinMode(4, OUTPUT);  
pinMode(5, OUTPUT);  
pinMode(6, OUTPUT);  
pinMode(7, OUTPUT);  
pinMode(8, OUTPUT);  
pinMode(9, OUTPUT); 
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);  
pinMode(12, OUTPUT);  
pinMode(13, OUTPUT);  
pinMode(14, OUTPUT);  
pinMode(15, OUTPUT);  
pinMode(16, OUTPUT);  
pinMode(17, OUTPUT);  
pinMode(18, OUTPUT);    
pinMode(19, OUTPUT);
}
void loop() {
for (int i=2; i <= 10; i++){
       digitalWrite(i, HIGH);
       digitalWrite((21 - i), HIGH);
      delay(100);
   }
for (int i=10; i >= 2; i--){
       digitalWrite(i, LOW);
       digitalWrite((21 - i), LOW);
      delay(100);
   }
for (int i=2; i <= 19; i++){
       digitalWrite(i, HIGH);
   }
for (int i=0; i <= 100; i++){   
int id = random(2, 20); 
if (digitalRead(id)) digitalWrite(id, LOW); delay(200);
   }
}
dimOnOff
Offline
Зарегистрирован: 21.04.2015

Спасибо, vov4ik .

Я по этому пути в общем и пошел. Но не додумался в последнем цикле   сделать так:  i <= 100.  

Получается в итоге ,что они то гаснут, но последние тушатся с уже другим интервалом. Ну и пауза чуть появляется в конце ввиду отличия количества светодиодов и числа "100" в цикле. Ну в ощем то работает. Может еще что поколдую))

 

vov4ik
Offline
Зарегистрирован: 10.09.2013

100 я взял на обум, можно уменьшить при условии что будут все гаснуть, а делей увеличить в начале delay((300-i)); и разница будет незаметной.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Да так значительно приятнее) Спасибо. Ща попробую к этому привинтить еще и плавное затухание, но подозреваю , что станут видны "холостые выстрелы по светодиодам" в виде зажигания уже потушенных)) Да и "недострелянные" ,кстати, тоже проявятся,видимо в конце)))

vov4ik
Offline
Зарегистрирован: 10.09.2013
  • ШИМ: 3, 5, 6, 9, 10, и 11. Любой из выводов обеспечивает ШИМ с разрешением 8 бит при помощи функции analogWrite().

unsigned long currentTime; // задание переменной времени
unsigned long loopTime; // задание переменной отрыва от времени
byte r = 0;       //уровень красного
byte g = 0;       //уровень зеленого
byte b = 0;       //уровень синего
void svet(byte r, byte g, byte b)
{analogWrite(5,r);analogWrite(6,g);analogWrite(9,b);}
byte d1 ;      //рандом 1-4
byte d2 ;      //рандом 0-255
void setup() {
currentTime = millis();       // считываем время, прошедшее с момента запуска программы
loopTime = currentTime; 
pinMode(5, OUTPUT); // назначаем пины как выходы
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
}
void loop() {
currentTime = millis();               // считываем время, прошедшее с момента запуска программы
  if(currentTime >= (loopTime + 11000)){ // сравниваем текущий таймер с переменной loopTime + 11 секунда
  d1 = random(1,4);
  d2 = random(0,256);
    loopTime = currentTime; 
  }
  if (d1 == 1 && d2 > r && r != 255) { r++; }
  if (d1 == 1 && d2 < r && r != 0) { r--; }
  if (d1 == 2 && d2 > g && g != 255) { g++; }
  if (d1 == 2 && d2 < g && g != 0) { g--; }
  if (d1 == 3 && d2 > b && b != 255) { b++; }
  if (d1 == 3 && d2 < b && b != 0) { b--; }
  svet(r,g,b);
  delay (100);
}

РГБ светодиод или РГБ светодиодную ленту на мосфетах (можно на 2003), класный эффект возникает.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Ух ты)  Спасибо!  Опробую. 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

У меня вот такой вопрос еще. Как сделать ,чтобы два разных цикла for() ,не влияя друг на друга , параллельно могли выполнятся, получая на это команды в данном случае по I2C. Уже все  вариации  "без delay делаем то или то" перебрал. Помогите, пожалуйста. 

void loop() 
{
  ...
 if(c == '1')
 {
   for (int i=2; i <= 10; i++){
       digitalWrite(i, HIGH);
       delay(500);
   }
   
   for (int i=10; i >= 2; i--){
       digitalWrite(i,LOW);
       delay(500);
   }
 }
 if(c == '2')
 {
   for (int i=10; i >= 2; i++){
       digitalWrite(i, HIGH);
       delay(500);
   }
   for (int i=2; i <= 10; i--){
       digitalWrite(i, LOW);
       delay(500);
   }
 }
}

 

vov4ik
Offline
Зарегистрирован: 10.09.2013

Фор не выпустит из цыкла пока сравнение истина.

for (int i=10; i >= 2; i++)  при данном условии {digitalWrite(i, HIGH); delay(500); } выполнется 32757 раз и врятли у ардуино есть столько портов на который можно подать высокий уровень.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Может не правильно выразился. Имел в виду ,что два цикла с разными програмами зажигания как бы становятся независимыми, т.е. выполнялись бы параллельно. Конечно ,если есть на то команда. 

vov4ik
Offline
Зарегистрирован: 10.09.2013

переделать всё без фора 

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Да вот пока не понял как только) vov4ik, если есть пример какой или ссылочка , бросьте, пожалуйста.

dimOnOff
Offline
Зарегистрирован: 21.04.2015

А можно ли сделать проверку в теле цикла, не наступило ли событие ,вызывающее новый цикл ? Хмм. Как-бы цикл в цикле получается.

bwn
Offline
Зарегистрирован: 25.08.2014

Можете в цикле, по наступлении события, присвоить крайнее значение переменной цикла и покинуть его.

vov4ik
Offline
Зарегистрирован: 10.09.2013

Можно хоть в каждый фор запихнуть ваш айтуси

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Дайте ,пожалуйста ,пример как сделать цикл без delay. 

  if (c == '1') 
  {
    for (int i = 0; i < 16; i++)
  {
    Tlc.set(i, 1023); // 1023 - brightness
    Tlc.update();
    delay(100);
 }
  }

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

dimOnOff, а что вы так за этот for уцепились? Оператор прямо скажем не самый удобный, что б его промеживать паузами. Могу дать пример как делать без for -недавно совсем обсуждали бегущие огоньки

dimOnOff
Offline
Зарегистрирован: 21.04.2015

Спасибо, dimax. Меня уже и самогого накрывает))) Вот и хочу от этого for избавится. Я по Вашему пути и попытался пойти. Тему с бегущими огоньками не видел до этого. Спасибо за наводку. Сейчас поразбираюсь. Я  только вот что научился делать : с каждой новой пришедшей командой по I2C зажигается новый светодиод. Мучаю , кстати, драйвер светодиодов. 

 
...

if ((c == '1') && (millis() - lastAction >= 100) ) 
  {
    if (i <Leds )
    { 
       lastAction = millis();
     i++;
     Tlc.set(i,4000);
     Tlc.update();
    }
}
....