Skip to content

Instantly share code, notes, and snippets.

@RodionGork
Created September 13, 2018 21:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RodionGork/926269893cb3caea5dfff4f5e8112990 to your computer and use it in GitHub Desktop.
Save RodionGork/926269893cb3caea5dfff4f5e8112990 to your computer and use it in GitHub Desktop.
Led chain for Arduino
// эффекты описываются отдельными массивами
// в каждом несколько строчек по 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