Переключение режимов светодиодов

leav
Offline
Зарегистрирован: 30.05.2015
int knopka = 2;
int diod1 = 13;
int diod2 = 12;
int diod3 = 11;
int diod4 = 10;
boolean svet = LOW;
boolean posl = false;

void setup()
{
  pinMode(knopka, INPUT);
  pinMode(diod1, OUTPUT);
  pinMode(diod2, OUTPUT);
  pinMode(diod3, OUTPUT);
  pinMode(diod4, OUTPUT);
}

void loop()
{
  delay(5);
  if (digitalRead(knopka)==HIGH&&posl==LOW)
  {
   svet=!svet;
   posl=HIGH; 
   if(svet>3)
   {
     svet=1;
   }
  }
  if(digitalRead(knopka)==LOW&&posl==HIGH)
  {
    posl=LOW;
  }
  
  if(svet==1)
  {
    digitalWrite(diod1,LOW);
    digitalWrite(diod2,LOW);
    digitalWrite(diod3,LOW);
    digitalWrite(diod4,LOW);
  }
  if(svet==2)
  {
    digitalWrite(diod1,HIGH);
    digitalWrite(diod2,HIGH);
  }
  if(svet==3)
  {
    digitalWrite(diod3,HIGH);
    digitalWrite(diod4,HIGH);
  }

}

Добрый день! Подскажите, пожалуйста, где ошибка в коде. Программирование на ардуино только начал осваивать, еще совсем новичек! 

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

Принципиальную схему прилагаю

leav
Offline
Зарегистрирован: 30.05.2015

Код в самом верху

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
#define pin_knopka 2
#define pin_diod1 13
#define pin_diod2 12
#define pin_diod3 11
#define pin_diod4 10
byte state = 0;    // текущее состояние: 0 - все выкл, 1 - вкл 12 и 13, 2 - вкл 10 и 11

void setup()
{
  pinMode(pin_knopka, INPUT); 
  pinMode(pin_diod1, OUTPUT);
  pinMode(pin_diod2, OUTPUT);
  pinMode(pin_diod3, OUTPUT);
  pinMode(pin_diod4, OUTPUT);
}

void loop()
{
  boolean keyPress = digitalRead(pin_knopka);  // читаем кнопку
  if (keyPress)  // если кнопка нажата
  {
    state++;  // увеличиваем state на 1
    delay(20); // защита от дребезга
  }

  switch (state) // смотрим что в state
  {
  case 0:
    {
      digitalWrite(pin_diod1,LOW);
      digitalWrite(pin_diod2,LOW);
      digitalWrite(pin_diod3,LOW);
      digitalWrite(pin_diod4,LOW);
      break;
    }  

  case 1:
    {
      digitalWrite(pin_diod1,HIGH);
      digitalWrite(pin_diod2,HIGH);
      digitalWrite(pin_diod3,LOW);
      digitalWrite(pin_diod4,LOW);
      break;
    }

  case 2:
    {
      digitalWrite(pin_diod1,LOW);
      digitalWrite(pin_diod2,LOW);
      digitalWrite(pin_diod3,HIGH);
      digitalWrite(pin_diod4,HIGH);
      break;
    }

  default: // если ни одно из перечисленных
    {
      state = 0;
    }  
  } // конец switch

} // конец loop

 

leav
Offline
Зарегистрирован: 30.05.2015

Огромное, Вам, спасибо!

А можно как-то сделать, чтоб при зажатии кнопки, светодиоды не мигали?

maksim
Offline
Зарегистрирован: 12.02.2012

вместо

   svet=!svet;

нужно

   svet++;

 

vvadim
Offline
Зарегистрирован: 23.05.2012

дык по коду они у вас и не мигают)))

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

vvadim пишет:

дык по коду они у вас и не мигают)))

Как по мне то при нажатой кнопке они будут мигать с частотой delay(20)

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

vvadim
Offline
Зарегистрирован: 23.05.2012

ну если вы такую частоту мигания видите, то сделайте антидребезг без делеев и всё)))

X-Dron
Offline
Зарегистрирован: 24.01.2015

Не антидребезг нужен, а фронт нажатия ловить.
За основу можно взять это. http://wiki.amperka.ru/%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-...

Без дополнителних библиотек.
Но я бы сделал по другому, проще и нагляднее. Но понадобится библиотека
 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Можно сделать както так чтобы переключалось только при очередном нажатии 

#define pin_knopka 2
#define pin_diod1 13
#define pin_diod2 12
#define pin_diod3 11
#define pin_diod4 10
byte state = 0;    // текущее состояние: 0 - все выкл, 1 - вкл 12 и 13, 2 - вкл 10 и 11

void setup()
{
  pinMode(pin_knopka, INPUT); 
  pinMode(pin_diod1, OUTPUT);
  pinMode(pin_diod2, OUTPUT);
  pinMode(pin_diod3, OUTPUT);
  pinMode(pin_diod4, OUTPUT);
}

