You are on page 1of 18

A linguagem de Programao do Arduino

A estrutura bsica da linguagem de programao do Arduino bastante simples; ela


formada por dois blocos principais de funes, setup( ) e loop( ) , que embutem
comandos da linguagem e outros blocos de funes escritos em C/C++. Junto com
esses dois blocos podem vir outras funes independentes criadas pelo programador,
alm de declaraes de variveis e importaes de bibliotecas externas e comentrios.
Funes em linguagens de programao so como sub-rotinas ou procedimentos; so
pequenos blocos de programas usados para montar o programa principal. Elas so
escritas pelo programador para realizar tarefas repetitivas, ou podem ser importadas
prontas para o programa principal em forma de bibliotecas.
Declarao da Funo: Toda funo deve ser declarada antes de ser chamada
atribuindo-lhe um tipo e um nome seguido de parnteses, onde sero colocados
os parmetros de passagem da funo. Depois do nome so definidos entre as chaves
'{' e '}' os procedimentos que a funo vai executar.

setup( ): Esta uma funo de preparao, ela encapsula duas ou trs outras
funes que ditam o comportamento dos pinos do Arduino e inicializam a porta serial.
a primeira funo a ser chamada quando o programa inicia e executada apenas nessa
primeira vez.

loop( ): Essa a funo de execuo, ela embute qualquer nmero de outras


funes que so executadas repetidamente; chamada logo depois da funo setup(
) e fica lendo os pinos de entrada do Arduino e comandando os pinos de sada e a
porta serial.

Exemplos:
Exemplo 1:
Nesse cdigo a funo
funo loop(
segundos:

setup( ) ativa a porta serial em 9600 bits/s e a

) fica transmitindo a frase "Hello World!" pela porta serial a cada 2

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

//inicializa a porta serial

void loop( )
{
Serial.println(Hello World!);
delay(2000);

//transmite a frase
//pela serial...
//a cada 2000 mS.

}
Exemplo 2:

Neste programa uma funo criada


pelo programador, ledOn() ,
aumenta e diminui repetida e
gradativamente o brilho de um LED em
srie com um resistor de 1Kohm
conectado no pino PWM 10 do Arduino:

int i=0;
void ledOn( );

//declarao da varivel global inteira


//iniciada com 0
//declarao da funo criada ledOn do
//tipo void

void setup( )
{
pinMode(10,OUTPUT); //pino e seu modo de operao
//so passados funo pinMode()
}
void loop( )
{
for (i=0; i <= 255; i++)
{
ledOn( ); //aumenta o brilho do led
}
for (i=255; i >= 0; i--)
{
ledOn( ); //diminui o brilho do led
}
void ledOn( )
//funo que acende/apaga o led
{
analogWrite (10, i); //pino e o valor de i so
//passados funo analogWrite()
delay (10);
}
}

Smbolos Usados na Linguagem


Os Smbolos usados na construo de funes em C so os seguintes:

{ } - Dentro das chaves vo os procedimentos que a funo deve executar;

; - O ponto-e-vrgula usado para marcar o final de um procedimento;

// - comentrio de uma linha: tudo depois das duas barras ignorado;

/*...*/ - comentrio em vrias linhas: tudo entre esses smbolos ignorado.

Constantes
Constantes so valores predefinidos que nunca podem ser alterados. Na
linguagem C do Arduino so 3 os grupos de constantes; os dois componentes de cada
grupo sempre podem ser representados pelos nmeros binrios 1 e 0.

TRUE/FALSE so constantes booleanas (1 e 0) que definem estados lgicos.


Verdadeiro qualquer valor diferente de zero. Falso sempre o valor zero.

HIGH/LOW essas constantes definem as tenses nos pinos digitais do Arduino.


A constante High (alto) pe uma tenso de 5 volts no pino selecionado; a
constante Low (baixo) pe terra (ou 0 volt) nesse pino.

INPUT/OUPUT so constantes programadas pela funo pinMode( ); para os


