Você está na página 1de 82

Introduo Linguagem C

Exemplo de um Programa
// Exemplo de programa em C
// Isto uma linha de comentrio
void main()
{
int a; // declara a varivel "a"
a = 3 + 2; // soma 3 com 2
}

Um programa em C composto por um


conjunto de Funes. A funo pela qual o
programa comea a ser executado chama-
se main.
Aps cada cada comando em C deve-se colocar
um ; (ponto-e-vrgula).
Um programa em C deve ser Identado para que
possa ser lido com mais facilidade.
Identificadores
So os nomes que podem ser dados para variveis
e funes.
Para a escolha destes nomes necessrio seguir
alguams regras:
Um identificador deve iniciar por uma letra ou
por um "_" (underscore);
A partir do segundo caracter pode conter letras,
nmeros e underscore;
Deve-se usar nomes significativos dentro do
contexto do programa;
C uma linguagem case-sensitive, ou seja, faz
diferena entre nomes com letras maisculas e
nomes com letras minsculas. Peso e peso
so diferentes;
Costuma-se usar maisculas e minsculas para
separar palavras: "PesoDoCarro";
Deve ser diferente dos comandos da linguagem;
Deve ter no mximo 31 caracteres (no caso do
TurboC);
Pode conter nmeros a partir do segundo
caracter;
Exemplos:
Idade, Contador, PesoDoCarro,
Usuario_1, CorDaPagina, RaioDoCirculo

Variveis
Uma varivel uma possio de memria que pode
ser identificada atravs de um nome.
Podem ter seu contedo alterado por um comando
de atribuio.
Aps a atribuio mudam de valor.
int a,b, SomaGeral;
a = 3; // a recebe o valor 3
b = a * 2; // b recebe o dobro do valor de a
c = a + b + 2; // c recebe 11
Tipos de Variveis
Todas as variveis em C tem um tipo;
Cada tipo define os valores que a varivel pode
armazenar;
Cada tipo ocupa uma certa quantidade de
nemria.
Tipo Valores Vlidos
char letras e smbolos: 'a', 'b', 'H', '^', '*','1','0'
int de -32767 at 32767 (apenas nmeros inteiros)
float de -3.4 x 1038 at +3.4 x 10+38com at 6 dgitos de preciso
double de -1.7 x 10308 at +1.7 x 10+308com at 10 dgitos de preciso

Declarao de Variveis
Todas as variveis tem que ser
declaradas antes de serem usadas;
No h uma inicializao implcita na declarao
// Exemplo de programa em C

#include <stdio.h> // Arquivo de cabealho (header)


void main()
{
int contador; // declaraes simples
float PrecoDoQuilo;
double TaxaDeCambio;
char LetraDigitada;
int IdadeManoel, IdadeJoao, IdadeMaria; // Pode colocar mais
de uma varivel na
// na mesma linha
double TaxaDoDolar,
TaxaDoMarco,
TaxaDoPeso, // Tambm pode trocar de linha no
meio
TaxaDoFranco;
.......
}
Inicializao de Variveis na Declarao
// Exemplo de programa em C

#include <stdio.h> // Arquivo de cabealho (header)


void main()
{
int NroDeHoras = 0; // declara e inicializa com Zero
float PrecoDoQuilo = 10.53; // declara e inicializa com
10.53
double TaxaDoDolar = 1.8,
TaxaDoMarco = 1.956,
TaxaDoPeso = 1.75,
TaxaDoFranco = 0.2;
.......
}

Constantes
Constantes so identificadores que no podem ter seus valores
alterados durante a execuo do programa.

Para criar uma constante existe o comando #define que, em geral


colocado no incio do programa-fonte.

Exemplos

#define LARGURA_MAXIMA 50 // No se coloca ponto-e-vrgula


aps o valor
#define NRO_DE_DIAS_DA_SEMANA 7
#define NRO_DE_HORAS_DO_DIA 24
#define VALOR_DE_PI 3.1415
void main ()
{
int TotalDeHoras;

TotalDeHoras = 10 * NRO_DE_DIAS_DA_SEMANA * NRO_DE_HORAS_DO_DIA;


......
}

Strings
Uma String uma sequncia de caracteres entre
aspas duplas: "exemplo de uma string em C".
A funo printf
A funo printf exibe um ou mais dados na tela. Para tanto ele deve
receber pelo menos dois parmetros, separados por vrgula:
um string de formato que define, atravs de caracteres
especiais, os tipos dos dados a serem impressos e suas
posies na linha de impresso;

um dado a ser impresso. Este dado pode ser qualquer um dos


dados visto anteriormente.

Por exemplo:

printf("%s","teste");

"%s" : a string de formato


"teste" : o dado a ser impresso.

A string de formato define quais os tipos dos dados a serem impressos. O


smbolo %s ser substitudo pelo dado que vem aps a vrgula.
Os dados definem quais os valores a serem impressos.

Se for necessrio, um string de formato pode definir que mais de um dado


ser impresso. Para tanto, dentro da string de formato deve haver mais de
um %, um para cada dado a ser impresso.
Neste caso, os dados devem vir aps a string de formato separados por
vrgulas.

Por exemplo:

printf("%s %s","teste1", "outra string");

Isto ir imprimir o string teste1 deixar 1 espao em branco e imprimir ao


lado o string outra string, assim :

teste1 outra string

#include <stdio.h> // Necessrio para usar a funo printf


// A funo printf exibe um ou mais dados na
tela
void main ()
{
printf("%s","Isto uma string ....\n"); // note o '\n' no final da
string;
printf("%s","Outra string ....");
printf("%s","Terceira string\n");
//Depois de Executar o programa, tecle ALT-F5 para ver o resultado na
tela
}

Exerccio
Experimente colocar um '\n' entre os %s na string de formato.

printf("%s\n%s","teste1", "outra string");

Incluso de Texto na String de Formato


possvel incluir um texto dentro da string de formato. Este texto ir aparecer
exatamente como for digitado no programa-fonte.

