Гирлянда на Arduino version 3.0. Массивы.
В этой статье мы рассмотрим еще одну гирлянду заодно разберем такое понятие, как «массив».
Итак, что такие массивы?
Массивы используются, в данном проекте, для наглядного хранения значений, которые мы можем вызывать по мере необходимости. В данном случае, используется последовательный перебор значений массива. Разберем на примере, у нас есть массив uint8_t pins[5];в нем хранятся 5 значений. Для того чтобы мы могли использовать его, нам нужно изначально, чем то заполнить, эти ячейки, количество которых составляет 5. Причем нумерация ячеек, это надо всегда помнить, начинается не с единицы, а с нуля. То есть разберем пример, использования в нашем скетче, прогнав циклом for массив, for (int u = 0; u <= 4; u++), мы можем заполнить ячейки массива, требуемыми нам значениями, например полученными после вычисления, h=u + 3; pins[u] = h; Разумеется к ячейкам массива, мы можем обращаться, не только в цикле for, но и напрямую, присваивая определенное значение, или значение переменных, отдельным ячейкам массива. pins[0] = 1; pins[3] = N; Таким образом в нашем массиве array_1 [2][3] = X; мы значение строки 3, столбца 4, присваиваем значению переменной Х, у нас это значение равно нулю. В нашем массиве, при его инициализации, это значение, выделено сейчас жирным шрифтом и подчеркиванием.
int array_1 [5][5] = {
{0, 0, 0, 0, 1},
{0, 0, 0, 1, 0},
{0, 0, 1, 0, 0},
{0, 1, 0, 0, 0},
{1, 0, 0, 0, 0},
};
Схема у нас будет такой же, как и в прошлом примере:
Итак, код программы будет такой:
uint8_t L = 0; //Объявляем переменные и масссив
uint8_t a;
uint8_t b;
uint8_t pin;
uint8_t B;
uint8_t A_pin;
uint8_t h;
uint8_t pins[5];
uint8_t j;
uint8_t i=1;
uint8_t array_1 [5][5] = { //Создаем 5 двумерных массивов, в которых хранятся эффекты гирлянды.
{0, 0, 0, 0, 1}, //1 массив - 1 эффект. Гашение светодиодов, при смене одного из 5 подэффектов,
{0, 0, 0, 1, 0}, //составляющих вместе, 1 эффект массива, реализовано путем вызова функции leds_off.
{0, 0, 1, 0, 0},
{0, 1, 0, 0, 0},
{1, 0, 0, 0, 0},
};
uint8_t array_2 [5][5] = {
{1, 0, 0, 0, 0},
{0, 1, 0, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 0, 1, 0},
{0, 0, 0, 0, 1},
};
uint8_t array_3 [5][5] = {
{1, 0, 0, 0, 1},
{1, 1, 0, 1, 1},
{1, 1, 1, 1, 1},
{0, 1, 1, 1, 0},
{0, 0, 1, 0, 0},
};
uint8_t array_4 [5][5] = {
{1, 0, 1, 0, 1},
{0, 1, 0, 1, 0},
{1, 0, 1, 0, 1},
{0, 1, 0, 1, 0},
{1, 0, 1, 0, 1},
};
uint8_t array_5 [5][5] = {
{1, 0, 0, 0, 0},
{1, 1, 0, 0, 0},
{1, 1, 1, 0, 0},
{1, 1, 1, 1, 0},
{1, 1, 1, 1, 1},
};
void setup() //В цикле настроек, прогоняем циклом for, подтяжку пинов светодиодов, к нулю.
{ //Сохраняем в массиве pins, значения пинов, к которым подключены светиодиоды
for (uint8_t u = 0; u <= 4; u++)
{ h=u + 3;
pins[u] = h;
digitalWrite(h, LOW);
}
for (pin = 3; pin <= 7; pin++) //Конфигурируем циклом for, пины 3-7 на выход.
{
pinMode(pin, OUTPUT);
}
for (A_pin = A1; A_pin <= A5 ; A_pin++) //Конфигурируем циклом for, аналоговые пины А1-А5, как цифровые, на вход.
{ //и подтягиваем их к единице.
pinMode(A_pin, INPUT);
digitalWrite(A_pin, HIGH);
}
}
void loop()
{
if ( L == 0 ) //После подачи питания, светодиоды погашены, ждем нажатия одной из 5 кнопок,
{while (true) // для выполнения одного из эффектов.
{
i=leds_off();
B = L; L = Nomer_Effekta(); if (B != L)
{
return;
}
}
}
if ( L == 1 ) //При нажатии кнопки 1, выполняем первый эффект. Прогоняем 2 цикла, 1 вложенный в другой
{ while (true) // таким образом, после прохода внутреннего цикла, продолжаем выполнение внешнего.
{ //Последовательно берем значение пина светодида, из массива pins,
for (uint8_t b = 0; b <= 4; b++) //и значение лог 0 или лог 1 из наших двумерных массивов.
{ //После прохождения одного из подэффектов, если требуется, выполняем гашение светодиодов.
for (uint8_t a = 0; a <= 4; a++) //Если была нажата одна из кнопок, выходим в основной цикл, если нет то крутим бесконечный цикл, выполняем эффект.
{
digitalWrite(pins[a], array_1[a][b]);
delay(100);
B = L; L = Nomer_Effekta(); if (B != L){return;}
i=leds_off();
delay(50);
B = L; L = Nomer_Effekta(); if (B != L){return;}
}
}
}
}
if ( L == 2 )
{ while (true)
{
for (uint8_t b = 0; b <= 4; b++)
{
for (uint8_t a = 0; a <= 4; a++)
{
digitalWrite(pins[a], array_2[a][b]);
delay(100);
B = L; L = Nomer_Effekta(); if (B != L){return;}
i=leds_off();
delay(50);
B = L; L = Nomer_Effekta(); if (B != L){return;}
}
}
delay(300);
}
}
if ( L == 3 )
{ while (true)
{
for (uint8_t b = 0; b <= 4; b++)
{
for (uint8_t a = 0; a <= 4; a++)
{
digitalWrite(pins[a], array_3[a][b]);
delay(150);
B = L; L = Nomer_Effekta(); if (B != L){return;}
i=leds_off();
delay(50);
B = L; L = Nomer_Effekta(); if (B != L){return;}
}
}
i=leds_off();
delay(50);
B = L; L = Nomer_Effekta(); if (B != L){return;}
}
}
if ( L == 4 )
{ while (true)
{
for (uint8_t b = 0; b <= 4; b++)
{
for (uint8_t a = 0; a <= 4; a++)
{
digitalWrite(pins[a], array_4[a][b]);
delay(150);
B = L; L = Nomer_Effekta(); if (B != L){return;}
i=leds_off();
delay(50);
B = L; L = Nomer_Effekta(); if (B != L){return;}
}
}
}
}
if ( L == 5 )
{ while (true)
{
for (uint8_t b = 0; b <= 4; b++)
{
for (uint8_t a = 0; a <= 4; a++)
{
digitalWrite(pins[a], array_5[a][b]);
delay(150);
B = L; L = Nomer_Effekta(); if (B != L){return;}
}
}
i=leds_off();
delay(50);
}
}
}
uint8_t leds_off() //Объявляем функцию leds_off()
{ //Прогоняем цикл for гашения светодиодов, берем значение пинов из массива pins.
for (uint8_t e = 0; e <= 4; e++)
{
digitalWrite(pins[e], LOW);
j=1;
} return j;
}
uint8_t Nomer_Effekta() //Объявляем функцию Nomer_Effekta()
{ //Сохраняем в переменной D значение L.
uint8_t D = L; //Если нажаты кнопки 1-5, подключенные к выводам А1-А5
if (digitalRead(A1) == LOW) //Гасим светодиоды, и присваиваем переменной D, значение номера эффекта 1-5.
{ D = 1; //Возвращаем значение переменной D.
for (pin = 3; pin <= 7; pin++)
{
digitalWrite( pin, LOW);
}
delay(200);
}
if (digitalRead(A2) == LOW)
{ D = 2;
for (pin = 3; pin <= 7; pin++)
{
digitalWrite( pin, LOW);
}
delay(200);
}
if (digitalRead(A3) == LOW)
{ D = 3;
for (pin = 3; pin <= 7; pin++)
{
digitalWrite( pin, LOW);
}
delay(200);
}
if (digitalRead(A4) == LOW)
{ D = 4;
for (pin = 3; pin <= 7; pin++)
{
digitalWrite( pin, LOW);
}
delay(200);
}
if (digitalRead(A5) == LOW)
{ D = 5;
for (pin = 3; pin <= 7; pin++)
{
digitalWrite( pin, LOW);
}
delay(200);
}
return D;
}
Прикрепляю файлы проекта.