void loop()
{
  boolean keyPress = digitalRead(pin_knopka);  // читаем кнопку
   boolean Flag_keyPress = 0; //Добавляем флаг нажатия кнопки
   if(keyPressed==0) Flag_keyPress=0; //Кнопка 0 - исходная
  if (keyPress==1 && Flag_keyPress==0)  // если кнопка нажата
  {
    state++;  // увеличиваем state на 1
    delay(20); // защита от дребезга
    Flag_keyPress = 1;//Фиксируем нажатие 1 раз
  }

  switch (state) // смотрим что в state
  {
  case 0:
    {
      digitalWrite(pin_diod1,LOW);
      digitalWrite(pin_diod2,LOW);
      digitalWrite(pin_diod3,LOW);
      digitalWrite(pin_diod4,LOW);
      break;
    }  

  case 1:
    {
      digitalWrite(pin_diod1,HIGH);
      digitalWrite(pin_diod2,HIGH);
      digitalWrite(pin_diod3,LOW);
      digitalWrite(pin_diod4,LOW);
      break;
    }

  case 2:
    {
      digitalWrite(pin_diod1,LOW);
      digitalWrite(pin_diod2,LOW);
      digitalWrite(pin_diod3,HIGH);
      digitalWrite(pin_diod4,HIGH);
      break;
    }

  default: // если ни одно из перечисленных
    {
      state = 0;
    }  
  } // конец switch

} // конец loop

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

какой смысл в строке 26? Дальше нигде не используется, а в следующем цикле переменная обнуляется.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Когда мы устанавливаем "Flag_keyPress = 1;" больше 22 строчка "if (keyPress==1 && Flag_keyPress==0)  // если кнопка нажата"

не срабатывает и state++; остается неизменным пока не отпустим кнопку, строчка 21

leav
Offline
Зарегистрирован: 30.05.2015

ВСЕ большое спасибо!!!
Вот какой у меня, в итоге, получился код

Уважаемые, подскажите, пожалуйста, пользовался кто-то микросхемой 74HC595Стоит ее покупать для увеличения портов, что бы подключить большее кол-во светодиодов?

#define pin_knopka 2
#define pin_diod1 13
#define pin_diod2 12
#define pin_diod3 11
#define pin_diod4 10
byte regim = 0;

void setup()
{
  pinMode(pin_knopka, INPUT); 
  pinMode(pin_diod1, OUTPUT);
  pinMode(pin_diod2, OUTPUT);
  pinMode(pin_diod3, OUTPUT);
  pinMode(pin_diod4, OUTPUT);
}
void loop()
{
  
  boolean key = digitalRead(pin_knopka); 
   boolean Flag_key = 0; 
   if(key==0) Flag_key=0; 
  if (key==1 && Flag_key==0) 
  {
    regim++;
    delay(175);
   Flag_key = 1;
  }
  switch(regim)
  {
    case 0:
    {
      digitalWrite(pin_diod1,LOW);
      digitalWrite(pin_diod2,LOW);
      digitalWrite(pin_diod3,LOW);
      digitalWrite(pin_diod4,LOW);
      break;
    }  

  case 1:
    {
      digitalWrite(pin_diod1,HIGH);
    delay(100);
    digitalWrite(pin_diod2,HIGH);
    delay(100);
    digitalWrite(pin_diod3,HIGH);
    delay(100);
    digitalWrite(pin_diod4,HIGH);
    delay(100);
    digitalWrite(pin_diod1,LOW);
    delay(100);
    digitalWrite(pin_diod2,LOW);
    delay(100);
    digitalWrite(pin_diod3,LOW);
    delay(100);
    digitalWrite(pin_diod4,LOW);
    delay(100);
    break;
    }

  case 2:
    {
      digitalWrite(pin_diod4,HIGH);
    delay(100);
    digitalWrite(pin_diod3,HIGH);
    delay(100);
    digitalWrite(pin_diod2,HIGH);
    delay(100);
    digitalWrite(pin_diod1,HIGH);
    delay(100);
    digitalWrite(pin_diod1,LOW);
    delay(100);
    digitalWrite(pin_diod2,LOW);
    delay(100);
    digitalWrite(pin_diod3,LOW);
    delay(100);
    digitalWrite(pin_diod4,LOW);
    delay(100);
    break;
    }

  default: // если ни одно из перечисленных
    {
      regim = 0;
    }  
  } // конец switch

} // конец loop

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

vosaraв строке 26 мы устанавливаем Flag_keyPress = 1

Дальше по завершении цикла  заново переходим к строке 17. Так вот в этот момент Flag_keyPress  ВСЕГДА становится равным нулю, потому как это была локальная переменная.

Кстати, в строке 21 есть несуществующая переменная Flag_keyPressed.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Да верно надо выносить с loop или ставить static

недосмотрел!!

leav
Offline
Зарегистрирован: 30.05.2015

