Created
September 13, 2018 21:06
-
-
Save RodionGork/926269893cb3caea5dfff4f5e8112990 to your computer and use it in GitHub Desktop.
Led chain for Arduino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// эффекты описываются отдельными массивами | |
// в каждом несколько строчек по 5 символов | |
// соответствующих 5 светодиодам | |
// каждая строчка - следующее состояние (шаг) | |
// для данного эффекта | |
// (в принципе они могут быть собраны в один массив) | |
// первый эффект просто перемигивается | |
// четными и нечетными светодиодами | |
char* effect0[] = { | |
"x-x-x", | |
"-x-x-", | |
}; | |
// второй эффект делает бегущий огонек | |
char* effect1[] = { | |
"x----", | |
"-x---", | |
"--x--", | |
"---x-", | |
"----x", | |
}; | |
// третий - более сложный вид бегущего огонька | |
char* effect2[] = { | |
"x----", | |
"xx---", | |
"xxx--", | |
"-xxx-", | |
"--xxx", | |
"---xx", | |
"----x", | |
}; | |
// этот массив задает количество "шагов" | |
// в каждом из эффектов перечисленных выше | |
// (без него можно обойтись) | |
int effectSteps[] = {2, 5, 7}; | |
// эта переменная указывает на выбранный эффект | |
char** currentEffect; | |
// эта содержит номер выбранного эффекта | |
//(можно было обойтись без одной из этих двух) | |
int currentEffectNumber; | |
// а в этой - номер текущего состояния (шага) | |
// для выбранного эффекта | |
int stepNumber; | |
// настройка контроллера | |
void setup() { | |
// пины с 3 по 7 включаем на выход | |
for (int pin = 3; pin <= 7; pin += 1) { | |
pinMode(pin, OUTPUT); | |
} | |
// пины с A1 по A5 включаем на вход, с подтяжкой вверх | |
for (int pin = A1; pin <= A5; pin += 1) { | |
pinMode(pin, INPUT_PULLUP); | |
} | |
// выбираем эффект номер 0 | |
currentEffect = effect0; | |
currentEffectNumber = 0; | |
// инициализируем счетчик текущего шага на 0 | |
stepNumber = 0; | |
// шаги и эффекты считаются с 0 (а не с 1) | |
} | |
// функция, повторяющаяся бесконечно в цикле | |
void loop() { | |
// вызвать функцию включения светодиодов | |
// соответствующих текущему шагу | |
switchLeds(stepNumber); | |
delay(250); // пауза | |
// вызвать проверку кнопок (возможно переключение эффекта) | |
checkButtons(); | |
// увеличить номер текущего состояния ("шага" эффекта) | |
stepNumber += 1; | |
// проверим, не закончились ли шаги | |
// для выбранного эффекта (с помощью массива effectSteps) | |
if (stepNumber >= effectSteps[currentEffectNumber]) { | |
// если закончились - сбрасываем счетчик шагов к началу | |
stepNumber = 0; | |
} | |
} | |
// функция переключения светодиодов в нужное состояние | |
// параметр s - номер шага в текущем эффекте | |
void switchLeds(int s) { | |
// для удобства укажем переменной leds на строку | |
// описывающую нужный шаг в выбранном эффекте | |
char* leds = currentEffect[s]; | |
// теперь перебираем пины светодиодов с 3 по 7 | |
for (int pin = 3; pin <= 7; pin += 1) { | |
// и проверяем соответствующие символы в строке "текущего шага" | |
// начиная с нуля - т.е. "pin-3" | |
// (0-й символ для 3-го светодиода, 1-й для 4-го и т.п.) | |
if (leds[pin - 3] == 'x') { | |
// то зажигаем соответствующий светодиод | |
digitalWrite(pin, HIGH); | |
} else { | |
// а если не крестик - то гасим! | |
digitalWrite(pin, LOW); | |
} | |
} | |
} | |
// функция проверки кнопок | |
// (она может быть короче если собрать все эффекты в один массив) | |
void checkButtons() { | |
// если нажата кнопка A1, выбираем эффект 0 | |
if (digitalRead(A1) == LOW) { | |
currentEffect = effect0; | |
currentEffectNumber = 0; | |
} | |
// если нажата кнопка A2, выбираем эффект 1 | |
if (digitalRead(A2) == LOW) { | |
currentEffect = effect1; | |
currentEffectNumber = 1; | |
} | |
// если нажата кнопка A3, выбираем эффект 2 | |
if (digitalRead(A3) == LOW) { | |
currentEffect = effect2; | |
currentEffectNumber = 2; | |
} | |
// здесь цикл не использовать если эффекты не собраны в один массив :( | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment