Você está na página 1de 87

Universidade Federal Fluminense - UFF

Escola de Engenharia - TCE


Curso de Engenharia de Telecomunicaes - TGT
Programa de Educao Tutorial - PET
Grupo PET-Tele

Tpicos Especiais em Eletrnica II

Introduo ao microcontrolador Arduino


Apostila de programao
(Verso: A2014M05D02)

Autor:

Roberto Brauer Di Renna


Lorraine de Miranda Paiva

Tutor:

Alexandre Santos de la Vega

Niteri - RJ
Fevereiro / 2014

Universidade Federal Fluminense

Sumrio
1 Estrutura

1.1

setup() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2

loop()

1.3

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

1.3.1

Estruturas de controle

if e operadores de comparao . . . . . . . . . . . . . . . . . . . . . . . .

10

1.3.2

if / else

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

1.3.3

for

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

1.3.4

switch / case

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

1.3.5

while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

1.3.6

do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

1.3.7

break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

1.3.8

continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

1.3.9

return

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

Elementos de sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

1.4.1

; - ponto e vrgula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

1.4.2

{} - Chaves

18

1.4.3

//

1.4.4

dene

1.4.5

1.3.10 goto
1.4

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

- Comentrios

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

1.5

Operadores aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

1.6

Operadores de comparao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

1.7

Operadores Booleanos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

1.8

Operadores de ponteiro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

1.9

Operadores bit a bit (

23

1.9.1

Bitwise

E (AND) (&),

(XOR) ()
1.9.2
1.9.3

Bitwise )

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

Bitwise

OU (OR) (|),

Bitwise

OU EXCLUSIVO

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

. . . . . . . . . . . . . . . . . . .

26

Bitwise NOT() . . . . . . . . . . . .
Bitshift left (<<), Bitshift right (>>) .

. . . . . . . . . . . . . . . . . . .

26

1.10 Operadores de composio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

1.10.1 Incremento e decremento . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

1.10.2 Operaes compostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

2 Variveis
2.1

31

Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.1

true

2.1.2

HIGH

false . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

LOW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31
31
31

Sumrio

2.2

Sumrio

2.1.4

LED BUILTIN

2.1.5

Constantes inteiras

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

2.1.6

Constantes de ponto utuante . . . . . . . . . . . . . . . . . . . . . . . .

34

Tipos de dados

2.4

2.5

OUTPUT

INPUT

INPUT PULLUP . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

2.2.2

boolean

2.2.3

char

2.2.4
2.2.5

byte

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

2.2.6

int

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

2.2.7

unsigned int . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

2.2.8

word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

2.2.9

long

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

unsigned char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

2.2.10 unsigned long . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

2.2.11 short . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

2.2.13 double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

2.2.14 string - char array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

2.2.15 String - object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

2.2.16 array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

Converso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

2.3.1

char()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

2.3.2

byte()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

2.3.3

int()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

2.3.4

word() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

2.3.5

long()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

2.3.6

oat()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

Escopo de variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

2.4.1

Escopo de uma varivel . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

2.4.2

Estticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

2.4.3

Voltil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

2.4.4

Constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

Utilitrios

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

sizeof() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

3 Funes

3.2

33

void

2.5.1

3.1

32

2.2.1

2.2.12 oat

2.3

2.1.3

51

Entrada e sada digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

3.1.1

pinMode() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

3.1.2

digitalWrite() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52

3.1.3

digitalRead()

52

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Entrada e sada analgica

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

3.2.1

analogReference() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

3.2.2

analogRead()

54

3.2.3

analogReadResolution()

3.2.4

analogWrite() -

3.2.5

analogWriteResolution()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

PWM

Universidade Federal Fluminense

. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .

55
56
57

Sumrio
3.3

3.4

3.5

3.6

3.7

3.8

3.9

Sumrio
Entrada e sada avanada

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.3.1

Tone() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

3.3.2

noTone() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

3.3.3

shiftOut() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

3.3.4

shiftln

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

3.3.5

pulseln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

Temporizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

3.4.1

millis() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

3.4.2

micros()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66

3.4.3

delay() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66

3.4.4

delayMicroseconds()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

Funes matemticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

3.5.1

min() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

3.5.2

max()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

69

3.5.3

abs() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

3.5.4

constrain() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

3.5.5

map()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

3.5.6

pow()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

3.5.7

sqrt()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

3.5.8

sin()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

3.5.9

cos() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

3.5.10 tan() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

3.5.11 randomSeed() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

3.5.12 random()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

74

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

Bits e bytes
3.6.1

lowByte()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.6.2

highByte() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

3.6.3

bitRead()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

3.6.4

bitWrite() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

3.6.5

bitSet()

3.6.6

bitClear()

3.6.7

bit()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

77

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

Interrupes externas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

3.7.1

attachInterrupt()

78

3.7.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

detachInterrupt() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

Interrupes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

3.8.1

interrupts()

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

3.8.2

noInterrupts() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

Comunicao

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

81

3.9.1

Serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

81

3.9.2

Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

82

3.10 USB (apenas Arduinos Leonardo e Due)


3.10.1 Teclado e

mouse

. . . . . . . . . . . . . . . . . . . . . .

83

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

A Apndice
A.1

60

85

Tabela ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Universidade Federal Fluminense

85

Sumrio

Universidade Federal Fluminense

Sumrio

Lista de Figuras
A.1

Tabela ASCII - parte 1.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

A.2

Tabela ASCII - parte 2.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

Lista de Figuras

Universidade Federal Fluminense

Lista de Figuras

Captulo 1
Estrutura
1.1

setup()

A funo

setup()

chamada quando um programa comea a rodar. usada para inicializar

as variveis, os tipo dos pinos, declarar o uso de bibliotecas, entre outros.

Esta funo ser

executada apenas uma vez aps a placa Arduino ser ligada ou reiniciada.

Exemplo

int buttonPin = 3;
void setup(){

Serial.begin(9600);
pinMode(buttonPin, INPUT);

void loop(){
// ...
}

1.2

loop()

Aps criar uma funo

setup() que declara os valores iniciais, a funo loop() faz exatamente

o que seu nome sugere, entra em

looping (executa sempre o mesmo bloco de cdigo), permitindo

ao seu programa fazer mudanas e responder. Esta funo usada para controlar ativamente
a placa Arduino.

Exemplo
int buttonPin = 3;

Captulo 1. Estrutura

1.3. Estruturas de controle

// setup inicializa o serial e o pino do button (botao)


void setup(){

beginSerial(9600);
pinMode(buttonPin, INPUT);

// loop checa o botao a cada vez,


// e envia o serial se ele for pressionado
void loop(){
if (digitalRead(buttonPin) == HIGH)
serialWrite('H');
else
serialWrite('L');
}

delay(1000);

1.3

Estruturas de controle

1.3.1 if e operadores de comparao


Essa estrutura, que usada em conjunto com um operador de comparao, testa alguma condio imposta pelo programador. Para testar se o valor de uma varivel maior do que 100
por exemplo,

if (variavel > 100){


}

// faa algo aqui

O programa testa se

variavel

maior do que 100.

Se for, o programa executa a ao

seguinte. Caso contrrio, o programa ignora a ao dentro das chaves e segue a rotina. Caso a
ao tenha apenas uma linha, as chaves podem ser omitidas.
Para fazer as comparaes, necessria a utlilizao dos operadores da Tabela1.3

Universidade Federal Fluminense

10

Captulo 1. Estrutura

1.3. Estruturas de controle


Tabela 1.1: Operadores de comparao.

Operador

Operao

==
!=
<
>
<=
>=

Igual a
Diferente de
Menor que
Maior que
Menor ou igual a
Maior ou igual a

1.3.2 if / else
A estrutura

if/else

fornece um controle maior sobre o cdigo do que simplesmente o

if,

permitindo mltiplos testes agrupados. Por exemplo, uma entrada analgica poderia se testada
e uma ao executada caso o valor fosse menor do que 500. Caso seja maior ou igual a 500,
executaria a segunda ao.

if (analog < 500){


// ao A
}
else{
// ao B
}
Tambm possvel colocar uma condio logo aps do

else.

No h limites de condies a

serem colocadas.

if (analog < 500)


{
// ao A
}
else if (analog >= 1000)
{
// ao B
}
else
{
// ao C
}
Outra forma de se fazer condies com a estrutura da subseco 1.3.4, o

Universidade Federal Fluminense

11

swich case.

Captulo 1. Estrutura

1.3. Estruturas de controle

1.3.3 for
For

chamada de estrutura de lao, pois cada bloco de programa se repete uma determinada

quantidade de vezes. Um contador normalmente usado para terminar e dar ritmo ao

loop.

til para qualquer operao que se repita. Uma aplicao comum operaes com vetores.

Sintaxe:
for (inicializao; condio; incremento) {
//ao;
}
A inicializao comea pela primeira e nica vez. Cada vez que iniciar um novo

loop,

condio testada. Se for verdadeira, a ao executada e a varivel de passo incrementada.


Quando a condio se tornar falsa, o

loop

termina.

Exemplo

// Escurecer um LED usando um pino a PWM


int PWMpin = 10; // LED em srie com um resistor de 470 ohm no pino 10
void setup(){
// no h necessidade de setup
}
void loop(){
for (int i=0; i <= 255; i++){
analogWrite(PWMpin, i);
delay(10);
}
}

Dica de cdigo
C uma linguagem que possibilita ao usurio maior conforto do que outras linguagens para
realizar determinadas aes. Uma delas o

loop.

possvel que, para inicializao, condio,

e incremento podem ser quaisquer declaraes vlidas em C e fazer uso de variveis ??independentes, alm de utilizar quaisquer tipos de dados, incluindo o tipo
solues para alguns problemas complicados de programao.

Universidade Federal Fluminense

12

oat.

Isso pode fornecer

Captulo 1. Estrutura

1.3. Estruturas de controle

Por exemplo, multiplicar o incremento gerando uma progresso logartmica:

for(int x = 2; x < 100; x = x * 1.5){


println(x);
}
Gera: 2,3,4,6,9,13,19,28,42,63,94.
Outro exemplo, enfraquecer e aumentar a luz de um LED:

void loop(){
int x = 1;
for (int i = 0; i > -1; i = i + x){
analogWrite(PWMpin, i);
if (i == 255) x = -1;
//troca a direo do pico
delay(10);
}
}

1.3.4 switch / case


Como a estrutura

if, switch...case

controla os programas permitindo os programadores

especicar diferentes cdigo que podero ser executados em diferentes condies. Em particular,
a estrutura do

switch compara o valor da varivel com o valor em cada caso especco.

Quando

o caso encontrado, ou seja, o valor o da varivel, a ao correspondente executada.


A palavra reservada

case.

Sem o

break,

break

interrompe o

a estrutura do

switch

switch,

e tpicamente usado no nal de cada

ir ser executada at encontrar uma interrupo,

ou o nal das comparaes.

Example

switch (var) {
case 1:
//faa algo quando var equivale a 1
break;
case 2:
//faa algo quando var equivale a 2
break;
default:
// se nenhuma comparao for verdadeira, faz-se o padro
// o padro pode ou no, existir
}

Universidade Federal Fluminense

13

Captulo 1. Estrutura

1.3. Estruturas de controle

Sintaxe
switch (var) {
case label:
// ao
break;
case label:
// ao
break;
default:
// ao
}

Parmetros
var: a varivel que ser comparada
label: o valor que ser comparado com a varivel var

1.3.5 while
O lao do

while acontece innitamente at que a expresso dentro dos parnteses se torne falsa.

Algo deve ser modicado ao testar a varivel para o trmino do

loop, caso contrrio ele nunca

terminar.

Sintaxe

while(expresso){
// ao
}

Parmetros
expresso - A estrutura (booleana)de C que verica se verdadeiro ou falso.

Exemplo
var = 0;
while(var < 200){
// faa algo duzentas vezes
var++;
}

Universidade Federal Fluminense

14

Captulo 1. Estrutura

1.3. Estruturas de controle

1.3.6 do-while
Muito parecido com o
do

while,

o do-while possui a diferena que sua condio testada ao nal

loop, assim executando a ao garantidamente uma vez.

Sintaxe
do{

// bloco de aes
} while (teste de condio);

Exemplo
Leitura de algum sensor:

do{
delay(50);
x = readSensors();

// esperar sensores estabilizarem


// leitura de sensores. far 100 leituras

} while (x < 100);

1.3.7 break
Interrompe alguma condio de

Exemplo

loop.

Tambm usado na estrutura de

for (x = 0; x < 255; x ++){


digitalWrite(PWMpin, x);
sens = analogRead(sensorPin);
if (sens > threshold){
x = 0;
break;
}
delay(50);
}

Universidade Federal Fluminense

15

switch.

Captulo 1. Estrutura

1.3. Estruturas de controle

1.3.8 continue
Ignora o resto da iterao atual de um
cional do

loop. continue

continua marcando a expresso condi-

loop, e prossegue com as iteraes subsequentes.

Exemplo

for (x = 0; x < 255; x ++){


if (x > 40 && x < 120){
continue;
}

digitalWrite(PWMpin, x);
delay(50);

1.3.9 return
Termina a funo e retorna um valor de uma funo para a funo de chamada.

Sintaxe
return;
return valor; // ambas as formas so vlidas

Parmetros
valor:

qualquer varivel ou constante, de qualquer tipo.

Exemplos:
int checkSensor(){
if (analogRead(0) > 400) {
return 1;
else{
return 0;
}
}

Universidade Federal Fluminense

16

Captulo 1. Estrutura

1.3. Estruturas de controle

Dica de cdigo
return

til para testar partes de cdigo ao invs de fazer um bloco de comentrio.

void loop(){
// Ideia brilhante de cdigo aqui
return;
// resto do cdigo intil
// essa parte nunca ser executada
}

1.3.10 goto
Transfere o uxo do programa para um ponto especco do mesmo programa.

Sintaxe

label:
goto label; // envia o fluxo do programa para o label

Dica de cdigo
Alguns autores desencorajam o uso do

goto em C alegando nunca ser necessrio, no entanto,

pode simplicar certos programas. Uma dessas situaes de encerrar longos

loops

ou blocos

lgicos, com uma determinada condio./ A razo pela qual muitos programadores desaprovam, que com o uso desenfreado de instrues

goto,

fcil criar um programa com o uxo

do programa indenido, o que nunca pode ser depurado.

Exemplo
for(byte r = 0; r < 255; r++){
for(byte g = 255; g > -1; g--){
for(byte b = 0; b < 255; b++){
if (analogRead(0) > 250){ goto bailout;}
}
}
}
bailout:

Universidade Federal Fluminense

17

Captulo 1. Estrutura

1.4

1.4. Elementos de sintaxe

Elementos de sintaxe

1.4.1 ; - ponto e vrgula


Usado ao terminar uma linha.

Exemplo
int a = 13;

Dicas de cdigo
Terminar uma linha sem o ponto e vrgula resultar em um erro de compilao. Uma das
primeiras coisas a se vericar quando h algum erro sem razo, um ponto e vrgula esquecido,
que precede a linha em que o compilador reclamou.

1.4.2 {} - Chaves
As chaves so largamente usadas na programao em C. Possuem diversas aplicaes, descritas
abaixo, que podem causar confuso em iniciantes.
Toda chave de abertura ({) deve ser fechada (}). Essa a condio que se refere s cha-

Integrated Development Enviroment,

ves estarem balanceadas. A IDE (

em ingls) do Arduino

inclui um artifcio que confere se as chaves esto devidamente balanceadas. Para isso, deve-se
apenas selecionar uma chave que a correspondente ir ser destacada.
Atualmente, esse artifcio possui um pequeno

bug

onde ele tambm destaca (incorretamente) as

chaves que esto comentadas. Programadores iniciantes e programadores que habituados com
BASIC normalmente encontram diculdades com o uso de chaves.

RETURN em uma subrotina


Next por um loop for.

substituem a instruo
cional e a instruo

No obstante, as chaves

(funo), a estrutura

ENDIF

por uma condi-

Por conta do uso das chaves ser bem variado, uma dica para praticar imediatamente aps se
abrir uma chave fech-la. Chaves desbalanceadas causam muitos erros de compilao. Muitas
vezes ca complicado encontrar o erro de sintaxe em um cdigo de muitas linhas. Por conta de
seu largo uso, as chaves so muito importantes para a sintaxe do programa. Movendo uma ou
duas linhas de lugar, o sentido do cdigo pode-se alterar drasticamente.

Funes
void minhafuno(parmetro){
aes
}

Loops
while (expresso booleana)
aes
}
do

Universidade Federal Fluminense

18

Captulo 1. Estrutura

1.4. Elementos de sintaxe

aes
} while (expresso booleana);
for (incializao; condio de trmino; expresso de incremento) {
aes
}

Estruturas condicionais
if (expresso booleana) {
aes
}
else if (expresso booleana) {
aes
}
else {
aes
}

1.4.3 // e / - Comentrios
Comentrios so linhas de programa que so usadas para informar o prprio programador ou
outra pessoa que venha a usar o cdigo como o programa funciona. Essas linhas so ignoradas
pelo compilador e nem so enviadas para o processador, logo, no ocupam espao no

chip

do

Atmega. Comentrios possuem o propsito de ajudar o programador a entender (ou lembrar)


como o programa funciona ou para informar a outros.

Existem duas formas diferentes de

comentar:

Example

x = 5;

// Essa uma linha simples de comentrio.


// Tudo escrito aqui no ser considerado
// outra linha de comentrio

/* a barra seguida do asterisco indica um bloco de comentrio.


at um asterisco seguido de barra, nada ser considerado.
if (gwb == 0){
x = 3;
}

// linha nica de comentrio dentro de um comentrio maior.

*/ fecha o bloco de comentrio


importante destacar que no se pode fazer um bloco de comentrio dentro de outro.

Universidade Federal Fluminense

19

Captulo 1. Estrutura

1.4. Elementos de sintaxe

Dica de cdigo
Ao programar, uma tcnica para se testar partes de cdigo comentar trechos ao invs de
apagar linhas. Assim, o compilador ignora esses trechos e o programador pode vericar como
ca o programa nessa nova congurao, sem perder o que j foi digitado.

1.4.4 dene
define

permite ao programador nomear um valor de uma constante antes do programa ser

compilado. Constantes nomedadas por

define

no usam memria do

chip.

O compilador ir

fazer referncias para essas constantes com o valor denido no momento da compilao.
Isso pode causar alguns efeitos indesejveis como o nome denido por

define

ser includo em

outra constante ou nome de varivel.Nesse caso o texto dever ser trocado pelo nmero ou texto
que se usou o

define.

Em geral, a palavra reservada

const

melhor para se denir constantes do que o

define.

A sintaxe do Arduino a mesma que em C:

Sintaxe
#define nomedaconstante valor
Note que o # necessrio.

Exemplo
#define ledPin 3
// O compilador ir trocar ledPin por 3 no momento de compilar.

Dica de cdigo
No h ponto e vrgula na estrutura do

define.

Caso colocar algum, o compilador apontar

erros.

#define ledPin 3;

// errado!

Colocar um sinal de igual tambm um erro de sintaxe.

#define ledPin = 3

// errado!

Universidade Federal Fluminense

20

Captulo 1. Estrutura

1.5. Operadores aritmticos

1.4.5 include
#include

usado para incluir bibliotecas. Possibilita ao programador usar um largo grupo de

funes pr-denidas. Existem bibliotecas escritas especicamente para Arduino.


A pgina de referncia de bibliotecas de C da AVR(AVR a referncia dos

chips

da Atmel, os

quais o Arduino baseado) pode ser conferido neste link .


Note que o

include similar ao define, no h ponto e vrgula para terminar a linha, causando

assim um erro de sintaxe caso seja colocado.

Exemplo
Esse exemplo inclui a biblioteca que usada para colocar informaes no espao de memria

ash

ao invs da

ram.

Isso guarda espao da

ram

para a mamria dinmica e faz a procura

por tabelas mais prtica.

#include <avr/pgmspace.h>
prog_uint16_t myConstants[] PROGMEM = {0, 21140, 702
0,0,0,0,0,0,0,0,29810,8968,29762,29762,4500};

1.5

, 9128,

Operadores aritmticos

Na Tabela 1.2 podemos confer-los:

Tabela 1.2: Operadores aritmticos.

Operador

Operao

=
+

/
%

Atribuio
Adio
Subtrao
Multipicao
Diviso
Resto da diviso inteira

1 http://www.nongnu.org/avr-libc/user-manual/modules.html+
Universidade Federal Fluminense

21

0, 25764, 8456,

Captulo 1. Estrutura

1.6

1.6. Operadores de comparao

Operadores de comparao

Na Tabela 1.3 podemos confer-los:

Tabela 1.3: Operadores de comparao.

1.7

Operador

Operao

==
!=
<
>
<=
>=

Igual a
Diferente de
Menor que
Maior que
Menor ou igual a
Maior ou igual a

Operadores Booleanos

Na Tabela 1.4 podemos confer-los:

Tabela 1.4: Operadores booleanos.

Operador

Signicado lgico

&&
||
!

e (and)

Universidade Federal Fluminense

ou (or)
negao (not)

22

Captulo 1. Estrutura

1.8

1.8. Operadores de ponteiro

Operadores de ponteiro

Na Tabela 1.5 podemos confer-los:

Tabela 1.5: Operadores de ponteiro.


Operador

Signicado

&

Referencia

Desreferencia

Ponteiros so um dos pontos mais complicados para os inciantes em linguagem de programao C e possvel escrever a maioria dos cdigos de Arduino sem usar ponteiros. Entretanto
manipulando certas estruturas de dados, o uso de ponteiros simplicam o cdigo e o conhecimento de como manipul-los uma ferramenta importante para o programador de C.

1.9

1.9.1

Operadores bit a bit (

Bitwise

E (AND) (&),
CLUSIVO (XOR) ()

Bitwise )

Bitwise

OU (OR) (|),

Bitwise

OU EX-

Os operadores bit a bit, como o nome sugere, baseiam-se seus clculos a nvel de bit das
variveis. Esses operadores resolvem uma larga quantidade de problemas.
Abaixo seguem descries e sintaxe de todos os operadores. Para mais detalhes, verique a
bibliograa[3].

Bitwise AND (&)


bitwise AND equivalente ao operador lgico AND.
O operador bitwise AND representado por & usado entre duas expresses inteiras. Bitwise
AND opera em cada bit de cada expresso independentemente, seguindo a seguinte regra: se
O operador

ambos so 1, o resultado 1, qualquer outro caso, a resposta 0. A tabela-verdade da porta


lgica AND pode ser conferida na Tabela 1.6, abaixo:

Tabela 1.6: Tabela-verdade porta AND.

Universidade Federal Fluminense

Resultado

23

Captulo 1. Estrutura

1.9. Operadores bit a bit (Bitwise)

Outra forma de expressar isso:

0 0 1 1
0 1 0 1
---------0 0 0 1

operando 1
operando 2
(operando 1 & operando 2) - resultado retornado

No Arduino, o tipo inteiro (int) um valor de 16 bits, ento ao usar o & entre duas expresses
causa 16 operaes simultneas. Um exemplo de cdigo:

int a = 92;
int b = 101;
int c = a & b;

// em binrio: 0000000001011100
// em binrio: 0000000001100101
// resultado: 0000000001000100, ou 68 em decimal.

Cada um dos 16 bits em a e b so processados usando o

bitwise AND, e todos os 16 bits

resultantes so guardados em c, resultando no valor de 01000100 em binrio, equivalente a 68


em decimal.

Bitwise OR (|)
bitwise OR equivalente ao operador lgico OR.
O operador bitwise OR representado por  | usado entre duas expresses inteiras. Bitwise OR
O operador

opera em cada bit de cada expresso independentemente, seguindo a seguinte regra: se ambos
so 0, o resultado 0, qualquer outro caso, a resposta 1. A tabela-verdade da porta lgica
OR pode ser conferida na Tabela 1.7, abaixo:

Tabela 1.7: Tabela-verdade porta OR.

Universidade Federal Fluminense

Resultado

24

Captulo 1. Estrutura

1.9. Operadores bit a bit (Bitwise)

Outra forma de representar:

0 0 1 1
0 1 0 1
---------0 1 1 1

operando 1
operando 2
(operando 1 | operando 2) - resultado retornado

Um exemplo de cdigo:

int a = 92;
int b = 101;
int c = a | b;

// binrio: 0000000001011100
// binrio: 0000000001100101
// binrio: 0000000001111101, ou 125 em decimal.

Bitwise XOR ()
H tambm um operador no to usado em C, chamado de ou-exclusivo, tambm conhecido
como XOR. O operador

Bitwise XOR

bitwise XOR representado por  usado entre duas expresses inteiras.

opera em cada bit de cada expresso independentemente.

Sua regra muito

parecida com operador OR, trocando apenas o caso em que temos 1 e 1, onde o resultado 0.
A tabela-verdade da porta lgica OXR pode ser conferida na Tabela 1.8, abaixo:

Tabela 1.8: Tabela-verdade porta XOR.


A

Resultado

Outra forma de representar:

0 0 1 1
0 1 0 1
---------0 1 1 0

operando 1
operando 2
(operando 1 ^ operando 2) - resultado retornado

Exemplo de cdigo:

int x = 12;
int y = 10;
int z = x ^ y;

// binrio: 1100
// binrio: 1010
// binrio: 0110, ou decimal 6

Universidade Federal Fluminense

25

Captulo 1. Estrutura

1.9. Operadores bit a bit (Bitwise)

Dica de cdigo
O operador XOR tambm usado como um somador de nmeros binrios.

1.9.2

Bitwise NOT()

O operador

sim

bitwise

NOT, representado por  . Diferentemente de & e |,

aplicado a apenas um operando. NOT troca cada bit por seu oposto: 0 torna-se 1 e 1

torna-se 0. A tabela-verdade da porta lgica OXR pode ser conferida na Tabela 1.9, abaixo:

Tabela 1.9: Tabela-verdade porta NOT.


A

Resultado

Outra forma de representar:

0 1
-----1 0

operando 1
NOT operando 1

int a = 103;
// binrio: 0000000001100111
int b = NOT a;
// binrio: 1111111110011000 = -104
No est incorreto o resultado ser

104.

Isto porque o bit mais elevado em uma varivel

inteira o chamado bit de sinal. Se o bit mais alto 1, o nmero interpretado como negativo.
Esta codicao de nmeros positivos e negativos chamado de complemento de dois. Para
mais informaes, consulte a bibliograa.
Note que para um inteiro x qualquer,

1.9.3

equivale a

x 1.

Bitshift left (<<), Bitshift right (>>)

Existem dois operadores de deslocamento bit em C: o operador de deslocamento esquerda

<<

e o operador de deslocamento direita

>>.

Estes operadores fazem com que os bits do

operando esquerdo sejam deslocados para a esquerda ou para a direita pelo nmero de posies
especicado pelo operando direito.

Sintaxe
varivel
varivel

<< numero_de_bits
>> numero_de_bits

Parmetros
varivel - (byte, int, long)

numero_de_bits

Universidade Federal Fluminense

integer

26

<= 32

Captulo 1. Estrutura

1.9. Operadores bit a bit (Bitwise)

Exemplo:
int a = 5;
int b = a << 3;
int c = b >> 3;

// binrio: 0000000000000101
// binrio: 0000000000101000, ou 40 em decimal
// binrio: 0000000000000101, ou volta para o 5 como iniciou

Ao mudar um valor x por bits y (x

<<

y), os bits de y mais esquerda so perdidos em x,

literalmente deslocado para fora do conjunto:

int a = 5;
int b = a << 14;

// binrio: 0000000000000101
// binrio: 0100000000000000 - o primeiro 1 do 101 foi descartado

Se voc tiver certeza de que nenhum dos nmeros signicativos em um valor esto sendo
deslocados para fora, uma maneira simples de pensar no operador de deslocamento esquerda
que ele multiplica o operando da esquerda por 2 elevado potncia operando direita. Por
exemplo, para gerar potncias de 2, as seguintes expresses podem ser empregadas:

1 << 0
1 << 1
1 << 2
1 << 3
...
1 << 8
1 << 9
1 << 10
...

==
==
==
==

1
2
4
8

== 256
== 512
== 1024

Quando voc muda x direita por bits y (x  y), e o bit mais alto em x um 1, o comportamento depende do tipo de dados exatos de x. Se x do tipo inteiro, o bit mais alto o bit
de sinal, que determina se x negativo ou no, como j discutido anteriormente. Nesse caso, o
bit de sinal copiado para os bits mais baixos:

int x = -16;
int y = x >> 3;

// binrio: 1111111111110000
// binrio: 1111111111111110

Esse comportamento, chamado de extenso de sinal, muitas vezes no o comportamento


desejado. Em vez disso, pode-se desejar zeros a serem deslocados para a esquerda. Acontece
que as regras deslocamento para a direita so diferentes para expresses do tipo inteira sem
sinal, ento a soluo usar um

typecast

para suprimir os bits que esto sendo copiados da

esquerda:

int x = -16;
// binrio: 1111111111110000
int y = (unsigned int)x >> 3; // binrio: 0001111111111110

Universidade Federal Fluminense

27

Captulo 1. Estrutura

1.10. Operadores de composio

Sendo cuidadoso para evitar a extenso de sinal, possvel pode usar o operador de deslocamento para a direita

int x = 1000;
int y = x >> 3;

1.10

>>

como uma forma de dividir por potncias de 2. Por exemplo:

// diviso inteira de 1000 por 8, tendo como resultado y = 125.

Operadores de composio

1.10.1 Incremento e decremento


Incrementa (++) ou decrementa uma varivel.

Sintaxe
x++;
++x;

// incrementa x em um e retorna o valor anterior de x


// incrementa x em um e retorna o novo valor de x

x--;
--x;

// decrementa x em um e retorna o valor anterior de x


// decrementa x em um e retorna o novo valor de x

Parmetros
x pode ser determinado como integer ou long.

Retorna
O valor original ou o valor incrementado/decrementado de uma varivel.

Exemplo
x = 2;
y = ++x;
y = x--;

// x agora possui o valor de 3 e y tambem 3


// x possui o valor de 2 novamente e y continua com o valor de 3

Universidade Federal Fluminense

28

Captulo 1. Estrutura

1.10. Operadores de composio

1.10.2 Operaes compostas


So basicamente simplicaes para as operaes matemticas. A Tabela 1.10 lista as possibilidades:

Tabela 1.10: Operaes compostas.


Forma simplicada

Equivalncia usual

x + = y;
x = y;
x = y;
x / = y;
x &= y
x |= y

x=x+y
x=xy
x=xy
x = x/y
x = x&y
x = x|y

importante destacar que para a forma composta do


pode ser do tipo caractere, inteiro(int) ou longo (long).
constante inteira de qualquer um dos tipos citados.
qualquer tipo de varivel.

Exemplo

x
x
x
x
x

= 2;
+= 4;
-= 3;
*= 10;
/= 2;

//
//
//
//

x
x
x
x

agora
agora
agora
agora

possui
possui
possui
possui

Universidade Federal Fluminense

o
o
o
o

valor
valor
valor
valor

de
de
de
de

29

6
3
30
15

bitwise AND

e do

bitwise OR, o x

y possui a liberdade de ser uma

Para as outras operaes, pode-se usar

Captulo 1. Estrutura

Universidade Federal Fluminense

1.10. Operadores de composio

30

Captulo 2
Variveis
2.1

Constantes

2.1.1 true | false


false
false

denida como 0 (zero).

true
true normalmente denida como 1, o que est certo, apesar de possuir uma denio mais
true, no pensamento Booleano. Ento, pode-se chegar a concluso que -1, 2 e -200 so todos denidos como true tambm.
larga. Qualquer inteiro diferente de zero

Dica de cdigo
Repare que diferentemente das palavras reservadas

HIGH, LOW, INPUT e OUTPUT, true e false

so escritas em letras minsculas.

2.1.2 HIGH | LOW


No momento que se for ler ou escrever em um pino digital, h apenas dois valores que o pino
pode assumir:

HIGH

ou

LOW.

HIGH
HIGH diferente dependendo de qual modo o pino for
colocado, se INPUT ou OUTPUT. Quando o pino congurado como INPUT com a funo pinMode
e lido com a funo digitalRead, o microcontrolador ir considerar como HIGH se a tenso for
Em relao aos pinos, o signicado de

maior ou igual a 3 volts no pino.


Tambm o possvel congurar com
leitura do

digitalWrite

como

pinMode

o pino como

INPUT

e, posteriormente, com a

HIGH denir os 20K resistores pull-up internos que orientaro


HIGH exceto no caso que for puxado para LOW pelo circuito

o pino de entrada para o valor de

31

Captulo 2. Variveis

2.1. Constantes

externo. dessa forma que a funo

INPUT_PULLUP

Quando um pino congurado como

digitalWrite,

OUTPUT

funciona.

com

pinMode,

e denido como

HIGH

com

o pino est com 5 volts. Neste estado, possvel fornecer corrente, por exem-

plo, acender um LED que est conectado atravs de um resistor em srie para o terra ou para
o outro pino congurado como

OUTPUT,

e denido como

LOW.

LOW
LOW tambm difere dependendo de como o pino foi denido. Quando conINPUT com pinMode, e lido com digitalRead, o microcontrolador ir considerar

O signicado de
gurado como
como

HIGH

se a tenso for menor ou igual a 2 volts no pino.

Quando um pino congurado como

digitalWrite, o pino est com 0 volts.

OUTPUT

com

pinMode,

e denido como

LOW

com

Neste estado, possvel reduzir corrente, por exemplo,

acender um LED que est conectado atravs de um resistor em srie para Vcc, ou para o outro
pino congurado como

OUTPUT,

e denido como

HIGH.

2.1.3 INPUT | OUTPUT | INPUT PULLUP


Pinos digitais podem ser usados como

pinMode()

INPUT, INPUT_PULLUP, ou OUTPUT. Modicar o pino com

singnica modicar o comportamento eltrico do pino.

Pinos congurados como INPUT


INPUT com pinMode() esto em estado de altaINPUT possuem capacidade apenas para executar aes
resistncia em srie de 100M na frente do pino. Isso os

Os pinos do Arduino denidos como


impedncia. Pinos congurados como
de pequeno porte. Equivalem a uma

torna teis para a leitura de um sensor, mas no alimentar um LED.

Pinos congurados como INPUT PULLUP


O chip interno Atmega do Arduino possui resistores do tipo

pull-up 1

internos que podem

ser acessados. Caso seja necessrios usar esses resistores ao invs de resistores externos

down

INPUT_PULLUP como argumento de pinMode(). Isso efetivamente


onde HIGHsignicaria que o sensor est desligado e LOW, ligado.

, deve-se usar

o comportamento,

Para mais informaes sobre resitores

1 A idia de um resistor

pull-

inverte

pull-up e pull-down, veja o link3 .

pull-up que ele fracamente puxe(pulls ) a tenso do condutor que ele est conectado

para 5V (ou qualquer tenso que represente o nvel lgico alto).

2 resistores

pull-down

so usados para armazenar a entrada em valor zero(baixo) quando nenhum outro

componente estiver conduzindo a entrada. Eles so usados com menos frequncia que os resistores

3 http://pt.wikipedia.org/wiki/Resistores

Universidade Federal Fluminense

p ull

up+

32

pull-up.

Captulo 2. Variveis

2.1. Constantes

Pinos congurados como Output


Pinos congurados como

OUTPUT com pinMode() esto em estado de baixa-impedncia.

Po-

dem prover uma quantidade considervel de corrente para outros circuitos. Pinos da Atmega
fornecem corrente possitiva ou negativa at

40mA

(miliampres) de corrente para outros cir-

cuitos. Isso til para acender LEDs, mas no para ler sensores. Pinos denidos como
podem ser destrudos caso sejam submetidos a curto-circuito com 5 volts.

OUTPUT

A quantidade de

corrente fornecida por um pino Atmega tambm no suciente para abastecer a maioria dos
rels ou motores, e alguns circuitos de interface sero necessrios.

2.1.4 LED BUILTIN


A maior parte das placas Arduino possuem um pino conectado a um LED
um resistor.

onboard

em srie com

LED_BUILTIN uma forma de declarar manualmente o pino como uma varivel.

maior parte das placas possuem esse LED conectado ao pino digital 13.

2.1.5 Constantes inteiras


Consatantes inteiras so nmeros usados diretamente no

sketch, como 123.

Por denio, esses

nmeros so tratados como int, mas possvel modicar isso com os modicadores U e L
(veja abaixo).
Normalmente, constantes inteiras so tratadas na base 10 (decimal), mas notaes especiais
podem ser usadas como entrada de nmeros em outras bases.

Tabela 2.1: Constantes inteiras.

Base

Exemplo Formatador Comentrio

10 (decimal)

123

nenhum

2 (binrio)

B1111011

condutor B

funcionam

ape-

nas valores de 8
bits (0 a 255) caracteres 0 e 1 so
vlidos
8 (octal)

0173

condutor 0

16 (hexadecimal)

0x7B

condutor 0x

caracteres de 0
a 7 so vlidos
caracteres 0

9, A a F, a


a f  vlidos

Base decimal
Decimal base 10. Constantes sem prexos so assumidas como formato decimal.

Exemplo:

101

// mesmo que o 101 na base decimal

((1 * 10^2) + (0 * 10^1) + 1)

Base binria
Binrio base dois. Apenas caracteres 0 e 1 so vlidos.

Universidade Federal Fluminense

33

Captulo 2. Variveis

2.1. Constantes

Exemplo:
B101

// mesmo que 5 na base decimal

((1 * 2^2) + (0 * 2^1) + 1)

O formatador binrio apenas trabalha com

bytes

(8

bits ) entre zero (B0) e 255 (B11111111).

Se for conveniente inserir um inteiro (int, 16 bits) na forma binria, deve-se fazer em dois passos:

+myInt = (B11001100 * 256) + B10101010;

Base octal
Octal a base oito. Apenas caracteres de 0 a 7 so vlidos. Valores em octal so indicados
com o prexo 0.

Exemplo:
0101

// mesmo que 65, em decimal

((1 * 8^2) + (0 * 8^1) + 1)

Dica de cdigo
possvel acontecer um erro difcil de se encontrar incluindo um zero na frente da constante,
o compilador interpreta a constante como octal.

Hexadecimal
Hexadecimal (ou hex) a base dezesseis. Caracteres vlidos so de 0 a 9 e letras de A a F.
A possui o valor de 10, B de 11, at F, que vale 15.

Valores Hex so indicados com o

prexo 0x. Repare que tanto faz escrever as letras em caixa alta ou baixa.

Exemplo:
0x101

// mesmo de 257, em decimal

((1 * 16^2) + (0 * 16^1) + 1)

Formatadores U e L
Por denio uma constante inteira tratada como um inteiro com limitaes inerentes a
seus valores possveis. Para especicar uma constante inteira com outros tipos de dados:
u ou U para forar a constante ao formato de dados unsigned. Exemplo: 33u
l ou L para forar a constante ao formato de dados long data. Exemplo: 100000L
ul ou UL para forar a constante ao formato de dados unsigned long constant. Exemplo:
32767ul

2.1.6 Constantes de ponto utuante


Similar a constantes inteiras, contantes de ponto utuante so usadas para tornar o cdigo mais
legvel. Constantes de ponto futuante so trocados na compilao para o valor para o qual a
expresso avaliada.

Universidade Federal Fluminense

34

Captulo 2. Variveis

2.2. Tipos de dados

Exemplo:
n = .005;
Constantes de ponto utuante tambm podem ser expressas em uma variao de notao
cientca. E e e so ambas aceitas como expoentes vlidos.

Tabela 2.2: Constantes de ponto utuante.


Ponto utuante

equivale a:

assim como a:

constante
10.0

10

2.34E5

2.34 105
67.0 10 12

67e-12

2.2

234000
.000000000067

Tipos de dados

2.2.1 void
A palavra reservada

void usada apenas no momento de declarar a funo.

Indica que a funo

esperada para retornar a informao para a funo que foi chamada.

Exemplo:
// aes acontecem nas funes "setup" e "loop"
// mas nenhuma informao foi repassada para a maior parte do programa
void setup(){
// ...
}
void loop(){
// ...
}

2.2.2 boolean
Uma varivel do tipo booleana assume dois valores, de
ocupa um byte de memria.

Universidade Federal Fluminense

35

true

ou

false.

Cada varivel deste tipo

Captulo 2. Variveis

2.2. Tipos de dados

2.2.3 char
um tipo de dado que utiliza apenas um byte de memria para gurdar o valor de um caractere.
Para um caractere usamos aspas simples
aspas duplas:

"ABC".

'A', por exemplo, e para mltiplos caracteres(strings )

American

Caracteres so armazenados como nmeros, entretanto. Percbe-se pela codicao ASCII(

Standard Code for Information Interchange, em ingls).

Isso signica que possvel fazer contas

com caracteres, usando os valores da tabela ASCII (ex. 'A' + 1 possui o valor de 66, j que na
tabela ASCII a letra a maiscula possui o valor de is 65). Veja mais valores na Figura. A.1
O tipo de dados

127.

char

Para um, de um

signed, o que signica que ele codica os nmeros de 128 a


bits ) tipo de dados no signed, use o tipo de dados byte.

um tipo

byte

(8

Exemplo
char myChar = 'A';
char myChar = 65;

// ambos so vlidos

2.2.4 unsigned char


um tipo de dado que ocupa apenas 1

byte

de memria. O tipo de dado aceita de 0 a 255.

No estilo de programao no Arduino, o tipo de dados

Exemplo

byte

deve ser preferido.

unsigned char myChar = 240;

2.2.5 byte
A

byte

guarda um nmero de 8 bits, de 0 a 255.

Example
byte b = B10010;

// "B" \'{e} o formatador bin\'{a}rio (B10010 = 18 em decimal)

2.2.6 int
Inteiro a primeira forma com que se inicia a guardar nmeros.
No Arduino Uno (e outras placas da ATMega) uma varivel do tipo inteiro (int) guarda um

bits

bytes

valor de 16
(2
). Isso permite um intervalo de
1
2 5 e valor mximo de (215 -1)).

32, 768

32, 767

(valor mnimo de

int guarda valores de 32 bits (4 bytes ). Isso permite um


2, 147, 483, 647 (valor mnimo de 231 e valor mximo de (231 )

J no Arduino Due,

intervalo de

2, 147, 483, 648

- 1).

Universidade Federal Fluminense

36

Captulo 2. Variveis
int

2.2. Tipos de dados

guarda nmeros negativos com uma tcnica chamada de complemento de dois, citada

anteriormente. O

bit

mais signicativo, algumas vezes chamado de

bit

de sinal, torna o nmero

negativo. O Arduino se preocupa em lidar com nmeros negativos logo, as operaes aritmticas ocorrem de maneira esperada. No entanto, podem acontecer alguns problemas ao lidar
com o operador

bitshift right (>>).

Exemplo
int ledPin = 13;

Sintaxe
int var = val;
var - nome da varivel inteira
val - o valor que a varivel assumir

Dica de cdigo
Quando variveis excedem sua capacidade mxima de armazenamento, elas rolam para
sua capacidade mnima. Note que isso ocorre em todas as direes.

Exemplo para uma varivel inteira de 16 bits:


int x;
x = -32768;
x = x - 1;

// x agora guarda 32,767 - rola para a direo negativa

x = 32767;
x = x + 1;

// x possui o valor de -32,768 - rola para a direo positiva

2.2.7 unsigned int


No Arduino UNO e outras placas da ATMEGA,
mesmo das inteiras que guardam valores de 2

unsigned ints

bytes.

(inteiros

unsigned )

so o

Ao invs de guardar nmeros negativos


65.535(216 ) 1). A verso Due guarda
32
), variando de 0 a 4, 294, 967, 295 (2 1).

apenas guarda valores positivos, em um intervalo de 0 a


valores de

4 bytes (32 bits


unsigned int

A diferena entre

e (

signed ) int,

que o MSB

considerado de sinal, assim

considerando o nmero negativo, mais uma vez usando o conceito do complemento de 2.

Exemplo
unsigned int ledPin = 13;

4 Most

Signicant Bit, Bit

mais signicativo, em ingls. Verique a bibliograa[3] para mais informaes.

Universidade Federal Fluminense

37

Captulo 2. Variveis

2.2. Tipos de dados

Sintaxe
unsigned int var = val;
var - nome da varivel
val - valor assumido pela vairvel

Dica de cdigo
Quando variveis excedem sua capacidade mxima de armazenamento, elas rolam para
sua capacidade mnima. Note que isso ocorre em todas as direes.

unsigned int x
x = 0;
x = x - 1;
x = x + 1;

// x agora guarda 65535 - rola para a direo negativa


// x possui o valor de 0 - rola para a direo positiva

2.2.8 word
Armazena um nmero do tipo

Exemplo

unsigned

de 16

bits

word w = 10000;

2.2.9 long
Converte o valor para o tipo

long.

Sintaxe
long(x)

Parmetros
x: varvel de qualquer tipo

Retorna
long

Universidade Federal Fluminense

38

de 0 a 65535. Semelhante a

unsigned int.

Captulo 2. Variveis

2.2. Tipos de dados

2.2.10 unsigned long


Variveis do tipo

unsigned long

de nmeros e podem guardar 32


tendo como intervalo de 0 a

Exemplo

possuem tamanhos extensos em relao ao armazenamento

bits

(4

bytes ). unsigned long no guarda nmeros negativos,

4, 294, 967, 295(232 1).

unsigned long time;


void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = millis();
//escreve desde que o programa tenha iniciado
Serial.println(time);
delay(1000);
}

Universidade Federal Fluminense

39

Captulo 2. Variveis

2.2. Tipos de dados

Sintaxe
unsigned long var = val;
onde:
var - nome da varivel
val - valor que a varivel assume

2.2.11 short
short guarda valores de 16 bits.
15
15
Possui o intervalo de valores de 32.768 a 32.767 (valor mnimo de 2
e mximo de (2 )1).
short

um tipo de dados de 16

bits.

Em todos os Arduinos

Exemplo
short ledPin = 13;

Sintaxe
short var = val;
onde:
var - nome da varivel
val - valor que a varivel assume

2.2.12 oat
Basicamente so nmeros com vrgula. Nmeros de ponto utuante so normalmente usados
para aproximar nmeros analgicos e contnuos por conta de sua maior preciso do que os nmeros inteiros. Nmeros de ponto utuante podem ser to qgrandes quanto
e to pequeno quanto

Floats

3.4028235E + 38.

possvel guardar 32

possuem apenas de 6 a 7 dgitos de preciso.

onde pode-se obter mais preciso usando


do mesmo tamanho que
Nmeros

float

float.

bits

(4

3.4028235E + 38

bytes ) de informao.

Diferentemente de outras plataformas,

double (em torno de 15 dgitos), no Arduino, double

no so exatos, e podem ter resultados estranhos quando comparados.

Por

exemplo, 6.0/3.0 no igual a 2.0. Operaes aritmticas de ponto utuante so muito mais
devagares do que inteiros. Programadores normalmente convertem nmeros de ponto utuante
para inteiros para aumentar a velocidade de seus cdigos.

Para tratar como

adicionar o ponto do decimal, caso contrrio, ser tratado como inteiro.

Exemplo
float minha_variavel;
float sensorCalibrado = 1.117;

Universidade Federal Fluminense

40

float,

deve-se

Captulo 2. Variveis

2.2. Tipos de dados

Sintaxe
float var = val;
onde:
var - nome da varivel
val - valor que a varivel assume

Exemplo de cdigo
int x;
int y;
float z;
x = 1;
y = x / 2;
z = (float)x / 2.0;

// y agora contm 0, int no guarda fraes


// z possui .5 (deve-se usar 2.0, ao invs de 2)

2.2.13 double
Preciso dupla para nmeros de ponto utuante.
ATMEGA, ocupa 4

bytes.

sem ganhos de preciso.

Nos Arduinos UNO e outras placas da

double exatamente a mesma do float,


No Arduino Due, double possui 8 bytes (64 bits ) de preciso.
Isto , a implementao do

Universidade Federal Fluminense

41

Captulo 2. Variveis

2.2. Tipos de dados

2.2.14 string - char array


Strings podem ser representadas de duas formas. Usando a estrutura de dados chamada
String ou usando um vetor de char. Para mais detalhes do mtodo que usa a estrutura
String, que fornece mais funcionalidade no custo de memria, siga a subseco 2.2.15.

Formas de se declarar strings


Tabela 2.3:

Strings :

Cdigo

char
char
'd',
char
'd',
char

como declarar?

Forma de declarar

Str1[15];
Str2[8] =
'u', 'i',
Str3[8] =
'u', 'i',
Str4[ ] =

Vetor sem inicializao

{'a', 'r',
'n', 'o'};
{'a', 'r',
'n', 'o', '\0'};
"arduino";

Vetor com espao extra, sem inicializao


Expicitando o caracter nulo
Inicializar com uma string constante entre
aspas, o compilador a ajustar a sequncia de
constantes e um caractere nulo de terminao

char Str5[8] = "arduino";

Inicializar a matriz com um tamanho explcito e string constante

char Str6[15] = "arduino";

Inicializar o array,

deixando espao extra

para uma sequncia maior

Terminao nula (null )


Geralmente,

strings

que funes como a

terminam com um caractere nulo (0, no cdigo ASCII). Isso permite

Serial.print()

funes continuam lendo os


signica que a

string

bytes

saibam quando termina a

string.

Por outro lado, as

de memria que na verdade no fazem parte da

string.

Isso

precisa ter um espao para mais de um caracter do que o texto que se

deseja escrever. por isso que Str2 e Str5 precisam possuir oito caracteres, apesar dearduino
possuir apenas sete - a ltima posio automaticamente preenchida com um caracter nulo.
Str4 ser automaticamente ajustada para o tamanho de oito caracteres, um para o nulo. Em
Str3, foi explicitamente includo o caracter nulo (\0).
possvel ter

strings

sem um caracter nal nulo (caso se no Str2 o tamanho discriminado

fosse sete ao invs de oito). Isso deve ser evitado, pois algumas funes podem no funcionar.
Muitos erros de ordem confusa de carcteres de vetores ocorrem por esse fato.

Aspas duplas ou simples?


Strings

so sempre denidas com aspas duplas ("Abc") e caracteres so sempre denidos

com aspas simples ('A').

Universidade Federal Fluminense

42

Captulo 2. Variveis

2.2. Tipos de dados

Concatenando strings longas


char String[] = "primeira linha"
" segunda linha"
" etcetera";

Vetores de

strings

normalmente conveniente, quando se trabalha com grandes quantidades de texto, assim


como um projeto de

display

LCD, usar um vetor de

strings. Strings

so por si s vetores, um

exemplo de um vetor bidimensional.


No exemplo abaixo, o asterisco depois do

char  char*

indica que um vetor de ponteiros.

Todo nome de vetor na verdade um ponteiro, ento, preciso disso para fazer um vetor de
vetores. No necessrio entender de ponteiros para este exemplo.

Exemplo
char* Strings[]={"string 1", "string 2", "string 3",
"string 4", "string 5","string 6"};
void setup(){
Serial.begin(9600);
}
void loop(){
for (int i = 0; i < 6; i++){
Serial.println(Strings[i]);
delay(500);
}
}

2.2.15 String - object


A classe

String

com vetores.

strings do texto de formas mais complexas do que


possvel concatenar Strings, anex-los, procurar e substituir substrings e muito
permite que se manipule

mais. preciso mais memria do que uma matriz de caracteres simples, mas tambm mais
til.

Para referncia, arrays de caracteres so chamados de

as instncias da classe

String

so chamados de

strings

strings

com s minsculo (s), e

de s maisculo(S). Note que

strings

de constantes, indicadas com aspas duplas so tratadas como matrizes de caracteres, e no


instncias da classe

String.

Universidade Federal Fluminense

43

Captulo 2. Variveis

2.3. Converso

2.2.16 array
Um

array

(vetor) uma coleo de variveis que so acessadas por um nmero ndice. Decla-

rando um vetor (todos os mtodos so vlidos):

int inteiros[6];
int pinos[] = {2, 4, 8, 3, 6};
int valores[6] = {2, 4, -8, 3, 2};
char mensagem[3] = "ola";
possivel declarar um vetor sem inicializ-lo, como em inteiros.
J em pinos o vetor foi declarado sem explicitar sem tamanho.

O compilador conta os

elementos e aloca um espao de memria com o tamnho apropriado. Em valores, h todas


as informaes, o tamanho e os valores do vetor. Para preencher um vetor com o tipo

char,

deve-se discriminar o tamanho e o contedo. Pode-se considerar cada espao do vetor como
uma casa. Desta forma, um vetor com 6 elementos, possui como ndices de 0 a 5. A primeira
casa sempre possui ndice como zero.

Atribuindo valores a um vetor


vet[0] = 10;

Recebendo um valor de um vetor


x = vet[4];

Vetores e for
Vetores normalmente so manipulados dentro de
como ndice para cada elemento do vetor.
porta serial:

int i;
for (i = 0; i < 5; i = i + 1) {
Serial.println(pinos[i]);
}

2.3

Converso

2.3.1 char()
Converte um valor para o tipo de dados

Sintaxe

char.

char(x)

Parmetros
x: valor de qualquer tipo

Retorna
char
Universidade Federal Fluminense

loops

onde o contador do lao usado

Por exemplo, escrever os elementos do vetor na

44

Captulo 2. Variveis

2.3. Converso

2.3.2 byte()
Converte um valor para o tipo de dados

Sintaxe

byte.

byte(x)

Parmetros
x: valor de qualquer tipo

Retorna
byte

2.3.3 int()
Converte um valor para o tipo de dados

Sintaxe

int.

int(x)

Parmetros
x: valor de qualquer tipo

Retorna
int

2.3.4 word()
Converte um valor para tipo de dados

Sintaxe

word

ou cria uma paralvra de dois

word(x)
word(h, l)

Parmetros
x: valor de qualquer tipo
h: o byte mais esquerda da palavra
l: o byte mais direita da palavra

Retorna
word
Universidade Federal Fluminense

45

bytes.

Captulo 2. Variveis

2.4. Escopo de variveis

2.3.5 long()
Converte um valor para o tipo de dados

Sintaxe

long.

long(x)

Parmetros
x: valor de qualquer tipo

Retorna
long

2.3.6 oat()
Converte um valor para o tipo de dados

Sintaxe

float.

float(x)

Parmetros
x: valor de qualquer tipo

Retorna
float

2.4

Escopo de variveis

2.4.1 Escopo de uma varivel


Variveis em C, usada no Arduino, ssui uma propriedade chamada de escopo.

Essa uma