Если не сложно, не могди бы Вы, написать как теперь будет выглядеть код? Очень хочеться довести до совершенства и разобраться

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Не проверял но должно быть так:

#define pin_knopka 2
#define pin_diod1 13
#define pin_diod2 12
#define pin_diod3 11
#define pin_diod4 10
byte regim = 0;
 bool Flag_key = 0; 

void setup()
{
  pinMode(pin_knopka, INPUT); 
  pinMode(pin_diod1, OUTPUT);
  pinMode(pin_diod2, OUTPUT);
  pinMode(pin_diod3, OUTPUT);
  pinMode(pin_diod4, OUTPUT);
}
void loop()
{
  
  boolean key = digitalRead(pin_knopka); 
  if(key==0) Flag_key=0; 
  if (key==1 && Flag_key==0) 
  {
    regim++;
    delay(175);
   Flag_key = 1;
  }
  switch(regim)
  {
    case 0:
    {
      digitalWrite(pin_diod1,LOW);
      digitalWrite(pin_diod2,LOW);
      digitalWrite(pin_diod3,LOW);
      digitalWrite(pin_diod4,LOW);
      break;
    }  

  case 1:
    {
      digitalWrite(pin_diod1,HIGH);
    delay(100);
    digitalWrite(pin_diod2,HIGH);
    delay(100);
    digitalWrite(pin_diod3,HIGH);
    delay(100);
    digitalWrite(pin_diod4,HIGH);
    delay(100);
    digitalWrite(pin_diod1,LOW);
    delay(100);
    digitalWrite(pin_diod2,LOW);
    delay(100);
    digitalWrite(pin_diod3,LOW);
    delay(100);
    digitalWrite(pin_diod4,LOW);
    delay(100);
    break;
    }

  case 2:
    {
      digitalWrite(pin_diod4,HIGH);
    delay(100);
    digitalWrite(pin_diod3,HIGH);
    delay(100);
    digitalWrite(pin_diod2,HIGH);
    delay(100);
    digitalWrite(pin_diod1,HIGH);
    delay(100);
    digitalWrite(pin_diod1,LOW);
    delay(100);
    digitalWrite(pin_diod2,LOW);
    delay(100);
    digitalWrite(pin_diod3,LOW);
    delay(100);
    digitalWrite(pin_diod4,LOW);
    delay(100);
    break;
    }

  default: // если ни одно из перечисленных
    {
      regim = 0;
    }  
  } // конец switch

} // конец loop

 

leav
Offline
Зарегистрирован: 30.05.2015

vosara пишет:

Не проверял но должно быть так:

 

#define pin_knopka 2
#define pin_diod1 13
#define pin_diod2 12
#define pin_diod3 11
#define pin_diod4 10
byte regim = 0;
 bool Flag_key = 0; 

void setup()
{
  pinMode(pin_knopka, INPUT); 
  pinMode(pin_diod1, OUTPUT);
  pinMode(pin_diod2, OUTPUT);
  pinMode(pin_diod3, OUTPUT);
  pinMode(pin_diod4, OUTPUT);
}
void loop()
{
  
  boolean key = digitalRead(pin_knopka); 
  if(key==0) Flag_key=0; 
  if (key==1 && Flag_key==0) 
  {
    regim++;
    delay(175);
   Flag_key = 1;
  }
  switch(regim)
  {
    case 0:
    {
      digitalWrite(pin_diod1,LOW);
      digitalWrite(pin_diod2,LOW);
      digitalWrite(pin_diod3,LOW);
      digitalWrite(pin_diod4,LOW);
      break;
    }  

  case 1:
    {
      digitalWrite(pin_diod1,HIGH);
    delay(100);
    digitalWrite(pin_diod2,HIGH);
    delay(100);
    digitalWrite(pin_diod3,HIGH);
    delay(100);
    digitalWrite(pin_diod4,HIGH);
    delay(100);
    digitalWrite(pin_diod1,LOW);
    delay(100);
    digitalWrite(pin_diod2,LOW);
    delay(100);
    digitalWrite(pin_diod3,LOW);
    delay(100);
    digitalWrite(pin_diod4,LOW);
    delay(100);
    break;
    }

  case 2:
    {
      digitalWrite(pin_diod4,HIGH);
    delay(100);
    digitalWrite(pin_diod3,HIGH);
    delay(100);
    digitalWrite(pin_diod2,HIGH);
    delay(100);
    digitalWrite(pin_diod1,HIGH);
    delay(100);
    digitalWrite(pin_diod1,LOW);
    delay(100);
    digitalWrite(pin_diod2,LOW);
    delay(100);
    digitalWrite(pin_diod3,LOW);
    delay(100);
    digitalWrite(pin_diod4,LOW);
    delay(100);
    break;
    }

  default: // если ни одно из перечисленных
    {
      regim = 0;
    }  
  } // конец switch

} // конец loop

 

Большое спасибо! Все работает прекрасно! Вы не пробовали, когда-то, использовать микросхему 74hc595? Стоит ее покупать для увеличения портов?