A linguagem de programação utilizada no Arduino é a linguagem C++ (com modificações). A ação de converter um programa para linguagem de máquina é chamada compilar. Para compilar um programa, normalmente se utiliza um ambiente de desenvolvimento (ou IDE, do inglês Integrated Development Environment), que é um aplicativo de computador que possui um compilador integrado, onde você pode escrever o seu programa e compilá-lo. No caso do Arduino, esse ambiente de desenvolvimento é o Arduino IDE. O texto contendo o programa em uma linguagem de programação de alto nível também é conhecido como o código fonte do programa.
Algoritmo
Um algoritmo, ou simplesmente programa, é uma forma de dizer para um computador o que ele deve fazer, de uma forma que nós humanos conseguimos entender facilmente. Os algoritmos normalmente são escritos em linguagens de programação de alto nível. Isso se aplica a praticamente qualquer computador, inclusive o Arduino, onde um algoritmo também é conhecido como sketch. Para simplificar, a partir de agora nós vamos nos referir aos algoritmos, programas ou sketches simplesmente como "programas". Um programa é composto de uma sequência de comandos, normalmente escritos em um arquivo de texto. Para este tutorial, vamos usar como base os comandos do programa mais simples do Arduino, o Blink, que simplesmente acende e apaga um LED, e vamos destrinchá-lo ao longo do tutorial. Veja abaixo o código fonte do Blink:
int led = 13;
void setup() { pinMode(led, OUTPUT); }
void loop() { digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000); }
Variável
Uma variável é um recurso utizado para armazenar dados em um programa de computador. Todo computador possui algum tipo de memória, e uma variável representa uma região da memória usada para armazenar uma determinada informação. Essa informação pode ser, por exemplo, um número, um caractere ou uma sequência de texto. Para podermos usar uma variável em um programa Arduino, nós precisamos fazer uma declaração de variável, como por exemplo:
int led;
Nesse caso estamos declarando uma variável do tipo int chamada led. Em seguida nós falaremos mais sobre o tipo de dado de uma variável.
Tipo de Dado
O tipo de dado de uma variável significa, como o próprio nome diz, o tipo de informação que se pode armazenar naquela variável. Em muitas linguagens de programação, como C++, é obrigatório definir o tipo de dado no momento da declaração da variável, como vimos na declaração da variável led
acima. No caso dos módulos Arduino que usam processador ATmega, os tipos mais comuns de dados que utilizamos são:
boolean
: valor verdadeiro (true
) ou falso (false
)char
: um caracterebyte
: um byte, ou sequência de 8 bitsint
: número inteiro de 16 bits com sinal (-32768 a 32767)unsigned int
: número inteiro de 16 bits sem sinal (0 a 65535)long
: número inteiro de 16 bits com sinal (-2147483648 a 2147483647)unsigned long
: número inteiro de 16 bits sem sinal (0 a 4294967295)float
: número real de precisão simples (ponto flutuante)double
: número real de precisão dupla (ponto flutuante)string
: sequência de caracteresvoid
: tipo vazio (não tem tipo)
Para conhecer todos os tipos de dado suportados pelo Arduino, veja a seção "Data Types" nessa página.
Atribuição
Atribuir um valor a uma variável significa armazenar o valor nela para usar posteriormente. O comando de atribuição em C++ é o =. Para atribuírmos o valor 13 à variável led que criamos acima, fazemos assim:
led = 13;
Quando se armazena um valor em uma variável logo na sua inicialização, chamamos isso de inicialização de variável. Assim, no nosso programa de exemplo temos:
int led = 13;
O objetivo dessa linha de código é dizer que o pino 13 do Arduino será utilizado para acender o LED, e armazenar essa informação para usar depois ao longo do programa. Os valores fixos usados no programa, como o valor 13 acima, são chamados de constantes, pois, diferentemente das variáveis, o seu valor não muda.
Operador
Um operador é um conjunto de um ou mais caracteres que serve para operar sobre uma ou mais variáveis ou constantes. Um exemplo muito simples de operador é o operador de adição, o +. Digamos que queremos somar dois números e atribuir a uma variável x. Para isso, fazemos o seguinte:
x = 2 + 3;
Após executar o comando acima, a variável x irá conter o valor 5. Cada linguagem de programação possui um conjunto de operadores diferente. Alguns dos operadores mais comuns na linguagem C++ são:
- Operadores aritméticos:
+
: adição ("mais")-
: subtração ("menos")*
: multiplicação ("vezes")/
: divisão ("dividido por")
- Operadores lógicos:
&&
: conjunção ("e")||
: disjunção ("ou")==
: igualdade ("igual a")!=
: desigualdade ("diferente de")!
: negação ("não")>
: "maior que"<
: "menor que">=
: "maior ou igual a"<=
: "menor ou igual a"
- Operadores de atribuição:
=
: atribui um valor a uma variável, como vimos acima.
Ao longo do desenvolvimento dos seus projetos, aos poucos você se familiarizará com alguns desses operadores.
Operadores Lógicos
A linguagem C++ suporta operadores lógicos que podem ser usados para criar operações lógicas mais complexas, combinando condições simples. O valor de uma expressão lógica é ou VERDADEIRO ou FALSO. Lembre que não há constantes lógicas VERDADEIRO e FALSO em C ; em expressões lógicas 0 é interpretado como FALSO, e qualquer valor diferente de zero é interpretado como VERDADEIRO. Os operadores lógicos são:
- ! NÃO lógico, operação de negação (operador unário);
- && E lógico, conjunção (operador binário);
- || OU lógico, disjunção (operador binário).
Por exemplo, se quisermos testar se um número num é positivo e par, e imprimir uma mensagem como no exemplo anterior, podemos escrever:
if (num >= 0)
if (num % 2 == 0)
printf("Numero par não negativo.\n");
Com os operadores lógicos isso pode ser simplificado:
!0 é 1
!1 é 0
if (num>0 && !(num%2))
printf("Numero par nao negativo.\n");
Os dois operadores binários operam sobre duas expressões lógicas e tem o valor 1 (verdadeiro) or 0 (falso). Os exemplos abaixo mostram o seu uso:
a==0 && b==0 (verdadeiro se ambos a == 0 e b == 0, portanto se a e b são 0)
a==0 || b==0 (verdadeiro se pelo menos uma das variáveis a or b for 0)
Uma expressão usando && é verdadeira somente se ambos os operadores forem verdadeiros (não zero). Uma expressão usando || é falsa somente se ambos os operadores forem falsos (zero).
Função
Uma função é, em linhas gerais, uma sequência de comandos que pode ser reutilizada várias vezes ao longo de um programa. Para criar uma função e dizer o que ela faz, nós precisamos fazer uma declaração de função. Veja como uma função é declarada no nosso programa de exemplo:
void setup() { pinMode(led, OUTPUT); }
setup()
. O que ela faz é executar os comandos de uma outra função pinMode()
. A ação de executar os comandos de função previamente declarada é denominada chamada de função. Nós não precisamos declarar a função pinMode()
porque ela já é declarada automaticamente no caso do Arduino.Chamada de Função
Chamar uma função significa executar os comandos que foram definidos na sua declaração. Uma vez declarada, uma função pode ser chamada várias vezes no mesmo programa para que seus comandos sejam executados novamente. Para chamarmos a nossa funçãosetup()
, por exemplo, nós usaríamos o seguinte comando:setup();
setup()
, porque ela é chamada automaticamente. Quando compilamos um programa no Arduino IDE, ele chama a função setup()
uma vez e depois chama a função loop()
repetidamente até que o Arduino seja desligado ou reiniciado.Valor de Retorno
setup()
, o tipo de retorno é void
, o que significa que a função não retorna nada. Para exemplificar, vamos criar uma função que retorna alguma coisa, por exemplo um número inteiro. Para retornar um valor, nós utilizamos o comando return
:int f() { return 1; }
f()
acima retorna sempre o valor 1
. Você pode usar o valor de retorno de uma função para atribuí-lo a uma variável. Por exemplo:x = f();
f()
e chamar o comando de atribuição acima, a variável X
irá conter o valor 1
.Parâmetros
int soma(int a, int b) { return a + b; }
soma()
, que aceita dois números inteiros como parâmetros. Nós precisamos dar um nome para esses parâmetros, e nesse caso escolhemos a e b. Esses parâmetros funcionam como variável que você pode usar dentro da função. Sempre que chamarmos a função soma()
, precisamos fornecer esses dois números. O comando return a + b
; simplesmente retorna a função com a soma dos dois números. Vamos então somar 2 + 3 e atribuir o resultado para uma variável X
:x = soma(2, 3);
Comentários
- Comentário de linha: inicia-se com os caracteres //, tornando todo o resto da linha atual um comentário.
- Comentário de bloco: inicia-se com os caracteres /* e termina com os caracteres */. Todo o texto entre o início e o término se torna um comentário, podendo ser composto de várias linhas.
/* Programação para Arduino - Primeiros Passos
Programa de exemplo: Blink */
/* Declaração da variável "led"
Indica que o LED está conectado no pino digital 13 do Arduino (D13). */
int led = 13;
/* Declaração da função setup()
Esta função é chamada apenas uma vez, quando o Arduino é ligado ou reiniciado.
*/
void setup() { // Chama a função pinMode() que configura um pino como entrada ou saída
pinMode(led, OUTPUT); // Configura o pino do LED como saída }
/* Declaração da função loop()
Após a função setup() ser chamada, a função loop() é chamada repetidamente até
o Arduino ser desligado. */
void loop() {
// Todas as linhas a seguir são chamadas de função com passagem de parâmetros
// As funções são executadas em sequência para fazer o LED acender e apagar
digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o
delay(1000); // Espera 1000 milissegundos (um segundo)
digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o
delay(1000); // Espera 1000 milissegundos (um segundo)
// Após terminar a função loop(), ela é executada novamente repetidas vezes,
// e assim o LED continua piscando.}
Estruturas de Controle
While
while (condição) { ... }
while
funciona. O nosso objetivo agora é fazer o LED piscar três vezes, depois esperar cinco segundos, piscar mais três vezes e assim por diante. Nós vamos mudar o conteúdo da função loop()
para o seguinte:// Variável para contar o número de vezes que o LED piscou
int i = 0;
// Pisca o LED três vezes
while(i < 3) {
digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o
delay(1000); // Espera 1000 milissegundos (um segundo)
digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o
delay(1000); // Espera 1000 milissegundos (um segundo)
i = i + 1; // Aumenta o número de vezes que o LED piscou
}
delay(5000); // Espera 5 segundos para piscar o LED de novo
i
. Essa variável vai contar quantas vezes o LED já piscou desde o início do programa ou desde a última pausa de cinco segundos. Nós vamos inicializar essa variável com zero porque no início da função loop()
o LED ainda não piscou nenhuma vez sob essas condições.while
, que deve ser seguido de uma condição definida entre parênteses. Enquanto essa condição for verdadeira, todo o bloco de comandos entre os caracteres {
e }
é executado repetidamente. No caso do nosso programa, enquanto o número de "piscadas" do LED (representado pela variável i) for menor do que três, nós continuamos a executar os comandos que fazem o LED piscar. Isso é representado pela expressão i < 3
dentro dos parênteses.{
e }
nós colocamos o código que faz o LED piscar, como anteriormente, mas não podemos nos esquecer de somar 1 à variável que conta o número de "piscadas". Isso é feito na seguinte linha de código: i = i + 1; // Aumenta o número de vezes que o LED piscou
- Atribuímos 0 à variável i: o LED ainda não piscou nenhuma vez.
- Comparamos se i < 3: como 0 é menor do que 3, executamos os comandos entre { e }:
- Executamos os comandos para acender e apagar o LED.
- Somamos 1 à variável i, tornando-a 1: sabemos que o LED piscou uma vez.
- Voltamos ao início do while e comparamos se i < 3: como 1 é menor do que 3, executamos os comandos entre { e } novamente:
- Executamos os comandos para acender e apagar o LED.
- Somamos 1 à variável i, tornando-a 2: sabemos que o LED piscou duas vezes.
- Voltamos ao início do while e comparamos se i < 3: como 2 é menor do que 3, executamos os comandos entre { e } novamente:
- Executamos os comandos para acender e apagar o LED.
- Somamos 1 à variável i, tornando-a 3: sabemos que o LED piscou três vezes.
- Voltamos ao início do while e comparamos se i < 3: como 3 não é menor do que 3, não executamos mais os comandos entre { e } e prosseguimos à próxima instrução.
- Esperamos cinco segundos por meio da chamada delay(5000).
For
// Variável para contar o número de vezes que o LED piscou
int i;
// Pisca o LED três vezes
for(i = 0; i < 3; i++) {
digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o
delay(1000); // Espera 1000 milissegundos (um segundo)
digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o
delay(1000); // Espera 1000 milissegundos (um segundo)
}
delay(5000); // Espera 5 segundos para piscar o LED de novo
for(inicialização; condição; finalização) { ... }
- Condição: é uma expressão verificada repetidamente, de forma idêntica à condição entre parênteses do while. Enquanto ela for verdadeira, os comandos entre { e } continuam sendo executados.
- Inicialização: é um comando executado apenas uma vez no início do comando for.
- Finalização: é um comando executado repetidas vezes ao final de cada execução dos comandos entre { e }.
- i = 0: inicializa a contagem do número de "piscadas".
- i++: soma 1 à variável i ao final da execução dos comandos entre { e }; nesse caso ele é equivalente ao comando i = i + 1. O operador ++ é chamado de operador de incremento, e é muito usado na linguagem C++.
If
if(condição) { ... }
loop()
:// Variável para contar o número de vezes que o LED piscou
int i = 0;
void loop() {
digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o
delay(1000); // Espera 1000 milissegundos (um segundo)
digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o
delay(1000); // Espera 1000 milissegundos (um segundo)
i++; // Incrementa o número de "piscadas"
if(i == 3) {
delay(5000); // Espera 5 segundos para piscar o LED de novo
i = 0; // Reinicia o contador de número de "piscadas"
} }
loop()
piscando o LED como no programa original, porém vamos inserir uma espera adicional de 5 segundos após cada 3 piscadas. Para isso, criamos uma variável i fora da função loop()
; ela precisa ser declarada de fora da função para poder reter o seu valor entre cada execução da função loop()
. Chamamos isso de variável global. Quando a variável é declarada dentro do corpo da função, ela não retém o valor entre cada execução, sendo reiniciada a cada vez que a função é reexecutada. Chamamos isso de variável local.i++; // Incrementa o número de "piscadas"
i = 0; // Reinicia o contador de número de "piscadas"
If-Else
if(condição) { ... } else { ... }
// Variável para contar o número de vezes que o LED piscou
int i;
// Pisca o LED três vezes
for(i = 0; i < 3; i++) {
if(i == 2) {
digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o
delay(200); // Espera 200 milissegundos (um segundo)
digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o
delay(1800); // Espera 1800 milissegundos (um segundo)
} else {
digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o
delay(1000); // Espera 1000 milissegundos (um segundo)
digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o
delay(1000); // Espera 1000 milissegundos (um segundo)
}
}
delay(5000); // Espera 5 segundos para piscar o LED de novo
Bibliotecas
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
lcd.begin(16, 2);
lcd.print("Oi!");
Nenhum comentário:
Postar um comentário