diferena a linguagens mais antigas como BASIC onde todas as variveis so globais.
Varivel globar uma que pode ser visualizada(utilizada) por qualquer funo em um programa. Variveis locais so visveis apenas para a funo que foram declaradas. No ambiente
do Arduino, qualquer varivel declarada fora de uma funo, global. Quando programas comeam a se tornar maiores e mais complexos, variveis locais so a melhor soluo para que
cada funo tenha acesso a suas prprias variveis. Isso previne possveis erros de programao
onde uma funo modica as variveis de outra funo.
Algumas vezes til declarar e inicializar a varivel dentro de um lao do tipo
forma, essa varivel poder ser acessada apenas dentro do lao.

Exemplo
int gPWMval; // nenhuma funo usar essa varivel
void setup(){
// ...
}
Universidade Federal Fluminense

46

for.

Desta

Captulo 2. Variveis

2.4. Escopo de variveis

void loop(){
int i;
// "i" ser visvel apenas na funo loop
float f; // "f" ser visvel apenas na funo loop
// ...

for (int j = 0; j <100; j++){


// a varivel j pode apenas ser acessada dentro do lao for
}

2.4.2 Estticas
A palavra reservada
funo.

static

usada para criar variveis que so visveis para apenas uma

Variveis locais so criadas e destrudas todas as vezes que uma funo chamada,

variveis estticas (static) persistem mesmo aps a chamada terminar, guardando a informao.
Variveis declaradas como

static so criadas e inicializadas apenas na primeira vez que a fun-

o chamada.

Exemplo
int var1;
int var2;
void setup(){
// ...
}
void loop(){
// ...
}
int funcao(){
static int var3;
aes
}

Universidade Federal Fluminense

47

Captulo 2. Variveis

2.4. Escopo de variveis

2.4.3 Voltil
volatile

a palavra reservada conhecida como qualicadora, usualmente usada antes do tipo

da varivel, possui o intuito de modicar como o compilador e o programa iro tratar a varivel.
Declarar uma varivel com

software

volatile

uma diretiva para o compilador. O compilador um

que traduz o cdigo em C/C++, que envia as reais instrues para o chip Atmega do

Arduino. Especicamente, ele direciona o compialor a carregar a varivel da RAM e no do

que est armazenado no registrador . Dentro de certas condies, o valor da varivel armazenada nos registradores pode ser impreciso. Uma varivel pode ser declarada como

volatile

quando o valor possa ser trocado por algo presente no trecho de cdigo, assim como por aes
concomitantes.

Exemplo
// alterna o estado(acende ou apaga) do LED quando o pino de interrupo muda de estado
int pino = 13;
volatile int estado = LOW;
void setup(){
pinMode(pino, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop(){
digitalWrite(pino, estado);
}
void blink(){
estado = !estado;
}

2.4.4 Constante
A palavra reservada

const

signica constante. um qualicador varivel que modica o com-

portamento da varivel, tornando uma varivel 

read-only .

Isto signica que a varivel pode

ser utilizada, assim como qualquer outra varivel do seu tipo, mas o seu valor no pode ser
alterado.
varivel

O compilador acusar erro no caso de uma tentativa de atribuir um valor a uma

const.

const obedecem as regras de escopo de variveis


Isso, e as armadilhas do uso de #define, faz com que a palavra

Constantes denidas com a palavra reservada


que governam outras variveis.
reservada

#define.

const um mtodo superior para a denio de constantes.

Assim, prefervel a usar

5 memria temporria onde as variveis do programa so guardas e manipuladas.

Universidade Federal Fluminense

48

Captulo 2. Variveis

2.5. Utilitrios

Exemplo
const float pi = 3.14;
float x;
// ....
x = pi * 2;

// pode-se usar constantes em operaes aritmticas

pi = 7;

// errado! no se pode atribuir valores a contantes!

A tabela 2.4 demonstra quando usar

#define

ou const:

Tabela 2.4: dene e const: quando usar?

tipo de varivel
Contantes numricas

Strings
Vetores

2.5

#define const

Utilitrios

2.5.1 sizeof()
O operador

sizeof()

retorna o nmero de

bytes

de um tipo de varivel ou o nmero de

ocupados em um vetor.

Sintaxe
sizeof(variable)

Parmetros
varivel: qualquer tipo de varivel ou vetor (exemplo: int, float, byte)

Universidade Federal Fluminense

49

bytes

Captulo 2. Variveis

2.5. Utilitrios

Exemplo
O operador

sizeof

normalmente usada para lidar com vetores (assim como

strings ),

onde conveniente mudar o tamanho de um vetor sem quebrar outras partes do programa. O
programa abaixo imprime um texto de um caracter por vez.

char minhaString[] = "teste";


int i;
void setup(){
Serial.begin(9600);
}
void loop() {
for (i = 0; i < sizeof(minhaString) - 1; i++){
Serial.print(i, DEC);
Serial.print(" = ");
Serial.write(minhaString[i]);
Serial.println();
}
delay(5000); // reduz a velociade do programa
}
Note que

int,

sizeof

retorna o nmero total de

deve-se usar um

loop

do tipo

for.

bytes.

Ento se for um tipo de varivel como

Repare que uma

string

bem formada termina com

valor de NULL, que no cdigo ASCII equivale a 0 (zero).

for (i = 0; i < (sizeof(meusInteiros)/sizeof(int)) - 1; i++) {


// faa algo com meusInteiros[i]
}

Universidade Federal Fluminense

50

Captulo 3
Funes
3.1

Entrada e sada digital

3.1.1 pinMode()
Congura um pino especco para denir o comportamento entre
1.0.1, possivel habilitar os resistores internos
explicitamente desabilita os

pullups

input

ou

output.

pullup no modo INPUT_PULLUP. O modo INPUT

internos.

Sintaxe
pinMode(pino, modo)

Parmetros
pino: o nmero do pino escolhido a ser usado
modo: INPUT, OUTPUT, ou INPUT_PULLUP

Exemplo
int ledPin = 13;

No Arduino

// LED conectado no pino 13

void setup(){
pinMode(ledPin, OUTPUT);
}

// definindo o pino como output

void loop(){
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}

//
//
//
//

liga o LED
aguarda um segundo
desliga o LED
aguarda um segundo

51

Captulo 3. Funes

3.1. Entrada e sada digital

3.1.2 digitalWrite()
Escreve o valor de

HIGH ou LOW em um pino digital.

Se o pino for congurado como

OUTPUT com

pinMode(), essa tenso ser aplicada a seu valor correspondente: 5V (ou 3.3V nas placas de
3.3V) para HIGH, 0V (ground) para LOW. O pino congurado como INPUT, digitalWrite() ir
habilitar (HIGH) ou desabilitar (LOW) o resistor interno pullup no pino. Recomenda-se congurar
o pinMode() como INPUT_PULLUP para permitir que a resistncia interno pull-up. Ao congurar
pinMode() como OUTPUT, e conectar o LED a um pino, ao chamar digitalWrite(HIGH), o LED
pode acender de forma fraca. Sem explicitar o modo do pino, digitalWrite() ir habilitar os
resistores internos

pull-up, que age como um resistor largo limitador de corrente.

Sintaxe
digitalWrite(pino, valor)

Parmetros
pino: nmero do pino
valor: HIGH ou LOW

Exemplo
int ledPin = 13;

// LED conectado ao pino digital

13

void setup(){
pinMode(ledPin, OUTPUT);
}

// define o pino digital como output

void loop(){
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}

//
//
//
//

liga o LED
aguardar um segundo
desliga o LED
aguardar um segundo

3.1.3 digitalRead()
Faz a leitura de um pino digital especco, tanto

HIGH

ou

LOW.

Sintaxe
digitalRead(pino)

Parmetros
pino: o nmero do pino digital que se deseja fazer a leitura (int)

Retorna
HIGH

ou

LOW

Exemplo
Universidade Federal Fluminense

52

Captulo 3. Funes

3.2. Entrada e sada analgica

Pino 13 possui o mesmo valor do pino 7, declarado como input.


int ledPin = 13; // LED conectado ao pino digital 13
int inPin = 7;
// boto conectado ao pino digital 7
int val = 0;
// varivel para guardar o valor lido
void setup(){
pinMode(ledPin, OUTPUT);
pinMode(inPin, INPUT);
}

// define o pino digital 13 como output


// define o pino digital 7 como input

void loop(){
val = digitalRead(inPin); // faz a leitura do pino definido como input
digitalWrite(ledPin, val);
}

Dica de cdigo
Se o pino no estiver conectado a nada,

digitalRead()

pode retornar

HIGH

ou

LOW

(isso

pode ser trocando de forma randmica).

3.2

Entrada e sada analgica

3.2.1 analogReference()
Congura a tenso de referncia usada na entrada analgica (isto , o valor usado como topo
do intervalo). As opes possveis esto dispostas na Tabela 3.2.1.

Tabela 3.1: Opes da funo

analogReference().

Opes

Ao executada

DEFAULT

a referncia padro de
de

INTERNAL

5V)

igual a

5 volts (nas placas de Arduino


3.3 volts (nas placas de Arduino de 3.3V)
1, 1 volts no ATmega168 ou ATmega328 e 2, 56

ou

volts no ATmega8 (no disponvel no Arduino Mega)

INTERNAL1V1
INTERNAL2V56
EXTERNAL

usa 1.1V como referncia (apenas Arduino Mega)


usa 2.56V como referncia (apenas Arduino Mega)
a tenso aplicada ao pino AREF (de

5V

usada como referncia.

Parmetros
type: qual tipo de referncia que ser usada
(DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, ou EXTERNAL).
Universidade Federal Fluminense

53

apenas)

Captulo 3. Funes

3.2. Entrada e sada analgica

Dica de cdigo
Depois de trocar a referncia analica, as primeiras leituras de

analogRead()( 3.2.2) podem

no ser precisas.
No se deve usar menos do que 0V ou mais do que 5V para referncias externas nos pinos
usados com AREF! Caso se use uma referncia externa com o pino,deve ser denida a referncia
analgica como

EXTERNAL

antes de se fazer a leitura com

analogRead().

Por outro lado, isso

encurtar a referncia de tenso ativa (gerada internamente) e o pino usado com o AREF, assim
podendo danicar o microcontrolador na placa Arduino. Alternativamente, possvel ligar a
tenso de referncia externa para o pino AREF atravs de um resistor de 5K, que permite
alternar entre tenses de referncia externas e internas.

Nota-se que a resistncia alterar a

tenso que usada como a referncia, porque existe uma resistncia de 32K interna sobre o pino
AREF. Os dois atuam como um divisor de tenso, de modo que, por exemplo, 2,5 V aplicada
atravs da resistncia ir produzir

2, 5 32/(32 + 5) =

2,2 V, no pino AREF.

3.2.2 analogRead()
Faz a leitura de valores de um pino analgico.
Nano, 16 no Mega) de 10

bits

A placa possui 6 canais (8 canais no Mini e

no conversor analgico para digital. Isso signica que as tenses

de entrada sero mapeadas em valores entre 0 e 5 volts para valores inteiros de 0 a 1023. Isso
gera uma resoluo entre as leituras de: 5 volts por 1024 unidades, ou 0,0049 volts (4,9 mV) por
unidade. O alcance e a resoluo de entrada podem ser alterados usando

analogReference().

Demora cerca de 100 microssegundos (0,0001s) para ler uma entrada analgica, ento a taxa
mxima de leitura de cerca de 10.000 vezes por segundo.

Sintaxe
analogRead(pin)

Parmetros
pin: o nmero de entradas analgicas a serem lidas (0 a 5 na maioria
das placas, 0 a 7 nos Arduinos Mini e Nano, 0 a 15 no Arduino Mega)

Retorna
int (0 a 1023)

Dica de cdigo
Se o pino anlgico for declarado mas no estiver conectado a nada, o valor que

analogRead()

retornar ser baseado em um nmero de fatores, como, por exemplo, os valores das outras
entradas analgicas.

Exemplo
Universidade Federal Fluminense

54

Captulo 3. Funes

3.2. Entrada e sada analgica

int analogPin = 3;
int val = 0;

// varivel para guardar o valor lido

void setup(){
Serial.begin(9600);
}
void loop(){
val = analogRead(analogPin);
Serial.println(val);
}

// pino de entrada de leitura

3.2.3 analogReadResolution()
analogReadResolution()

uma extenso do pino analgico para o Arduino Due.

tamanho (em bits) do valor determinado por

analogRead().

Dene o

Seu padro 10 bits (determina

valores entre 0-1023) para verses anteriores com placas baseadas em AVR. O Due tem 12-bit
ADC de capacidade que pode ser acessada mudando a resoluo para 12. Isso vai determinar
valores da

analogRead()

entre 0 e 4095.

Sintaxe
analogReadResolution(bits)

Parmetros
bits: determina a resoluo (em bits) do valor determinado pela
funo analogRead(). possvel determinar isso de 1 32. Pode-se
definir resolues mais altas que 12, mas os valores determinados
por analogRead() vo sofrer aproximaes. Veja a nota abaixo para
detalhes.

Nota
Se o valor de

analogReadResolution()

determinado for um valor maior do que a capaci-

dade da placa, o Arduino apenas vai informar, na sua maior resoluo, os bits extras com zeros.
Por exemplo: ao usar o Due com

analogReadResolution(16)

se obtm uma aproximao de

um nmero de 16-bit com os primeiros 12 bits contendo a leitura real ADC e os 4 ltimos contendo zeros. Se o valor de

analogReadResolution()

determinado for um valor menor do que

a capacidade da placa, os valores extras de bits signicantes na leitura ADC sero descartados.

Universidade Federal Fluminense

55

Captulo 3. Funes

3.2. Entrada e sada analgica

Dica de cdigo
Usar uma resoluo de 16-bit (ou qualquer outra maior que a capacidade do hardware em
questo) permite escrever programas que automaticamente manipulam dispositivos com uma
resoluo ADC maior, quando estes estiverem disponveis em placas futuras, sem mudar a linha
do cdigo.

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

// abre a conexo serial

void loop() {
analogReadResolution(10);
// l a entrada em A0 na resoluo padro
//(10 bits) e envia a conexo serial
Serial.print("ADC 10-bit (default) : ");
Serial.print(analogRead(A0));
analogReadResolution(12); // muda a resulao para 12 bits e l A0
Serial.print(", 12-bit : ");
Serial.print(analogRead(A0));
analogReadResolution(16); // muda a resulao para 16 bits e l A0
Serial.print(", 16-bit : ");
Serial.print(analogRead(A0));
analogReadResolution(8); // muda a resulao para 8 bits e l A0
Serial.print(", 8-bit : ");
Serial.println(analogRead(A0));
delay(100);
}

// uma pausa para no lotar a serial monitor

3.2.4 analogWrite() - PWM


Escreve um valor analgico (onda PWM) para o pino. Pode ser usada para acender um LED
variando sua intensidade luminosa ou acionar um motor em diferentes velocidades.
de chamar

analogWrite(),

balho especicado at a prxima chamada


ou

digitalWrite()

Depois

o pino vai gerar uma onda quadrada constante do ciclo de tra-

no mesmo pino).

analogWrite()

(ou uma chamada

digitalRead()

A frequncia do sinal PWM na maioria dos pinos

aproxidamente 490 Hz. No Uno e placas similares, os pinos 5 e 6 tm uma frequncia de aproximadamente 980 Hz. Na maioria dos Arduinos (com ATmega168 ou ATmega328), a funo
funciona nos pinos 3, 5, 6, 9, 10, and 11. No Arduino Mega, funciona nos pinos 2 - 13 e 44
- 46. Em Arduinos mais antigos com ATmega8 s funciona

Universidade Federal Fluminense

56

analogWrite() nos pinos 9, 10, e 11.

Captulo 3. Funes
No Arduino Due

3.2. Entrada e sada analgica


analogWrite()

funciona nos pinos 2 at 13, somados aos pinos DAC0 e

DAC1. Ao contrrio dos pinos PWM, DAC0 e DAC1 so conversores Digital para Analgico,
e funcionam como verdadeiros pinos de sada analgicos. No necessrio chamar

pinMode()

analogWrite().
analogWrite() no tem relao com os pinos analgicos ou com a funo analogRead().

para determinar o pino como de sada antes de chamar


A funo

Sintaxe
analogWrite(pino, valor)

Parmetros
pino: o nmero do pino escolhido a ser usado.
valor: o ciclo de trabalho: entre 0 (sempre desligado) e 255.

Nota
As sadas PWM, geralmente nos pinos 5 e 6, vo ter ciclos de trabalho maiores que o esperado. Isso por conta das interaes com as funes

millis() e delay(),

que compartilham do

mesmo tempo interno usado para gerar essas sadas PWM. Isso pode ser observado principalmente em denies de ciclos de trabalho baixos (ex.: 0 - 10) que podem resultar em valores
de 0 sem desligar totalmente as sadas nos pinos 5 e 6.

Exemplo
Determinar a sada do LED proporcionalmente ao valor lido no potencimetro.
int ledPin = 9;
int analogPin = 3;
int val = 0;

// LED conectado ao pino digital 9


// potencimetro conectado ao pino analgico 3
// varivel para armazenar o valor lido

void setup()
{
pinMode(ledPin, OUTPUT);
}

// determina o pino como de sada

void loop()
{
val = analogRead(analogPin);
analogWrite(ledPin, val / 4);
}

// l o pino de entrada
// analogRead valores vo de 0 1023,
//analogWrite vo de 0 255

3.2.5 analogWriteResolution()
analogWriteResolution()
analogWriteResolution()

a extenso da Analog API para o Arduino Due.


determina a resoluo da funo

Universidade Federal Fluminense

57

analogWrite().

O padro ser

Captulo 3. Funes

3.2. Entrada e sada analgica

de 8 bits (valores ente 0-255) para verses com compatibilidade com placas baseadas em AVR.
O Due tem as seguintes capacidades de hardware:
12 pinos que tero padro de PWM 8-bit, como as placas baseadas em AVR. Isto pode ser
trocado para uma resoluo de 12-bit.
2 pinos com 12-bit DAC (Conversor Digital-Analgico).
Ao denir a resoluo para 12, pode-se usar

analogWrite()

com valores entre 0 e 4095 para

analisar toda a resoluo DAC ou determinar o sinal PWM.

Sintaxe

analogWriteResolution(bits)

Parmetros

bits: determina a resoluo em (em bits) do valor usado na funo


analogWrite(). O valor pode variar de 1 32. Se a resoluo
escolhida for maior ou menor que a capacidade do hardwar da placa,
o valor usado na analogWrite() vai ser cortado se for muito alto
ou substitudo por zeros se for muito baixo. Veja a nota abaixo
para mais detalhes.

Universidade Federal Fluminense

58

Captulo 3. Funes

3.2. Entrada e sada analgica

Nota
Se determinou-se o valor

analogWriteResolution()

para um valor mais alto que a ca-

pacidade da placa, o Arduino vai discartar os bits extras.

Por exemplo: usando o Due com

analogWriteResolution(16) em um pino 12-bit DAC, somente os primeiros 12 bits dos valores passados para analogWrite() vo ser usados e os ltimos 4 bits vo ser descartados. Se
determinou-se o valor analogWriteResolution() para um valor mais baixo que a capacidade
da placa, os bits que faltam vo ser substitudos por zeros para preencher o tamanho requirido
pelo hardware.

Por exemplo: ao usar o Due com

analogWriteResolution(8)

em um pino

12-bit DAC, o Arduino vai adicionar 4 zero bits para o valor de 8-bit usado na analogWrite()
para obter os 12 bits requeridos.

Exemplo
void setup(){
// abre a conexo serial
Serial.begin(9600);
// determina os pinos digitais como de sada
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop(){
// l a entrada em A0 e descreve o pino PWM
// com um LED ligado
int sensorVal = analogRead(A0);
Serial.print("Analog Read) : ");
Serial.print(sensorVal);
// a resoluo padro PWM
analogWriteResolution(8);
analogWrite(11, map(sensorVal, 0, 1023, 0 ,255));
Serial.print(" , 8-bit PWM value : ");
Serial.print(map(sensorVal, 0, 1023, 0 ,255));
// muda a resoluo PWM para 12 bits
// A resoluo de 12 bits completa s suportada no Duemilanove
analogWriteResolution(12);
analogWrite(12, map(sensorVal, 0, 1023, 0, 4095));
Serial.print(" , 12-bit PWM value : ");
Serial.print(map(sensorVal, 0, 1023, 0, 4095));
// muda a resoluo PWM para 4 bits
analogWriteResolution(4);
analogWrite(13, map(sensorVal, 0, 1023, 0, 127));
Serial.print(", 4-bit PWM value : ");
Serial.println(map(sensorVal, 0, 1023, 0, 127));
Universidade Federal Fluminense

59

Captulo 3. Funes

3.3. Entrada e sada avanada

delay(5);
}

3.3

Entrada e sada avanada

3.3.1 Tone()
Gera uma onda quadrada de frequncia especca (e 50% do ciclo de trabalho) em um pino.
A durao pode ser especca, por outro lado a curva continua at chamar

noTone().

O pino

pode ser conectado um piezo buzzer ou outros semelhantes para reproduzir sons. Somente
um som pode ser gerado em um tempo. Se o som j est tocando em um pino diferente, chamar

tone()

no ter efeito. Se o som est tocando no mesmo pino, chamar

tone()

vai mudar a

frequncia.
Usar a funo

tone()

vai interferir com a sada PWM nos pinos 3 e 11 (em placas que no

sejam a Mega). No possvel gerar sons mais baixos que 31 Hz.

Nota
Se o objetivo for tocar diferentes tons em diversos pinos, necessrio chamar
um pino antes de chamar

tone()

noTone()

em

no prximo pino.

Sintaxe
tone(pino, frequncia)
tone(pino, frequncia, durao)

Parmetros
pino: o pino que gera o som.
frequncia: a frequncia do som em hertz.
durao: a durao do som em milisegundos (opcional).

3.3.2 noTone()
Para a gerao de uma onda quadrada gerada por

tone().

No tem efeito se nenhum som est

sendo gerado.

Nota
Se o objetivo for tocar diferentes tons em diversos pinos, necessrio chamar
um pino antes de chamar

tone()

no prximo pino.

Sintaxe
noTone(pino)

Parmetros
pino: o pino que vai parar de gerar som.
Universidade Federal Fluminense

60

noTone()

em

Captulo 3. Funes

3.3. Entrada e sada avanada

3.3.3 shiftOut()

Desloca um bit de cada vez de um byte de dados . Comea do maior (ex.: mais a esquerda) ou
menor (ex.: mais a direita) bit signicativo. Cada bit escrito por turno a um pino de dados,
aps o pino(clockPin) receber um pulso (primeiro HIGH, depois LOW) para indicar que o bit
vlido. Se h uma interao com um dispositivo que ativado pelo aumento das extremidades,
necessrio ter certeza que o pino est desativado antes de chamar
chamada

digitalWrite(clockPin, LOW).

shiftOut(),

ex.: com a

Nota

Isso uma implementao de


implementao de

hardware

software ; veja tambm a biblioteca SPI, que providencia uma

que mais rpida mas funciona somente em pinos especcos.

Sintaxe

shiftOut(dataPin, clockPin, bitOrder, value)

Universidade Federal Fluminense

61

Captulo 3. Funes

3.3. Entrada e sada avanada

Parmetro
dataPin: o pino em que haver a sada de cada bit (int).
clockPin: o pino de alternncia uma vez que o dataPin
foi definido para o valor correto (int).
bitOrder: que vai deslocar os bits; tanto MSBFIRST ou LSBFIRST
(Primeiro o bit mais signicativo, ou, primeiro o bit menos signicativo).
value: os dados para deslocar. (byte).

Dica de cdigo
O dataPin e clockPin devem ser registrados como de sada ao chamar

pinMode(). shiftOut

escrita na sada 1 byte (8 bits), ento requer uma operao de duas etapas para valores maiores
que 255.

// Faa isso para MSBFIRST serial


int data = 500;
// desloque highbyte
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// desloque lowbyte
shiftOut(dataPin, clock, MSBFIRST, data);
// Ou faa isso para LSBFIRST serial
data = 500;
// desloque lowbyte
shiftOut(dataPin, clock, LSBFIRST, data);
// desloque highbyte
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));

Exemplo
Para o circuito, veja o tutorial sobre como controlar um registro de troca 74HC595.
//**************************************************************//
// Nome
: shiftOutCode, Hello World
//
// Autor : Carlyn Maw,Tom Igoe
//
// Data
: 25 Oct, 2006
//
// Verso : 1.0
//
// Notas : Cdigo para usar um registro de troca 74HC595
//
//
: para ter valores de 0 255
//
//****************************************************************
//Pino conectado ao ST_CP do 74HC595
int latchPin = 8;
//Pino conectado ao SH_CP do 74HC595
int clockPin = 12;
//Pino conectado ao DS do 74HC595
int dataPin = 11;

Universidade Federal Fluminense

62

Captulo 3. Funes

3.3. Entrada e sada avanada

void setup() {
//determinar os pinos como de sada
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
//sequncia de contagem
for (int j = 0; j < 256; j++) {
//deslique o latchPin e mantenha assim enquanto
//estiver havendo transmisso
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, j);
//ligue o latchPin para sinilizar ao chip que ele
//no precisa mais receber informaes
digitalWrite(latchPin, HIGH);
delay(1000);
}
}

3.3.4 shiftln
Muda um bit de cada vez de um byte de dados.
ou menor(ex.:

mais a direita) bit signicativo.

Comea do maior (ex.: mais a esquerda)


Para cada bit, o pino(clockPin) ativado

(HIGH), o prximo bit lido da linha de dados, e ento o pino desativado(LOW). Se h


uma interao com um dispositivo que ativado pelo aumento das extremidades, necessrio ter certeza que o pino est desativado antes de chamar

digitalWrite(clockPin, LOW).

shiftOut(),

ex.: com a chamada

Nota
Isso uma implementao de
uma implementao de

hardware

software ; o Arduino tambm oferece a biblioteca SPI, que usa


que mais rpida mas funciona somente em pinos especcos.

Sintaxe
shifln(dataPin, clockPin, bitOrder)

Parmetro
dataPin: o pino em que haver a entrada de cada bit (int).
clockPin: o pino de alternncia do sinal a ser lido do dataPin (int).
bitOrder: que vai deslocar os bits; tanto MSBFIRST ou LSBFIRST
(Primeiro o bit mais signicativo, ou, primeiro o bit menos signicativo).

Retorna
O valor lido (byte).

Universidade Federal Fluminense

63

Captulo 3. Funes

3.3. Entrada e sada avanada

3.3.5 pulseln
L um pulso (tanto

HIGH

ou

LOW)

de um pino.

Por exemplo, se o valor

HIGH, pulseIn()

espera pelo pino para ligar, inicia a contagem, ento espera o pino para desligar e parar a
contagem. Retorna a durao do pulso em microsegundos. Desiste e retorna 0 se nenhum pulso
comea dentro de um tempo limite especicado.

A contagem dessa funo foi determinada

empricamente e provavelmente vai apresentar erros em longos pulsos. Funciona em pulsos de


10 microsegundos 3 minutos de durao.

Sintaxe

pulseIn(pino, valor)
pulseIn(pino, valor, timeout)

Parmetro

pino: o nmero do pino em que l-se o pulso. (int)


valor: tipo do pulso a ser lido: tanto HIGH ou LOW. (int)
timeout (opcional): o nmero de microsegundos para esperar
o pulso comear; o padro um segundo. (unsigned long)

Retorna
A durao do pulso (em microsegundos) ou 0 se nenhum pulso comear antes do tempo
limite (unsigned

long).

Universidade Federal Fluminense

64

Captulo 3. Funes

3.4. Temporizao

Exemplo
int pin = 7;
unsigned long duration;
void setup()
{
pinMode(pin, INPUT);
}
void loop()
{
duration = pulseIn(pin, HIGH);
}

3.4

Temporizao

3.4.1 millis()
Retorna o nmero em milisegundos desde que o Arduino comeou a rodar o programa em questo. Este nmero vai sobrecarregar (voltar para zero), aproximadamente aps 50 dias.

Retorna
Nmero em milisegundos desde que o programa comeou (unsigned

long).

Exemplo
unsigned long time;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = millis();
//printa o tempo desde que o programa comeou
Serial.println(time);
//espera um segundo para no enviar grande quantidade de dados
delay(1000);
}

