Beruflich Dokumente
Kultur Dokumente
Autor:
Tutor:
Niteri - RJ
Fevereiro / 2014
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
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
28
28
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
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
39
2.2.11 short . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
2.2.13 double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
42
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
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
51
3.1.1
pinMode() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
3.1.2
digitalWrite() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
3.1.3
digitalRead()
52
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
3.2.1
analogReference() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
3.2.2
analogRead()
54
3.2.3
analogReadResolution()
3.2.4
analogWrite() -
3.2.5
analogWriteResolution()
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PWM
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
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
mouse
. . . . . . . . . . . . . . . . . . . . . .
83
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
A Apndice
A.1
60
85
Tabela ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
Sumrio
Sumrio
Lista de Figuras
A.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
A.2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
Lista de Figuras
Lista de Figuras
Captulo 1
Estrutura
1.1
setup()
A funo
setup()
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()
ao seu programa fazer mudanas e responder. Esta funo usada para controlar ativamente
a placa Arduino.
Exemplo
int buttonPin = 3;
Captulo 1. Estrutura
beginSerial(9600);
pinMode(buttonPin, INPUT);
delay(1000);
1.3
Estruturas de controle
O programa testa se
variavel
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
10
Captulo 1. Estrutura
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
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.
else.
No h limites de condies a
serem colocadas.
11
swich case.
Captulo 1. Estrutura
1.3.3 for
For
chamada de estrutura de lao, pois cada bloco de programa se repete uma determinada
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,
loop
termina.
Exemplo
Dica de cdigo
C uma linguagem que possibilita ao usurio maior conforto do que outras linguagens para
realizar determinadas aes. Uma delas o
loop.
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.
12
oat.
Captulo 1. Estrutura
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);
}
}
if, switch...case
especicar diferentes cdigo que podero ser executados em diferentes condies. Em particular,
a estrutura do
Quando
case.
Sem o
break,
break
interrompe o
a estrutura do
switch
switch,
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
}
13
Captulo 1. Estrutura
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.
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++;
}
14
Captulo 1. Estrutura
1.3.6 do-while
Muito parecido com o
do
while,
Sintaxe
do{
// bloco de aes
} while (teste de condio);
Exemplo
Leitura de algum sensor:
do{
delay(50);
x = readSensors();
1.3.7 break
Interrompe alguma condio de
Exemplo
loop.
15
switch.
Captulo 1. Estrutura
1.3.8 continue
Ignora o resto da iterao atual de um
cional do
loop. continue
Exemplo
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:
Exemplos:
int checkSensor(){
if (analogRead(0) > 400) {
return 1;
else{
return 0;
}
}
16
Captulo 1. Estrutura
Dica de cdigo
return
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
loops
ou blocos
lgicos, com uma determinada condio./ A razo pela qual muitos programadores desaprovam, que com o uso desenfreado de instrues
goto,
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:
17
Captulo 1. Estrutura
1.4
Elementos de sintaxe
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-
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
chaves que esto comentadas. Programadores iniciantes e programadores que habituados com
BASIC normalmente encontram diculdades com o uso de chaves.
substituem a instruo
cional e a instruo
No obstante, as chaves
(funo), a estrutura
ENDIF
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
18
Captulo 1. Estrutura
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
comentar:
Example
x = 5;
19
Captulo 1. Estrutura
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
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.
const
define.
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.
erros.
#define ledPin 3;
// errado!
#define ledPin = 3
// errado!
20
Captulo 1. Estrutura
1.4.5 include
#include
chips
da Atmel, os
Exemplo
Esse exemplo inclui a biblioteca que usada para colocar informaes no espao de memria
ash
ao invs da
ram.
ram
#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
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
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
Operador
Signicado lgico
&&
||
!
e (and)
ou (or)
negao (not)
22
Captulo 1. Estrutura
1.8
Operadores de ponteiro
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
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].
Resultado
23
Captulo 1. Estrutura
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.
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:
Resultado
24
Captulo 1. Estrutura
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
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:
Resultado
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
25
Captulo 1. Estrutura
Dica de cdigo
O operador XOR tambm usado como um somador de nmeros binrios.
1.9.2
Bitwise NOT()
O operador
sim
bitwise
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:
Resultado
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.
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.
<<
>>.
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
integer
26
<= 32
Captulo 1. Estrutura
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
<<
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
typecast
esquerda:
int x = -16;
// binrio: 1111111111110000
int y = (unsigned int)x >> 3; // binrio: 0001111111111110
27
Captulo 1. Estrutura
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
>>
Operadores de composio
Sintaxe
x++;
++x;
x--;
--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--;
28
Captulo 1. Estrutura
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
Exemplo
x
x
x
x
x
= 2;
+= 4;
-= 3;
*= 10;
/= 2;
//
//
//
//
x
x
x
x
agora
agora
agora
agora
possui
possui
possui
possui
o
o
o
o
valor
valor
valor
valor
de
de
de
de
29
6
3
30
15
bitwise AND
e do
Captulo 1. Estrutura
30
Captulo 2
Variveis
2.1
Constantes
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
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
digitalWrite
como
pinMode
o pino como
INPUT
e, posteriormente, com a
31
Captulo 2. Variveis
2.1. Constantes
INPUT_PULLUP
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
OUTPUT
com
pinMode,
e denido como
LOW
com
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.
pinMode()
pull-up 1
ser acessados. Caso seja necessrios usar esses resistores ao invs de resistores externos
down
, deve-se usar
o comportamento,
1 A idia de um resistor
pull-
inverte
pull-up que ele fracamente puxe(pulls ) a tenso do condutor que ele est conectado
2 resistores
pull-down
componente estiver conduzindo a entrada. Eles so usados com menos frequncia que os resistores
3 http://pt.wikipedia.org/wiki/Resistores
p ull
up+
32
pull-up.
Captulo 2. Variveis
2.1. Constantes
Po-
dem prover uma quantidade considervel de corrente para outros circuitos. Pinos da Atmega
fornecem corrente possitiva ou negativa at
40mA
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.
onboard
em srie com
maior parte das placas possuem esse LED conectado ao pino digital 13.
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.
Base
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
Base decimal
Decimal base 10. Constantes sem prexos so assumidas como formato decimal.
Exemplo:
101
Base binria
Binrio base dois. Apenas caracteres 0 e 1 so vlidos.
33
Captulo 2. Variveis
2.1. Constantes
Exemplo:
B101
bytes
(8
Se for conveniente inserir um inteiro (int, 16 bits) na forma binria, deve-se fazer em dois passos:
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
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.
prexo 0x. Repare que tanto faz escrever as letras em caixa alta ou baixa.
Exemplo:
0x101
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
34
Captulo 2. Variveis
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.
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
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.
35
true
ou
false.
Captulo 2. Variveis
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".
American
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
um tipo
byte
(8
Exemplo
char myChar = 'A';
char myChar = 65;
// ambos so vlidos
byte
Exemplo
byte
2.2.5 byte
A
byte
Example
byte b = B10010;
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
J no Arduino Due,
intervalo de
- 1).
36
Captulo 2. Variveis
int
guarda nmeros negativos com uma tcnica chamada de complemento de dois, citada
anteriormente. O
bit
bit
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
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.
x = 32767;
x = x + 1;
unsigned ints
bytes.
(inteiros
unsigned )
so o
A diferena entre
e (
signed ) int,
que o MSB
Exemplo
unsigned int ledPin = 13;
4 Most
37
Captulo 2. Variveis
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;
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
38
de 0 a 65535. Semelhante a
unsigned int.
Captulo 2. Variveis
unsigned long
Exemplo
bits
(4
39
Captulo 2. Variveis
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
float
float.
bits
(4
3.4028235E + 38
bytes ) de informao.
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.
Exemplo
float minha_variavel;
float sensorCalibrado = 1.117;
40
float,
deve-se
Captulo 2. Variveis
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;
2.2.13 double
Preciso dupla para nmeros de ponto utuante.
ATMEGA, ocupa 4
bytes.
41
Captulo 2. Variveis
Strings :
Cdigo
char
char
'd',
char
'd',
char
como declarar?
Forma de declarar
Str1[15];
Str2[8] =
'u', 'i',
Str3[8] =
'u', 'i',
Str4[ ] =
{'a', 'r',
'n', 'o'};
{'a', 'r',
'n', 'o', '\0'};
"arduino";
Inicializar o array,
strings
Serial.print()
string
bytes
string.
string.
Isso
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
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.
42
Captulo 2. Variveis
Vetores de
strings
display
strings. Strings
so por si s vetores, um
char char*
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);
}
}
String
com vetores.
mais. preciso mais memria do que uma matriz de caracteres simples, mas tambm mais
til.
as instncias da classe
String
so chamados de
strings
strings
strings
String.
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-
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
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.
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
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
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.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
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
void loop(){
int i;
// "i" ser visvel apenas na funo loop
float f; // "f" ser visvel apenas na funo loop
// ...
2.4.2 Estticas
A palavra reservada
funo.
static
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
o chamada.
Exemplo
int var1;
int var2;
void setup(){
// ...
}
void loop(){
// ...
}
int funcao(){
static int var3;
aes
}
47
Captulo 2. Variveis
2.4.3 Voltil
volatile
da varivel, possui o intuito de modicar como o compilador e o programa iro tratar a varivel.
Declarar uma varivel com
software
volatile
que traduz o cdigo em C/C++, que envia as reais instrues para o chip Atmega 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
read-only .
ser utilizada, assim como qualquer outra varivel do seu tipo, mas o seu valor no pode ser
alterado.
varivel
const.
#define.
48
Captulo 2. Variveis
2.5. Utilitrios
Exemplo
const float pi = 3.14;
float x;
// ....
x = pi * 2;
pi = 7;
#define
ou const:
tipo de varivel
Contantes numricas
Strings
Vetores
2.5
#define const
Utilitrios
2.5.1 sizeof()
O operador
sizeof()
retorna o nmero de
bytes
ocupados em um vetor.
Sintaxe
sizeof(variable)
Parmetros
varivel: qualquer tipo de varivel ou vetor (exemplo: int, float, byte)
49
bytes
Captulo 2. Variveis
2.5. Utilitrios
Exemplo
O operador
sizeof
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.
int,
sizeof
deve-se usar um
loop
do tipo
for.
bytes.
string
50
Captulo 3
Funes
3.1
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.
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
void setup(){
pinMode(ledPin, 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.2 digitalWrite()
Escreve o valor de
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
Sintaxe
digitalWrite(pino, valor)
Parmetros
pino: nmero do pino
valor: HIGH ou LOW
Exemplo
int ledPin = 13;
13
void setup(){
pinMode(ledPin, 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
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
3.2
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.
analogReference().
Opes
Ao executada
DEFAULT
a referncia padro de
de
INTERNAL
5V)
igual a
ou
INTERNAL1V1
INTERNAL2V56
EXTERNAL
5V
Parmetros
type: qual tipo de referncia que ser usada
(DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, ou EXTERNAL).
Universidade Federal Fluminense
53
apenas)
Captulo 3. Funes
Dica de cdigo
Depois de trocar a referncia analica, as primeiras leituras de
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
analogRead().
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.
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) =
3.2.2 analogRead()
Faz a leitura de valores de um pino analgico.
Nano, 16 no Mega) de 10
bits
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
int analogPin = 3;
int val = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
val = analogRead(analogPin);
Serial.println(val);
}
3.2.3 analogReadResolution()
analogReadResolution()
analogRead().
Dene o
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()
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)
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()
a capacidade da placa, os valores extras de bits signicantes na leitura ADC sero descartados.
55
Captulo 3. Funes
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);
}
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);
}
analogWrite(),
digitalWrite()
Depois
no mesmo pino).
analogWrite()
digitalRead()
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
56
Captulo 3. Funes
No Arduino Due
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().
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;
void setup()
{
pinMode(ledPin, OUTPUT);
}
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()
57
analogWrite().
O padro ser
Captulo 3. Funes
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()
Sintaxe
analogWriteResolution(bits)
Parmetros
58
Captulo 3. Funes
Nota
Se determinou-se o valor
analogWriteResolution()
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.
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
delay(5);
}
3.3
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()
tone()
vai mudar a
frequncia.
Usar a funo
tone()
vai interferir com a sada PWM nos pinos 3 e 11 (em placas que no
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().
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.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
hardware
Sintaxe
61
Captulo 3. Funes
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.
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;
62
Captulo 3. Funes
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.:
digitalWrite(clockPin, LOW).
shiftOut(),
Nota
Isso uma implementao de
uma implementao de
hardware
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).
63
Captulo 3. Funes
3.3.5 pulseln
L um pulso (tanto
HIGH
ou
LOW)
de um pino.
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.
Sintaxe
pulseIn(pino, valor)
pulseIn(pino, valor, timeout)
Parmetro
Retorna
A durao do pulso (em microsegundos) ou 0 se nenhum pulso comear antes do tempo
limite (unsigned
long).
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
65
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
void setup()
{
pinMode(ledPin, OUTPUT);
}
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(),
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().
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()
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;
void setup()
{
pinMode(outPin, OUTPUT);
}
void loop()
{
digitalWrite(outPin, HIGH);
delayMicroseconds(50);
digitalWrite(outPin, LOW);
delayMicroseconds(50);
}
//
//
//
//
ativa o pino
pausa de 50 microsegundos
desativa o pino
pausa de 50 microsegundos
Nota
Essa funo trabalha com muita preciso na faixa de 3 microsegundos para cima. No
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.
68
Captulo 3. Funes
Dica de cdigo
min(a++, 100);
a++;
min(a, 100);
3.5.2 max()
69
Captulo 3. Funes
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.
Dica de cdigo
Por causa do modo que a funo
max(a--, 100);
a--;
max(a, 100);
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(a++);
a++;
abs(a);
70
Captulo 3. Funes
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.
No restringe valores para dentro do intervalo, porque valores fora do intervalo so, por vezes,
destinados e teis. A funo
constrain()
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()
map()
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
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()
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).
72
Captulo 3. Funes
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()
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,
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
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()
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
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
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)
75
Captulo 3. Funes
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).
76
Captulo 3. Funes
3.6.4 bitWrite()
Escreve um bit de uma varivel numrica.
Sintaxe
bitWrite(x, n, b)
Parmetro
x: a
n: o
para
b: o
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.
77
Captulo 3. Funes
3.7
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
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()
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.
Captulo 3. Funes
delayMicroseconds(),
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.
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()).
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.
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()
81
Captulo 3. Funes
3.9. Comunicao
ush()
parseFloat()
parseInt()
peek()
print()
println()
read()
readBytes()
readBytesUntil()
setTimeout()
write()
serialEvent()
3.9.2 Stream
Stream
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
82
Captulo 3. Funes
Funes
available()
read()
ush()
nd()
ndUntil()
peek()
readBytes()
readBytesUntil()
readString()
readStringUntil()
parseInt()
parseoat()
setTimeout()
3.10
Mouse
Keyboard:
se a biblioteca
Mouse
Mouse.move()
Keyboard.print()
ou
Keyboard
Funes como
computador conectado e devem somente ser chamadas quando se est pronto para manuselas.
interruptor fsico ou somente respondendo a uma entrada especca que pode ser controlada.
Quando se usa a biblioteca
Serial.print().
Mouse
ou
Keyboard,
Desse modo, possvel ter certeza que os valores que esto sendo infor-
Mouse
Keyboard
manuse-las.
Mouse
As funes do mouse permitem ao Leonardo, Micro, ou Due controlar o movimento do
cursor do computador conectado.
posio anterior.
Mouse.begin()
Mouse.click()
Mouse.end()
Mouse.move()
Mouse.press()
Mouse.release()
Mouse.isPressed()
83
Captulo 3. Funes
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.
Keyboard.begin()
Keyboard.end()
Keyboard.press()
Keyboard.print()
Keyboard.println()
Keyboard.release()
Keyboard.releaseAll()
Keyboard.write()
84
Apndice A
Apndice
A.1
Tabela ASCII
85
Apndice A. Apndice
em 12/02/2014.
1 http://www.theasciicode.com.ar/american-standard-code-information-interchange/ascii-codes-table.gif
86
Referncias Bibliogrcas
[1] Referncia do
website
ocial do Arduino.
http://arduino.cc/en/Reference/HomePage.
Introduo a estruturas
87
Prentice