Como declarar e usar arrays no Arduino - Vetores e Matrizes

Objetivo

Nesta dica vamos mostrar como declarar, atribuir e acessar arrays na linguagem de programação C++, na qual o Arduino está baseado.

Array é um tipo especial de variável que pode armazenar uma série de elementos de dados ao mesmo tempo. Além disso, cada valor de um array estará sempre relacionado à uma chave de identificação. Portanto, esta estrutura de dados é também conhecida como variável indexada, vetor (array unidimensional) ou matriz (array multidimensional).

Representação gráfica de um array:

1. Declarando um array unidimensional (vetor)

1.1. Array unidimensional ou vetor uma variável composta formada por um conjunto de elementos do mesmo tipo acessíveis com um único nome. Estes elementos são armazenadas de forma contínua e ocupando as posições de forma fixas, ou seja de forma indexada. Pode-se dizer portanto que vetor é uma matriz unidimensional pois possui apenas uma linha. Ex.:  int ledPin[] = {2, 3, 4, 5, 6}

1.2. Declarar um array significa criar espaços na memória do controlador de forma indexada.

1.3. Os métodos abaixo são formas válidas de como declarar arrays unidimensionais (vetores):

float codes[5];
int ledPin[] = {2, 4, 6, 9, 5};
int valEntrada[6] = {4, 6, 5, -8, 9};
char nome[8] = "Arduino";

Observações:

1.3.1. No primeiro exemplo, declaramos o array tipo "float" com 5 posições, mas sem atribuirmos seus valores.

1.3.1.1. Ao declararmos um array unidimensional (1 única linha), podemos reservar na memória do microcontrolador o número de posições (colunas) disponíveis. Ex.: codes[5] = 5 colunas.

1.3.1.2. Ao declararmos um tipo para o array, determinamos qual tipo de dados devem ser atribuídos aos elementos do array.

1.3.2. No segundo exemplo, o array ledPin foi declarado como tipo "int" e sem a indicação do seu tamanho (número de elementos). Entretanto, observe que o vetor ledPin já possui valores atribuídos em 5 posições.

1.3.2.1. IMPORTANTE: Os valores a serem atribuídos devem estar separados por vírgula e inseridos entre chaves {}. Ex.: {2, 4, 6, 9, 5}

1.3.3. No terceiro exemplo, o array valEntrada foi declarado com 6 posições disponíveis., mas o array recebe apenas 5 valores tipo int inicialmente.

1.3.4. No quarto e último exemplo foi declarado um array de caracteres contendo 8 posições disponíveis que recebe a string (cadeia de caracteres) "Arduino".

2. Acessando um array unidimensional  (vetor)

2.1. Para acessar um valor de um elemento do array precisamos indicar a sua posição, ou melhor, indicar o índice (chave numérica) o qual ele está relacionado.

2.1.1. Arrays são indexados a partir da posição 0, ou seja, o primeiro elemento de uma array estará sempre relacionado ao índice 0.

2.2.1. Por exemplo, x = ledPin[2];  irá receber o valor 6, ou seja, o valor do elemento na posição 2 do array "int" ledPin[] = {2, 4, 6, 9, 5}.

2.3. Retomando os valores do tópico 1.3, veja abaixo alguns exemplos, corretos ou não, de como acessar valores de um array:

float codes[5];
int ledPin[] = {2, 4, 6, 9, 5};
int valEntrada[6] = {4, 6, 5, -8, 9};
char nome[8] = "Arduino";

void setup() {
  Serial.begin(9600);

  // primeiro - acessar um valor sem estar atribuido
  Serial.print("codes[3] = ");
  Serial.println(codes[3]);

  // segundo -acessa o elemento na posição (índice) 2
  Serial.print("ledPin[2] = ");
  Serial.println(ledPin[2]);

  // terceiro - acessa o elemento na posição não disponível
  Serial.print("valEntrada[7] = ");
  Serial.println(valEntrada[7]);

  // quarto - acessa um caractere na posição 0
  Serial.print("nome[0] = ");
  Serial.println(nome[0]);
}

void loop() {
  // put your main code here, to run repeatedly:
}

Veja o resultado no monitor serial:

Observações:

2.3.1. No primeiro exemplo queremos acessar o valor de um elemento que ainda não foi atribuído. O valor retornado neste caso é 0.00, pois a o elemento não existe e a variável foi declarada como float.

2.3.2. No segundo exemplo o valor retornado é 6, ou seja, o valor do elemento armazenado na posição (índice) 2 do array. Observe que neste caso o tamanho do array (nº de elementos) não foi declarado.

2.3.2.1. Neste caso o compilador do IDE conta os elementos declarados e cria um vetor de tamanho apropriado.

2.3.3. No terceiro exemplo queremos acessar valor de um elemento que está além do tamanho do array. O valor retornado neste caso é 0, pois não existe e foi declarado como int, portanto este método não é recomendado.

2.3.3.1. ATENÇÃO: Não é recomendado acessar um elemento além da última posição do array, ou seja, usar um índice maior do que foi declarado. Isto faz com que o programa possivelmente leia parte da memória que poderia ser utilizado para outros propósitos, ocasionando mal funcionamento do software que gera erros muitas vezes difíceis de serem localizados.

2.3.4. No último exemplo acessamos o elemento 0 do array onde retornamos o caractere "A".

2.3.4.1. É importante observar que se desejássemos acessar um elemento não atribuído, o valor retornado seria null (nulo) e não zero como nos itens 2.3.1 e 2.3.3 do nosso exemplo.

3. Atribuindo valor a um elemento de um array unidimensional  (vetor)

3.1. Para atribuir valor a um elemento de um vetor, faça da mesma forma que a atribuição de dados em variáveis escalares, porém, indicando entre colchetes a posição onde o dado será armazenado. Ex.: codes[3] = 3.85;

3.2. Veja no exemplo abaixo onde apresentamos alguns exemplo de atribuição onde inserimos e alteramos dados em vetores:

float codes[5];
int ledPin[] = {2, 4, 6, 9, 5};
int valEntrada[6] = {4, 6, 5, -8, 9};
char nome[8] = "Arduino";

void setup() {
  Serial.begin(9600);
  
  codes[3] = 3.85;
  ledPin[2] = 12;
  valEntrada[7] = -1;
  nome[0] = 'M';

  // primeiro - acessar um valor sem estar atribuido
  Serial.print("codes[3] = ");
  Serial.println(codes[3]);

  // segundo -acessa o elemento na posição (índice) 2
  Serial.print("ledPin[2] = ");
  Serial.println(ledPin[2]);

  // terceiro - acessa o elemento na posição não disponível
  Serial.print("valEntrada[7] = ");
  Serial.println(valEntrada[7]);

  // quarto - acessa um caractere na posição 0
  Serial.print("nome[0] = ");
  Serial.println(nome[0]);
}

void loop() {
  // put your main code here, to run repeatedly:
}

Veja o resultado no monitor serial:

Observações:

2.3.1. No primeiro exemplo atribuímos um novo valor para o elemento na posição 3 do array.

2.3.2. No segundo exemplo alteramos o valor do terceiro elemento do array (índice 2) de 6 para 12.

2.3.3. No terceiro exemplo atribuímos um novo valor -1 na posição 7 do array. Entretanto, como já mencionamos anteriormente, não é recomendável acessar um elemento além da última posição do array declarada.

2.3.4. Finalmente, no quarto exemplo alteramos o caractere "A" para "M" na primeira posição do array (índice 0).

2.3.4.1. ATENÇÃO: Char é um tipo de dado usado para armazenar um caractere. Caracteres literais na linguagem de programação C devem ser escritos com aspas simples. Ex.: nome[0] = 'M'; // use aspas simples. Leia char() - Referência Arduino.

4. Percorrendo os elementos de um array unidimensional (vetor)

4.1. Podemos percorrer todos elementos de um vetor, utilizando um loop for para acessar individualmente cada valor.

4.1. No exemplo abaixo, vamos imprimir todos os elementos de um array através da porta serial:

int ledPin[] = {2, 4, 6, 9, 5};

void setup() {
  Serial.begin(9600);

  for (byte i=0; i<5; i++) {
    Serial.print("ledPin[");
    Serial.print(i);
    Serial.print("] = ");
    Serial.println(ledPin[i]);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
}

Veja o resultado no monitor serial:

5. Array multidimensional (matriz)

5.1. Array multidimensional é um array cujos os valores são constituídos de outros arrays unidimensionais (vetores). Arrays multidimensionais também podem ser denominados de matrizes.

5.1.1.  Pode-se dizer, portanto, que matriz é uma array multidimensional por possuir duas ou mais linhas (dimensões).

5.2. Veja no exemplo abaixo onde demonstramos como declarar, atribuir e acessar elementos de uma matriz:

int dados[3][7] = { // declarando uma matriz [linhas][colunas]
  {0, 1, 2, 3, 4, 5, 6},
  {6, 5, 4, 3, 2, 1, 0},
  {0,-1,-2,-3,-4,-5,-6}
};

void setup() {
  Serial.begin(9600);

  Serial.println(dados[0][0]); // acessamos o elemento na linha 0 e coluna 0
  Serial.println(dados[2][3]); // acessamos o elemento na linha 2 e coluna 3

  dados[2][3] = 125;

  Serial.println(dados[2][3]);
    
}

void loop() {
  // put your main code here, to run repeatedly:
}

Veja o resultado no monitor serial:

Observações:

5.2.1. Declaramos uma matiz informando entre colchetes o número de linhas e o número de colunas. Ex.: dados[3][5] - 3 linhas e 5 colunas

5.2.1.1. Se omitirmos a quantidade de linhas, o o compilador do IDE conta os elementos declarados e cria uma matriz com o número de linhas apropriado.

5.2.1.2. ATENÇÃO: Se omitirmos a quantidade de colunas o compilador irá registrar um erro e interromperá o upload.

5.2.1.2. Também irá ocorrer erro se indicarmos a quantidade de colunas menor que os elementos declarados.

5.2.2. No exemplo acessamos os elementos do array, sendo: dados[0][0] - linha posição 0 e coluna posição 0 / dados[2][3] - linha posição 2 e coluna posição 3

5.2.3. Também no exemplo atribuímos o valor 125 ao elemento dados[2][3], posicionado na terceira linha e quarta coluna. Observe que o valor foi alterado de -3 para 125.

6. Percorrendo os elementos de um array multidimensional (matriz)

 6.1. Para acessarmos individualmente cada elemento de um array multidimensional (matriz) precisaremos utilizar dois laços for. O primeiro loop for será para obtermos, sequencialmente, as linhas da matriz. O segundo loop, que deverá estar inserido dentro do primeiro loop, será para acessarmos os valores dos elementos de cada vetor (colunas). Veja o exemplo abaixo que elucida melhor como percorrer e acessar todos os elementos de uma matriz:

int dados[3][7] = { // declarando uma matriz [linhas][colunas]
  {0, 1, 2, 3, 4, 5, 6},
  {6, 5, 4, 3, 2, 1, 0},
  {0,-1,-2,-3,-4,-5,-6}
};

void setup() {
  Serial.begin(9600);

  for (byte i=0; i <3; i++) { // acessa as linhas
    for (byte j=0; j<7; j++) { // acessa colunas de cada linha
        Serial.print("dados[");
        Serial.print(i);
        Serial.print("]");
        Serial.print("[");
        Serial.print(j);
        Serial.print("] = ");
        
        Serial.println(dados[i][j]);
    }
  }
}

void loop() {
  // put your main code here, to run repeatedly:
}

Veja o resultado no monitor serial:

7. Projetos

7.1. Veja abaixo alguns projetos onde utilizamos vetores na programação:

 7.2. Veja abaixo alguns projetos onde utilizamos matrizes na progamação:

8. Documentação oficial

Arrays - referencia arduinoArrays

Exemplo prático - Arduino

Desafios

Com base neste projeto, resolva o seguinte desafio:

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

 

 

Compartilhe:

Doações

Contribua pra manter o site online :)

Inscreva-se no canal Squids

Você está preparado?

Squids Arduino News

Desafio 82 - Projeto 92 Relógio digital com temperatura, umidade e datas Com base no projeto Projeto 92 - Criando um relógio digital com OLED SSD1306, módulo DS3231 e Arduino resolva os seguin...

Básico - Projeto 92 Criando um relógio digital com Oled SSD1306 - bibliotecas Adafruit Objetivo O objetivo neste projeto é criar um relógio digital usando um display OLED junto com o Real Time ...

Desafio 81 - Projeto I09 Controlando 2 motores com driver L9110s (menu via display LCD) Com base no projeto I09 - Motores DC com Driver Ponte H L9110 e Arduino - Controle de 4 velocidades pelo ...

Intermediário - Projeto 09 Motores DC com driver ponte H L9110s e Arduino - 4 velocidades Objetivo Neste tutorial vamos mostrar como controlar a velocidade de 2 motores CC (corrente contínua) a...

Básico - Hub 008 Usar o módulo display 4 dígitos 74HC595   Sugerido por: Tim Santos Objetivo O objetivo é adaptar o  Projeto 63 - Usando o módulo TM1637 (display 4 dígitos) com Arduino e u...

Outros artigos

Mais: Desafios Projetos Básicos Projetos Intermediários Básico

Topo