Dica de cdigo:
O paramtro para

millis

unsigned long,
int.

um

usar outros tipos de dados como

Universidade Federal Fluminense

65

erros podem ser gerados se o programa

Captulo 3. Funes

3.4. Temporizao

3.4.2 micros()
Retorna o nmero em microsegundos desde que o Arduino comeou a rodar o programa em
questo. O nmero vai sobrecarregar (voltar a zero), aproximadamente aps 70 minutos. Em
16 MHz placas de Arduino (ex.: Duemilanove e Nano), essa funo tem a resoluo de quatro
microsegundos (o valor retornado sempre um mltiplo de quatro).

Em 8 MHz placas de

Arduino (ex.: o LilyPad), esta funo tem uma resoluo de oito microsegundos.

Nota
H 1.000 microsegundos em um milisegundo e 1.000.000 microsegundos em um segundo.

Retorna
Nmero de microsegundos desde que o programa comeou (unsigned

long).

Exemplo
unsigned long time;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = micros();
//printa o tempo desde que o programa comeou
Serial.println(time);
//espera um segundo para no enviar grande quantidade de dados
delay(1000);
}

3.4.3 delay()
Pausa o programa na quantidade de tempo (em milisegundos) especicada como parmetro.
(H 1000 milisegundos em um segundo).

Sintaxe
delay(ms)

Parmetro
ms: o nmero em milisegundos da pausa (unsigned long)

Exemplo
Universidade Federal Fluminense

66

Captulo 3. Funes

3.4. Temporizao

int ledPin = 13;

// LED conectado ao pino digital 13

void setup()
{
pinMode(ledPin, OUTPUT);
}

// determina o pino digital como de sada

void loop()
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}

//
//
//
//

acende o LED
espera um segundo
apaga o LED
espera um segundo

Nota
Enquanto fcil fazer um LED piscar com a funo
pequenos delays para tarefas como

delay(),

e muitos programas usam

debouncing, o uso do delay() em um cdigo tem desvanta-

gens signicativas. Leitura de sensores, clculos matemticos, ou manipulaes de pinos podem


continuar durante a funo

delay, ento, com efeito, isso traz mais outras atividades para fazer

uma pausa. Para abordagens alternativas de controlar o tempo, existe, por exemplo, a funo

millis().

Programadores mais experiente procuram evitar o uso do

delay()

para a tempo-

rizao de eventos com mais de 10 milisegundos, menos no cdigo do Arduino que muito
simples.
No entanto, certas coisas continuam enquanto a funo

delay()

controla o Atmega chip, por-

que a funo delay+ no desabilita interrupes. A comunicao Serial que aparece no pino
RX gravada, valores PWM (analogWrite) e estados de pinos so mantidos, e interrupes
vo trabalhar como deveriam.

3.4.4 delayMicroseconds()
Pausa o programa na quantidade de tempo (em microsegundos) especicada como parmetro.
H mil microsegundos em um milisegundo, e um milho de microsegundos em um segundo.
Atualmente, o maior valor que vai produzir uma pausa exata 16383. Isso pode mudar em
futuros lanamentos de Arduino. Para pausas maiores que alguns milhares de segundos, deve-se
usar

delay().

Sintaxe
delayMicroseconds(us)

Parmetro
us: o nmero em microsegundo da pausa (unsigned int)

Exemplo
Universidade Federal Fluminense

67

Captulo 3. Funes
int outPin = 8;

3.5. Funes matemticas


// pino digital 8

void setup()
{
pinMode(outPin, OUTPUT);
}
void loop()
{
digitalWrite(outPin, HIGH);
delayMicroseconds(50);
digitalWrite(outPin, LOW);
delayMicroseconds(50);
}

// determina o pino digital como de sada

//
//
//
//

ativa o pino
pausa de 50 microsegundos
desativa o pino
pausa de 50 microsegundos

Configura o pino 8 para trabalhar como um pino de saida.


Manda pulsos com um perodo de 100 microsegundos.

Nota
Essa funo trabalha com muita preciso na faixa de 3 microsegundos para cima. No

delayMicroseconds vai funcionar precisamente para pausas menores de


Arduino 0018, delayMicroseconds() no desativa interrupes.

possvel assegurar que


tempo. A partir do

3.5

Funes matemticas

3.5.1 min()
Calcula o mnimo de dois nmeros.

Parmetro
x: o primeiro nmero, qualquer tipo de dado
y: o segundo nmero, qualquer tipo de dado

Retorno
O menor de dois nmeros.

Exemplos
sensVal = min(sensVal, 100);
// atribui sensVal ao menor entre sensVal ou 100
// assegurando que ele nunca fica acima de 100.

Nota
max() muito usada para restringir o menor termo do
min() usada para restringir o maior termo do intervalo.

Universidade Federal Fluminense

68

intervalo de uma varivel, enquanto

Captulo 3. Funes

3.5. Funes matemticas

Dica de cdigo

Por causa do modo que a funo

min() executada, necessrio evitar usar outras funes

dentro dos colchetes, isso pode levar a resultados incorretos.

min(a++, 100);
a++;
min(a, 100);

// evitar isto - produz resultados incorretos


// usar isto - manter outras operaes fora da funo

3.5.2 max()

Calcula o mximo entre dois nmeros.

Universidade Federal Fluminense

69

Captulo 3. Funes

3.5. Funes matemticas

Parmetro
x: o primeiro nmero, qualquer tipo de dado
y: o segundo nmero, qualquer tipo de dado

Retorna
O maior de dois valores do parmetro.

Exemplos
sensVal = max(senVal, 20);
// atribui sensVal ao maior entre sensVal ou 20
// assegurando que ele nunca fique abaixo de 20

Nota
max() muito usada para restringir o menor termo do
min() usada para restringir o maior termo do intervalo.

intervalo de uma varivel, enquanto

Dica de cdigo
Por causa do modo que a funo

max() executada, necessrio evitar usar outras funes

dentro dos colchetes, isso pode levar a resultados incorretos.

max(a--, 100);
a--;
max(a, 100);

// evitar isto - produz resultados incorretos


// usar isto - manter outras operaes fora da funo

3.5.3 abs()
Computa o valor absoluto de um nmero.

Parmetro
x: o nmero

Retorna
x: Se x for maior ou igual a 0.
-x: Se x for menor que 0.

Dica de cdigo
Por causa do modo que a funo

abs() executada, necessrio evitar usar outras funes

dentro dos colchetes, isso pode levar a resultados incorretos.

abs(a++);
a++;
abs(a);

// evitar isto - produz resultados incorretos


// usar isto - manter outras operaes fora da funo

Universidade Federal Fluminense

70

Captulo 3. Funes

3.5. Funes matemticas

3.5.4 constrain()
Restringe um nmero a car dentro de um intervalo.

Parmetro
x: o nmero a restringer, todo tipo de dado
a: o menor termo do intervalo, todo tipo de dado
b: o maior termo do intervalo, todo tipo de dado

Retorna
x: Se x est entre a e b
a: Se x menor que a
b: Se x maior que b

Exemplo
sensVal = constrain(sensVal, 10, 150);
// limites variam de valores de sensores entre 10 e 150

3.5.5 map()
fromLow caria mapeado
para toLow, um valor fromHigh para toHigh, valores in-between para valores in-between, etc.

Remapeia um nmero de um intervalo para outro. Isto , um valor de

No restringe valores para dentro do intervalo, porque valores fora do intervalo so, por vezes,
destinados e teis. A funo

constrain()

pode ser usada tanto antes ou depois desta funo,

se o termo do intervalo for desejado. Note que o "limite inferior"de qualquer intervalo pode ser
maior ou menos que o "limite superior", ento, a funo

map()

pode ser usada para inverter

um intervalo de nmeros, por exemplo:

y = map(x, 1, 50, 50, 1);


A funo tambm lida com nmeros negativos, para isso, este exemplo:

y = map(x, 1, 50, 50, -100);


Isso tambm vlido e funciona bem. A funo

map()

usa matemtica inteira, ento, no vai

gerar fraes. Restos fracionarios so cortados, e no so arredondados.

Parmetro
value: o nmero a mapear
fromLow: o limite inferior do intervalo atual do valor.
fromHigh: o limite superior do intervalo atual do valor.
toLow: o limite inferior do intervalo desejado do valor.
toHigh: o limite superior do intervalo desejado do valor.

Retorna
O valor mapeado.

Exemplo
Universidade Federal Fluminense

71

Captulo 3. Funes

3.5. Funes matemticas

/* Mapeia um valor analgico para 8 bits (0 to 255) */


void setup() {}
void loop()
{
int val = analogRead(0);
val = map(val, 0, 1023, 0, 255);
analogWrite(9, val);
}

Nota
Matematicamente, aqui est toda a funo:

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

3.5.6 pow()
Calcula o valor de um nmero elevado a um potncia.

pow()

pode ser usada para elevar um

nmero a uma potncia fracionada. Isto e til para gerar mapeamento exponencial para valores
ou curvas.

Parmetro
base: o nmero (float)
exponent: a potncia que a base elevada (float)

Retorna
O resultado de uma exponenciao (double).

3.5.7 sqrt()
Calcula a raiz quadrada de um nmero.

Parmetro
x: o nmero, qualquer tipo de dado

Retorna
A ras quadrada do nmero (double).

Universidade Federal Fluminense

72

Captulo 3. Funes

3.5. Funes matemticas

3.5.8 sin()
Calcula o seno de em ngulo (em radianos). O resultado varia de -1 1.

Parmetro
rad: o ngulo em radianos (float)

Retorna
O seno do ngulo (double).

3.5.9 cos()
Calcula o cosseno de em ngulo (em radianos). O resultado varia de -1 1.

Parmetro
rad: o ngulo em radianos (float)

Retorna
O cosseno do ngulo (double).

3.5.10 tan()
Calcula a tangente de em ngulo (em radianos). O resultado varia de innito negativo innito.

Parmetro
rad: o ngulo em radianos (float)

Retorna
A tangente do ngulo (double).

3.5.11 randomSeed()
randomSeed()

inicia o gerador de nmeros pseudo-aleatrio, fazendo com que comece em um

ponto arbitrrio na sua sequncia aleatria. Esta sequncia, embora muito longa e aleatria,
sempre a mesma. Se importante para a sequncia de valores gerados por
em execues subsequentes de um cdigo, use

randomSeed()

random()

diferir,

para iniciar o gerador de nme-

ros aleatrios com uma entrada bastante aleatria, assim como

analogRead()

em um pino

desconectado. Por outro lado, isso pode, ocasionalmente, ser til para usar sequncias pseudoaleatrias que repitam de maneira exata. Isso pode ser realizado chamando
um nmero xo, antes de comear a sequncia aleatria.

Parmetro
long, int - transmite um nmero para dar nicio.
Universidade Federal Fluminense

73

randomSeed() com

Captulo 3. Funes

3.5. Funes matemticas

Exemplo
long randNumber;
void setup(){
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop(){
randNumber = random(300);
Serial.println(randNumber);
delay(50);
}

3.5.12 random()
A funo

random()

gera nmeros pseudo-aleatrios.

Sintaxe
random(max)
random(min, max)

Parmetro
min - limite inferior do valor aleatrio, inclusive (opcional)
max - limite superior do valor aleatrio, exclusivo

Retorno
Um nmero aleatrio entre min e max-1 (long).

Nota
Se importante para a sequncia de valores gerados por
subsequentes de um cdigo, use

randomSeed()

random()

diferir, em execues

para iniciar o gerador de nmeros aleatrios

com uma entrada bastante aleatria, assim como

analogRead()

em um pino desconectado.

Por outro lado, isso pode, ocasionalmente, ser til para usar sequncias pseudo-aleatrias que
repitam de maneira exata. Isso pode ser realizado chamando
xo, antes de comear a sequncia aleatria.

Exemplo
long randNumber;
void setup(){
Universidade Federal Fluminense

74

randomSeed()

com um nmero

Captulo 3. Funes

3.6. Bits e bytes

Serial.begin(9600);
// se o pino de entrada analgico 0 desconectado,
// o retorno random analog vai causar a chamada da randomSeed()
// para gerar diferentes nmeros iniciais cada vez que o cdigo rodar.
// randomSeed() vai embaralhar a funo random.
randomSeed(analogRead(0));
}
void loop() {
// printa um nmero aleatrio de 0 299.
randNumber = random(300);
Serial.println(randNumber);
// printa um nmero aleatrio de 10 19.
randNumber = random(10, 20);
Serial.println(randNumber);
delay(50);
}

3.6

Bits e bytes

3.6.1 lowByte()
Extrai o byte de menor ordem (mais a direita) de uma varivel (ex.: uma palavra).

Sintaxe

lowByte(x)

Universidade Federal Fluminense

75

Captulo 3. Funes

3.6. Bits e bytes

Parmetro
x: um valor de qualquer tipo

Retorna
byte.

3.6.2 highByte()
Extrai o byte de maior ordem (mais a esquerda) de uma palavra (ou o segundo menor byte de
um tipo de dado maior).

Sintaxe
highByte(x)

Parmetro
x: um valor de qualquer tipo

Retorna
Byte.

3.6.3 bitRead()
L um bit de um nmero.

Sintaxe
bitRead(x, n)

Parmetro
x: o nmero a partir do qual feita a leitura.
n: o bit a ser lido, comeando do 0 para o bit
menos significativo (mais a direita).

Retorna
O valor de um bit (0 ou 1).

Universidade Federal Fluminense

76

Captulo 3. Funes

3.6. Bits e bytes

3.6.4 bitWrite()
Escreve um bit de uma varivel numrica.

Sintaxe
bitWrite(x, n, b)

Parmetro
x: a
n: o
para
b: o

varivel numrica a ser escrita.


bit do nmero a ser escrito, comeando do 0
o bit menos significativo (mais a direita).
valor a ser escrito para o bit (0 ou 1).

3.6.5 bitSet()
Determina (escreve um 1 para) um bit de uma varivel numrica.

Sintaxe
bitSet(x, n)

Parmetro
x: a varivel numrica cujo bit ser determinado.
n: o bit a ser determinado, comeando do 0 para o bit menos significativo.

3.6.6 bitClear()
Apaga (escreve um 0 para) um bit de uma varivel nmerica.

Sintaxe
bitClear(x, n)

Parmetro
x: a varivel numrica cujo bit ser apagado.
n: o bit a ser apagado, comeando do 0 para o bit menos significativo.

3.6.7 bit()
Computa o valor de um bit especco (bit 0 1, bit 1 2, bit 2 4, etc.).

Sintaxe
bit(n)

Parmetro
n: o bit cujo valor ser computado.

Retorna
O valor do bit.

Universidade Federal Fluminense

77

Captulo 3. Funes

3.7

3.7. Interrupes externas

Interrupes externas

3.7.1 attachInterrupt()
Especica uma chamada de rotina de servio de interrupo (ISR) para chamar quando ocorre
uma interrupo. Substitui qualquer funo anterior, que foi anexada interrupo. A maioria
das placas de Arduino tem duas interrupes externas: nmero 0 (no pino digital 2) e 1 (no
pino digital 3). A tabela abaixo mostra os pinos de interrupo em diversas placas.

Placas

int.0

int.1 int.2 int.3 int.4 int.5

Uno, Ethernet

Mega2560

21

20

19

Leonardo

Due

(veja abaixo)

18

O Arduino Due tem poderosas capacidades de interrupo que permitem anexar uma funo
de interrupo em todos os pinos disponveis. possvel identicar diretamente o nmero do
pino em

attachInterrupt().

Nota
Dentro da funo,

delay()

no ir funcionar e o valor retornado por

millis()

no ser

desenvolvido. Dados Seriais recebidos durante a funo podem ser perdidos. necessrio declarar como volteis todas variveis que foram modicadas dentro da funo. Veja a seo sobte
ISRs abaixo para mais informaes.

Utilizando interrupes
Interupes so teis para fazer coisas acontecerem automaticamente em programas de microcontroladores, e pode ajudar a resolver problemas de temporizao. Boas tarefas para usar
uma interrupo so a leitura de um codicador rotatrio, ou monitorar a entrada de um usurio.
Se o objetivo garantir que o programa sempre conte os pulsos de um codicador rotatrio,
para que ele nunca perca um pulso, isto tornaria muito complicado escrever um programa
para fazer qualquer outra coisa, porque o programa iria precisar consultar constantemente as
linhas de sensor para o codicador, a m de capturar os pulsos quando eles ocorrerem. Outros
sensores tem uma dinmica de interface similar tambm, como tentar ler um sensor de som
que est tentando capturar um rudo, ou um sensor infravermelho (foto-interruptor) tentando
capturar uma moeda caindo. Em todas estas situaes, usar uma interrupo pode liberar o
microcontrolador para capturar outra atividade realizade enquanto no perde a entrada.

Sobre rotinas de servio de interrupo (Interrupt Service Routines/ISR)


ISRs so tipos especiais de funes que tem algumas limitaes nicas que a maioria das
outras funes no tem. Uma ISR no pode ter nenhum parmetro, e no deve retornar nada.
Geralmente, uma ISR deve ser o mais curta e rpida quanto possvel. Se o cdigo usa mltiplas
ISRs, somente uma pode rodar por vez, outras interrupes vo ser ignoradas (desligadas) at
a interrupo em questo terminar. Como

Universidade Federal Fluminense

delay() e millis() dependem de interrupes, elas


78

Captulo 3. Funes

3.7. Interrupes externas

no vo funcionar enquanto uma ISR estiver rodando.

delayMicroseconds(),

que no depende de interrupes, vai funcionar como esperado. Nor-

malmente, as variveis globais so usadas para passar dados entre uma ISR e o programa
principal. Para ter certeza que variveis usadas em uma ISR so atualizadas corretamente, as
declare como volteis.

Sintaxe
attachInterrupt(interrupt, ISR, mode)
attachInterrupt(pin, ISR, mode)
(Arduino Due somente)

Parmetro
interrupt:
o nmero da interrupo (int)
pin: o nmero do pino (Arduino Due somente)
ISR:
o ISR a ser chamado quando uma interrupo ocorre;
esta funo no deve ter parmetros e no deve retornar nada.
Essa funo , algumas vezes, referia como um rotina de servio de interrupo.
mode:
define quando a interrupo deve ser acionada. Quatro
constantes so pr-definidas como valores vlidos.
LOW para acionar a interrupo sempre que o pino est desligado.
CHANGE para acionar a interrupo sempre que o pino muda o valor.
RISING para acionar quando o pino vai de desligado para ligado.
FALLING para quando o pino vai de ligado para desligado.
A placa Due permite tambm:
HIGH para acionar a interrupo sempre que o pino est ligado.
(Arduino Due somente)

Exemplo
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, state);
}
void blink()
{
state = !state;
}
Universidade Federal Fluminense

79

Captulo 3. Funes

3.8. Interrupes

3.7.2 detachInterrupt()
Desliga a interrupo determinada.

Sintaxe
detachInterrupt(interrupt)
detachInterrupt(pin)
(Arduino Due somente)

Parmetro
interrupt: o nmero da interrupo a ser desativada
(veja attachInterrupt() para mais detalhes).
pin: o nmero do pino da interrupo a ser desativada (Arduino Due somente)

3.8

Interrupes

3.8.1 interrupts()
Reabilita interrupes (depois delas terem diso desativas por

noInterrupts()).

Interrupes

permitem que certas tarefas importantes aconteam em segundo plano e so ativadas por padro.

Algumas funes no vo funcionar enquanto interrupes so desativadas, e comuni-

caes recebidas podem ser ignoradas. Interrupes podem atrapalhar um pouco o tempo do
cdigo no entanto, e podem ser desativadas para sees particulares crticas do cdigo.

Exemplo
void setup() {}
void loop()
{
noInterrupts();
// crtico, tempo sensvel de cdigo aqui.
interrupts();
// outro cdigo aqui.
}

3.8.2 noInterrupts()
Desativa interrupes ( possvel reabilit-las com

interrupts()).

Interrupes permitem que

certas tarefas importantes aconteam em segundo plano e so ativadas por padro. Algumas
funes no vo funcionar enquanto interrupes so desativadas, e comunicaes recebidas
podem ser ignoradas. Interrupes podem atrapalhar um pouco o tempo do cdigo no entanto,
e podem ser desativadas para sees particulares crticas do cdigo.

Universidade Federal Fluminense

80

Captulo 3. Funes

3.9. Comunicao

Exemplo
void setup() {}
void loop()
{
noInterrupts();
// crtico, tempo sensvel de cdigo aqui.
interrupts();
// outro cdigo aqui.
}

3.9

Comunicao

3.9.1 Serial
Usada para a comunicao entre a placa do Arduino e o computador ou outros dispositivos.
Todas as placas de Arduino tem no mnimo uma porta serial (tambm conhecida como uma
(UART ou USART): Serial. Comunica nos pinos digitais 0 (RX) e 1 (TX) bem como com o
computador via USA. Assim, se usadas estas funo, no possvel usar tambm os pinos 0 e
1 para sadas ou entradas digitais.
possvel usar o ambiente serial monitor do Arduino para se comunicar com a placa do Arduino. Clicando no boto serial monitor na barra de ferramentas e selecionando a mesma taxa
de transmisso usada na chamada para

begin().

O Arduino Mega tem trs portas seriais adicionais: Serial1 nos pinos 19 (RX) e 18 (TX), Serial2
nos pinos 17 (RX) e 16 (TX), Serial3 nos pinos 15 (RX) e 14 (TX). Para usar esses pinos para
comunicao com um computador pessoal, necessrio um adaptador adicional USB-serial,
como eles no esto conectados ao adaptador USB-serial do Mega. Para us-los para comunicao com um dispositivo serial externo TTL, necessrio conectar o pino TX ao pino RX do
dispositivo, o RX ao pino TX do dispositivo, e o ground do Mega ao ground do dispositivo.
(No se conecta esses pinos diretamente a uma porta serial RS232; eles operam em +/- 12V e
podem danicar a placa do Arduino.)
O Arduino Due tem trs portas seriais TTL 3.3V adicionais: Serial1 nos pinos 19 (RX) e 18
(TX); Serial2 nos pinos 17 (RX) e 16 (TX), Serial3 nos pinos 15 (RX) e 14 (TX). Pinos 0 e 1
so conectados tambm ao pinos correspondentes do ATmega16U2 USB-TTL Serial chip, que
est conectado a porta de depurao USB. Somado a isso, h a porta nativa USB-serial no
SAM3X chip, SerialUSB'.
A placa de Arduino Leonardo usa Serial1 para se comunicar via TTL (5V) serial nos pinos 0
(RX) e 1 (TX). Serial reservada para comunicao USB CDC.

Funes
if (Serial)
available()
begin()
end()
nd()
ndUntil()

Universidade Federal Fluminense

81

Captulo 3. Funes

3.9. Comunicao

ush()
parseFloat()
parseInt()
peek()
print()
println()
read()
readBytes()
readBytesUntil()
setTimeout()
write()
serialEvent()

3.9.2 Stream
Stream

a classe de base para caracteres e streams de bases binrias.

Ela no chamada

diretamente, mas chamada sempre que se usa uma funo que dependa dela.

Stream dene funes de leitura no Arduino. Quando se usa qualquer funcionalidade principal
que usa read() ou mtodos similares, possvel seguramente assumir que isso chama uma classe
Stream. Para funes como print(), Stream herda da classe Print. Algumas das bibliotecas
que dependem da Stream so:

Serial
Wire
Ethernet Client
Ethernet Server
SD

Universidade Federal Fluminense

82

Captulo 3. Funes

3.10. USB (apenas Arduinos Leonardo e Due)

Funes
available()
read()
ush()
nd()
ndUntil()
peek()
readBytes()
readBytesUntil()
readString()
readStringUntil()
parseInt()
parseoat()
setTimeout()

3.10

USB (apenas Arduinos Leonardo e Due)

3.10.1 Teclado e mouse


Estas bibliotecas principais permitem que as placas de Arduino Leonardo, Micro, ou Due apaream como um Mouse e/ou Teclado nativos de um computador conectado.
Um aviso sobre o uso das bibliotecas

Mouse

Keyboard:

se a biblioteca

Mouse

est rodando constantemente, isso vai dicultar a programao da placa.

Mouse.move()

Keyboard.print()

ou

Keyboard

Funes como

vo mover o cursor ou enviar teclas digitadas para um

computador conectado e devem somente ser chamadas quando se est pronto para manuselas.

recomendado usar um sistema de controle para ativar esta funcionalidade, como um

interruptor fsico ou somente respondendo a uma entrada especca que pode ser controlada.
Quando se usa a biblioteca

Serial.print().

Mouse

ou

Keyboard,

melhor testar a sada primeiro usando

Desse modo, possvel ter certeza que os valores que esto sendo infor-

mados so conhecidos. Consulte os exemplos de

Mouse

Keyboard

para algumas maneiras de

manuse-las.

Mouse
As funes do mouse permitem ao Leonardo, Micro, ou Due controlar o movimento do
cursor do computador conectado.

Ao atualizar a posio do cursor, ela sempre relativa a

posio anterior.
Mouse.begin()
Mouse.click()
Mouse.end()
Mouse.move()
Mouse.press()
Mouse.release()
Mouse.isPressed()

Universidade Federal Fluminense

83

Captulo 3. Funes

3.10. USB (apenas Arduinos Leonardo e Due)

Keyboard
As funes do teclado permitem ao Leonardo, Micro, ou Due mandar teclas digitadas para
um computador ligado.

Nota
Nem todos possveis caracteres ASCII, particulamente os no-imprimveis, podem ser enviados com a biblioteca

Keyboard.

A biblioteca apoia o uso de teclas modicadoras. Teclas

modicadoras alteram o comportamento de outra tecla quando pressionada simultaneamente.

Keyboard.begin()
Keyboard.end()
Keyboard.press()
Keyboard.print()
Keyboard.println()
Keyboard.release()
Keyboard.releaseAll()
Keyboard.write()

Universidade Federal Fluminense

84

Apndice A
Apndice
A.1

Tabela ASCII

Figura A.1: Tabela ASCII - parte 1.

85

Apndice A. Apndice

A.1. Tabela ASCII

Figura A.2: Tabela ASCII - parte 2.

Modicado de: link ASCII

em 12/02/2014.

1 http://www.theasciicode.com.ar/american-standard-code-information-interchange/ascii-codes-table.gif

Universidade Federal Fluminense

86

Referncias Bibliogrcas
[1] Referncia do

website

ocial do Arduino.

http://arduino.cc/en/Reference/HomePage.

Accessado em: 12/02/2014.


[2] Waldemar Celes Filho, Renato Cerqueira, and Jo Lucas Rangel.

de dados: com tcnicas de programao em C.

[3] Neal S. Widmer and Ronald J. Tocci.

Introduo a estruturas

Elsevier, 11 edition, 2004.

Sistemas Digitais - Princpios e Aplicaes.

Hall - Br, 11 edition, 2011.

87

Prentice