Na lição de hoje (a terceira lição), vamos agora ver como se utilizam as variáveis em Arduino. As variáveis servem para guardar informação.
Tipos de variáveis
Os dados que guardamos nas variáveis podem ser de diferentes tipos. Vamos listar alguns deles. Para uma referência completa dos tipos de variáveis no Arduino, podes consultar esta página web.
- char, são utilizados para armazenar caracteres e ocupam um byte.
- byte, podem armazenar um número entre 0 e 255.
- int, ocupam 2 bytes (16 bits) e tanto armazenam um número entre 2-15 e 215-1, ou seja, entre -32,768 e 32,767.
- unsigned int, também ocupam 2 bytes, mas como não possuem sinal, podem tomar valores entre 0 e 216-1, ou seja, entre 0 e 65,535.
- long, ocupa 32 bits (4 bytes), de -2,147,483,648 até 2,147,483,647.
- unsigned long.
- float, números decimais que ocupam 32 bits (4 bytes). Podem tomar valores entre -3.4028235E+38 e +3.4028235E+38.
- double, também armazena números decimais, mas possuem 8-bytes (64 bit).
Sempre que escolhemos um tipo de dados, devemos escolher o menor tamanho possível para as nossas necessidades, uma vez que ocuparão espaço na memória da nossa placa e pode ocorrer que o nosso programa precise de mais memoria do que a disponível. Mas como “fazemos” variáveis no nosso código? É muito simples: indicando o tipo e o nome da variável. Podemos também atribuir (ou não) um valor inicial. Vejamos um exemplo:
1 2 3 4 5 |
char miCaracter='a'; //declaramos uma variável tipo char, chamada miCaracater e vamos iniciá-la com valor a byte unNumero = 189; // variável do tipo byte inicializada a 189 int unEntero; //variável do tipo int sem inicializar unsigned int numeroPositivo = 2343; //número inteiro positivo inicializado float numDecimal = 12.212; //número decimal inicializado a 12,212 |
Existe outro tipo de váriável muito importante: String (“Cadeia” em português). Serve para armazenar cadeias de texto, e é fundamental quando queremos enviar texto pela porta série. Permite criar cadeias a partir de números, outras variáveis ou concatenando cadeias. Vejamos alguns exemplos (desta página):
1 2 3 4 5 |
String stringOne = "Olá String"; // usar uma <em>String</em> fixa String stringOne = String('a'); // converter um <em>char</em> fixo numa <em>String</em> String stringTwo = String("This is a string"); // converter uma <em>String</em> fixa num objecto <em>String</em> String stringOne = String(stringTwo + " with more");// concatenar duas strings String stringOne = String(13); // usar um número inteiro |
Existe ainda outro tipo de variável muito importante, chamado Array (“Conjunto” em português), que é uma conjunção ordenada de dados de um determinado tipo. De momento não vamos ver já esse tipo…vamos pouco a pouco. Vamos criar um programa de exemplo, que some dois números inteiros e mostre o resultado através da porta série:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int a = 5; //variável <em>a</em> é um inteiro, inicializado a 5 int b = 6; //variável <em>b</em> é um inteiro, inicializado a 6 int c = a + b; //variável <em>c</em> é um inteiro, inicializado a 11. void setup() { // initializar Serial Serial.begin(9600); // baudrate 9600 Serial.print("a + b igual "); Serial.println(String(c)); void loop() { } |
Neste programa, escrevemos tudo na função setup, porque queremos que se execute apenas uma vez. Qual destas três opções achas que imprimirá pela porta série?
- a + b igual c
- 5 + 6 igual 11
- a + b igual 11
Vais ter que resolver o problema para confirmar se acertaste!
Âmbito das variáveis
Vamos a explicar isto através de exemplos.
Âmbito global
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int a= 5; void setup() { // initializar Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fin setup"); } void loop() { a = a + 1; Serial.println(String(a)); delay(1000); } |
Dizemos que a variável a é global porque se pode aceder a ela a partir de qualquer parte, ou seja, acedemos ao seu valor através das funções setup e loop. O que iríamos receber através da porta série seria o seguinte:
Âmbito local
São variáveis que apenas existem dentro do âmbito em que foram declaradas. Para entendermos rapidamente, um âmbito é o que está entre parênteses. Se as utilizar-mos fora do seu âmbito, teremos um erro de compilação. Como apenas existe dentro do seu âmbito, o meu programa poderia repetir o mesmo nome da variável em âmbitos distintos. Vamos ver alguns exemplos para explicá-lo bem:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void setup() { int a= 5; //a variável <em>a</em> apenas existe dentro da função <em>setup</em> // initializar Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fim setup"); } void loop() { //ao compilar, daria um erro de compilação, porque <em>a</em> não existe no loop a = a + 1; Serial.println(String(a)); delay(1000); } |
Ao compilar este programa iríamos obter um erro de código, porque a variável int a é de âmbito local, e só existe dentro da função setup. Por isso, não a podemos usar na função loop. O que aconteceria com este código?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void setup() { int a = 5; //a variável <em>a</em> apenas existe dentro da função <em>setup</em> // initializar Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fim setup"); } void loop() { int a = 0; a = a + 1; Serial.println(String(a)); delay(1000); } |
Compila? Sim, porque a foi declarada tanto dentro do loop, como dentro do setup. O que se imprimiria no monitor da porta série?
1 2 3 4 5 |
5 fim setup 1 1 1 |
De certeza que te apanhei de surpresa! Esperavas que se imprimisse 1 2 3 4 ? Sim, qualquer um esperava isso! Porque é que não aconteceu isso? Porque a variável a do loop … é criada e destruída em cada iteração, e por isso inicializa-se sempre a 0 … e adiciona-se 1… Por isso, vale sempre 1 dentro do loop. E os programas seguintes? Vamos ver se adivinhas! Constrói-os tu mesmo para confirma o resultado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int a = 0; void setup() { int a = 5; //a variável <em>a</em> apenas existe dentro da função <em>setup</em> // initializar Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fim setup"); } void loop() { a = a + 1; Serial.println(String(a)); delay(1000); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int a = 0; void setup() { int a = 5; a = a + 1; // initializar Serial Serial.begin(9600); // baudrate 9600 Serial.println(String(a)); Serial.println("fim setup"); } void loop() { a = a + 1; Serial.println(String(a)); delay(1000); } |
Se achas que sabes, antes de programares, escreve nos comentários o que deveria sair… Vamos ver quem acerta