pinos do Arduino; eles podem ser programados como entradas (de sensores) ou
podem ser programados como sadas (de controle).

Variveis
Variveis so posies na memria de programa do Arduino marcadas com um nome e
o tipo de informao que iro guardar. Essas posies podem estar vazias ou podem
receber um valor inicial. Os valores das variveis podem ser alterados pelo programa.
Escopo da Varivel o limite ou abrangncia da varivel. Uma varivel pode ser
declarada em qualquer parte do programa. Se for declarada logo no incio, antes da
funo setup( ), ela tem o escopo de Varivel Global, e por isso ela pode ser vista e
usada por qualquer funo no programa. Se declarada dentro de uma funo ela tem o
escopo de Varivel Local, e s pode ser usada por essa funo.
Toda varivel deve ser declarada antes de ser chamada. Essa declarao consiste em
atribuir previamente um tipo e um nome varivel.
Tipos de variveis

byte - esse tipo armazena 8 bits (0-255);


int - armazena nmeros inteiros de at 16 bits;

long - armazena nmeros inteiros de at 32 bits;


float - variveis deste tipo podem armazenar nmeros fracionrios de at 32 bits.

Matrizes
Matrizes so colees de variveis de um mesmo tipo, portanto so posies na
memria de programa; cada uma com um endereo, um identificador, chamado
de ndice. A primeira posio de uma matriz sempre a de ndice 0.
Declarao de uma Matriz: As matrizes, como as variveis e as funes, devem ser
declaradas com um tipo e um nome seguido de colchetes; e podem tambm ser
inicializadas com os valores entre as chaves.
Exemplo:

int nomeMatriz [ ] = {16,32,64,128,...};


Pode-se tambm declarar somente o tipo, o nome e o tamanho da matriz, deixando
para o programa o armazenamento de variveis nas posies, ou ndices, da matriz.
Exemplo:

int nomeMatriz [ 10 ] ;

//nomeMatriz com dez 10 posies para


//variveis inteiras

Escrever e ler uma Matriz:


Para guardar o inteiro

16 na 4 posio da matriz nomeMatriz, usa-se:

nomeMatriz [3] = 16;


Para atribuir o valor armazenado na 5 posio de

nomeMatriz varivel x:

int x = nomeMatriz[4];

Operaes Aritmticas e lgicas


As 4 operaes aritmticas, diviso, adio, multiplicao e subtrao, so
representadas pelos smbolos: /, +, *, e -, respectivamente, separando os operandos:

x
x
x
x
x
x

=
=
=
=
=
=

x
x
x
x
x
x

*
/

1;
1;
y;
y;
y;
y;

//O
//O
//O
//O
//O
//O

que
que
que
que
que
que

igual
igual
igual
igual
igual
igual

a:
a:
a:
a:
a:
a:

=
=
=
=
=
=

x++
x-x+=y
x-=y
x*=y
x/=y

E so 3 os operadores lgicos na linguagem do Arduino que so usados para comparar


duas expresses e retornar 1 ou 0 (TRUE/FALSE):

&&
||
!

AND
OR
NOT

porta lgica E
porta lgica OU
porta lgica NO

Os smbolos compostos combinam os smbolos aritmticos com o sinal de atribuio e


comparam uma varivel com uma constante, ou variveis entre si, para testar uma
condio:

x
x
x
x
x
x

== y;
!= y ;
< y;
> y;
<= y;
>= y;

//
//
//
//
//
//

x
x
x
x
x
x

igual a y?
no igual a y?
menor que y?
maior que y?
menor ou igual a y?
maior ou igual a y?

Funes de Matemtica e Tempo


delay(ms); Essa funo pausa o programa por um perodo em milissegundos
indicado pelo parmetro entre parnteses.
Exemplo:

delay(1000);

//Com esse parmetro o programa vai pausar


//durante 1 segundo (1000 ms).

Nota: Durante o perodo em que essa funo est ativa qualquer outra funo no
programa suspensa; equivalente ao HALT em Assembly. Somente as interrupes
de hardware podem parar essa funo.

