Гирлянда на Arduino version 3.0. Массивы.

girlyanda

В этой статье мы рассмотрим еще одну гирлянду  заодно разберем такое понятие, как «массив».

Итак, что такие массивы?

Массивы используются, в данном проекте, для наглядного хранения значений, которые мы можем вызывать по мере необходимости. В данном случае, используется последовательный перебор значений массива. Разберем на примере, у нас есть массив 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},

};

Схема  у нас будет такой же, как и в прошлом примере:

Гирлянда на Arduino version 3.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;
}

Прикрепляю файлы проекта.