Гирлянда на Arduino c переключением эффектов
Гирлянда на Arduino — это весьма забавная самоделка, благодаря которой вы поймете принцип управления выходами с помощью тактовой кнопки.
В прошлой статье мы разбирали гирлянду на Arduino c 5 светодиодами. Единственный ее минус был в том, что мы не могли переключать самостоятельно эффекты. В этой статье мы сделаем настоящую китайскую мини-гирлянду также на 5 светодиодов, но с возможностью переключать световые эффекты с помощью тактовой кнопки.
Техническое задание
Разработать схему мини-гирлянды на Arduino с 5 светодиодами с возможностью менять световые эффекты с помощью нажатия тактовой кнопки. Причем эффекты должны меняться мгновенно, как на китайской гирлянде за 200 рублей:
Разработка
Для того, чтобы отладить схему, соберем ее для начала в Proteus (щелкните для полного открытия)
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.

