Все те же светодиоды :(

IvGor
Offline
Зарегистрирован: 28.02.2018

Прошу помощи. Я новичек в программирование и для меня все это очень тяжело дается. 

В основе идея имитации запуска ртутной лампы с бракованным пускателем. Когда она запускается и мигает перед тем как загореться окончательно. Имитировать данный эффект должны три светодиода по нажатию кнопки.  Первый шаг - горит один светодиод, второй шаг - рандомное мигание 3-х светодиодов, потом имитация сломаной лампы. рандом работает, а имитация переходит в бесконечное мигае светодиодов. 

int j=0;
int Up_LedPin = 0;
int Down_LedPin = 1;
int Right_LedPin = 2;
int ButPin = 4;
int flag = 0;
int reg = 0;
void setup() 
{
pinMode(Up_LedPin, OUTPUT);
pinMode(Down_LedPin, OUTPUT);
pinMode(Right_LedPin, OUTPUT);
pinMode(ButPin, INPUT);
}

void loop()
{
  if(digitalRead(ButPin) == HIGH && flag == 0) 
  { delay(100);
  reg ++;
  flag = 1;
  
  if(reg>1)
  {
    reg=0;
  }
  }
if(digitalRead(ButPin) == LOW && flag == 1)
{ delay(100);
flag = 0;
j=0;
}
//------------------------------- 1 REG ------------------------------
if(reg ==0)
{
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, HIGH); 
}
//------------------------------- 2 REG ------------------------------
if(reg == 1)
{
while (j<50)
{
digitalWrite (random (0,3), HIGH);
delay (random (5, 10));                      //тут светодиады рандомно мигают
digitalWrite (random (0,3), LOW); 
delay (random (3, 8));
j++;

}                                                   //тут должна быть имитация сломанной лампы
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
delay(10);
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, LOW);
delay(100);
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
delay(20);
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, LOW);
delay(50);
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
delay(100);
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, LOW);
delay(20);
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Спасибо, кончено, за информацию, только Вы забыли написать в чём именно 

IvGor пишет:
Прошу помощи.
В чём Ваша проблема-то?

IvGor
Offline
Зарегистрирован: 28.02.2018

Ах да) простите. Проблемма в том, что имитация не работает. в последнем шаге после рандома светодиоды переходят в циклическое мерцание. а по идее должны помигать с разной задержкой как в сломанной лампе и начать гореть пока их не выключить нажатием кнопки. 

ven-til
Offline
Зарегистрирован: 13.02.2018

IvGor,    добавляешь переменную boolean lampOn = false;

 

 

if (reg == 1)
{
  if (!lampOn) {
    while (j < 50)
    {
      digitalWrite (random (0, 3), HIGH);
      delay (random (5, 10));                      //тут светодиады рандомно мигают
      digitalWrite (random (0, 3), LOW);
      delay (random (3, 8));
      j++;

    }                                                   //тут должна быть имитация сломанной лампы
    digitalWrite(Up_LedPin, HIGH);
    digitalWrite(Down_LedPin, HIGH);
    digitalWrite(Right_LedPin, HIGH);
    delay(10);
    digitalWrite(Up_LedPin, LOW);
    digitalWrite(Down_LedPin, LOW);
    digitalWrite(Right_LedPin, LOW);
    delay(100);
    digitalWrite(Up_LedPin, HIGH);
    digitalWrite(Down_LedPin, HIGH);
    digitalWrite(Right_LedPin, HIGH);
    delay(20);
    digitalWrite(Up_LedPin, LOW);
    digitalWrite(Down_LedPin, LOW);
    digitalWrite(Right_LedPin, LOW);
    delay(50);
    digitalWrite(Up_LedPin, HIGH);
    digitalWrite(Down_LedPin, HIGH);
    digitalWrite(Right_LedPin, HIGH);
    delay(100);
    digitalWrite(Up_LedPin, LOW);
    digitalWrite(Down_LedPin, LOW);
    digitalWrite(Right_LedPin, LOW);
    delay(20);
    digitalWrite(Up_LedPin, HIGH);
    digitalWrite(Down_LedPin, HIGH);
    digitalWrite(Right_LedPin, HIGH);
    lampOn = true;
  }
}

 

 

IvGor
Offline
Зарегистрирован: 28.02.2018

Так, лампы загорелись в конце, после нажатия кнопки снова входит в первый режим, но на этом стопорится. 

IvGor
Offline
Зарегистрирован: 28.02.2018

До введения lampOn можно было при каждом нажатии менать режим, пока рука не отсохнет)) 

IvGor
Offline
Зарегистрирован: 28.02.2018
int j=0;
int Up_LedPin = 0;
int Down_LedPin = 1;
int Right_LedPin = 2;
int ButPin = 4;
int flag = 0;
int reg = 0;
boolean lampOn = false;
void setup()
{
pinMode(Up_LedPin, OUTPUT);
pinMode(Down_LedPin, OUTPUT);
pinMode(Right_LedPin, OUTPUT);
pinMode(ButPin, INPUT);
}

void loop()
{
  if(digitalRead(ButPin) == HIGH && flag == 0) 
  { delay(100);
  reg ++;
  flag = 1;
  
  if(reg>1)
  {
    reg=0;
  }
  }
if(digitalRead(ButPin) == LOW && flag == 1)
{ delay(100);
flag = 0;
j=0;
}
//------------------------------- 1 REG ------------------------------
if(reg ==0)
{
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, HIGH); 
}
//------------------------------- 2 REG ------------------------------
if(reg == 1)
{
if (!lampOn)
{
while (j<50)
{
digitalWrite (random (0,3), HIGH);
delay (random (5, 10));
digitalWrite (random (0,3), LOW); 
delay (random (3, 8));
j++;
}
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
delay(10);
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, LOW);
delay(100);
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
delay(20);
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, LOW);
delay(50);
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
delay(100);
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, LOW);
delay(20);
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
lampOn = true;
}
}
}

//после выполнения lapmOn=true; нажимаю кнопку, перехожу в первый режим и все. теперь на кнопку нет реакций(( раньше работало.

 

ven-til
Offline
Зарегистрирован: 13.02.2018

IvGor, ну сброс lampOn в false уже сам догадайся куда вставить.

IvGor
Offline
Зарегистрирован: 28.02.2018
int j=0;
int Up_LedPin = 0;
int Down_LedPin = 1;
int Right_LedPin = 2;
int ButPin = 4;
int flag = 0;
int reg = 0;
boolean lampOn = false;
void setup()
{
pinMode(Up_LedPin, OUTPUT);
pinMode(Down_LedPin, OUTPUT);
pinMode(Right_LedPin, OUTPUT);
pinMode(ButPin, INPUT);
}

void loop()
{
  if(digitalRead(ButPin) == HIGH && flag == 0) 
  { delay(100);
  reg ++;
  flag = 1;
  lampOn = false;
  
  if(reg>1)
  {
    reg=0;
  }
  }
if(digitalRead(ButPin) == LOW && flag == 1)
{ delay(100);
flag = 0;
j=0;
}
//------------------------------- 1 REG ------------------------------
if(reg ==0)
{
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, HIGH); 
}
//------------------------------- 2 REG ------------------------------
if(reg == 1)
{
if (!lampOn)
{
while (j<50)
{
digitalWrite (random (0,3), HIGH);
delay (random (5, 10));
digitalWrite (random (0,3), LOW); 
delay (random (3, 8));
j++;
}
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
delay(10);
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, LOW);
delay(100);
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
delay(20);
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, LOW);
delay(50);
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
delay(100);
digitalWrite(Up_LedPin, LOW);
digitalWrite(Down_LedPin, LOW);
digitalWrite(Right_LedPin, LOW);
delay(20);
digitalWrite(Up_LedPin, HIGH);
digitalWrite(Down_LedPin, HIGH);
digitalWrite(Right_LedPin, HIGH);
lampOn = true;
}
}
}

Все заработало! Огромное спасибо!!!! тему можно закрыть.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

// до лупа
int i=0;
long t=0;

//в лупе

// рандомное мигание
if( i<=10 && millis()-t>random(10,500)) 
{
  t=millis();
  int r=random (0,2);
  digitalWrite(Up_LedPin, r);
  digitalWrite(Down_LedPin, r);
  digitalWrite(Right_LedPin, r);
  i++;
}
// постоянное включение после миганий
if( i>10) {
  digitalWrite(Up_LedPin, 1);
  digitalWrite(Down_LedPin, 1);
  digitalWrite(Right_LedPin, 1);
}

может так интереснее? - больше рандомности

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

и да, рандом а ардуины тоже кривой - он попросту НЕ рандом

17:59:04.311 -> 10100011010
17:59:05.413 -> ----------
17:59:09.250 -> 10100011010
17:59:10.353 -> ----------
17:59:14.189 -> 10100011010
17:59:15.323 -> ----------
17:59:19.261 -> 10100011010
17:59:20.397 -> ----------
17:59:24.433 -> 10100011010
17:59:25.534 -> ----------
17:59:30.173 -> 10100011010
17:59:36.280 -> ----------
17:59:40.220 -> 10100011010
17:59:41.352 -> ----------
17:59:45.558 -> 10100011010
17:59:46.690 -> ----------
17:59:50.663 -> 10100011010
 
рестантом перезапускал - результат одинаков... 
 
результат меняется только если момент вызова рандома по времени от момента запуска разный
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

и да, рандом а ардуины тоже кривой - он попросту НЕ рандом

Опять тестикулы танцевать мешают? Да, ампутируйте уже их нахрен!

ELITE пишет:

рестантом перезапускал - результат одинаков... 

Ну, вообще-то это всегда и везде так. Чтобы результаты были разными, нужно randomSeed использовать. Но Вам это ни к чему - в других двадцати языках всё и так замечательно.

P.S. Мои просьбы:

1. Опубликовать список из двадцати языков, которые Вы знаете на уровне выше университетского
2. Объяснить, почему Вы не используете Паскаль для программирования Ардуино

остаются в силе. Может, снизойдёте?

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

ЕвгенийП пишет:

P.S. Мои просьбы:

1. Опубликовать список из двадцати языков, которые Вы знаете на уровне выше университетского
2. Объяснить, почему Вы не используете Паскаль для программирования Ардуино

остаются в силе. Может, снизойдёте?

От прицепился, противный. Может некогда.))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bwn пишет:

От прицепился, противный. Может некогда.))))

Да, я ж ничо. Не требую типа, а покорнейше прошу :)