Есть ли возможность свечения светодиода в матрице 5 * 5 квадратной формы с общей конфигурацией анода - PullRequest
1 голос
/ 23 октября 2019

У меня есть светодиодная матрица, которая является общим анодом для ряда и общим катодом для столбца. Мне нужно светить матрицу в форме квадрата (первая строка && последняя строка && первый столбец && последний столбец), но я не смог этого сделать. Я смог зажечь первый и последний ряды отдельно и первый и второй столбцы отдельно)

void first_last_row();
void first_last_column();

int Led_Row_Pins[] = { 2 , 3 , 4 , 5 , 6 } ;             //   Anode pins are shorted in row_wise_manner
int Led_Column_Pins[] = {8  , 9 , 10 , 11 , 12} ;          //   Column Pins are shorted in column_wise_manner   
int Loop_Count = 5 ;
int Wait_Time_On = 1000 ;
int Wait_Time_Off = 500 ;
int i = 0 ;
int j = 0 ;
int state = 1 ;

void setup() {
  for( i = 0 ; i < Loop_Count ; i++ ){     // Anode Pins are connected in row_wise manner and are made LOW so that they dont conduct       
    pinMode(Led_Row_Pins[i],OUTPUT);
    digitalWrite(Led_Row_Pins[i],LOW);
    pinMode(Led_Column_Pins[i],OUTPUT);    // Cathode Pins are connected in column_wise manner and are made HIGH so that they dont conduct
    digitalWrite(Led_Column_Pins[i],HIGH); 
  }
}

void loop() { 
      first_last_row();
      delay(1000);
      first_last_column();
}


void first_last_row()
{
  for( i = 0 ; i < Loop_Count ; i++ )// Led First And Last Row 
   {
     for( j = 0 ; j < Loop_Count ; j++)
     {
       if( i == 0 || i == 4 )
       {
         digitalWrite(Led_Row_Pins[i],state); //Led_On_State
         digitalWrite(Led_Column_Pins[j],!state);
       }
     }
   }
}


void first_last_column()
{

  for( j = 0 ; j < Loop_Count ; j++ )// Led First And Last Column
   {
     for( i = 0 ; i < Loop_Count ; i++)
     {
       if( j == 0 || j == 4 )
       {
        digitalWrite(Led_Row_Pins[i],state);//    Led_On_State
        digitalWrite(Led_Column_Pins[j],!state);
       }
     }
   }
}

Мне нужно, чтобы первый ряд и последний ряд и первый столбец и последний столбец вели свечение вместе, чтобы он образовалформа квадрата, но я смог светить их отдельно только первый ряд и последний ряд вместе и первый столбец и последний столбец.

1 Ответ

2 голосов
/ 23 октября 2019

В вашем конкретном случае вы можете включить первый и последний ряд, например, на 1 мсек, затем включить первый и последний столбец на 1 мсек и повторить это. Кроме того, я предлагаю отключить все светодиоды перед включением нового шаблона.

void loop() { 
      static int show_rows = 0;

      switch_all_off();
      if(show_rows) {
          first_last_row();
      } else {
          first_last_column();
      }
      show_rows = !show_rows;
      delay(10);
}

void switch_all_off()
{
    int off = 0;
    for( j = 0 ; j < Loop_Count ; j++ )
    {
          digitalWrite(Led_Row_Pins[i],off);
          digitalWrite(Led_Column_Pins[j],!off);
    }
}

На этом первом шаге светодиоды, содержащиеся как в строках, так и в столбцах, будут ярче. Чтобы исправить это, вы можете исключить угловые светодиоды либо из строк, либо из столбцов, например,

void first_last_column()
{

    for( j = 0 ; j < Loop_Count ; j++ )// Led First And Last Column
    {
        for( i = 0 ; i < Loop_Count ; i++)
        {
            if((i != 0) && (i != 4) && ( j == 0 || j == 4 ))
            {
                digitalWrite(Led_Row_Pins[i],state);//    Led_On_State
                digitalWrite(Led_Column_Pins[j],!state);
            }
        }
    }
}

. Для более общего решения вам нужно циклически перебирать строки, активировать одну строку за другой и переключатьВыводы столбцов, необходимые для текущей строки.

#define MAXLEDS 5
int states[MAXLEDS][MAXLEDS] = {
    { 1, 0, 0, 0, 1 },
    { 0, 1, 0, 1, 0 },
    { 0, 0, 1, 0, 0 },
    { 0, 1, 0, 1, 0 },
    { 1, 0, 0, 0, 1 }
};

void switch_leds(int row) {
    int i;

    /* switch off all rows */
    for(i = 0; i < MAXLEDS, i++) {
        digitalWrite(Led_Row_Pins[i], 0);
    }

    /* switch columns according to current row */
    for(i = 0; i < MAXLEDS; i++) {
        digitalWrite(Led_Column_Pins[i], !states[row][i]);
    }

    /* switch on current row */
    digitalWrite(Led_Row_Pins[row], 1);

}

void loop() { 
    static int row = 0;
    /* switch on LEDs in a single row */
    switch_leds(row);
    /* next row */
    row++; row %= MAXLEDS;
    /* The processing delay between calls to loop() is added to this delay. */
    delay(5);
}

Все примеры кода не проверены и могут содержать ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...