delayMicroseconds(us); Essa funo pausa o programa por um perodo


em microssegundos indicado pelo parmetro entre parnteses.
Exemplo:

delayMicroseconds(1000); //Com esse parmetro o programa


//vai pausar durante 1 ms (1000us).

millis( ); Retorna o nmero de milissegundos desde que o Arduino comeou a


executar o programa corrente.
Exemplo:

long total = millis( );

//Aqui a varivel inteira longa de


//32 bits) total vai guardar o
//tempo em ms desde que o Arduino
//foi inicializado.

random(min,max); Gera nmeros pseudo-aleatrios entre os limites min e max


especificados como parmetros.
Exemplo:

int valor = random(100,400); //A varivel inteira valor


//vai assumir um valor
//aleatrio entre 100 e 400.
Nota: O parmetro

min opcional e se excludo o limite mnimo 0.

abs(x); Retorna o mdulo ou valor absoluto do nmero real passado como


parmetro.
Exemplo:

float valor = abs(-3.14);

// varivel valor vai ser


//atribudo o nmero em ponto
//flutuante (e sem sinal) 3.14.

map(valor,min1,max1,min2,max2); A funo map( ) converte uma faixa de


valores para outra faixa. O primeiro parmetro valor a varivel que ser convertida;
o segundo e o terceiro parmetros so os valores mnimo e mximo dessa varivel; o
quarto e o quinto so os novos valores mnimo e mximo da variavel valor.
Exemplo:

int valor = map(analog Read(A0),0,1023,0,255));


/*
A varivel valor vai guardar a leitura do nvel analgico no
pino A0 convertida da faixa de 0-1023 para a faixa 0-255. Com
essa funo possvel reverter uma faixa de valores,
exemplo:
int valor = map(x,1,100,100,1);
*/

Controles de Fluxo
O comando if
O comando if um controle de fluxo
usado para selecionar uma ou mais
instrues baseado no resultado de um
teste de comparao. Todas as
instrues entre as chaves '{' e '}' so
executadas somente se o resultado
desse teste for verdadeiro; se no,
essas instrues no so executadas.
Verdadeiro qualquer resultado,
mesmo negativo, diferente de zero.
Falso um resultado zero.

Sintaxe:

if (expresso)
{
bloco de instrues;
}
//se expresso for verdadeira, bloco de instrues
//executado.

O comando if...else
Ao se acrescentar mais um bloco de
instrues no loop do comando if
pode-se criar o comando
if...else, para fazer um teste
novo quando o resultado da
expresso for falsa.

Sintaxe:

if (expresso)
{
bloco de instrues1;
}
//se expresso for verdadeira, bloco de instrues1
//executado
else
{
bloco de instrues2;
}
//se expresso for falsa, bloco de instrues2
//executado

O comando if...else...if
E de novo ao se acrescentar
agora o comando if...else
no loop do comando if podese criar mais um outro
comando,
o if...else...if.
No exemplo abaixo, se

expresso1 for verdadeira o


bloco de instrues1
executado; se expresso1
for falsa mas expresso2 for
verdadeira bloco de
instrues2 executado; e
se expresso1 e
expresso2 forem falsas o
bloco de instrues3
executado.

Sintaxe:

if (expresso1)
{
bloco de comandos1;
}
else if (expresso2)
{
bloco de instrues2;
}
else
{
bloco de comandos3;
}

O comando switch...case

possvel ir inserindo
comandos if...else na
posio do segundo bloco de
instrues de outro comando
if...else e assim criar uma
cadeia de comandos para
testar dezenas de expresses
at encontrar uma que retorne
um resultado verdadeiro e
executar um dos blocos de
instrues. Mas existe um
comando prprio que simplifica
bastante essa seleo, o
comando switch...case.
Esse comando permite
comparar uma mesma varivel
inteira, ou uma expresso que
retorne um inteiro, com vrios
valores possveis pr-definidos.

Sintaxe:

switch (expresso)
{
case constante1:
bloco de instrues1;
break;
case costante2:
bloco de instrues2;
break;
case constante3:
bloco de instrues3;
break;
default:
bloco de instrues4;
}

O comando while

Uma das operaes mais frequentes que os programas executam repetir um bloco de
instrues at que uma condio inicialmente verdadeira se torne falsa. para isso que
serve o comando while.

Sintaxe:

while (expresso)
{
bloco de instrues;
}
//O bloco de instrues ser executado
//enquanto o parmetro expresso for verdadeiro.

O comando do...while

Para que o bloco de instrues seja executado ao menos uma vez, ele deslocado para
a entrada da caixa de decises, antes do teste de validade, cria-se o
comando do...while:

Sintaxe:

do
{
bloco de instrues;
}
while (expresso);
//Aqui o bloco de instrues ser executado primeiro
//e s ento o parmetro expresso avaliado.

O comando for

Inserindo-se no loop do comando while um contador que registre cada execuo do


bloco de instrues cria-se o comando for. Esse contador deve conter uma varivel de
controle que deve ser previamente inicializada com um tipo e um valor.

Sintaxe:

for (varivel; expresso; incremento)


{
bloco de instrues;
}

A varivel de controle inicializada normalmente com 0 ou 1; o parmetro expresso


deve conter o valor mximo (ou mnimo) que o contador deve alcanar; e incremento
o valor que ser incrementado (ou decrementado) da varivel cada vez que o bloco de
instrues executado. Observe que cada parmetro entre parnteses separado por
ponto e vrgula.

O operador ternrio '?'

possvel simplificar cdigos com comandos if...else em C/C++ com o operador


condicional ?, tambm chamado de operador ternrio '?'. Esse operador avalia uma
expresso e se esta for verdadeira uma instruo executada, se a expresso for falsa
uma outra expresso executada. A sua sintaxe a seguinte:
Sintaxe:

(expresso) ? instruo1 : instruo2;

Exemplo:

int x = 8;
y = (x > 10) ? 15 : 20;

Aqui o valor de y vai depender da avaliao da expresso do operador ternrio; como o


valor de x vale 8, a expresso (x>10) falsa, por isso o inteiro 20 ser atribudo a y;
se o valor atribudo a x fosse maior que 10, y seria 15. Essa mesma expresso com o
comando if...else ficaria assim:

int x = 8;
if (x > 10)
{
y = 15;
}
else
y = 20;

Entradas e Sadas do Arduno

Os Pinos de Alimentao
Ficam na barra com 6 pinos, marcada como POWER, localizada ao lado dos pinos
analgicos. O primeiro pino dessa barra, RESET, quando forado ao potencial de terra
serve para resetar o Arduino. Do outro lado, Vin um pino que tambm pode servir
para alimentar o Arduino se nele for aplicada uma tenso entre 9 e 15 volts.
Dos 6 pinos dessa barra somente os quatro do meio servem para alimentar um circuito
externo conectado ao Arduino: o pino de 5V e o terra (os dois pinos Gnd entre 5V e
Vin); e o pino 3V3 que disponibiliza essa tenso com uma corrente mxima de 50mA.

A Porta USB
por meio da porta serial USB que o Arduino se comunica atravs de um cabo a um
computador ou a outros dispositivos que tenham tambm uma interface USB.
tambm por esse conector que o Arduino recebe 5 volts diretamente da fonte de
alimentao do computador.
Funes em C para a porta serial:

Serial.begin(taxa);
Essa funo habilita a porta serial e fixa a taxa de transmisso e recepo em
bits por segundo entre o computador e o Arduino.
Exemplo:

Serial.begin(9600);
/* A porta serial habilitada em 9600 bps.
Os pinos digitais 0 e 1 no podem ser utilizados como
entrada ou como sada de dados quando a porta serial
habilitada por essa funo. */

Serial.end( );
Desabilita a porta serial para permitir o uso dos pinos digitais 0 e 1 para entrada
ou sada de dados.
Como a funo anterior, essa funo deve ser sempre escrita dentro de
setup( ) .

Serial.avaliable( );
Retorna o nmero de bytes disponveis para leitura no buffer da porta serial.
Exemplo:

int total=Serial.available( );
/*Aqui a varivel inteira total vai guardar o nmero de
caracteres que esto disponveis para leitura na porta
serial.
O valor 0 retornado quando no h nenhuma informao
para ser resgatada na porta serial.
*/

Serial.read( );
Essa funo l o primeiro byte que est no buffer da porta serial.
Exemplo:

int valor = Serial.read( );


/*Aqui a varivel inteira valor vai guardar o primeiro
byte (caractere) disponvel na porta serial.
O valor -1 retornado quando no h nenhuma informao
para ser resgatada na porta serial.
*/

Serial.print( );
Envia para a porta serial um caractere ASCII, que pode ser capturado por um
terminal de comunicao. O segundo parmetro, formato, opcional e
especifica com quantas casas decimais ou com que base numrica vai ser o
nmero transmitido.
Exemplos:

Serial.print(1.23456);
Serial.print(1.23456,3);
Serial.print(Al Mundo!);
Serial.print(A);
Serial.print(A,BIN);
Serial.print(A,OCT);
Serial.print(A,HEX);
Serial.print(A,DEC);

//
//
//
//
//
//
//
//

transmite
transmite
transmite
transmite
transmite
transmite
transmite
transmite

1.23 (default)
1.234
a frase (string)
o caractere A
01000001
o octal 101
o hexa 41
o decimal 65

Serial.println();
Como a anterior, essa funo envia para a porta serial um caractere ASCII com
os mesmos parmetros opcionais de formato, porem acrescenta ao final da
transmisso o caractere Carriage Return (retorno ao incio da linha) e o
caractere New Line (mudana para a prxima linha).

Os Pinos Analgicos
A0~A5: So 6 pinos em uma s barra com o nome ANALOG IN, localizada no lado
oposto s barras dos pinos digitais. So numerados de 0 a 5, da esquerda para a
direita. Esses pinos so usados para leitura de sinais analgicos de sensores conectados
ao Arduino, e podem ser de quaisquer valores entre 0 a 5 volts. Os pinos analgicos
no precisam ser previamente configurados com a funo pinMode( ); .

Funo em C para os pinos analgicos:

analogRead(pino);
Essa funo l o nvel analgico presente no pino indicado pelo parmetro entre
parnteses e, aps a converso para o seu equivalente em bits, o guarda em
uma varivel determinada pelo programador.
Exemplo:

int sensor = analogRead(A0);


/* Aqui a varivel inteira sensor vai armazenar a
tenso analgica convertida para digital presente no pino
A0. Essa informao vai ser um valor inteiro entre 0
(para 0 volt no pino) e 1023 (se 5 volts no pino).
*/
Os pinos analgicos so reconhecidos pela linguagem do Arduino tanto como A0
a A5 como 14 a 19. Assim, a mesma expresso acima pode ser escrita tambm
da seguinte forma: int sensor = analogRead(14);
Obs.: Esses pinos analgicos podem ser configurados tambm como pinos
digitais pela funo pinMode( ); , aumentando assim o nmero desses pinos
de 14 para 20.

Os Pinos Digitais
0~13: So 14 pinos marcados com o nome DIGITAL logo abaixo de duas barras de 8
pinos. So numerados de 0 a 13 da direita para a esquerda e podem ser configurados
pela funo pinMode( ); para detectarem ou transmitirem nveis lgicos digitais
(verdadeiro/falso, 1/0 ou HIGH/LOW).
AREF e GND: O pino AREF a entrada de tenso de referncia para o conversor A/D
do Arduino; o pino GND o terra, comum a todos os outros pinos.

PWM: 6 dos 14 pinos digitais (marcados com '~') podem ser usados para gerar sinais
analgicos com a funo analogWrite( ); utilizando a tcnica de Modulao por
Largura de Pulso (PWM).
Pinos 0 e 1: Os dois primeiros pinos digitais so conectados a USART do
microcontrolador do Arduino para comunicao serial com um computador.
Pinos 2 e 3: Pinos que chamam uma ISR (Interrupt Service Routine) para tratar uma
interrupo de hardware com a funo attachInterrupt( ); nesses pinos.
Funes em C para os pinos digitais:

pinMode(pino,modo);
Serve para estabelecer a direo do fluxo de informaes em qualquer dos 14
pinos digitais. Dois parmetros devem ser passados funo: o primeiro indica
qual pino vai ser usado; o segundo, se esse pino vai ser entrada ou se vai ser
sada dessas informaes.
Exemplo:

pinMode(2,OUTPUT);
/* Aqui o pino 2 selecionado para transmitir
informaes do Arduino para um circuito externo qualquer.
Para configurar esse pino como entrada, o segundo
parmetro dessa funo deve ser INPUT.
*/

digitalRead(pino);
Uma vez configurado um certo pino como entrada com a funo pinMode( ); , a
informao presente nesse pino pode ser lida com a funo digitalRead( ); e
armazenada numa varivel qualquer.
Exemplo:

int chave = digitalRead(3);


/* Nesse exemplo a varivel inteira chave vai guardar o
estado lgico (verdadeiro/falso) presente no pino digital
3. */

digitalWrite(pino,valor);
Para enviar um nvel lgico para qualquer pino digital do Arduino utiliza-se essa
funo. Dois parmetros so requeridos: o nmero do pino e o estado lgico
(HIGH/LOW ) em que esse pino deve permanecer.
Exemplo:

digitalWrite(2,HIGH);
/* Aqui uma tenso de 5 volts colocada no pino 2. Para
enviar terra para esse pino o segundo parmetro dever
ser LOW. */

analogWrite(pino,valor);
O Arduino pode gerar tenses analgicas em 6 de seus 14 pinos digitais com a
funo analogWrite( );. Dois parmetros devem ser passados funo: o

primeiro indica em qual pino ser gerada a tenso; o segundo determina a


amplitude dessa tenso, e deve ter valores entre 0 (para 0 volt) e 255 (para 5
volts).
Exemplo:

analogWrite(10,128);
/* Com esses parmetros uma tenso analgica de 2,5 volts
vai aparecer no pino 10. No necessrio configurar um
pino PWM como sada com a funo pinMode( ); quando se
chama funo analogWrite( ); .
*/

attachInterrupt(pino,funo,modo);
Essa funo uma rotina de servio de interrupo, ou ISR (Interrupt Service
Routine). Toda vez que ocorrer uma interrupo por hardware no pino digital 2
ou no 3 do Arduino uma outra funo, criada pelo programador, vai ser
chamada. O terceiro parmetro, modo, informa como a interrupo vai ser
disparada, se na borda de subida do pulso detectado no pino do Arduino, se na
borda de descida, se quando o pulso for baixo ou se na mudana de nvel desse
pulso.
Exemplo:

attachInterrupt(0,contador,RISING);
/* Nesse exemplo a funo contador vai ser chamada
quando o Arduino detectar uma mudana do nvel LOW para o
nvel HIGH em seu pino 2. Nessa ISR o parmetro 0
monitora o pino 2, o parmetro 1 monitora o pino 3.
*/

pulseIn(pino,valor,espera);
Essa funo mede em microssegundos a largura de um pulso em qualquer pino
digital. O parmetro valor diz funo que tipo de pulso deve ser medido, se
HIGH ou LOW. O parmetro espera (time out) opcional e se passado funo
faz com que a medida do pulso s comece aps o tempo em microssegundos ali
especificado.
Exemplo:

pulseIn(4,HIGH);
/* Aqui essa funo vai monitorar o pino 4, e quando o
nvel nesse pino mudar de LOW para HIGH a sua largura vai
ser medida at que seu nvel volte para LOW. Se, por
exemplo, for passado o valor 100 como terceiro parmetro,
a medida da largura do pulso s ser disparada aps 100
S. */