Variáveis... O que são?
Uma variável é uma maneira de nomear e armazenar um conteúdo na memória do micro controlador para uso posterior pelo sketch.
Como o termo sugere, as variáveis podem ter seu conteúdo continuamente alterado em tempo de execução. A variável precisa ser declarada (tipo e nome) e, opcionalmente, receber um valor, ou seja, opcionalmente pode ser atribuído a ela um conteúdo no momento de sua declaração.
Variáveis devem ser nomeadas de maneira a lembrar a finalidade a que se destinam, ou seja, se a variável é para conter o número da porta digital que vai ascender e apagar o led vermelho seu nome deveria ser, por exemplo: ledVermelho, pois, isto torna o seu código mais legível e consequentemente mais fácil de ser mantido.
Evite usar nomes com apenas um caractere e nunca é demais lembrar que deve procurar usar nomes que lembrem o conteúdo que esta variável irá guardar. É opcional a atribuição de um conteúdo à variável no momento de sua declaração, isto pode ser feito posteriormente tanto em tempo de programação como em tempo de execução. Abaixo temos uma figura mostrando a declaração de uma variável assim como a atribuição de um conteúdo a esta no momento de sua declaração, observe-a com atenção.
Obs.:
- int - é o tipo do dado que a variável irá conter;
- pino - é o nome da variável;
- = - é o sinal de atribuição, note que aqui não significa igual e sim atribuição, pois a variável pino não é igual a 5, mas sim o seu conteúdo é 5;
- 5 - é o valor atribuído à variável pino.
Nunca é demais lembrar a variável pino não é igual a 5 e sim o seu conteúdo que é 5, ou seja, a variável pino contém 5 e pode ser alterado a qualquer momento que assim o programador deseje.
Visibilidade ou escopo de uma variável
Uma variável pode ser declarada no início do sketch, antes função setup () ou localmente, quando estiver dentro de funções ou de uma estrutura de repetição.
Se declarada no início do sketch, o seu escopo será dito global. Variáveis globais são vistas por todas as funções. Observe com atenção a figura abaixo.
Obs.: Note que a variável pino tem um escopo global ou seja pode ser vista em qualquer ponto do sketch.
Se for declarada dentro de uma função ou como parte de uma estrutura iteração (repetição), será dito local, ou seja, só poderá ser vista e usada dentro da função em que foi declarada. Observe com atenção a figura abaixo.
Deve ser notado que na figura acima a variável pino2 está sendo declarada dentro da função setup() e sendo assim só terá visibilidade dentro desta função e em nenhum outro lugar do sketch e que o mesmo se aplica a variável pino3 que só terá visibilidade dentro da função loop().
Portanto, é possível ter duas ou mais variáveis de mesmo nome em diferentes funções, pois são tratadas em locais diferentes na memória, apesar de não ser uma prática comum. As variáveis de escopo locais asseguram que apenas aquela função onde a variável foi declarada pode manipular o seu conteúdo.
Dados suportados pela linguagem
É muito importante que se tenha conhecimento dos dados suportados pela linguagem, pois, o uso de dados não suportados irá gerar erro na compilação do sketch.
A seguir temos uma breve explicação dos dados suportados mais usados pela linguagem Arduino.
void:
A palavra chave void (vazio, nulo) é utilizada apenas na declaração de função. Ela indica que esta não irá retornar valor algum.
Boolean:
Neste tipo de dado podemos ter apenas os valores 0 ou 1, ou ainda as constantes, false ou true. Este tipo de dado ocupa um byte de memória.
Exemplo: boolean ativo = false;
char:
O tipo de dado char armazena caracteres como o caractere "Y", mas, de ser observado que na forma numérica, isto é, o correspondente numérico do caractere que queremos armazenar. A faixa de valores para este tipo de dado (na forma numérica) é de -128 a 127 e o espaço ocupado em memória é de um byte.
Neste exemplo, o caractere maiúsculo Y corresponde ao valor 89 na tabela ASCII (American Standard Code for Information Interchange), um padrão desenvolvido nos anos 1960 para representar textos em computadores. A tabela ASCII padrão vai de 0 a 127.
No endereço http://arduino.cc/en/Reference/ASCIIchart, você tem a tabela ASCII com todos os caracteres que podem ser representados e armazenados no tipo de dado char. A figura abaixo mostra uma tabela com o valor decimal dos principais caracteres. Observe-a com atenção.
Os valores não mostrados nesta tabela acima são códigos de controle usados em vários equipamentos, como vídeos, impressoras, comunicação, etc.
Para atribuir um valor a uma variável do tipo char, podemos usar o seu valor numérico presente na tabela ASCII ou o próprio caractere, envolvido por aspa simples. Então, caractere = 65 é o mesmo que caractere = ‘A’.
Não se preocupe se tudo isto lhe parece confuso neste momento, pois quando começar a usar na prática tudo ficará mais claro.
byte:
Este tipo de dado armazena valores numéricos inteiros de 0 a 255. Ocupa um byte de memória.
Exemplo: byte temperatura = 27;
Int:
Manipula números inteiros, sem casas decimais, na faixa de 32767 a -32768. Este tipo de dado ocupa dois bytes de memória.
Exemplo: int temperatura = 27;
unsigned int:
O mesmo que int, exceto que o qualificador usigned altera a faixa de valores: 0 a 65535 ou seja, só aceita números positivos.
Exemplo: unsigned int totalLeitura = 50000;
long:
Um tipo de dado que manipula valores inteiros na faixa de -2147483648 a 2147483647 e ocupa quatro bytes de memória.
Exemplo: long totalLeitura;
unsigned long:
O mesmo que long, exceto que o qualificador unsigned altera a faixa de valores: 0 a 4294967295.
Exemplo: unsigned long totalLeitura;
float:
O tipo float permite manipular números em ponto flutuante (ponto decimal). Use este tipo de dado onde números inteiros não se aplicam. Ocupa quatro bytes de memória e faixa de valores é de -3.4028235E+38 a 3.4028235E+38.
Exemplo: float totalLeitura = 3.16;
double:
O tipo double, assim como o float, permite manipular números em ponto flutuante (ponto decimal). Na linguagem Arduino estes tipos são a mesma coisa.
Exemplo: double totalLeitura = 234.56;
Array
Uma array é uma coleção de valores numéricos ou caracteres. Um item qualquer desta coleção é acessado através de um número que indica a posição deste item dentro da coleção, conhecido por índice.
A declaração de um array inicia com o tipo de dado, um nome e opcionalmente o número de elementos que compõe esta coleção. É importantíssimo saber que array na linguagem Arduino inicia em zero, ou seja, o primeiro item da coleção tem o índice zero(0).
Exemplos: int numeros[4];
A variável numeros é uma coleção de quatro inteiros cujo índice inicia em 0 e termina em 3.
Obs.: a linguagem Arduino permite o uso de arrays de múltiplas dimensões, o que torna mais complexo o seu manuseio. A inicialização se dá de forma semelhante como visto anteriormente e apenas como exemplo, um array de duas dimensões:
int cuboLEDs[2][2] = { { 0, 1 } , { 1, 1} };
Outra forma de declarar um array, sem indicar o número de elementos:
int numeros[] = {2, 4, 8, 3, 6, 0};
Declarando um array de caracteres:
char caracteres[] = {‘a’, ‘t’, ‘8’, ‘3’};
Uma forma de armazenar uma cadeia de caracteres, conhecido como string:
mensagem[] = "Estou estudando variáveis";
Mais adiante veremos uma estrutura (for) que facilitará em muito a navegação pelos elementos de um array. Observe que tudo isto vai ficar mais claro quando estiver usando este tipo de variável na prática.
Constantes, mas, o que são?
Enquanto variáveis podem ter seu conteúdo alterado tanto em tempo de programação como de execução, as constantes uma vez declaradas e a atribuição de seu conteúdo executada não poderá mais ter seu conteúdo alterado, esta é a única diferença entre variável e constante, do resto são exatamente iguais e tudo o que viu sobre variáveis se aplica aqui.
A figura abaixo mostra a declaração de uma constante, observe-a com atenção.
Obs.:
- const - é a palavra chave utilizada para criar uma constante;
- int - é o tipo do dado que a constante deverá suportar;
- pino - é o nome da constante;
- = - é o sinal de atribuição;
- 5 - é o valor atribuído à constante pino.
É muito importante que se tenha em mente a constante deve ter a atribuição do conteúdo executada no momento de sua declaração e que se isto não acontecer irá retornar um erro e ainda que este conteúdo não pode mais ser mudado tanto em tempo de programação como em tempo de execução.
Constantes pré-definidas
A linguagem Arduino possui algumas constantes pré-definidas. Estas são usadas para tornar os sketch mais legívei. Observe a figura abaixo com muita atenção, ele a mostra algumas das mais usadas constantes pré-definidas.
As constantes HIGH, LOW, IMPUT e OUTPUT
Quando uma porta digital é configurada como INPUT (entrada) e lida com digitalRead(), o micro controlador irá informar HIGH se uma tensão de 3 volts ou mais estiver presente neste pino, e claro, caso seja menor que 3volts irá informar LOW. Quando esta mesma porta é configurada como OUTPUT (saída) e definido como HIGH com digitalWrite() ela irá fornecer 5 volts para qualquer dispositivo conectado a ela e se definido como LOW irá fornecer 0volt.
Obs: as constantes true e false são digitadas em letras minúsculas, ao contrário de HIGH, INPUT, LOW, e OUTPUT.
Observe com atenção a figura abaixo e note que em cada linha de código existe o comentário informando o que esta linha executa.
Na prática
Bem, chegou a hora de você mudar o sketch feito na aula passada utilizando os conhecimentos vistos nesta aula, ou seja, fazendo uso de variáveis e de constante mas obtendo o mesmo resultado, ou seja piscar o led de sua placa, aquele que se encontra conectado à sua porta digital 13.
Abra a sua IDE e digite o código que se inicia na linha 2 termina na linha 12 indicado na figura abaixo.
Entendendo o código
Linha 2:
Está sendo declarado a variável do tipo byte, de nome led e atribuído a ela o valor 13 o que não existia no código feito na aula anterior.
A escolha deste tipo de dado se deve unicamente por ser o tipo que menos memória consome e como suporta valores até 255 é mais que o suficiente para as portas disponíveis nas placas de Arduino que conheço.
Linha 5:
Usando a função pinMode() está sendo está sendo configurada a porta digital 13 como saída, mas, desta vez fazendo uso da variável criada na linha 2 e na sequência está sendo usado a constante pré-definida OUTPUT configurando esta porta como saída.
Linha 8:
Usando a função digitalWrite() está sendo escrito na porta 13 o nível de saída alto, ou seja irá fornecer 5 volts, mas, usando a variável criada na linha 2 e a constante pré-definida HIGH.
Linha 10:
Usando a função digitalWrite() está sendo escrito na porta 13 o nível de saída baixo, ou seja irá fornecer 0 volts, mas, também usando a variável criada na linha 2 e a constante pré-definida LOW.
Observe que as demais linhas de código são exatamente iguais as usadas no sketch feito na aula anterior, dispensando assim maiores comentários. Observe ainda que este sketch fará a mesma coisa que o sketch digitado transferido para a placa na aula passado.
Carregando o Sketch
Chegou a hora de transferir (carregar) o sketch para a placa de Arduino. Para tal basta clicar no botão Carregar como indicado na figura abaixo.
Os dois leds, RX e TX deverão piscar indicando a comunicação. Observe com atenção a figura abaixo.
Ao final do carregamento um aviso passa a ser exibido na parte inferior da IDE como é mostrado na figura abaixo.
E para finalizar observe que o led existente no Arduino Uno passa a piscar ascendendo e apagando a cada 1 segundo.
Assim, chega-se ao final desta terceira aula e se preparando estudar tensão e corrente e também os componentes resistor e diodo emissor de luz ou led como é comumente chamado. Até lá e bons estudos.