O exemplo
printf("A aluna %s ficou
doente","Maria");
geraria
A aluna Maria ficou doente

como resultado.

Constantes do tipo String


#define UNIVERSIDADE "Pontifcia Universidade Catlica do Rio Grande
do Sul"
// deve-se colocar entre aspas
#include <sdtio.h>
#include <conio.h> // necessrio para as funes clrscr e getch
void main ()
{
clrscr(); // Limpa a tela
printf("%s", UNIVERSIDADE); // Imprime o nome representado pela
constante
getch(); // espera que o usurio pressione uma tecla
}

Impresso de Inteiros com "printf"


Para imprimir um inteiro com printf usa-se o smbolo %d

// Impresso de Variveis Inteiras


#include <stdio.h>
#include <conio.h> // necessrio para as funes clrscr e getch
void main ()
{
int Contador;
int NroDeFilhos;

clrscr(); // Limpa a tela

Contador = 10;
printf("Valor da Varivel: %d\n", Contador); // No momento da
execuo sinal %d vai
// ser substitudo pelo
valor da
// varivel Contador
NroDeFilhos = 3;
printf("Maria tem %d filhos", NroDeFilhos); // o inteiro
pode ficar no meio da string
getch(); // espera que o usurio pressione uma tecla
}

Impresso de Expresses aritmticas


// Impresso de Expresses aritmticas
#include <stdio.h>
#include <conio.h> // necessrio para as funes clrscr e getch
void main ()
{
int NroDeAndares;
int AlturaPorAndar;

clrscr(); // Limpa a tela


NroDeAndares = 7;
AlturaPorAndar = 3;

printf("Altura Total do Prdio: %d metros",


NroDeAndares*AlturaPorAndar);
// No momento da execuo sinal %d vai ser substitudo
// pelo valor da multiplicao
getch(); // espera que o usurio pressione uma tecla
}

Impresso de Nmeros reais


// Impresso de nmeros reais
#include <stdio.h>
#include <conio.h> // necessrio para as funes clrscr e getch
void main ()
{
float NotaDaP1, NotaDaP2;
float Media;

clrscr(); // Limpa a tela


NotaDaP1 = 6.6; // Atribuio do Valores das mdias
NotaDaP2 = 8.2;

Media = (NotaDaP1 + NotaDaP2) / 2.0;

printf("Mdia Final : %f", Media);


// No momento da execuo sinal %f vai ser substitudo
// pelo valor da varivel Media com SEIS casas decimais
// Mdia Final : 7.400000
getch(); // espera que o usurio pressione uma tecla
}
Formato de Impresso dos Nmeros Reais
No exemplo acima o resultado da mdia (7.4) foi impresso com 6 casas
decimais (7.400000).

Isto sempre acontece quando se manda imprimir um float da forma como foi
feito no exemplo acima. Isto acontece pois o padro da funo printf
completar o nmero com zeros direita, at que fique com seis casas
decimais.

Para formatar de maneira diferente usar-se, junto com o %f uma especificao


de quantas casas decimais se deseja que o nmero tenha. Especifica-se
tambm o nmero total de caracteres do nmero a ser impresso.

Por exemplo: %6.3f especifica que se quer imprimir um float com 3 casas
decimais e com um tamanho total de 6 caracteres no total.

#include <stdio.h>
#include <conio.h>
void main()
{
float NotaDaP1, NotaDaP2;
float Media;

clrscr(); // Limpa a tela


NotaDaP1 = 6.6; // Atribuio do Valores das mdias
NotaDaP2 = 8.2;

Media = (NotaDaP1 + NotaDaP2) / 2.0;

printf("Mdia Final : %6.3f", Media);


// No momento da execuo sinal %6.3f vai ser substitudo
// pelo valor da varivel Media
// Mdia Final : 7.400
getch(); // espera que o usurio pressione uma tecla

Regras para impresso de um nmero real

o nmero de casas decimais sempre respeitado. Se for preciso, zeros


sero acrescetados direita do nmero

o tamanho total significa o nmero de caracteres do nmero inclundo


o ponto decimal e um eventual sinal de
menos (-), se for o caso;

Se a soma do nmero de caracteres da parte inteira, mais o ponto


decimal, mais a parte fracionria, mais um eventual sinal de
menos ainda for menor do que o tamanho total especificado no
formato, ento, espaos em branco sero acrescentados esquerda da
parte real do nmero.

Se a soma do nmero de caracteres da parte inteira, mais o ponto


decimal, mais a parte fracionria, mais um eventual sinal de
menos for maior do que o tamanho total especificado no formato,
ento, apenas o nmero de casas decimais respeitado

Por exemplo:

#include <stdio.h>
#include <conio.h>
void main()
{
float Numero;
Numero = -2.5;
clrscr();
printf("1234567890\n");
printf("%7f\n", Numero);
printf("%7.0f\n", Numero);
printf("%7.3f\n", Numero);
printf("%8.3f\n", Numero);
printf("%9.3f\n", Numero);
printf("\n");
printf("%8.4f\n", Numero);
printf("%8.1f\n", Numero);
printf("%6.12f\n", Numero);

getch();
}

// Resultados
1234567890
-2.500000
-2
-2.500
-2.500
-2.500

-2.5000
-2.5
-2.500000000000

Alinhamento de nmeros DIREITA

Nos exemplos anteriores os nmeros ficavam sempre alinhados a partir da


esquerda.
Experimente colocar um sinal de menos logo depois do sinal de % e veja o
que acontece.
printf("%-7.3f\n", Numero);

Variveis do Tipo String


Uma varivel capaz de arrmazenar uma string deve ser declarada informando-
se qual o nmero mximo de caracteres que ela poder armazenar.
Exemplo:
char Nome[30]; // isto define que a varivel poder armazenar uma
// string de at 29 caracteres.

Ao trabalharmos com strings deve-se incluir o arquivo de


cabealho string.h

Atribuio com strings


As atribuies de valores a strings devem ser feitas atravs da
funo strcpy

// Exemplo com strings


#include <stdio.h>
#include <conio.h>
#include <string.h> // arquivo de cabealho para trabalhar com
strings

void main()
{
char Nome[30]; // declara uma string que poder armazenar at 29
caracteres !!
clsrscr();
strcpy(Nome, "Jose da Silva"); // atribui "Jose da Silva" para a
varivel Nome
printf("O funcionrio %s foi tranferido", Nome); // no lugar de %s
aparecer o
// contedo da
varivel Nome
getch();
}

Operadores Aritmticos
- sinal de menos (unrio) Maior
precedncia
(avaliado
antes)
*,/ multiplicao e diviso
% mdulo (reto da diviso)
+,- soma e subtrao Menor
precedncia
(avaliado
depois)

Pode-se usar parnteses para alterar a precedncia.


Exerccio
Crie um progama que organize os dados em uma tabela conforme o exemplo a
seguir. Os dados das clulas em amarelo deve ser informados atravs de
atribuies dentro do programa.

Procure usar somente os %f para definir o formato e a posio dos dados.


No tente preencher os espaos com brancos. Por exemplo, use
printf ("%10d, QuantidadeDeBananas);

ou invs de
printf(" %d", QuantidadeDeBananas);

Produto Preo Unitrio Quantidade Preo Total

Banana R$ 2.50 2 R$ 5.00

Uva R$ 6.50 6 R$ 39.00

Pessego R$ 10.22 10 R$ 102.20

Sub-Total R$ 146.20
Imposto (5%) R$ 7.31
Total R$ 153.51
Tutorial de Programao Arduno Lio 1

Com o aumento da popularidade do Arduino, cada vez mais evidente que este o
microcontrolador mais utilizados em termos acadmicos, por amadores e pequenas
empresas. Muitos dos produtos electrnicos de diferentes empresas de produo,
esto a entrar num ramo de produo de diferentes "shields" produzindo variaes
muito especificas para uma dada tarefa. O site Arduno oferece recursos livres e
tutoriais, bem como uma referncia de linguagem para ajudar a entender o cdigo
e sintaxe.

O que um Arduino?

uma placa de controlo de entrada de dados (IN), por exemplo sensores, e sada de
dados (OUT), por exemplo atuadores, com o caso de motores e leds.
Possui ainda um regulador de tenso de 5 V, um boto de reset, um conector de
alimentao, pinos conectores, LEDs e uma entrada de ligao USB. Quando ligado
atravs de USB o Arduino no necessita alimentao externa.
EM termos de alimentao external esta pode variar entre 7 a 12 V.
O Arduino tem um conjunto de pinos de entrada e sada.

Hardware

Para comear necessrio uma placa Arduno, sensores e atuadores. Uma vez que
o Arduno pode ser ligado por USB a um computador, basta, utilizar o software
Arduno IDE de modo a poder criar cdigos de carrega-los diretamente na placa .

Download e Instalao do software Arduno IDE

1- Ir para www.arduino.cc para descarregar a ltima verso do software Arduino


(link direto: http://arduino.cc/en/Main/Software , seleccione o seu sistema operativo,
neste caso, ser o Windows);

2- Guardar o arquivo *.ZIP no desktop;


3- Criar uma pasta chamada "Arduino" na pasta "Programas" do disco local.

4- Extraia o contedo da pasta *.ZIP para a pasta "Arduino";

Interface do Arduno IDE

A interface Arduino bastante simples. Quando se executa o software, na primeira


janela, mostrado um editor de texto em branco. Os Projetos Arduino so
chamados "sketches" e quando se comear um novo projeto, so criados diversos
ficheiros, alguns dos quais so livrarias e dependncias necessrias ao projeto.

Para se conectar uma placa:

1- Inicie o software Arduino, clicando duas vezes no cone do Arduino;

2- Conecte uma extremidade do USB no Arduino e a outra ponta em seu


computador;

3- O computador deve detectar o novo dispositivo e dizer-lhe se est instalado


corretamente;

4- No software , seleccione "Ferramentas" -> "Board" -> e seleciona a sua placa;

5- No software , seleccione "Ferramentas" -> "Porta Serial" -> COM # (note que, se
voc tem vrias portas , voc ter que ir ao Gestor de Dispositivos para ver qual
porta COM atribuda sua placa.

Inicializao
Primeiro de tudo importante explicar que a linguagem Arduino sensvel a
maisculas: uma letra maiscula no o mesmo que uma letra minscula.
O cdigo a seguir representa o mnimo para que um programa possa ser compilado:

O "void setup ()" normalmente usado para inicializar variveis , modos de pinos ,
definio a velocidade de transmisso serial, etc. O software s vai a uma seco
de cada vez.

O "void loop ()" a parte do cdigo em que se faz um loop, ou seja, cria-se um ciclo
de repetio para que as instrues dentro do mesmo sejam repetidas.

Quase todas as linhas de cdigo precisa de um ponto e vrgula ';' para ser
finalizada. Para escrever comentrios numa nica linha de cdigo ,coloque duas
barras invertidas , seguidas pelo texto:
/ / comentrios so ignorados durante a compilao de seu programa

Para escrever comentrios multi- linha , iniciar o comentrio com / * e terminam


com * /

/ * Este um comentrio
de vrias linhas* /

Se por exemplo se quiser colocar um cdigo dentro de um "void loop ()", o cdigo
escrito dentro de chavetas {}:

void loop () {
ESCREVER AQUI O Cdigo
}

Comunicao srie
A placa Arduino pode comunicar com vrias velocidades de transmisso. A
transmisso uma medida em quantas vezes o hardware pode enviar informao a
cada segundo. Para definir a velocidade de transmisso, use o seguinte cdigo:

void setup () {

Serial.begin (9600);

Para produzir um valor na janela Arduino, considere o seguinte programa:

Verifique se o programa no tem erros premindo o boto "Verificar" (parece um


boto "play"), os erros aparecem na parte inferior da janela.
Seguidamente, enviar o projeto para a placa usando o boto "Enviar para I / O
Board" (seta apontada para a direita). Aguarde que o upload seja feito e de seguida
seleccione o boto "Serial Monitor" (boto que se parece com uma lupa no canto
superior direito). Quando o serial monitor abrir , certifique-se que a velocidade de
transmisso selecionada a mesma do seu programa.
Programa Piscar LED;
No software Arduino v a File -> Exemplos -> Basics -> Blink LED. O cdigo ir
carregar automaticamente na janela, pronto para ser transferido para o Arduino.

Deve colocar um LED no pino 13 e de seguida pressionar o boto "Upload" e


aguarde at que o programa diga "Upload Concludo". Voc deve ver o LED no pino
13 comear a piscar.

http://youtu.be/QSK81QQLI34

Compreenso do cdigo do programa Piscar LED


Da Lio 1, vai reconhecer a configurao bsica de cdigo void ( ) {} e void loop ()
{} , bem como os comentrios. As trs novas linhas de cdigo so:

pinMode (13, OUTPUT);

A qual define o pino 13 como um pino de sada . O oposto , seria INPUT, faria com
que o pino l-se um sinal de 5V em vez de emiti-lo.

digitalWrite (13 , HIGH ) e digitalWrite (13, LOW);

A linha digitalWrite (pin , HIGH) ; coloca um pino especifico elevado para a 5V. Neste
caso, escolheu o pino 13, pois o LED est ligado ao pino 13 . Substituindo alto com
LOW , o pino definido para 0V.

delay ( 1000) ;

O linha delay ( 1000) ; faz com que o programa espere 1000 milissegundos antes de
continuar (onde 1000 apenas um exemplo conveniente para chegar com um 1
segundo de atraso ) . Note-se que , durante um intervalo , o microcontrolador
espera simplesmente e no executa quaisquer linhas de cdigo adicionais.
Componentes de um cdigo
Vamos considerar que um cdigo no Arduino constitudo por 5 elementos
principais:

--- As bibliotecas, que vm no inicio do programa, e onde so includas todas as


bibliotecas as quais so normalmente constitudas por funes pr-feitas por outros
programadores ou at mesmo pelos criadores da plataforma Arduino.

--- As Variveis, as quais so definidas aps as livrarias, servindo para guardas


informaes, como por exemplo o valor de uma velocidade, o resultado de um
calculo, etc...

--- As funes, no sendo completamente necessrio que sejam colocadas abaixo


das variveis, mas para seguir um raciocnio linear vamos admitir que so
colocadas abaixo das variveis. Estas funes j dizem respeito a funes criadas
por ns e no s includas nas bibliotecas.

--- void setup(), como foi visto na lio 2, este normalmente usado para inicializar
variveis, modos de pinos, definio a velocidade de transmisso serial, etc...

--- void loop(), mais uma vez, como visto na lio 2, aqui a parte do cdigo em
que se faz um loop, ou seja, cria-se um ciclo de repetio para que as instrues
dentro do mesmo sejam repetidas.

Bibliotecas
Quando se cria um cdigo/programa usando uma linguagem de programao, neste
caso C/C++, existe a possibilidade de usar um conjunto de funes pr-criadas por
outros programadores que j resolvem determinados problemas, ou seja, no
necessrio inventar a roda se ela j foi inventada, poupando imenso trabalho.
A esse conjunto de funes damos o nome de bibliotecas, do ingls, library.

Exemplos de bibliotecas a utilizar ao longo do projeto:


- Servo: Esta utilizada quando temos um servo-motor acoplado ao arduino, assim
de uma forma intuitiva, consegue-se posicionar o motor numa determina posio,
dando apenas como dados de entrada o ngulo.
- Ultrasonic: A livraria ultrasonic utilizada para controlo do sensor de ultra-som.
Facilitando a leitura da distncia lida por este.

Na prtica, para se utilizar uma biblioteca basta inclui-la no incio do cdigo, por
exemplo, para usar a biblioteca servo deve ter uma linha no incio do cdigo escrita
com o formato apresentado na imagem direita:

Variveis
Uma varivel uma forma de dar um nome e guardar um valor para usar ao longo
do programa, como por exemplo, dados de um sensor ou um valor intermedirio de
um clculo.

-> Declarar Variveis

Antes de serem utilizadas, as variveis devem ser declaradas. Declarar uma


varivel significa definir o seu tipo, e opcionalmente, configurar um valor inicial
(iniciar a varivel). As variveis no precisam ser iniciadas quando so declaradas.

int variavel1; // declarar varivel


int variavel2 = 0; // iniciar varivel

NOTA: "int" o tipo de varivel, neste caso um inteiro, "variavel1" o nome


atribuido varivel.

-> Usar Variveis

Aps serem declaradas ou iniciadas, podem ser usadas de forma a atribuir, alterar
ou utilizar um valor. Para atribuir ou alterar um valor de uma varivel utiliza-se o
operador "=", dizendo ao programa para atribuir o que estiver do lado direito do
sinal de igual, dentro da varivel que deve ficar do lado esquerdo do sinal de igual.
variavel1 = 7; // atribuir varivel o valor 7
variavel2 = analogRead(2); // atribuir a voltagem lida de uma porta analgica 2 do
arduino

-> Tipos de Variveis

Existem diversos tipos de variveis, umas onde apenas se podem guardar nmeros
e outras onde pode ser guardado qualquer tipo de carater, seja ele um nmero,
uma letra ou um smbolo.

int - consegue guardar valores de -32767 at 32767 (apenas nmeros inteiros).


int var1 = 200;

float - consegue guardar valores de -3.4 x 10^-38 at +3.4 x 10^+38 com at 6


dgitos de preciso.
float var2 = -0.0489;

double - consegue guardar valores de -1.7 x 10^-308 at +1.7 x 10^+308 com at


10 dgitos de preciso.
double var3 = 0.478009;

char - consegue guardar letras, nmeros e smbolos: 'a', 'b', 'H', '^', '*','1','0'.
char var4 = 'A';

sting - consegue guardar conjuntos de letras, nmeros e smbolos: 'a', 'b', 'H', '^',
'*','1','0' (por exemplo, uma frase).
char var5[20] = "Escola de Robtica!!";

NOTA: no caso da string esta um conjunto de carateres por isso inicia-se com
sendo do tipo "char" mas no nome da varivel, entre parntesis rectos coloca-se o
nmero de carateres que sero colocados no seu interior, essa informao
colocada dentro de aspas duplas.

Funes
As funes so usadas para criar pequenos pedaos de cdigos separados do
programa principal. No caso do arduino estas so colocadas fora do void loop().

Qual a vantagem de fazermos uma funo?

As funes so importantes pois devolvem valores, ajudam a fragmentar o cdigo


em partes menores e podem ser utilizadas mais de uma vez no mesmo programa,
poupando tempo de programao e inmeras linhas de cdigo que fazem o mesmo.

Na imagem direita podemos ver como se cria uma funo e como utilizada no
void loop().
A funo em questo soma dois valores e depois devolve o resultado ao programa
principal.
void setup()
O "void setup ()" normalmente usado para inicializar variveis , modos de pinos ,
definio a velocidade de transmisso serial, etc. Por exemplo se utilizar-mos um
servo-motor e queremos atribuir-lhe uma posio de inicializao (em que posio o
servo deve estar situado antes do inicio das operaes) podemos utilizar o exemplo
de cdigo apresentado direita.

void loop()
O "void loop ()" a parte do cdigo em que se faz um loop, ou seja, cria-se um ciclo
de repetio para que as instrues dentro do mesmo sejam repetidas.

Funo para fazer movimentar os motores


A funo motores pode ser utilizada, escrevendo o seguinte cdigo:

motores(vel, modo, tempo)

em que as variveis corresponde s seguintes instrues:

-> vel: Define a velocidade do motor, podendo variar entre 0 e 255

-> modo: Define como se vai movimentar o rob, podendo variar entre 1 e 4, em
que 1 andar em frente, 2 andar para trs, 3 virar a direita, 4 virar a esquerda.

-> tempo: Define o tempo em que a tarefa ir ser realizada. (se colocado a zero ir
fazer a tarefa at que uma condio seja satisfeita, por exemplo, andar para a
frente at encontrar um obstculo)
Exemplos:

Andar para a frente a uma velocidade de 185 durante 10 segundos:


motores(185,1,10);

Virar direita com uma velocidade de 255 durante 1 segundo:


motores(255,3,1);

Funo para saber a distncia a que o rob est de um


objeto
A funo ultrassom pode ser utilizada, escrevendo o seguinte cdigo:

ultrassom()

Deste modo o pedao de cdigo anterior representa a distncia medida.

Exemplos:

Andar para a frente caso a distncia do objeto for maior que 30 centmetros. Caso
seja menor o rob pra.

if (ultrassom() > 30)


{
motores(230,1,0);
}
if (ultrassom() < 30)
{
motores(0,1,0);
}
Funo para decidir para que lado deve virar o rob
A funo rodar pode ser utilizada, escrevendo o seguinte cdigo:

rodar()

Por exemplo se o rob est num canto decide para que lado deve virar, escolhendo
sempre o lado que no tem obstculo.

Exemplos:

Andar para a frente caso a distncia do objeto for maior que 30 centmetros. Caso
seja menor o rob verifica para que lado deve virar para evitar o objeto.

if (ultrassom() > 30)


{
motores(230,1,0);
}
if (ultrassom() < 30)
{
motores(0,1,0);
rodar();
}

Funo para seguir linha


A funo seguir pode ser utilizada, escrevendo o seguinte cdigo:

seguir()

O rob executa uma ao dependendo das cores verificadas nos sensores


Utilizar as funes:
Para utilizar as funes apresentadas na lio anterior, basta efetuar o download do
ficheiro direita, e abrir no arduino. No ficheiro est criado um projeto que ja
contem um layout com todos os pinos definidos e funes inseridas, de tal modo,
que para utilizar as funes apenas necessrio fazer alteraes no void loop() que
se encontra no fim do projeto.

NOTA: necessrio ter a biblioteca Ultrasonic.h disponivel para download no


separador "Teste de Sensores".

Programao para Arduino -


Primeiros Passos
Conceitos iniciais de programao para Arduino

Autor: Lus Fernando Chavier


Neste tutorial vamos apresentar os conceitos bsicos de programao necessrios
para comear a utilizar o Arduino, e tambm outros tipos de de sistemas
embarcados semelhantes. Para conhecer o que possvel construir com esses
sistemas, veja a nossa seo de projetos. Se quiser aprender mais sobre Arduino
e sistemas embarcados, explore a nossa seo de tutoriais.

Se voc est usando o Arduino pela primeira vez, no deixe de ver nossos tutoriais
de como configurar o Arduino para Windows ou Mac.

Aqui ns vamos explicar os conceitos de programao desde o incio, e voc no


precisa saber nada sobre Arduino ou programao de computadores para
comear. Se voc j tem experincia prvia com programao, este tutorial talvez
no acrescente muito ao seu conhecimento.

Ns vamos aprender como funciona um programa simples, fazendo nele algumas


modificaes ao longo do tutorial. Se voc tiver acesso a um Arduino, voc pode
us-lo ao longo do tutorial para praticar os conceitos aprendidos, tornando a
experincia muito mais legal. Voc s precisa de um Arduino, original ou
compatvel, e mais nada. Ento vamos l.

Introduo

O objetivo deste tutorial apresentar, de uma forma simples e rpida, o bsico de


programao para que voc possa comear a utilizar o Arduino em seus projetos,
sem ter que ler muitos livros ou artigos sobre programao. O tema
"desenvolvimento de software" como um todo muito abrangente, ento vamos
focar apenas nos conceitos que so importantes para Arduino e sistemas
embarcados em geral.

Existem muitas outras coisas para se aprender na parte de software que no


vamos abordar aqui. No final do artigo ns colocamos links que voc pode seguir
para aprender conceitos mais avanados ou conceitos de software que no so
muito utilizados na programao de sistemas embarcados.

Vamos comear explicando como funciona um computador (lembre-se que o


Arduino , no fundo, um computador).

Computador

Um computador , de forma simplificada, uma mquina que processa instrues.


Essas instrues so processadas no "crebro" do computador, que se
chama microprocessador. Todo computador possui pelo menos um
microprocessador. O Arduino, por exemplo, nada mais do que um computador
muito pequeno, e ele utiliza um microprocessador do modelo ATmega. Alguns
microprocessadores, como o ATmega, tambm so chamados
de microcontroladores.

Programa de Computador

Um programa de computador, ou software, uma sequncia de instrues que


so enviadas para o computador. Cada tipo de microprocessador (crebro)
entende um conjunto de instrues diferente, ou seja, o seu prprio "idioma".
Tambm chamamos esse idioma de linguagem de mquina.

As linguagens de mquina so, no fundo, as nicas linguagens que os


computadores conseguem entender, s que elas so muito difceis para os seres
humanos entenderem. por isso ns usamos uma coisa chamada linguagem de
programao.

No caso de sistemas como o Arduino (os chamados sistemas embarcados), o


software que roda no microprocessador tambm chamado de firmware.

Linguagem de Programao

Ns seres humanos precisamos converter as nossas idias para uma forma que
os computadores consigam processar, ou seja, a linguagem de mquina. Os
computadores de hoje (ainda) no conseguem entender a linguagem natural que
ns usamos no dia a dia, ento precisamos de um outro "idioma" especial para
instruir o computador a fazer as tarefas que desejamos. Esse "idioma" uma
linguagem de programao, e na verdade existem muitas delas.

Essas linguagens de programao tambm so chamadas de linguagens de


programao de alto nvel. A linguagem de programao utilizada no Arduino a
linguagem C++ (com pequenas modificaes), que uma linguagem muito
tradicional e conhecida. Essa a linguagem que utilizaremos ao longo deste
tutorial.

Para converter um programa escrito em uma linguagem de alto nvel para


linguagem de mquina, ns utilizamos uma coisa chamada compilador. A ao de
converter um programa para linguagem de mquina chamada compilar. Para
compilar um programa, normalmente se utiliza um ambiente de
desenvolvimento (ou IDE, do ingls 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 programao de alto nvel


tambm conhecido como o cdigo fonte do programa.

Algoritmo (Programa)

Um algoritmo, ou simplesmente programa, uma forma de dizer para um


computador o que ele deve fazer, de uma forma que ns humanos conseguimos
entender facilmente. Os algoritmos normalmente so escritos em linguagens de
programao de alto nvel. Isso se aplica a praticamente qualquer computador,
inclusive o Arduino, onde um algoritmo tambm conhecido como sketch. Para
simplificar, a partir de agora ns vamos nos referir aos algoritmos, programas ou
sketches simplesmente como "programas".

Um programa composto de uma sequncia 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 cdigo fonte do
Blink:

int led = 13;

void setup() {

pinMode(led, OUTPUT);

void loop() {
digitalWrite(led, HIGH);

delay(1000);

digitalWrite(led, LOW);

delay(1000);

Varivel

Uma varivel um recurso utizado para armazenar dados em um programa de


computador. Todo computador possui algum tipo de memria, e uma varivel
representa uma regio da memria usada para armazenar uma determinada
informao. Essa informao pode ser, por exemplo, um nmero, um caractere ou
uma sequncia de texto. Para podermos usar uma varivel em um programa
Arduino, ns precisamos fazer uma declarao de varivel, como por exemplo:

int led;

Nesse caso estamos declarando uma varivel do tipo int chamada led . Em
seguida ns falaremos mais sobre o tipo de dado de uma varivel.

Tipo de Dado
O tipo de dado de uma varivel significa, como o prprio nome diz, o tipo de
informao que se pode armazenar naquela varivel. Em muitas linguagens de
programao, como C++, obrigatrio definir o tipo de dado no momento da
declarao da varivel, como vimos na declarao da varivel led acima. No caso
dos mdulos Arduino que usam processador ATmega, os tipos mais comuns de
dados que utilizamos so:

boolean : valor verdadeiro ( true ) ou falso ( false )

char : um caractere

byte : um byte, ou sequncia de 8 bits

int : nmero inteiro de 16 bits com sinal (-32768 a 32767)

unsigned int : nmero inteiro de 16 bits sem sinal (0 a 65535)


long : nmero inteiro de 16 bits com sinal (-2147483648 a 2147483647)

unsigned long : nmero inteiro de 16 bits sem sinal (0 a 4294967295)

float : nmero real de preciso simples (ponto flutuante)

double : nmero real de preciso dupla (ponto flutuante)

string : sequncia de caracteres

void : tipo vazio (no tem tipo)

Para conhecer todos os tipos de dado suportados pelo Arduino, veja a seo "Data
Types" nessa pgina.

Atribuio
Atribuir um valor a uma varivel significa armazenar o valor nela para usar
posteriormente. O comando de atribuio em C++ o = . Para atriburmos o
valor 13 varivel led que criamos acima, fazemos assim:

led = 13;

Quando se armazena um valor em uma varivel logo na sua inicializao,


chamamos isso de inicializao de varivel. Assim, no nosso programa de
exemplo temos:

int led = 13;

O objetivo dessa linha de cdigo dizer que o pino 13 do Arduino ser utilizado
para acender o LED, e armazenar essa informao para usar depois ao longo do
programa.

Os valores fixos usados no programa, como o valor 13 acima, so chamados


de constantes, pois, diferentemente das variveis, o seu valor no muda.

Operador

Um operador um conjunto de um ou mais caracteres que serve para operar


sobre uma ou mais variveis ou constantes. Um exemplo muito simples de
operador o operador de adio, o + . Digamos que queremos somar dois
nmeros e atribuir a uma varivel x . Para isso, fazemos o seguinte:
x = 2 + 3;

Aps executar o comando acima, a varivel x ir conter o valor 5 .

Cada linguagem de programao possui um conjunto de operadores diferente.


Alguns dos operadores mais comuns na linguagem C++ so:

Operadores aritmticos:

o + : adio ("mais")

o - : subtrao ("menos")

o * : multiplicao ("vezes")

o / : diviso ("dividido por")

Operadores lgicos:

o && : conjuno ("e")

o || : disjuno ("ou")

o == : igualdade ("igual a")

o != : desigualdade ("diferente de")

o ! : negao ("no")

o > : "maior que"

o < : "menor que"

o >= : "maior ou igual a"

o <= : "menor ou igual a"

Operadores de atribuio:

o = : atribui um valor a uma varivel, como vimos acima.

Ao longo do desenvolvimento dos seus projetos, aos poucos voc se familiarizar


com todos esses operadores. Para uma lista completa, veja essa pgina da
Wikipedia.
Funo

Uma funo , em linhas gerais, uma sequncia de comandos que pode ser
reutilizada vrias vezes ao longo de um programa. Para criar uma funo e dizer o
que ela faz, ns precisamos fazer uma declarao de funo. Veja como uma
funo declarada no nosso programa de exemplo:

void setup() {

pinMode(led, OUTPUT);

Aqui estamos declarando uma funo com o nome setup() . O que ela faz
executar os comandos de uma outra funo pinMode() . A ao de executar os
comandos de funo previamente declarada denominada chamada de funo.
Ns no precisamos declarar a funo pinMode() porque ela j declarada
automaticamente no caso do Arduino.

Chamada de Funo
Chamar uma funo significa executar os comandos que foram definidos na sua
declarao. Uma vez declarada, uma funo pode ser chamada vrias vezes no
mesmo programa para que seus comandos sejam executados novamente. Para
chamarmos a nossa funo setup() , por exemplo, ns usaramos o seguinte
comando:

setup();

No entanto, no caso do Arduino, ns no precisamos chamar a funo setup() ,


porque ela chamada automaticamente. Quando compilamos um programa no
Arduino IDE, ele chama a funo setup() uma vez e depois chama a
funo loop() repetidamente at que o Arduino seja desligado ou reiniciado.

Valor de Retorno
A palavra chave que vem antes do nome da funo na declarao define o tipo
do valor de retorno da funo. Toda vez que uma funo chamada, ela
executada e devolve ou retorna um determinado valor - esse o valor de retorno,
ou simplesmente retorno da funo. O valor de retorno precisa ter um tipo, que
pode ser qualquer um dos tipos de dados citados anteriormente. No caso da nossa
funo setup() , o tipo de retorno void , o que significa que a funo no retorna
nada.

Para exemplificar, vamos criar uma funo que retorna alguma coisa, por exemplo
um nmero inteiro. Para retornar um valor, ns utilizamos o comando return :

int f() {

return 1;

Quando chamada, a funo f() acima retorna sempre o valor 1 . Voc pode usar
o valor de retorno de uma funo para atribu-lo a uma varivel. Por exemplo:

x = f();

Aps declarar a funo f() e chamar o comando de atribuio acima, a


varivel x ir conter o valor 1 .

Parmetros
Um outro recurso importante de uma funo so os parmetros. Eles servem para
enviar algum dado para a funo quando ela chamada. Vamos criar por exemplo
uma funo que soma dois nmeros:

int soma(int a, int b) {

return a + b;

Aqui acabamos definir uma funo chamada soma() , que aceita dois nmeros
inteiros como parmetros. Ns precisamos dar um nome para esses parmetros, e
nesse caso escolhemos a e b . Esses parmetros funcionam como varivel que
voc pode usar dentro da funo. Sempre que chamarmos a funo soma() ,
precisamos fornecer esses dois nmeros. O comando return a +

b; simplesmente retorna a funo com a soma dos dois nmeros. Vamos ento
somar 2 + 3 e atribuir o resultado para uma varivel x :

x = soma(2, 3);

Aps a chamada acima, a varivel x ir conter o valor 5 .


Comentrios

Um comentrio um trecho de texto no seu programa que serve apenas para


explicar (documentar) o cdigo, sem executar nenhum tipo de comando no
programa. Muitas vezes, os comentrios so usados tambm para desabilitar
comandos no cdigo. Nesse caso, dizemos que o cdigo foi comentado.

Na linguagem C++, um comentrio pode ser escrito de duas formas:

Comentrio de linha: inicia-se com os caracteres // , tornando todo o resto


da linha atual um comentrio.

Comentrio de bloco: inicia-se com os caracteres /* e termina com os


caracteres */ . Todo o texto entre o incio e o trmino se torna um comentrio,
podendo ser composto de vrias linhas.

Para facilitar a visualizao, os ambientes de desenvolvimento geralmente


mostram os comentrios em uma cor diferente. No caso do Arduino IDE, por
exemplo, os comentrios so exibidos na cor cinza. Vamos ento explicar o que o
programa de exemplo faz, inserindo nele vrios comentrios explicativos:

/*

Programao para Arduino - Primeiros Passos

Programa de exemplo: Blink

*/

/*

Declarao da varivel "led"

Indica que o LED est conectado no pino digital 13 do Arduino (D13).

*/

int led = 13;

/*
Declarao da funo setup()

Esta funo chamada apenas uma vez, quando o Arduino ligado ou rei
niciado.

*/

void setup() {

// Chama a funo pinMode() que configura um pino como entrada ou


sada

pinMode(led, OUTPUT); // Configura o pino do LED como sada

/*

Declarao da funo loop()

Aps a funo setup() ser chamada, a funo loop() chamada repetidam


ente at

o Arduino ser desligado.

*/

void loop() {

// Todas as linhas a seguir so chamadas de funo com passagem de


parmetros

// As funes so executadas em sequncia para fazer o LED acender e


apagar

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um segundo)

digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino do


LED, apagando-o

delay(1000); // Espera 1000 milissegundos (um segundo)


// Aps terminar a funo loop(), ela executada novamente
repetidas vezes,

// e assim o LED continua piscando.

Estruturas de Controle

Estruturas de controle so blocos de instrues que alteram o fluxo de execuo


do cdigo de um programa. Com elas possvel fazer coisas como executar
comandos diferentes de acordo com uma condio ou repetir uma srie de
comandos vrias vezes, por exemplo.

A seguir ns veremos algumas das estruturas de controle mais comuns usadas


nas linguagens de programao em geral. Vamos tambm modificar o nosso
programa de teste para exemplificar melhor como essas estruturas funcionam.

While
O while uma estrutura que executa um conjunto de comandos repetidas vezes
enquanto uma determinada condio for verdadeira. While em ingls quer dizer
"enquanto", e pronuncia-se "ui-ou". Ele segue o seguinte formato:

while(condio) {

...

Vamos ento fazer uma modificao no nosso programa para exemplificar melhor
como o while funciona. O nosso objetivo agora fazer o LED piscar trs vezes,
depois esperar cinco segundos, piscar mais trs vezes e assim por diante. Ns
vamos mudar o contedo da funo loop() para o seguinte:

// Varivel para contar o nmero de vezes que o LED piscou

int i = 0;

// Pisca o LED trs vezes


while(i < 3) {

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um segundo)

digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino do


LED, apagando-o

delay(1000); // Espera 1000 milissegundos (um segundo)

i = i + 1; // Aumenta o nmero de vezes que o LED


piscou

delay(5000); // Espera 5 segundos para piscar o LED de


novo

Primeiro ns declaramos uma varivel i . Essa varivel vai contar quantas vezes o
LED j piscou desde o incio do programa ou desde a ltima pausa de cinco
segundos. Ns vamos inicializar essa varivel com zero porque no incio da
funo loop() o LED ainda no piscou nenhuma vez sob essas condies.

Em seguida ns inserimos o comando while , que deve ser seguido de


uma condio definida entre parnteses. Enquanto essa condio for verdadeira,
todo o bloco de comandos entre os caracteres { e } executado repetidamente.
No caso do nosso programa, enquanto o nmero de "piscadas" do LED
(representado pela varivel i ) for menor do que trs, ns continuamos a executar
os comandos que fazem o LED piscar. Isso representado pela expresso i <

3 dentro dos parnteses.

Entre os caracteres { e } ns colocamos o cdigo que faz o LED piscar, como


anteriormente, mas no podemos nos esquecer de somar 1 varivel que conta o
nmero de "piscadas". Isso feito na seguinte linha de cdigo:

i = i + 1; // Aumenta o nmero de vezes que o LED


piscou

Veja que aps executar todos os comandos entre { e } , sempre teremos na


varivel i o nmero de vezes que o LED piscou desde o incio da funo loop() .
Vamos percorrer a sequncia de passos executada cada vez que a
funo loop() chamada:

1. Atribumos 0 varivel i : o LED ainda no piscou nenhuma vez.

2. Comparamos se i < 3: como 0 menor do que 3 , executamos os


comandos entre { e } :

1. Executamos os comandos para acender e apagar o LED.

2. Somamos 1 varivel i , tornando-a 1 : sabemos que o LED


piscou uma vez.

3. Voltamos ao incio do while e comparamos se i < 3 : como 1 menor do


que 3 , executamos os comandos entre { e } novamente:

1. Executamos os comandos para acender e apagar o LED.

2. Somamos 1 varivel i , tornando-a 2 : sabemos que o LED


piscou duas vezes.

4. Voltamos ao incio do while e comparamos se i < 3 : como 2 menor do


que 3 , executamos os comandos entre { e } novamente:

1. Executamos os comandos para acender e apagar o LED.

2. Somamos 1 varivel i , tornando-a 3 : sabemos que o LED


piscou trs vezes.

5. Voltamos ao incio do while e comparamos se i < 3 : como 3 no


menor do que 3 , no executamos mais os comandos entre { e } e
prosseguimos prxima instruo.

6. Esperamos cinco segundos por meio da chamada delay(5000) .

Aps esses passos, chegamos ao final da funo loop() , e como j sabemos, ela
chamada novamente pelo sistema do Arduino. Isso reinicia o ciclo, executando
os passos acima indefinidamente.

Rode o programa modificado com as instrues acima no seu Arduino e tente


variar o nmero de "piscadas" e o nmero
For
Agora que ns j aprendemos o comando while, fica muito fcil aprender o
comando for, pois ele quase a mesma coisa. Vamos modificar o contedo da
funo loop() como fizemos acima, porm usando o for no lugar do while :

// Varivel para contar o nmero de vezes que o LED piscou

int i;

// Pisca o LED trs vezes

for(i = 0; i < 3; i++) {

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um segundo)

digitalWrite(led, LOW); // Atribui nvel lgico 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

A primeira modificao que fizemos foi declarar a varivel i sem inicializ-la com
o valor 0 . Ns podemos fazer isso porque o comando for far isso para a gente.
Ele segue o seguinte formato:

for(inicializao; condio; finalizao) {

...

Vamos descrever cada item separadamente:


Condio: uma expresso verificada repetidamente, de forma idntica
condio entre parnteses do while . Enquanto ela for verdadeira, os
comandos entre { e } continuam sendo executados.

Inicializao: um comando executado apenas uma vez no incio do


comando for .

Finalizao: um comando executado repetidas vezes ao final de cada


execuo dos comandos entre { e } .

Podemos ento verificar que o for nada mais do que um while acrescido de
um comando de inicializao e um comando de finalizao. Para o nosso
programa de teste, esses comandos so, respectivamente:

i = 0 : inicializa a contagem do nmero de "piscadas".

i++: soma 1 varivel i ao final da execuo 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++.

Se executarmos o programa acima no Arduino, veremos que o resultado o


mesmo que obtivemos com o programa que fizamos anteriormente utilizando
o while .

If
O if uma das estruturas mais bsicas de programao em geral. If significa "se"
em ingls, e exatamente isso que ele faz: ele verifica uma expresso e,
apenas se ela for verdadeira, executa um conjunto de comandos. Em linguagem
natural, ele executa uma lgica do tipo: "se isso for verdadeiro, ento faa aquilo"

Para ilustrar, vamos modificar o nosso programa de exemplo para que ele faa a
mesma coisa que fizemos com o while e o for acima, porm vamos fazer isso
usando um if , que segue o seguinte formato:

if(condio) {

...

}
A lgica muito simples: sempre que a condio vor verdadeira, os comandos
entre { e } so executados, caso contrrio o programa prossegue sem execut-
los. Vamos ver ento como fica a funo loop() :

// Varivel para contar o nmero de vezes que o LED piscou

int i = 0;

void loop() {

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um segundo)

digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino do


LED, apagando-o

delay(1000); // Espera 1000 milissegundos (um segundo)

i++; // Incrementa o nmero de "piscadas"

if(i == 3) {

delay(5000); // Espera 5 segundos para piscar o LED de


novo

i = 0; // Reinicia o contador de nmero de


"piscadas"

Aqui a lgica um pouco diferente: ns vamos manter a funo loop() piscando o


LED como no programa original, porm vamos inserir uma espera adicional de 5
segundos aps cada 3 piscadas. Para isso, criamos uma varivel i fora da
funo loop() ; ela precisa ser declarada de fora da funo para poder reter o seu
valor entre cada execuo da funo loop() . Chamamos isso de varivel global.
Quando a varivel declarada dentro do corpo da funo, ela no retm o valor
etnre cada execuo, sendo reiniciada a cada vez que a funo re-executada.
Chamamos isso de varivel local.

Ns usaremos ento essa varivel global i para contar, novamente, o nmero de


vezes que o LED acendeu e apagou. Na declarao da varivel, ns a
inicializamos com o valor 0 para indicar que o LED no acendeu nenhuma vez
ainda. A funo loop() ento comea a ser executada, acendendo e apagando o
LED. Para contar o nmero de vezes que o LED piscou, ns adicionamos a
seguinte linha de cdigo:

i++; // Incrementa o nmero de "piscadas"

Em seguida utilizamos o if para verificar se acabamos de acender o LED pela


terceira vez. Para isso, usamos a expresso i == 3 na condio do f . Se essa
expresso for verdadeira, isso que dizer que o LED j acendeu 3 vezes, ento
inserimos uma pausa adicional de 5 segundos com a chamada delay(5000) e
reiniciamos a contagem do nmero de "piscadas" novamente com o seguinte
comando:

i = 0; // Reinicia o contador de nmero de


"piscadas"

A partir da a funo loop() continua sendo chamada e o ciclo se inicia


novamente.

If-Else
O if-else, tambm conhecido como if-then-else, pode ser visto como uma
extenso do comando if . Else em ingls significa "caso contrrio", e ele faz
exatamente o que o nome diz: "se isso for verdadeiro, ento faa aquilo, caso
contrrio, faa outra coisa". Ele segue o seguinte formato:

if(condio) {

...

} else {

...

Para exemplificar, vamos usar o programa do for que mostramos acima, mas
vamos dessa vez fazer o LED acender e apagar quatro vezes antes de dar uma
pausa de cinco segundos. Depois vamos fazer com que na terceira de cada uma
dessas quatro "piscadas", o LED acenda por um perodo mais curto. Dentro da
funo loop() , teremos o seguinte:

// Varivel para contar o nmero de vezes que o LED piscou

int i;

// Pisca o LED trs vezes

for(i = 0; i < 3; i++) {

if(i == 2) {

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(200); // Espera 200 milissegundos (um


segundo)

digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino


do LED, apagando-o

delay(1800); // Espera 1800 milissegundos (um


segundo)

} else {

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um


segundo)

digitalWrite(led, LOW); // Atribui nvel lgico 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

Aqui o que fazemos , toda vez que vamos acender o LED, verificar se a terceira
vez que isso acontece, por meio do comando if com a condio i == 2 . Se essa
expresso for verdadeira, isso quer dizer que j acendemos o LED duas vezes e
estamos prestes a acend-lo pela terceira vez; nesse caso mudamos o tempo que
o LED fica acaso para um valor menor, de 0,2 segundo (uma reduo de 0,8
segundo) e o tempo que ele fica apagado para um valor maior, de 1,8 segundos
(aumento de 0,8 segundo).

Mas e se essa no for a terceira vez que o LED est sendo acionado? a que
entra o else : se a condio do if for verdadeira, o bloco de comandos
entre { e } logo aps o if executado, caso contrrio, o bloco
entre { e } aps o else executado. Isso quer dizer que para a primeira,
segunda e quarta "piscadas" ser usado o tempo padro de um segundo.

Bibliotecas

As coisas que aprendemos nas sees anteriores so importantes para


implementar a lgica do seu programa no Arduino, mas normalmente voc vai
querer fazer mais coisas alm de apenas acender um LED. Quando se faz tarefas
mais complexas ou se utiliza algum outro circuito conectado ao seu Arduino, um
recurso muito importante so as bibliotecas.

Uma biblioteca basicamente composta de cdigo fonte adicional que voc


adiciona ao seu projeto por meio do comando include. Vejamos como adicionar,
por exemplo, uma biblioteca para controle de um display de cristal liquido (LCD):

#include <LiquidCrystal.h>

Uma biblioteca do Arduino se apresenta normalmente como uma ou


mais classes que possuem funes, os mtodos, para acionar dispositivos,
configur-los ou executar alguma outra tarefa. Continuando com o exemplo do
display de cristal lquido, para us-lo no seu programa, primeiro preciso inicializ-
lo. O que fazemos nesse caso criar um objeto para acessar o LCD
(tecnicamente isso se chama instanciar um objeto). Vejamos como isso feito:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Quando fazemos isso, lcd se torna um objeto da classe LiquidCrystal . Isso o


equivalente a criar uma varivel do tipo LiquidCrystal . Os parmetros que so
passados entre parnteses servem para inicializar a configurao desse objeto, e
nesse caso correspondem aos nmeros dos pinos que foram utilizados para
conectar o LCD ao Arduino.

Quase sempre as bibliotecas de Arduino possuem um mtodo begin() , que serve


para fazer a configurao inicial do dispositivo que est sendo controlado. Para
chamar a funo begin() do objeto lcd que criamos, fazemos o seguinte:

lcd.begin(16, 2);

Normalmente esse mtodo begin() chamado de dentro da funo setup() , ou


seja, durante a inicializao do programa. Os parmetros do mtodo begin() ,
nesse caso, correspondem ao nmero de colunas e o nmero de linhas do LCD,
respectivamente.

Feitos esses passos, j podemos escrever texto no LCD. Fazemos isso usando o
mtodo print() do objeto lcd , sempre que precisarmos ao longo do programa:

lcd.print("Oi!");

O mtodo print() apenas um dos vrios mtodos disponveis na


blblioteca LiquidCrystal . Para saber todos os mtodos fornecidos por uma
determinada biblioteca, preciso consultar a documentao fornecida com ela.

Este o processo bsico de utilizao de bibliotecas no Arduino. Para mais


informaes, leia a documentao fornecida com a biblioteca que voc est
usando.

Classes, objetos e mtodos so conceitos de programao orientada a objetos.


No vamos explicar tudo em detalhes aqui, mas se voc quiser aprender mais
sobre isso, siga os links relacionados no final da pgina.

Concluso

Neste tutorial ns vimos os conceitos bsicos de programao necessrios para


programar um Arduino ou mesmo outras plataformas de hardware embarcado.
Mas isso s o comeo, e ainda h muitas coisas a se aprender, tanto na parte de
hardware quanto na parte de software. Segue ento uma lista para outros artigos e
tutoriais interessantes para que voc possa aprender conceitos mais avanados e
expandir as suas possibilidades:

Programao em C

o Instalando o ambiente de desenvolvimento (PUC-RS)


o Introduo programao C (PUC-RS)

o Curso de Programao em C (Unicamp)

o C Programming (em ingls)

Programao orientada a objetos em C++

o C++ como uma linguagem de programao orientada a


objetos (Unicamp)

o Entendendo C++ - verso original em ingls aqui

Escrevendo bibliotecas para o Arduino (em ingls)

Displays de LED de 7
segmentos
Por

Henrique Puhlmann

06/10/2014

Displays de LED de 7 Segmentos

Displays de LED de 7 segmentos foram largamente utilizados


como elementos de comunicao visual em painis,
instrumentos etc. A vantagem de se utilizar esse tipo de
componente que a disposio dos segmentos de LEDs, os
tamanhos dos displays e a disposio e numerao dos pinos
na sua maioria padronizada, permitindo assim que se
utilize displays de mltiplos fabricantes, sem prejuzos. So
intercambiveis.

O que so Displays de LED de 7


segmentos?

Na Figura 1 pode-se observar um exemplo tpico


de display de 7 segmentos e os detalhes de sua arquitetura
interna. Com os sete segmentos de LED possvel
representar nmeros de 0 a 9 e algumas letras rudimentares.

Figur
a 1: Display de 7 segmentos com detalhes internos e
simulao de operao
Note que os segmentos so identificados por letras de "a" a
"g" e o ponto decimal como "dp". A organizao interna
dos displays de 7 segmentos pode ser na forma de catodo
comum, ou anodo comum, conforme ilustrado na Figura 1.
Essa arquitetura facilita o projeto dos circuitos de
acionamento desses displays. Os detalhes desses circuitos
sero mostrados mais adiante. Para formar um dgito
necessrio acender os segmentos correspondentes. Veja as
sequncias listadas a seguir para a formao dos nmeros e
caracteres mais comuns:

0 (Zero) - a, b, c, d, e, f

1 (Um) - b, c

2 (dois) - a, b, d, e, g

3 (trs) - a, b, c, d, g

4 (quatro) - b, c, f, g

5 (cinco) - a, c, d, f, g

6 (seis) - a, c, d, e, f, g

7 (sete) - a, b, c

8 (oito) - a, b, c, d, e, f, g (todos)

9 (nove) - a, b, c, f, g

A (maisculo) - a, b, c, e, f, g

B (minsculo) - c, d, e, f, g

C (maisculo) - a, d, e, f

D (minsculo) - b, c, d, e, g

E (maisculo) - a, d, e, f, g

F (maisculo) - a, e, f, g
Se voc observar a simulao de operao de um display de 7
segmentos, como mostrado na Figura 1, poder perceber
que as letras formadas nesse tipo de display deixam muito a
desejar. Para melhorar isso, foram criados os displays de 16
segmentos ou alfanumricos, que j permitem representar de
forma razoavelmente boa todas as letras do alfabeto.
Os displays alfanumricos sero apresentados
resumidamente no final.

Os circuitos que sero apresentados mais adiante, foram


desenvolvidos para displays de 7 segmentos, mas podem ser
facilmente adaptados para os displays alfanumricos.

Como acionar um display de LED de 7


segmentos

Os circuitos para o acionamento dos displays de 7 segmentos


so simples. necessrio ter um elemento de habilitao
para permitir o fluxo de energia atravs dos LEDs, resistores
para limitar a corrente em cada LED e assegurar que o brilho
seja o suficiente, e um seletor de segmentos, que determina
quais os segmentos que devero ser ligados. Na Figura
2 esto ilustrados esses elementos de forma simplificada.
Figura 2: Configurao tpica para acionamento de
um display de 7 segmentos de anodo comum

Dependendo da sua soluo, do circuito lgico ou


microcontrolador que voc for utilizar, pode-se dispensar a
utilizao de Q1 e do seletor de segmentos. Porm, boa
prtica de projeto no ligar o display direto no
microcontrolador, para proteg-lo contra eventuais falhas
do display. O seletor de segmentos pode ser implementado
com um array de transistores, como por exemplo
o uln2003 [1] ou uln2004 [2].

Para exemplificar o clculo de alguns parmetros desse


circuito, vamos supor que ser utilizado o display da
Kingbright de cdigo SA36-11CGKWA [3].
Do datasheet do display, temos as seguintes informaes:

Vf = 2,1V (tpico) , para If = 20 mA;

Mxima corrente If = 30 mAcc;

Corrente de Pico = 150 mA, com duty cycle de 1/10 e


largura de pulso de 100 ms.

Devemos tomar alguns cuidados na hora de dimensionar os


elementos de acionamento do display:

O transistor Q1 dever suportar no pior caso 8 x If;

R = (Vcc - Vf + VceQ1) / If, se desprezarmos a queda


no seletor.

Se Vcc = 5 Vcc, If = 10 mA, e Vce = -0,2V temos:

====> IcQ1 = 8 x 10 mA = 80 mA;

====> R = (5 - 2,1 - 0,2)V/ 10 mA = 270 Ohms.

Na Figura 2 pode-se observar que o circuito de acionamento


de um nico display de 7 segmentos bastante simples e
fcil de se conectar o circuito a um microcontrolador. E se
necessitarmos de mais displays para formar nmeros com
mais dgitos?
Como acionar um arranjo com
vrios displays de 7 segmentos?
Se quisermos mostrar, por exemplo, 4 dgitos num arranjo
de displays de 7 segmentos e utilizarmos a soluo mostrada
na Figura 2, sero necessrios pelo menos 32 bits para
acionar os quatro dgitos e eventualmente mais 4 linhas de
habilitao individual para cada display. Esse arranjo
provavelmente inviabilizaria o seu projeto, especialmente se
for utilizar microcontroladores de 8 bits. Ento... Como
resolver esse problema?

A sada para esse problema utilizar uma configurao


multiplexada de acionamento dos displays. Essa soluo se
aproveita do fato dos nossos olhos, por natureza, reterem a
percepo do brilho do LED por algum tempo, de forma que
no se percebe uma descontinuidade de brilho se a
frequncia do chaveamento for alta o suficiente para isso. o
mesmo efeito que nos permite assistir a filmes, onde os
quadros do filme so "piscados" numa frequncia de 24 vezes
por segundo para criar a iluso de movimento contnuo.
Na Figura 3 mostrado um arranjo desse tipo.
Figura 3: Circuito para acionamento multiplexado
dos displays

Com o arranjo mostrado na Figura 3, acrescentar mais um


dgito implica em acrescentar apenas mais um bit para a
seleo do display adicional. O barramento para acionamento
dos segmentos compartilhado.

Como calcular os elementos desse circuito? Bem... Neste


arranjo devemos considerar mais dois parmetros: Frequncia
de multiplexao e nmero de displays, o que nos d uma
razo entre o perodo em que o display est ligado e o
perodo em que ele est desligado. No nosso exemplo, essa
razo de 1/4 ou 25% (duty cycle). A frequncia de
multiplexao dever ser adotada com valor acima de 24 Hz,
por exemplo 30 Hz, para que os nossos olhos no percebam a
cintilao. Outro ponto a considerar, que a corrente mdia
no display diminui conforme diminui o duty cycle, causando
uma diminuio no brilho percebido do display. Assim, para
aumentar o brilho, devemos recalcular os resistores de
limitao de corrente. Uma boa aproximao, utilizar o
parmetro de corrente de pico (150 mA, com duty cycle de
1/10) como valor limitante de mximo. Esse parmetro nos
indica como aceitvel uma corrente mdia de 15 mA no
perodo de multiplexao. Se o nosso duty cycle de 1/4, e
quisermos manter uma corrente mdia de 10 mA, a corrente
durante o acionamento dever assumir o valor de 40 mA e os
resistores devero assumir o seguinte valor:

R = (Vcc - Vf + VceQ1) / If, se desprezarmos a queda no


seletor. Ou seja,

R = (5 - 2,1 - 0,2) /40 mA = 67,5 Ohms ou ento 68 Ohms


(valor comercial para resistores de 5%)

A percepo do brilho do display bastante subjetiva. Nos


clculos acima, foi realizada a suposio de que o brilho e os
demais parmetros do display variam de forma linear, o que
no exatamente verdadeiro, mas pode ser aproximado
dessa forma. No final das contas, sempre ser necessrio
visualmente realizar pequenos ajustes nos valores calculados.

H mais um detalhe importante que devemos considerar para


que o circuito apresentado na Figura 3 funcione
corretamente: a dinmica de acionamento dos displays. Essa
dinmica est ilustrada na Figura 4.
Figura 4: Diagrama de tempos referente multiplexao
dos displays

Para evitar um fenmeno conhecido como "vazamento" ou


"transbordo" de dgito necessrio desligar o display antes de
preparar o barramento de dados para o prximo dgito, e s
depois atualizar o barramento e ligar o prximo dgito.

Displays alfanumricos

Os displays de 16 segmentos ou alfanumricos permitem


representar os dgitos numricos e, de forma razoavelmente
boa, todas as letras do alfabeto. A organizao interna tpica
de um display de 16 segmentos pode ser observada
na Figura 5. O arranjo interno, tal como os displays de 7
segmentos, tambm pode ser de anodo comum ou catodo
comum.
.

Figura 5: Organizao interna de display de LED de 16


segmentos e simulao de operao

Como acionar um display alfanumrico?

Na comparao dos displays mostrados na Figura 1 e


na Figura 5, possvel constatar que a principal diferena
do display de 7 segmentos e do alfanumrico obviamente o
nmero de segmentos de LEDs. Enquanto o primeiro tem 7
segmentos para formar os dgitos e mais um para ativar o
ponto decimal, o segundo tem 16 segmentos mais o ponto
decimal. Naturalmente o circuito de acionamento mais
complexo, especialmente quando se utilizam
microcontroladores de 8 bits. Na Figura 5 pode-se observar
essa complexidade.

Figura 5: Acionamento de um display alfanumrico

O acionamento de um display alfanumrico, por sua


complexidade, requer que seja realizadas algumas atividades
adicionais de preparao antes que ele seja acionado.
Supondo que seja utilizado um barramento de 8 bits,
necessrio que se transfira a primeira metade da seleo dos
segmentos dos displays para o primeiro seletor / driver, que
deve obrigatoriamente possuir algum tipo de memria, 8 flip-
flops por exemplo. Em seguida, transfere-se a segunda
metade da seleo para o barrramento e depois liga-se
o display. A seleo do ponto decimal feita por um bit
adicional.

No caso da necessidade de se utilizar displays alfanumricos


em arranjos com vrios dgitos / caracteres, tambm pode ser
utilizada a soluo de multiplexao mostrada na Figura 3,
observadas as particularidades do acionamento para esse tipo
de display.

Resumo sobre Displays de LED

Este artigo apresentou os display de LED de 7 segmentos e


algumas formas mais comuns para utiliz-los. importante
conhecer e entender a multiplexao dos dgitos como
soluo prtica e tradicional para prover o seu projeto de
sinalizao visual. Este artigo tambm serve de embasamento
terico para que se possa compreender melhor os arranjos e
solues desenvolvidas no prximo artigo tcnico da srie
de Bibliotecas padronizadas em C para o MCS-
51 sobre Displays.

Referncias
[1] Datasheet do componente TI ULN2003

[2] Datasheet do componente TI ULN2004

[3] Datasheet do componente KingBright SA36-11CGKWA

Projeto utilizando o Display de LED de 7


Segmentos GBK Robotics

O objetivo deste projeto demonstrar a utilizao de um display de led de 7 segmentos controlado


diretamente a partir das portas digitais do Arduino.

Material necessrio:

1 Arduino
1 Display de Led de 7 Segmentos Catodo ou Anodo Comum (1 dgito)*
1 Resistor de 220 ohms (vermelho, vermelho, marrom)ou 330 ohms (laranja, laranja, marrom)*
1 Protoboard*
Jumper cable

*Podem ser substitudos pelo mdulo P11-Display Simples da GBK Robotics

Passo1: Displays de Led de 7 Segmentos

Os displays de led de sete segmentos so bastante comuns e muitos utilizados para exibir,
principalmente, informaes numricas

Podem ser de dois tipos:


Passo 2: Montagem do circuito (Projeto 1)

Acompanhar a sequncia de montagem:

Pino 1 (segmento e) do display ligado ao 6 do Arduino;

Pino 2 (segmento d) do display ligado ao 5 do Arduino;

Pino 3 (Gnd, se catodo comum ou Vcc se anodo comum) do display ligado ao resistor de 220
ohms;
Resistor de 220 ohms ligado ao Gnd (se catodo comum) ou Vcc (se anodo comum) do Arduino;

Pino 4 (segmento c) do display ligado ao 4 do Arduino;

Pino 5 (ponto decimal) do display ligado ao 9 do Arduino;

Pino 6 (segmento b) do display ligado ao 3 do Arduino;

Pino 7 (segmento a) do display ligado ao 2 do Arduino;

Pino 9 (segmento f) do display ligado ao 7 do Arduino;

Pino 10 (segmento g) do display ligado ao 8 do Arduino.

Passo 3: Programa 1

int SEG_A = 2;
int SEG_B = 3;
int SEG_C = 4;
int SEG_D = 5;
int SEG_E = 6;
int SEG_F = 7;
int SEG_G = 8;
int PONTO = 9;
int ATRASO = 150;
void setup() {
for (int pino = SEG_A; pino <= SEG_G; pino++) {
pinMode(pino, OUTPUT);
}
}
void loop() {
for (int pino = SEG_A; pino < SEG_G; pino++) {
digitalWrite(pino, HIGH);
if (pino > SEG_A)
digitalWrite(pino - 1, LOW);
else
digitalWrite(SEG_F, LOW);
delay(ATRASO);
}
}

Passo 4: Programa 2

Inicie o ambiente de desenvolvimento do Arduino e digite o Sketch (programa) a seguir:

// Declarao da matriz para uso em displays com catodo comum, para utilizar em
displays com anodo comum basta inverter o valor dos bytes.
byte digitos[10][7] = {
{ 1,1,1,1,1,1,0 }, // = 0
{ 0,1,1,0,0,0,0 }, // = 1
{ 1,1,0,1,1,0,1 }, // = 2
{ 1,1,1,1,0,0,1 }, // = 3
{ 0,1,1,0,0,1,1 }, // = 4
{ 1,0,1,1,0,1,1 }, // = 5
{ 1,0,1,1,1,1,1 }, // = 6
{ 1,1,1,0,0,0,0 }, // = 7

{ 1,1,1,1,1,1,1 }, // = 8
{ 1,1,1,0,0,1,1 } // = 9
};
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pontoDecimal(false);
}
void pontoDecimal(boolean ponto) {
digitalWrite(9, ponto);
}
void escrever(int digito) {
int pino = 2;
for (int segmento = 0; segmento < 7; segmento++) {
digitalWrite(pino, digitos[digito][segmento]);
pino++;
}
pontoDecimal(false);
}
void limpar() {
byte pino = 2;
for (int segmento = 0; segmento < 7; segmento++) {
digitalWrite(pino, LOW);
pino++;
}
}
void loop() {
for (int cont = 9; cont >= 0; cont--) {
escrever(cont);
boolean ponto = true;
for (int i = 0; i < 4; i++) {
delay(250);
pontoDecimal(ponto);
ponto = !ponto;
}
}
limpar();

delay(1000);
}
Passo 5: Uso de displays com mltiplos dgitos

Voc j deve ter observado que quando precisamos utilizar displays de leds que apresentam mais
do que um dgito, os portas disponveis no Arduino no sero suficientes ou mesmo que
sejam suficientes, no permitiro colocar novas funcionalidades ao seu projeto como, por
exemplo, um sensor
de temperatura ou um mdulo de relgio em tempo real (RTC).

Desta maneira, para otimizar o uso das portas do Arduino devemos utilizar um driver para displays
de led sendo, o mais popular, o Maxim 7219 ou 7221, cuja pinagem pode ser observada a seguir.

Passo 6: Montagem do circuito (Projeto 2)

Passo 7: Programa 3
// Este sketch exibe o nmero 1234 em um display de led de 7 segmentos com 4 dgitos
// Utilizar a biblioteca LedControl
#include "LedControl.h"
/*
* Criar um LedControl (lc).
* O pino 11 do Arduino deve ser conectado ao pino DATA IN do primeiro MAX7219/21
* O pino 10 do Arduino deve ser conectado ao pino CLK do primeiro MAX7219/21
* O pino 9 do Arduino deve ser conectado ao pino LOAD (/CS) do primeiro MAX7219/21

* O quarto parmetro indica que h apenas um MAX7219/21 conectado ao Arduino


*/
LedControl lc = LedControl(11, 10, 9, 1);
void setup()
{ // Retira o MAX7219/21 do modo de economia de energia
lc.shutdown(0, false);
// Define a intensidade do brilho dos leds
lc.setIntensity(0, 2);
lc.clearDisplay(0);
}
void loop()
{ lc.setChar(0, 2, '0', false);
lc.setChar(0, 2, '1', false);
lc.setChar(0, 3, '2', false);
lc.setChar(0, 4, '3', false);
}

Passo 8: Programa 4

/*
* Este sketch exibe os nmeros inteiros entre -999 e 999 em um display de led de
* 7 segmentos com 4 dgitos
*/
// Utilizar a biblioteca LedControl
#include "LedControl.h"
/*
* Criar um LedControl (lc).
* O pino 11 do Arduino deve ser conectado ao pino DATA IN do primeiro MAX7219/21
* O pino 10 do Arduino deve ser conectado ao pino CLK do primeiro MAX7219/21
* O pino 9 do Arduino deve ser conectado ao pino LOAD (/CS) do primeiro MAX7219/21
* O quarto parmetro indica que h apenas um MAX7219/21 conectado ao Arduino
*/
LedControl lc = LedControl(11, 10, 9, 1);
int i = -999;
void setup()
{ // Retira o MAX7219/21 do modo de economia de energia
lc.shutdown(0, false);
// Define a intensidade do brilho dos leds
lc.setIntensity(0, 2);
lc.clearDisplay(0);
}
void loop()
{ exibirInteiro(i++);
}
void exibirInteiro(int valor)
{
int unidade;
int dezena;
int centena;
boolean negativo = false;
if(valor < -999 || valor > 999)
return;
if(valor < 0)
{
negativo = true;
valor = valor * (-1);
}
unidade = valor % 10;
valor = valor / 10;
dezena = valor % 10;
valor =valor / 10;
centena = valor;
if (negativo)
{ // Imprime o sinal de negativo no display que est mais a esquerda
lc.setChar(0, 1, '-', false);
}
else
{ // Imprime um espao no lugar do sinal de negativo
lc.setChar(0, 1 , ' ', false);
}
// Exibo o nmero dgito a dgito
lc.setDigit(0, 2, (byte)centena, false);
lc.setDigit(0, 3, (byte)dezena, false);
lc.setDigit(0, 4, (byte)unidade, false);
delay(100);
}

Introduo

O objetivo deste tutorial apresentar, de uma forma simples e rpida, o bsico de


programao para que voc possa comear a utilizar o Arduino em seus projetos,
sem ter que ler muitos livros ou artigos sobre programao. O tema
"desenvolvimento de software" como um todo muito abrangente, ento vamos
focar apenas nos conceitos que so importantes para Arduino e sistemas
embarcados em geral.

Existem muitas outras coisas para se aprender na parte de software que no


vamos abordar aqui. No final do artigo ns colocamos links que voc pode seguir
para aprender conceitos mais avanados ou conceitos de software que no so
muito utilizados na programao de sistemas embarcados.
Vamos comear explicando como funciona um computador (lembre-se que o
Arduino , no fundo, um computador).

Computador

Um computador , de forma simplificada, uma mquina que processa instrues.


Essas instrues so processadas no "crebro" do computador, que se
chama microprocessador. Todo computador possui pelo menos um
microprocessador. O Arduino, por exemplo, nada mais do que um computador
muito pequeno, e ele utiliza um microprocessador do modelo ATmega. Alguns
microprocessadores, como o ATmega, tambm so chamados
de microcontroladores.

Programa de Computador

Um programa de computador, ou software, uma sequncia de instrues que


so enviadas para o computador. Cada tipo de microprocessador (crebro)
entende um conjunto de instrues diferente, ou seja, o seu prprio "idioma".
Tambm chamamos esse idioma de linguagem de mquina.

As linguagens de mquina so, no fundo, as nicas linguagens que os


computadores conseguem entender, s que elas so muito difceis para os seres
humanos entenderem. por isso ns usamos uma coisa chamada linguagem de
programao.

No caso de sistemas como o Arduino (os chamados sistemas embarcados), o


software que roda no microprocessador tambm chamado de firmware.

Linguagem de Programao

Ns seres humanos precisamos converter as nossas idias para uma forma que
os computadores consigam processar, ou seja, a linguagem de mquina. Os
computadores de hoje (ainda) no conseguem entender a linguagem natural que
ns usamos no dia a dia, ento precisamos de um outro "idioma" especial para
instruir o computador a fazer as tarefas que desejamos. Esse "idioma" uma
linguagem de programao, e na verdade existem muitas delas.

Essas linguagens de programao tambm so chamadas de linguagens de


programao de alto nvel. A linguagem de programao utilizada no Arduino a
linguagem C++ (com pequenas modificaes), que uma linguagem muito
tradicional e conhecida. Essa a linguagem que utilizaremos ao longo deste
tutorial.
Para converter um programa escrito em uma linguagem de alto nvel para
linguagem de mquina, ns utilizamos uma coisa chamada compilador. A ao de
converter um programa para linguagem de mquina chamada compilar. Para
compilar um programa, normalmente se utiliza um ambiente de
desenvolvimento (ou IDE, do ingls 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 programao de alto nvel


tambm conhecido como o cdigo fonte do programa.

Algoritmo (Programa)

Um algoritmo, ou simplesmente programa, uma forma de dizer para um


computador o que ele deve fazer, de uma forma que ns humanos conseguimos
entender facilmente. Os algoritmos normalmente so escritos em linguagens de
programao de alto nvel. Isso se aplica a praticamente qualquer computador,
inclusive o Arduino, onde um algoritmo tambm conhecido como sketch. Para
simplificar, a partir de agora ns vamos nos referir aos algoritmos, programas ou
sketches simplesmente como "programas".

Um programa composto de uma sequncia 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 cdigo fonte do
Blink:

int led = 13;

void setup() {

pinMode(led, OUTPUT);

void loop() {

digitalWrite(led, HIGH);

delay(1000);
digitalWrite(led, LOW);

delay(1000);

Varivel

Uma varivel um recurso utizado para armazenar dados em um programa de


computador. Todo computador possui algum tipo de memria, e uma varivel
representa uma regio da memria usada para armazenar uma determinada
informao. Essa informao pode ser, por exemplo, um nmero, um caractere ou
uma sequncia de texto. Para podermos usar uma varivel em um programa
Arduino, ns precisamos fazer uma declarao de varivel, como por exemplo:

int led;

Nesse caso estamos declarando uma varivel do tipo int chamada led . Em
seguida ns falaremos mais sobre o tipo de dado de uma varivel.

Tipo de Dado
O tipo de dado de uma varivel significa, como o prprio nome diz, o tipo de
informao que se pode armazenar naquela varivel. Em muitas linguagens de
programao, como C++, obrigatrio definir o tipo de dado no momento da
declarao da varivel, como vimos na declarao da varivel led acima. No caso
dos mdulos Arduino que usam processador ATmega, os tipos mais comuns de
dados que utilizamos so:

boolean : valor verdadeiro ( true ) ou falso ( false )

char : um caractere

byte : um byte, ou sequncia de 8 bits

int : nmero inteiro de 16 bits com sinal (-32768 a 32767)

unsigned int : nmero inteiro de 16 bits sem sinal (0 a 65535)

long : nmero inteiro de 16 bits com sinal (-2147483648 a 2147483647)

unsigned long : nmero inteiro de 16 bits sem sinal (0 a 4294967295)


float : nmero real de preciso simples (ponto flutuante)

double : nmero real de preciso dupla (ponto flutuante)

string : sequncia de caracteres

void : tipo vazio (no tem tipo)

Para conhecer todos os tipos de dado suportados pelo Arduino, veja a seo "Data
Types" nessa pgina.

Atribuio
Atribuir um valor a uma varivel significa armazenar o valor nela para usar
posteriormente. O comando de atribuio em C++ o = . Para atriburmos o
valor 13 varivel led que criamos acima, fazemos assim:

led = 13;

Quando se armazena um valor em uma varivel logo na sua inicializao,


chamamos isso de inicializao de varivel. Assim, no nosso programa de
exemplo temos:

int led = 13;

O objetivo dessa linha de cdigo dizer que o pino 13 do Arduino ser utilizado
para acender o LED, e armazenar essa informao para usar depois ao longo do
programa.

Os valores fixos usados no programa, como o valor 13 acima, so chamados


de constantes, pois, diferentemente das variveis, o seu valor no muda.

Operador

Um operador um conjunto de um ou mais caracteres que serve para operar


sobre uma ou mais variveis ou constantes. Um exemplo muito simples de
operador o operador de adio, o + . Digamos que queremos somar dois
nmeros e atribuir a uma varivel x . Para isso, fazemos o seguinte:

x = 2 + 3;

Aps executar o comando acima, a varivel x ir conter o valor 5 .


Cada linguagem de programao possui um conjunto de operadores diferente.
Alguns dos operadores mais comuns na linguagem C++ so:

Operadores aritmticos:

o + : adio ("mais")

o - : subtrao ("menos")

o * : multiplicao ("vezes")

o / : diviso ("dividido por")

Operadores lgicos:

o && : conjuno ("e")

o || : disjuno ("ou")

o == : igualdade ("igual a")

o != : desigualdade ("diferente de")

o ! : negao ("no")

o > : "maior que"

o < : "menor que"

o >= : "maior ou igual a"

o <= : "menor ou igual a"

Operadores de atribuio:

o = : atribui um valor a uma varivel, como vimos acima.

Ao longo do desenvolvimento dos seus projetos, aos poucos voc se familiarizar


com todos esses operadores. Para uma lista completa, veja essa pgina da
Wikipedia.

Funo
Uma funo , em linhas gerais, uma sequncia de comandos que pode ser
reutilizada vrias vezes ao longo de um programa. Para criar uma funo e dizer o
que ela faz, ns precisamos fazer uma declarao de funo. Veja como uma
funo declarada no nosso programa de exemplo:

void setup() {

pinMode(led, OUTPUT);

Aqui estamos declarando uma funo com o nome setup() . O que ela faz
executar os comandos de uma outra funo pinMode() . A ao de executar os
comandos de funo previamente declarada denominada chamada de funo.
Ns no precisamos declarar a funo pinMode() porque ela j declarada
automaticamente no caso do Arduino.

Chamada de Funo
Chamar uma funo significa executar os comandos que foram definidos na sua
declarao. Uma vez declarada, uma funo pode ser chamada vrias vezes no
mesmo programa para que seus comandos sejam executados novamente. Para
chamarmos a nossa funo setup() , por exemplo, ns usaramos o seguinte
comando:

setup();

No entanto, no caso do Arduino, ns no precisamos chamar a funo setup() ,


porque ela chamada automaticamente. Quando compilamos um programa no
Arduino IDE, ele chama a funo setup() uma vez e depois chama a
funo loop() repetidamente at que o Arduino seja desligado ou reiniciado.

Valor de Retorno
A palavra chave que vem antes do nome da funo na declarao define o tipo
do valor de retorno da funo. Toda vez que uma funo chamada, ela
executada e devolve ou retorna um determinado valor - esse o valor de retorno,
ou simplesmente retorno da funo. O valor de retorno precisa ter um tipo, que
pode ser qualquer um dos tipos de dados citados anteriormente. No caso da nossa
funo setup() , o tipo de retorno void , o que significa que a funo no retorna
nada.
Para exemplificar, vamos criar uma funo que retorna alguma coisa, por exemplo
um nmero inteiro. Para retornar um valor, ns utilizamos o comando return :

int f() {

return 1;

Quando chamada, a funo f() acima retorna sempre o valor 1 . Voc pode usar
o valor de retorno de uma funo para atribu-lo a uma varivel. Por exemplo:

x = f();

Aps declarar a funo f() e chamar o comando de atribuio acima, a


varivel x ir conter o valor 1 .

Parmetros
Um outro recurso importante de uma funo so os parmetros. Eles servem para
enviar algum dado para a funo quando ela chamada. Vamos criar por exemplo
uma funo que soma dois nmeros:

int soma(int a, int b) {

return a + b;

Aqui acabamos definir uma funo chamada soma() , que aceita dois nmeros
inteiros como parmetros. Ns precisamos dar um nome para esses parmetros, e
nesse caso escolhemos a e b . Esses parmetros funcionam como varivel que
voc pode usar dentro da funo. Sempre que chamarmos a funo soma() ,
precisamos fornecer esses dois nmeros. O comando return a +

b; simplesmente retorna a funo com a soma dos dois nmeros. Vamos ento
somar 2 + 3 e atribuir o resultado para uma varivel x :

x = soma(2, 3);

Aps a chamada acima, a varivel x ir conter o valor 5 .

Comentrios
Um comentrio um trecho de texto no seu programa que serve apenas para
explicar (documentar) o cdigo, sem executar nenhum tipo de comando no
programa. Muitas vezes, os comentrios so usados tambm para desabilitar
comandos no cdigo. Nesse caso, dizemos que o cdigo foi comentado.

Na linguagem C++, um comentrio pode ser escrito de duas formas:

Comentrio de linha: inicia-se com os caracteres // , tornando todo o resto


da linha atual um comentrio.

Comentrio de bloco: inicia-se com os caracteres /* e termina com os


caracteres */ . Todo o texto entre o incio e o trmino se torna um comentrio,
podendo ser composto de vrias linhas.

Para facilitar a visualizao, os ambientes de desenvolvimento geralmente


mostram os comentrios em uma cor diferente. No caso do Arduino IDE, por
exemplo, os comentrios so exibidos na cor cinza. Vamos ento explicar o que o
programa de exemplo faz, inserindo nele vrios comentrios explicativos:

/*

Programao para Arduino - Primeiros Passos

Programa de exemplo: Blink

*/

/*

Declarao da varivel "led"

Indica que o LED est conectado no pino digital 13 do Arduino (D13).

*/

int led = 13;

/*

Declarao da funo setup()


Esta funo chamada apenas uma vez, quando o Arduino ligado ou rei
niciado.

*/

void setup() {

// Chama a funo pinMode() que configura um pino como entrada ou


sada

pinMode(led, OUTPUT); // Configura o pino do LED como sada

/*

Declarao da funo loop()

Aps a funo setup() ser chamada, a funo loop() chamada repetidam


ente at

o Arduino ser desligado.

*/

void loop() {

// Todas as linhas a seguir so chamadas de funo com passagem de


parmetros

// As funes so executadas em sequncia para fazer o LED acender e


apagar

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um segundo)

digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino do


LED, apagando-o

delay(1000); // Espera 1000 milissegundos (um segundo)


// Aps terminar a funo loop(), ela executada novamente
repetidas vezes,

// e assim o LED continua piscando.

Estruturas de Controle

Estruturas de controle so blocos de instrues que alteram o fluxo de execuo


do cdigo de um programa. Com elas possvel fazer coisas como executar
comandos diferentes de acordo com uma condio ou repetir uma srie de
comandos vrias vezes, por exemplo.

A seguir ns veremos algumas das estruturas de controle mais comuns usadas


nas linguagens de programao em geral. Vamos tambm modificar o nosso
programa de teste para exemplificar melhor como essas estruturas funcionam.

While
O while uma estrutura que executa um conjunto de comandos repetidas vezes
enquanto uma determinada condio for verdadeira. While em ingls quer dizer
"enquanto", e pronuncia-se "ui-ou". Ele segue o seguinte formato:

while(condio) {

...

Vamos ento fazer uma modificao no nosso programa para exemplificar melhor
como o while funciona. O nosso objetivo agora fazer o LED piscar trs vezes,
depois esperar cinco segundos, piscar mais trs vezes e assim por diante. Ns
vamos mudar o contedo da funo loop() para o seguinte:

// Varivel para contar o nmero de vezes que o LED piscou

int i = 0;

// Pisca o LED trs vezes

while(i < 3) {
digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do
LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um segundo)

digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino do


LED, apagando-o

delay(1000); // Espera 1000 milissegundos (um segundo)

i = i + 1; // Aumenta o nmero de vezes que o LED


piscou

delay(5000); // Espera 5 segundos para piscar o LED de


novo

Primeiro ns declaramos uma varivel i . Essa varivel vai contar quantas vezes o
LED j piscou desde o incio do programa ou desde a ltima pausa de cinco
segundos. Ns vamos inicializar essa varivel com zero porque no incio da
funo loop() o LED ainda no piscou nenhuma vez sob essas condies.

Em seguida ns inserimos o comando while , que deve ser seguido de


uma condio definida entre parnteses. Enquanto essa condio for verdadeira,
todo o bloco de comandos entre os caracteres { e } executado repetidamente.
No caso do nosso programa, enquanto o nmero de "piscadas" do LED
(representado pela varivel i ) for menor do que trs, ns continuamos a executar
os comandos que fazem o LED piscar. Isso representado pela expresso i <

3 dentro dos parnteses.

Entre os caracteres { e } ns colocamos o cdigo que faz o LED piscar, como


anteriormente, mas no podemos nos esquecer de somar 1 varivel que conta o
nmero de "piscadas". Isso feito na seguinte linha de cdigo:

i = i + 1; // Aumenta o nmero de vezes que o LED


piscou

Veja que aps executar todos os comandos entre { e } , sempre teremos na


varivel i o nmero de vezes que o LED piscou desde o incio da funo loop() .
Vamos percorrer a sequncia de passos executada cada vez que a
funo loop() chamada:
1. Atribumos 0 varivel i : o LED ainda no piscou nenhuma vez.

2. Comparamos se i < 3: como 0 menor do que 3 , executamos os


comandos entre { e } :

1. Executamos os comandos para acender e apagar o LED.

2. Somamos 1 varivel i , tornando-a 1 : sabemos que o LED


piscou uma vez.

3. Voltamos ao incio do while e comparamos se i < 3 : como 1 menor do


que 3 , executamos os comandos entre { e } novamente:

1. Executamos os comandos para acender e apagar o LED.

2. Somamos 1 varivel i , tornando-a 2 : sabemos que o LED


piscou duas vezes.

4. Voltamos ao incio do while e comparamos se i < 3 : como 2 menor do


que 3 , executamos os comandos entre { e } novamente:

1. Executamos os comandos para acender e apagar o LED.

2. Somamos 1 varivel i , tornando-a 3 : sabemos que o LED


piscou trs vezes.

5. Voltamos ao incio do while e comparamos se i < 3 : como 3 no


menor do que 3 , no executamos mais os comandos entre { e } e
prosseguimos prxima instruo.

6. Esperamos cinco segundos por meio da chamada delay(5000) .

Aps esses passos, chegamos ao final da funo loop() , e como j sabemos, ela
chamada novamente pelo sistema do Arduino. Isso reinicia o ciclo, executando
os passos acima indefinidamente.

Rode o programa modificado com as instrues acima no seu Arduino e tente


variar o nmero de "piscadas" e o nmero

For
Agora que ns j aprendemos o comando while, fica muito fcil aprender o
comando for, pois ele quase a mesma coisa. Vamos modificar o contedo da
funo loop() como fizemos acima, porm usando o for no lugar do while :
// Varivel para contar o nmero de vezes que o LED piscou

int i;

// Pisca o LED trs vezes

for(i = 0; i < 3; i++) {

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um segundo)

digitalWrite(led, LOW); // Atribui nvel lgico 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

A primeira modificao que fizemos foi declarar a varivel i sem inicializ-la com
o valor 0 . Ns podemos fazer isso porque o comando for far isso para a gente.
Ele segue o seguinte formato:

for(inicializao; condio; finalizao) {

...

Vamos descrever cada item separadamente:

Condio: uma expresso verificada repetidamente, de forma idntica


condio entre parnteses do while . Enquanto ela for verdadeira, os
comandos entre { e } continuam sendo executados.

Inicializao: um comando executado apenas uma vez no incio do


comando for .
Finalizao: um comando executado repetidas vezes ao final de cada
execuo dos comandos entre { e } .

Podemos ento verificar que o for nada mais do que um while acrescido de
um comando de inicializao e um comando de finalizao. Para o nosso
programa de teste, esses comandos so, respectivamente:

i = 0 : inicializa a contagem do nmero de "piscadas".

i++: soma 1 varivel i ao final da execuo 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++.

Se executarmos o programa acima no Arduino, veremos que o resultado o


mesmo que obtivemos com o programa que fizamos anteriormente utilizando
o while .

If
O if uma das estruturas mais bsicas de programao em geral. If significa "se"
em ingls, e exatamente isso que ele faz: ele verifica uma expresso e,
apenas se ela for verdadeira, executa um conjunto de comandos. Em linguagem
natural, ele executa uma lgica do tipo: "se isso for verdadeiro, ento faa aquilo"

Para ilustrar, vamos modificar o nosso programa de exemplo para que ele faa a
mesma coisa que fizemos com o while e o for acima, porm vamos fazer isso
usando um if , que segue o seguinte formato:

if(condio) {

...

A lgica muito simples: sempre que a condio vor verdadeira, os comandos


entre { e } so executados, caso contrrio o programa prossegue sem execut-
los. Vamos ver ento como fica a funo loop() :

// Varivel para contar o nmero de vezes que o LED piscou

int i = 0;
void loop() {

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um segundo)

digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino do


LED, apagando-o

delay(1000); // Espera 1000 milissegundos (um segundo)

i++; // Incrementa o nmero de "piscadas"

if(i == 3) {

delay(5000); // Espera 5 segundos para piscar o LED de


novo

i = 0; // Reinicia o contador de nmero de


"piscadas"

Aqui a lgica um pouco diferente: ns vamos manter a funo loop() piscando o


LED como no programa original, porm vamos inserir uma espera adicional de 5
segundos aps cada 3 piscadas. Para isso, criamos uma varivel i fora da
funo loop() ; ela precisa ser declarada de fora da funo para poder reter o seu
valor entre cada execuo da funo loop() . Chamamos isso de varivel global.
Quando a varivel declarada dentro do corpo da funo, ela no retm o valor
etnre cada execuo, sendo reiniciada a cada vez que a funo re-executada.
Chamamos isso de varivel local.

Ns usaremos ento essa varivel global i para contar, novamente, o nmero de


vezes que o LED acendeu e apagou. Na declarao da varivel, ns a
inicializamos com o valor 0 para indicar que o LED no acendeu nenhuma vez
ainda. A funo loop() ento comea a ser executada, acendendo e apagando o
LED. Para contar o nmero de vezes que o LED piscou, ns adicionamos a
seguinte linha de cdigo:

i++; // Incrementa o nmero de "piscadas"


Em seguida utilizamos o if para verificar se acabamos de acender o LED pela
terceira vez. Para isso, usamos a expresso i == 3 na condio do f . Se essa
expresso for verdadeira, isso que dizer que o LED j acendeu 3 vezes, ento
inserimos uma pausa adicional de 5 segundos com a chamada delay(5000) e
reiniciamos a contagem do nmero de "piscadas" novamente com o seguinte
comando:

i = 0; // Reinicia o contador de nmero de


"piscadas"

A partir da a funo loop() continua sendo chamada e o ciclo se inicia


novamente.

If-Else
O if-else, tambm conhecido como if-then-else, pode ser visto como uma
extenso do comando if . Else em ingls significa "caso contrrio", e ele faz
exatamente o que o nome diz: "se isso for verdadeiro, ento faa aquilo, caso
contrrio, faa outra coisa". Ele segue o seguinte formato:

if(condio) {

...

} else {

...

Para exemplificar, vamos usar o programa do for que mostramos acima, mas
vamos dessa vez fazer o LED acender e apagar quatro vezes antes de dar uma
pausa de cinco segundos. Depois vamos fazer com que na terceira de cada uma
dessas quatro "piscadas", o LED acenda por um perodo mais curto. Dentro da
funo loop() , teremos o seguinte:

// Varivel para contar o nmero de vezes que o LED piscou

int i;

// Pisca o LED trs vezes


for(i = 0; i < 3; i++) {

if(i == 2) {

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(200); // Espera 200 milissegundos (um


segundo)

digitalWrite(led, LOW); // Atribui nvel lgico baixo ao pino


do LED, apagando-o

delay(1800); // Espera 1800 milissegundos (um


segundo)

} else {

digitalWrite(led, HIGH); // Atribui nvel lgico alto ao pino do


LED, acendendo-o

delay(1000); // Espera 1000 milissegundos (um


segundo)

digitalWrite(led, LOW); // Atribui nvel lgico 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

Aqui o que fazemos , toda vez que vamos acender o LED, verificar se a terceira
vez que isso acontece, por meio do comando if com a condio i == 2 . Se essa
expresso for verdadeira, isso quer dizer que j acendemos o LED duas vezes e
estamos prestes a acend-lo pela terceira vez; nesse caso mudamos o tempo que
o LED fica acaso para um valor menor, de 0,2 segundo (uma reduo de 0,8
segundo) e o tempo que ele fica apagado para um valor maior, de 1,8 segundos
(aumento de 0,8 segundo).
Mas e se essa no for a terceira vez que o LED est sendo acionado? a que
entra o else : se a condio do if for verdadeira, o bloco de comandos
entre { e } logo aps o if executado, caso contrrio, o bloco
entre { e } aps o else executado. Isso quer dizer que para a primeira,
segunda e quarta "piscadas" ser usado o tempo padro de um segundo.

Bibliotecas

As coisas que aprendemos nas sees anteriores so importantes para


implementar a lgica do seu programa no Arduino, mas normalmente voc vai
querer fazer mais coisas alm de apenas acender um LED. Quando se faz tarefas
mais complexas ou se utiliza algum outro circuito conectado ao seu Arduino, um
recurso muito importante so as bibliotecas.

Uma biblioteca basicamente composta de cdigo fonte adicional que voc


adiciona ao seu projeto por meio do comando include. Vejamos como adicionar,
por exemplo, uma biblioteca para controle de um display de cristal liquido (LCD):

#include <LiquidCrystal.h>

Uma biblioteca do Arduino se apresenta normalmente como uma ou


mais classes que possuem funes, os mtodos, para acionar dispositivos,
configur-los ou executar alguma outra tarefa. Continuando com o exemplo do
display de cristal lquido, para us-lo no seu programa, primeiro preciso inicializ-
lo. O que fazemos nesse caso criar um objeto para acessar o LCD
(tecnicamente isso se chama instanciar um objeto). Vejamos como isso feito:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Quando fazemos isso, lcd se torna um objeto da classe LiquidCrystal . Isso o


equivalente a criar uma varivel do tipo LiquidCrystal . Os parmetros que so
passados entre parnteses servem para inicializar a configurao desse objeto, e
nesse caso correspondem aos nmeros dos pinos que foram utilizados para
conectar o LCD ao Arduino.

Quase sempre as bibliotecas de Arduino possuem um mtodo begin() , que serve


para fazer a configurao inicial do dispositivo que est sendo controlado. Para
chamar a funo begin() do objeto lcd que criamos, fazemos o seguinte:

lcd.begin(16, 2);

Normalmente esse mtodo begin() chamado de dentro da funo setup() , ou


seja, durante a inicializao do programa. Os parmetros do mtodo begin() ,
nesse caso, correspondem ao nmero de colunas e o nmero de linhas do LCD,
respectivamente.

Feitos esses passos, j podemos escrever texto no LCD. Fazemos isso usando o
mtodo print() do objeto lcd , sempre que precisarmos ao longo do programa:

lcd.print("Oi!");

O mtodo print() apenas um dos vrios mtodos disponveis na


blblioteca LiquidCrystal . Para saber todos os mtodos fornecidos por uma
determinada biblioteca, preciso consultar a documentao fornecida com ela.

Este o processo bsico de utilizao de bibliotecas no Arduino. Para mais


informaes, leia a documentao fornecida com a biblioteca que voc est
usando.

Classes, objetos e mtodos so conceitos de programao orientada a objetos.


No vamos explicar tudo em detalhes aqui, mas se voc quiser aprender mais
sobre isso, siga os links relacionados no final da pgina.

Concluso

Neste tutorial ns vimos os conceitos bsicos de programao necessrios para


programar um Arduino ou mesmo outras plataformas de hardware embarcado.
Mas isso s o comeo, e ainda h muitas coisas a se aprender, tanto na parte de
hardware quanto na parte de software. Segue ento uma lista para outros artigos e
tutoriais interessantes para que voc possa aprender conceitos mais avanados e
expandir as suas possibilidades: