Гирлянда на Arduino c переключением эффектов

girlianda

Гирлянда на Arduino  — это весьма забавная самоделка, благодаря которой вы поймете принцип управления выходами с помощью тактовой кнопки.

В прошлой статье мы разбирали гирлянду на Arduino c 5 светодиодами. Единственный ее минус был в том, что мы не могли переключать самостоятельно эффекты. В этой статье мы сделаем настоящую китайскую мини-гирлянду также на 5 светодиодов, но с возможностью переключать световые эффекты с помощью тактовой кнопки.

Техническое задание

Разработать схему мини-гирлянды на Arduino с 5 светодиодами с возможностью менять световые эффекты с помощью нажатия тактовой кнопки. Причем эффекты должны меняться мгновенно, как на китайской гирлянде за 200 рублей:

Гирлянда на Arduino c переключением эффектов

Разработка

Для того, чтобы  отладить схему, соберем ее для начала в Proteus (щелкните для полного открытия)

Гирлянда на Arduino c переключением эффектов

uint8_t L=1; //Объявляем глобальную переменную L, и присваиваем ей значение

void setup() {
  // Конфигурируем цифровые выводы под номерами 3,4,5,6,7 на выход,а 8 вывод на вход.
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, INPUT);
  digitalWrite(8, HIGH);   //Притягиваем  8 вывод к единице.
}
// Пишем программу которая будет крутиться в бесконечном цикле, 
//пока мы не нажмем кнопку Reset, или не подадим питание заново.

void loop() 
{
  
  if( L == 1 ) //Если счетчик L равен 1, то выполняем условие.
 {
  while(true) //Открываем Бесконечный цикл.  
  {
    for ( uint8_t a = 2; a < 8; a++)  //Прогоняем цикл, присваиваем перемепнной a значение 2, при условии, если a < 8, увеличиваем a, на единицу.
  {if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}  /*Опрашиваем вывод 8 ардуино, если там присутствует лог. 0, то выполняем условие. 
  Ждем задержку, увеличиваем значение счетчика на единицу, Если счетчик равен 6, то выходим в основной цикл.*/
  digitalWrite(a, HIGH);   // Подаем на вывод имеющий значение переменной а, логическую единицу.
  delay(100);  //Ожидание 100 миллисекунд.
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}            
  digitalWrite(a, LOW);    // Подаем на вывод имеющий значение переменной а, логическую единицу.
  delay(100);
  }
  }
 }
 if( L == 2 )
 {
  while(true)
 {
  {for ( uint8_t b = 8; b > 2; b--)
  {
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
  digitalWrite(b, HIGH);   
  delay(100);  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}            
  digitalWrite(b, LOW);    
  delay(100);
  }
 
 }
 }
 }
 if( L == 3 )
 {
  while(true)
  {
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(3, HIGH);   
  delay(100);  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}            
  digitalWrite(7, LOW);   
  digitalWrite(3, LOW);   
  delay(100);
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
  digitalWrite(6, HIGH);   
  digitalWrite(4, HIGH);   
  delay(100);  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}            
  digitalWrite(6, LOW);   
  digitalWrite(4, LOW);   
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}
  digitalWrite(5, HIGH);   
  delay(100);  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;};return;}            
  digitalWrite(5, LOW);   
  }
 }
  if( L == 4 )
 {
  while(true)
  {
  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(6, LOW);   
  digitalWrite(5, HIGH);   
  digitalWrite(4, LOW);   
  digitalWrite(3, HIGH);   
  delay(50);  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, LOW);   
  digitalWrite(6, HIGH);   
  digitalWrite(5, LOW);   
  digitalWrite(4, HIGH);   
  digitalWrite(3, LOW);   
  delay(50);
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(6, LOW);   
  digitalWrite(5, HIGH);  
  digitalWrite(4, LOW);   
  digitalWrite(3, HIGH);  
  delay(50);  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(6, HIGH);   
  digitalWrite(5, HIGH);  
  digitalWrite(4, HIGH);  
  digitalWrite(3, LOW);   
  delay(50);
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(6, HIGH);  
  digitalWrite(5, HIGH);  
  digitalWrite(4, HIGH);   
  digitalWrite(3, HIGH);  
  delay(50); 
 }
 }
  if( L == 5 )
 {
  while(true)
  {
  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(6, LOW);   
  digitalWrite(5, LOW);  
  digitalWrite(4, LOW);   
  digitalWrite(3, LOW);   
  delay(50);  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);  
  digitalWrite(6, HIGH); 
  digitalWrite(5, LOW);  
  digitalWrite(4, LOW);   
  digitalWrite(3, LOW);   
  delay(50);
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH); 
  digitalWrite(6, HIGH);   
  digitalWrite(5, HIGH);  
  digitalWrite(4, LOW);  
  digitalWrite(3, LOW);   
  delay(50);  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(6, HIGH);   
  digitalWrite(5, HIGH);   
  digitalWrite(4, HIGH);   
  digitalWrite(3, LOW);   
  delay(50);
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);  
  digitalWrite(6, HIGH);  
  digitalWrite(5, HIGH);  
  digitalWrite(4, HIGH);   
  digitalWrite(3, HIGH);   
  delay(50);
  
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(6, HIGH);   
  digitalWrite(5, HIGH);
  digitalWrite(4, HIGH);  
  digitalWrite(3, LOW);  
  delay(50); 
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH); 
  digitalWrite(6, HIGH);   
  digitalWrite(5, HIGH);   
  digitalWrite(4, LOW);   
  digitalWrite(3, LOW);   
  delay(50);
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(6, HIGH);   
  digitalWrite(5, LOW);   
  digitalWrite(4, LOW); 
  digitalWrite(3, LOW);   
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, HIGH);   
  digitalWrite(6, LOW);   
  digitalWrite(5, LOW);   
  digitalWrite(4, LOW);   
  digitalWrite(3, LOW);   
  delay(50);
  if(digitalRead(8) == LOW){delay(500);L=L + 1;if(L == 6){L=1;return;};return;}
  digitalWrite(7, LOW);   
  digitalWrite(6, LOW);   
  digitalWrite(5, LOW);  
  digitalWrite(4, LOW);   
  digitalWrite(3, LOW);   
  delay(50);  
    }
 }
 
}
 

Работа в железе

Прикрепляю к проекту как обычно код программы, HEX-файл для Proteus и сам проект в Proteus.