Переключение программ кнопкой

AngelinaDementeva
Offline
Зарегистрирован: 10.03.2018

Помогите, пожалуйста 

Пишу программу для переключения режимов горения светодиодов кнопкой, но собранное устройство очень странно горит: сначала мигающий жёлтый(по плану), потом я нажимаю кнопку и переключается программа на горение жёлтого, красного и зелёного(тоже по плану), но потом при последющих нажатиях ничего не меняется 

int flag=0; 
int regim=0;
int button = 5;
int count = 0;
int button_old = 1;

int LedR = 13;
int LedY = 12;
int LedG = 11;
int LedLeftHand = 10;
int LedRightHand = 9;

int RedTime = 2000;
int YelTime = 3000;
int GrnTime = 12000;
int GrnFlashTime = 1000;
int LedLeftHandTime = 12000;
int LedRightHandTime = 12000;

int GrnNumFlash = 3;

void setup()
{
  Serial.begin(9600);
  pinMode(button, INPUT_PULLUP);

  pinMode(LedR, OUTPUT);
  pinMode(LedY, OUTPUT);
  pinMode(LedG, OUTPUT);
  pinMode(LedLeftHand, OUTPUT);
  pinMode(LedRightHand, OUTPUT);
}

void loop()
{
  if(digitalRead(button) == HIGH && count== 0) 
    { 
      regim ++;
      count = 1;
    }
   if(regim > 3) 
         { 
         regim = 0;
         }
  if(digitalRead(button) == LOW && flag == 1) 
     { 
  flag = 0; 
  } 
   

  if(regim == 0)
    {
    digitalWrite(LedY, HIGH);
    delay(1000);         
    digitalWrite(LedY, LOW);   
    delay(1000);  
    }

if(regim == 1)
  {
  digitalWrite(LedR, HIGH);
  delay(RedTime);
  digitalWrite(LedY, HIGH);
    delay(YelTime);
    digitalWrite(LedR, LOW);
    digitalWrite(LedY, LOW);
    digitalWrite(LedG, HIGH);
delay(GrnTime);

  for (int i = GrnNumFlash; i > 0; i--)
       {
       digitalWrite(LedG, LOW);
       delay(GrnFlashTime);
       digitalWrite(LedG, HIGH);
        delay(GrnFlashTime);
       }
       digitalWrite(LedG, LOW);

digitalWrite(LedY, HIGH);
delay(YelTime);
digitalWrite(LedY, LOW);
}


if(regim == 2)
  {
  digitalWrite(LedR, HIGH);
  delay(RedTime);
  digitalWrite(LedY, HIGH);
  delay(YelTime);
  digitalWrite(LedR, LOW);
  digitalWrite(LedY, LOW);
  digitalWrite(LedG, HIGH);
  digitalWrite(LedRightHand, HIGH);
  delay(GrnTime);
  delay(LedRightHandTime);

  for (int i = GrnNumFlash; i > 0; i--)
    {
    digitalWrite(LedG, LOW);
    delay(GrnFlashTime);
    digitalWrite(LedG, HIGH);
    delay(GrnFlashTime);
    }
  digitalWrite(LedG, LOW);
  digitalWrite(LedRightHand, LOW);

  digitalWrite(LedY, HIGH);
  delay(YelTime);
  digitalWrite(LedY, LOW);
}


if(regim == 3)
{
  digitalWrite(LedR, HIGH);
  delay(RedTime);
  digitalWrite(LedY, HIGH);
  delay(YelTime);
  digitalWrite(LedR, LOW);
  digitalWrite(LedY, LOW);
  digitalWrite(LedG, HIGH);
  digitalWrite(LedLeftHand, HIGH);
  delay(GrnTime);
  delay(LedLeftHandTime);

  for (int i = GrnNumFlash; i > 0; i--)
    {
    digitalWrite(LedG, LOW);
    delay(GrnFlashTime);
    digitalWrite(LedG, HIGH);
    delay(GrnFlashTime);
    }
  digitalWrite(LedG, LOW);
  digitalWrite(LedLeftHand, LOW);

  digitalWrite(LedY, HIGH);
  delay(YelTime);
  digitalWrite(LedY, LOW);
  }
}

Совсем не понимаю почему так(

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

меняйте структуру программы и ваши приемы программирования. так не взлетит.  ПС;#7  #59

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

1.
Кнопка у Вас срабатывает только 1 раз! Как только она сработала один раз, переменная count становится 1 (в строке 39) и обратно нулём она уже не становится никогда. Поэтому условие в строке 36 больше никода не выполнится.

2.
Неясно для чего нужны строки 45-48. Там в условии стоит проверка, что flag рано 1, но переменная flag у Вас никогда не становится 1, значит это условине никогда не выполнится. Возможно, в строках 45 и 47 Вы имели в виду count, а не flag? Подумайте.

Общее замечание. Когда непонятно как работает, ставьте печать в Serial.print всех переменных, какие есть и внимательно на них смотрите. Обычно человек замечает странное значение и немного подумав, понимает в чём ошибка.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Я так понял, наличие нескольких режимов - это была задумка препода проверить знание Вами конструкций языка. В таких случаях используют оператор switch(){} а не цепочки из ша(){}, несмотря на то что компилятор все равно преварит switch() в цепочку if() в большинстве случаев. А ежели ишо, каждый "режим" оформите в однократно вызываемую "функцию", то читаемость вашей поделки вырастет "на порядок", взамен скорости исполнения. Зато ошибки в коде выйдут "на первый план".

Перепишите, и Вам самому станет гораздо понятней.