#1 2016-04-21 20:42:07

Vik300001
Учасник
Зареєстрований: 2016-04-21
Повідомлень: 7

Код новогодней гирлянды

Здравствуйте! Собрал из кусочков код новогодней гирлянды, светодиоды подключены к пинам 2-9, кнопка к 10.
Мерцание светодиодов должно меняться после нажатия кнопки, всего три режима. Но на самом деле работает только первый режим, программа на кнопку не реагирует. Прошу помощи у знающих людей...
/*
Мигаем светодиодами на контактах со 2 по 9
*/
// Setup - этот блок выполняется лишь один раз, при запуске скетча
int del=100; // присваиваем переменной "del" значение 100, это будет в дальнейшем являться задержкой в 100 миллисекунд
int switchPin =10;
int val;

int state;
int c;

void setup()
{
  // устанавливаем цыфровые выводы со 2 по 9 как выходы (далее мы рассмотрим как это сделать более простым способом)
  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(switchPin, INPUT);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}
// блок цикла - данный блок будет повторяться бесконечно, до тех пор пока вы не отключите питание
void loop()
{
  state = digitalRead(switchPin);

  if (state == HIGH && c == 0) // нажали кнопку
  {
    c = 1;
  }
  if (state == LOW && c == 1) // отпустили кнопку
  {
    val = ++val;
    if (val == 2)
    {
      val = 0;
    }
    c = 0;
  }

  if (val == 0) // Мигание 1

{
  digitalWrite(2, HIGH);   // включить светодиод на контакте 2
  delay(del);              // выполнить задержку длительностью "del" ("del" как мы помним равна 100 миллисекунд)
  digitalWrite(2, LOW);    // выключить светодиод
  digitalWrite(3, HIGH);   // включить светодиод на контакте 3
  delay(del);              // выполнить задержку
  digitalWrite(3, LOW);    // выключить светодиод
  digitalWrite(4, HIGH);   // включить светодиод на контакте 4
  delay(del);              // выполнить задержку
  digitalWrite(4, LOW);    // выключить светодиод
  digitalWrite(5, HIGH);   // включить светодиод на контакте 5
  delay(del);              // выполнить задержку
  digitalWrite(5, LOW);    // выключить светодиод
  digitalWrite(6, HIGH);   // включить светодиод на контакте 6
  delay(del);              // выполнить задержку
  digitalWrite(6, LOW);    // выключить светодиод
  digitalWrite(7, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(7, LOW);    // выключить светодиод
  digitalWrite(8, HIGH);   // включить светодиод на контакте 8
  delay(del);              // выполнить задержку
  digitalWrite(8, LOW);    // выключить светодиод
  digitalWrite(9, HIGH);   // включить светодиод на контакте 9
  delay(del);              // выполнить задержку
  digitalWrite(9, LOW);    // выключить светодиод
  digitalWrite(8, HIGH);   // включить светодиод на контакте 8
  delay(del);              // выполнить задержку
  digitalWrite(8, LOW);    // выключить светодиод
  digitalWrite(7, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(7, LOW);    // выключить светодиод
  digitalWrite(6, HIGH);   // включить светодиод на контакте 6
  delay(del);              // выполнить задержку
  digitalWrite(6, LOW);    // выключить светодиод
  digitalWrite(5, HIGH);   // включить светодиод на контакте 5
  delay(del);              // выполнить задержку
  digitalWrite(5, LOW);    // выключить светодиод
  digitalWrite(4, HIGH);   // включить светодиод на контакте 4
  delay(del);              // выполнить задержку
  digitalWrite(4, LOW);    // выключить светодиод
  digitalWrite(3, HIGH);   // включить светодиод на контакте 3
  delay(del);              // выполнить задержку
  digitalWrite(3, LOW);    // выключить светодиод
}

if (val == 1) // Если мы кнопку 1 раз нажали и отпустили
{
  digitalWrite(2, HIGH);   // включить светодиод на контакте 2
  delay(del);              // выполнить задержку длительностью "del" ("del" как мы помним равна 100 миллисекунд)
  digitalWrite(2, LOW);    // выключить светодиод
  digitalWrite(5, HIGH);   // включить светодиод на контакте 3
  delay(del);              // выполнить задержку
  digitalWrite(5, LOW);    // выключить светодиод
  digitalWrite(3, HIGH);   // включить светодиод на контакте 4
  delay(del);              // выполнить задержку
  digitalWrite(3, LOW);    // выключить светодиод
  digitalWrite(6, HIGH);   // включить светодиод на контакте 5
  delay(del);              // выполнить задержку
  digitalWrite(6, LOW);    // выключить светодиод
  digitalWrite(4, HIGH);   // включить светодиод на контакте 6
  delay(del);              // выполнить задержку
  digitalWrite(4, LOW);    // выключить светодиод
  digitalWrite(7, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(7, LOW);    // выключить светодиод
  digitalWrite(5, HIGH);   // включить светодиод на контакте 8
  delay(del);              // выполнить задержку
  digitalWrite(5, LOW);    // выключить светодиод
  digitalWrite(8, HIGH);   // включить светодиод на контакте 9
  delay(del);              // выполнить задержку
  digitalWrite(8, LOW);    // выключить светодиод
  digitalWrite(6, HIGH);   // включить светодиод на контакте 8
  delay(del);              // выполнить задержку
  digitalWrite(6, LOW);    // выключить светодиод
  digitalWrite(9, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(9, LOW);    // выключить светодиод
  digitalWrite(7, HIGH);   // включить светодиод на контакте 6
  delay(del);              // выполнить задержку
  digitalWrite(7, LOW);    // выключить светодиод
  digitalWrite(8, HIGH);   // включить светодиод на контакте 5
  delay(del);              // выполнить задержку
  digitalWrite(8, LOW);    // выключить светодиод
  digitalWrite(9, HIGH);   // включить светодиод на контакте 4
  delay(del);              // выполнить задержку
  digitalWrite(9, LOW);    // выключить светодиод
  }
  if (val == 2) // Если мы кнопку 2 раз нажали и отпустили
  {
  digitalWrite(2, HIGH);   // включить светодиод на контакте 2
  delay(del);              // выполнить задержку длительностью "del" ("del" как мы помним равна 100 миллисекунд)
  digitalWrite(2, LOW);    // выключить светодиод
  digitalWrite(4, HIGH);   // включить светодиод на контакте 3
  delay(del);              // выполнить задержку
  digitalWrite(4, LOW);    // выключить светодиод
  digitalWrite(6, HIGH);   // включить светодиод на контакте 4
  delay(del);              // выполнить задержку
  digitalWrite(6, LOW);    // выключить светодиод
  digitalWrite(8, HIGH);   // включить светодиод на контакте 5
  delay(del);              // выполнить задержку
  digitalWrite(8, LOW);    // выключить светодиод
  digitalWrite(9, HIGH);   // включить светодиод на контакте 6
  delay(del);              // выполнить задержку
  digitalWrite(9, LOW);    // выключить светодиод
  digitalWrite(7, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(7, LOW);    // выключить светодиод
  digitalWrite(4, HIGH);   // включить светодиод на контакте 8
  delay(del);              // выполнить задержку
  digitalWrite(5, LOW);    // выключить светодиод
  digitalWrite(3, HIGH);   // включить светодиод на контакте 9
  delay(del);              // выполнить задержку
  digitalWrite(3, LOW);    // выключить светодиод
}
}

Неактивний

#2 2016-04-22 00:45:26

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Код новогодней гирлянды

Green в теме 
http://forum.arduino.ua/viewtopic.php?id=456

показал возможное ренение

void loop()
{

 if (KeyExe())
 {
  val++;
  if ( val > 2 ) val = 0; 
 }
	
	
if ( val == 0) // Мигание 1
{.
.
.  

}

bool KeyExe()
{
  static bool key_pressed;
  static uint8_t debounce_timer;
  
  if (key_pressed != !digitalRead(switchPin)) {
    key_pressed = !key_pressed;
    debounce_timer = DEBOUNCE_TIME;
  }
  else if (debounce_timer && !--debounce_timer && key_pressed)
    return true;
  return false;
}
  
для начала
а позже переделаете на кол. нажатий за время  

Неактивний

#3 2016-04-22 10:09:36

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Код новогодней гирлянды

Еще.
Кнопка как подключена? Резистор есть?

Неактивний

#4 2016-04-22 11:31:49

Vik300001
Учасник
Зареєстрований: 2016-04-21
Повідомлень: 7

Re: Код новогодней гирлянды

Еще.
Кнопка как подключена? Резистор есть?

Да, есть резистор

Неактивний

#5 2016-04-24 16:42:49

Vik300001
Учасник
Зареєстрований: 2016-04-21
Повідомлень: 7

Re: Код новогодней гирлянды

Разобрался..
Вот код на три режима

/*
Мигаем светодиодами на контактах со 2 по 9
*/
// Setup - этот блок выполняется лишь один раз, при запуске скетча
int del=200; // присваиваем переменной "del" значение 100, это будет в дальнейшем являться задержкой в 100 миллисекунд
int switchPin =10;
int val;

int state;
int c;

void setup()
{
  // устанавливаем цыфровые выводы со 2 по 9 как выходы (далее мы рассмотрим как это сделать более простым способом)
  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(switchPin, INPUT);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}
// блок цикла - данный блок будет повторяться бесконечно, до тех пор пока вы не отключите питание
void loop()
{
  state = digitalRead(switchPin);

  if (state == HIGH && c == 0) // нажали кнопку
  {
    c = 1;
  }
  if (state == LOW && c == 1) // отпустили кнопку
  {
    val = ++val;
    if (val == 3)
    {
      val = 0;
    }
    c = 0;
  }

  if (val == 0) // Мигание 1

{
  digitalWrite(2, HIGH);   // включить светодиод на контакте 2
  delay(del);              // выполнить задержку длительностью "del" ("del" как мы помним равна 100 миллисекунд)
  digitalWrite(2, LOW);    // выключить светодиод
  digitalWrite(3, HIGH);   // включить светодиод на контакте 3
  delay(del);              // выполнить задержку
  digitalWrite(3, LOW);    // выключить светодиод
  digitalWrite(4, HIGH);   // включить светодиод на контакте 4
  delay(del);              // выполнить задержку
  digitalWrite(4, LOW);    // выключить светодиод
  digitalWrite(5, HIGH);   // включить светодиод на контакте 5
  delay(del);              // выполнить задержку
  digitalWrite(5, LOW);    // выключить светодиод
  digitalWrite(6, HIGH);   // включить светодиод на контакте 6
  delay(del);              // выполнить задержку
  digitalWrite(6, LOW);    // выключить светодиод
  digitalWrite(7, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(7, LOW);    // выключить светодиод
  digitalWrite(8, HIGH);   // включить светодиод на контакте 8
  delay(del);              // выполнить задержку
  digitalWrite(8, LOW);    // выключить светодиод
  digitalWrite(9, HIGH);   // включить светодиод на контакте 9
  delay(del);              // выполнить задержку
  digitalWrite(9, LOW);    // выключить светодиод
  digitalWrite(8, HIGH);   // включить светодиод на контакте 8
  delay(del);              // выполнить задержку
  digitalWrite(8, LOW);    // выключить светодиод
  digitalWrite(7, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(7, LOW);    // выключить светодиод
  digitalWrite(6, HIGH);   // включить светодиод на контакте 6
  delay(del);              // выполнить задержку
  digitalWrite(6, LOW);    // выключить светодиод
  digitalWrite(5, HIGH);   // включить светодиод на контакте 5
  delay(del);              // выполнить задержку
  digitalWrite(5, LOW);    // выключить светодиод
  digitalWrite(4, HIGH);   // включить светодиод на контакте 4
  delay(del);              // выполнить задержку
  digitalWrite(4, LOW);    // выключить светодиод
  digitalWrite(3, HIGH);   // включить светодиод на контакте 3
  delay(del);              // выполнить задержку
  digitalWrite(3, LOW);    // выключить светодиод
}

 if (val == 1) // Если мы кнопку 1 раз нажали и отпустили
 {
  digitalWrite(2, HIGH);   // включить светодиод на контакте 2
  delay(del);              // выполнить задержку длительностью "del" ("del" как мы помним равна 100 миллисекунд)
  digitalWrite(2, LOW);    // выключить светодиод
  digitalWrite(9, HIGH);   // включить светодиод на контакте 3
  delay(del);              // выполнить задержку
  digitalWrite(9, LOW);    // выключить светодиод
  digitalWrite(3, HIGH);   // включить светодиод на контакте 4
  delay(del);              // выполнить задержку
  digitalWrite(3, LOW);    // выключить светодиод
  digitalWrite(8, HIGH);   // включить светодиод на контакте 5
  delay(del);              // выполнить задержку
  digitalWrite(8, LOW);    // выключить светодиод
  digitalWrite(4, HIGH);   // включить светодиод на контакте 6
  delay(del);              // выполнить задержку
  digitalWrite(4, LOW);    // выключить светодиод
  digitalWrite(7, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(7, LOW);    // выключить светодиод
 digitalWrite(5, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(5, LOW);    // выключить светодиод
 digitalWrite(6, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку
  digitalWrite(6, LOW);    // выключить светодиод
  
  }
  if (val == 2) // Если мы кнопку 2 раз нажали и отпустили
  {


  digitalWrite(2, HIGH);   // включить светодиод на контакте 2
  digitalWrite(3, HIGH);   // включить светодиод на контакте 3
   digitalWrite(4, HIGH);   // включить светодиод на контакте 4
digitalWrite(5, HIGH);   // включить светодиод на контакте 5
digitalWrite(6, HIGH);   // включить светодиод на контакте 5
   digitalWrite(7, HIGH);   // включить светодиод на контакте 5
 digitalWrite(8, HIGH);   // включить светодиод на контакте 6
   digitalWrite(9, HIGH);   // включить светодиод на контакте 7
  delay(del);              // выполнить задержку длительностью "del"
 digitalWrite(2, LOW);   // выключить светодиод на контакте 2
  digitalWrite(3, LOW);   // выключить светодиод на контакте 3
   digitalWrite(4, LOW);   // выключить светодиод на контакте 4
digitalWrite(5, LOW);   // выключить светодиод на контакте 5
digitalWrite(6, LOW);   // выключить светодиод на контакте 5
   digitalWrite(7, LOW);   // выключить светодиод на контакте 5
 digitalWrite(8, LOW);   // выключить светодиод на контакте 6
   digitalWrite(9, LOW);   // выключить светодиод на контакте 7
delay(del);              // выполнить задержку длительностью "del"
 
 }
}

Неактивний

#6 2016-04-24 21:22:35

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Код новогодней гирлянды

"Так значит можешь, если захочешь!"

Неактивний

#7 2016-04-25 09:31:41

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Код новогодней гирлянды

Green пише:

"Так значит можешь, если захочешь!"

это просто отлично что TS разобрался. он молодец
но надеюсь новички никогда не увидят этот пост.
учится нужно не только на работающем коде, но и на "красивом".
Ваш пример очень хорош. тот факт что TS его проигнорировал, меня печалит, ибо следующая тема возможно будет - как избавится от дребезга.

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

Остання редакція NoName (2016-04-25 09:36:05)

Неактивний

#8 2016-04-25 12:42:46

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Код новогодней гирлянды

Иной раз, взглянув на код, сразу же хочется его закрыть со словами "глаза б мои никогда этого не видели б!"((

Остання редакція Green (2016-04-25 12:43:33)

Неактивний

#9 2016-04-25 17:26:49

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Код новогодней гирлянды

Green пише:

Иной раз, взглянув на код, сразу же хочется его закрыть со словами "глаза б мои никогда этого не видели б!"((

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

Неактивний

#10 2016-04-29 10:15:26

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Код новогодней гирлянды

Vik300001, забейте на светодиоды
если есть желание сделать классную гирлянду - посмотрите на ленту
у меня была корпусирована (прозрачная трубка), но она немного дороже,
пример на ардуино:
http://www.getchip.net/posts/122-ehffek … tu-ws2812/
только обязательно смотрите без буквы b они высокоскоросные, проблем не оберетесь
лента позволит Вам сделать действительно уникальную гирлянду и она будет шикарна.
успехов!

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму