Programação para Arduino em
C++
A
linguagem de programação do Arduino pode ser dividida em três partes
principais: estruturas, valores (variáveis e constantes) e funções.
FUNÇÕES
Para controlar a placa Arduino e realizar
computações.
Entradas e Saídas Digitais
digitalRead()
digitalWrite()
pinMode()
digitalWrite()
pinMode()
Entradas e Saídas Analógicas
analogRead()
analogReference()
analogWrite()
analogReference()
analogWrite()
Apenas Zero, Due e Família MKR
analogReadResolution()
analogWriteResolution()
analogWriteResolution()
Entradas e Saídas Avançadas
noTone()
pulseIn()
pulseInLong()
shiftIn()
shiftOut()
tone()
pulseIn()
pulseInLong()
shiftIn()
shiftOut()
tone()
Funções Temporizadoras
delay()
delayMicroseconds()
micros()
millis()
delayMicroseconds()
micros()
millis()
Funções Matemáticas
abs()
constrain()
map()
max()
min()
pow()
sq()
sqrt()
constrain()
map()
max()
min()
pow()
sq()
sqrt()
Funções Trigonométricas
cos()
sin()
tan()
sin()
tan()
Caracteres
isAlpha()
isAlphaNumeric()
isAscii()
isControl()
isDigit()
isGraph()
isHexadecimalDigit()
isLowerCase()
isPrintable()
isPunct()
isSpace()
isUpperCase()
isWhitespace()
isAlphaNumeric()
isAscii()
isControl()
isDigit()
isGraph()
isHexadecimalDigit()
isLowerCase()
isPrintable()
isPunct()
isSpace()
isUpperCase()
isWhitespace()
Números Aleatórios
random()
randomSeed()
randomSeed()
Bits e Bytes
bit()
bitClear()
bitRead()
bitSet()
bitWrite()
highByte()
lowByte()
bitClear()
bitRead()
bitSet()
bitWrite()
highByte()
lowByte()
Interrupções Externas
attachInterrupt()
detachInterrupt()
detachInterrupt()
Interrupções
interrupts()
noInterrupts()
noInterrupts()
Comunicação
Serial
Stream
Stream
USB
Keyboard
Mouse
Mouse
VARIÁVEIS
Tipos de dados e constantes da linguagem
Arduino.
Constantes
HIGH | LOW
INPUT | OUTPUT | INPUT_PULLUP
LED_BUILTIN
true | false
Constantes de Ponto Flutuante
Constantes Inteiras
INPUT | OUTPUT | INPUT_PULLUP
LED_BUILTIN
true | false
Constantes de Ponto Flutuante
Constantes Inteiras
Conversão
byte()
char()
float()
int()
long()
word()
char()
float()
int()
long()
word()
Tipos de Dados
bool
boolean
byte
char
double
float
int
long
short
size_t
string
String()
unsigned char
unsigned int
unsigned long
vetor
void
word
boolean
byte
char
double
float
int
long
short
size_t
string
String()
unsigned char
unsigned int
unsigned long
vetor
void
word
Escopo de Variáveis e Qualificadores
const
escopo
static
volatile
escopo
static
volatile
Utilitários
PROGMEM
sizeof()
sizeof()
ESTRUTURAS
Os elementos da linguagem Arduino (C++).
Sketch
loop()
setup()
setup()
Estruturas de Controle
break
continue
do...while
else
for
goto
if
return
switch...case
while
continue
do...while
else
for
goto
if
return
switch...case
while
break
[Control Structure]
Descrição
break
é
usado usado para sair de um laço for, while ou do…while, ignorando a condição padrão do loop. Também é usada
para sair do comando switch case.
Código
de Exemplo
No códgo seguinte, o break quebra o
loop
for
quando o valor do sensor excede o
limiar.int lim = 40;
for (int x = 0; x < 255; x ++) {
analogWrite(PWMpin, x);
sens = analogRead(sensorPin);
if (sens > lim) { // "foge" do o loop `for`
x = 0;
break;
}
delay(50);
A documentação de referência da linguagem Arduino está
licenciada sob a licença Creative Commons Attribution-Share
Alike 3.0.
Encontrou alguma coisa que pode ser melhorada? Sugira
correções e nova documentação via GitHub.
Dúvidas sobre como usar o Github? Aprenda tudo o que
precisa saber nesse tutorial.
Descrição
O comando
continue
"pula"
o resto da iteração atual de um loop (for, while,
ou do…while). Esse comando continua a checar a
expressão condicional do loop, e procede com qualquer iterações subsequentes.
Código
de Exemplo
O código abaixo escreve o valor de 0 a 255
ao pino
PWMpin
, mas pula os valores no intervalo 41 a 119.for (int x = 0; x <= 255; x ++) {
if (x > 40 && x < 120) { // cria um salto nos valores
continue;
}
analogWrite(PWMpin, x);
delay(50);
A documentação de referência da linguagem Arduino está
licenciada sob a licença Creative Commons Attribution-Share
Alike 3.0.
Encontrou alguma coisa que pode ser melhorada? Sugira
correções e nova documentação via GitHub.
Dúvidas sobre como usar o Github? Aprenda tudo o que
precisa saber nesse tutorial.
do...while
[Control Structure]
Descrição
O loop
do…
while
funciona
da mesma forma que o loop while,
com a exceção de a condição ser testada no final do loop, tal que o loop será
executado pelo menos uma vez.
Sintaxe
do {
// bloco de comandos
} while (condição);
A
condição
é
uma expressão booleana que é avaliada como verdadeiro ou falso, respectivamente true
ou false
na
linguagem Arduino.
Código
de Exemplo
int x = 0;
do {
delay(50); // espera os sensores estabilizarem
x = readSensors(); // checa os sensores
} while (x < 100);
else
[Control Structure]
Descrição
A combinação if…else permite maior controle sobre o fluxo
de código que o comando mais básico if, por permitir
múltiplos testes serem agrupados juntos. Uma cláusula else (se presente) será executada se a
condição do comando if resulta
em false.
O else pode
proceder outro teste if,
tal que múltiplos, testes mutualmente exclusivos podem ser executados ao mesmo
tempo.
Cada teste irá proceder para o próximo até
um teste que resulte em verdadeiro seja encontrado. Quando esse teste for
encontrado, o bloco de código correspondente a condição é executado, e o
programa então continua a partir da linha seguinte a estrutura if-else
completa. Se nenhum teste resultar em verdadeiro, o bloco else padrão é executado, se um estiver
presente, que dita o comportamento padrão.
Note que um bloco else if pode ser usado sem um bloco else no final e vice-versa. Um número
praticamente ilimitado de blocos else
if conectados é permitido.
Sintaxe
if (condição1) {
// faz coisa A
}
else if (condição2) {
// faz coisa B
}
else
{
// faz coisa C
}
for
[Control
Structure]
Descrição
O comando for [e usado para repetir um bloco de
código envolvido por chaves. Um contador de incremento é geralmente utilizado
para terminar o loop. O comando for é
útil para qualquer operação repetitiva, e é usado frequentemente com vetores
para operar em coleções de dados ou pinos.
Sintaxe
for (inicialização; condição;
incremento) {
//comando(s);
}
A
inicialização
ocorre
primeiro e apenas uma vez. A cada repetição do loop, a condição
é testada; se é verdadeira (true), o bloco de comandos, e o incremento
são executados. Quando a condição
se torna falsa (false), o loop termina.
Código
de Exemplo
// Varia o brilho de um LED usando um pino
PWM
int pinoPWM = 10; // LED em série com um
resistor de 470 ohm no pino 10
void setup() {
// setup não necessário
}
void
loop() {
for (int i = 0; i <= 255; i++) {
analogWrite(pinoPWM,
i);
delay(10);
}
}
Notas
e Advertências
O loop for na
linguagem C é muito mais flexível que os loops `for` encontrados em outras
linguagens. Quaisquer dos três elementos da sintaxe podem ser omitidos, porém
os ponto e vírgula (';') são necessários. Além disso, os comandos para
inicialização, condição e incremento podem ser quaisquer comandos válidos na
linguagem C, mesmo com variáveis não relacionadas ao loop, e podem usar
quaisquer tipos de dados da linguagem, incluindo floats. Esses tipos de
comandos for incomuns
podem prover soluções rápidas para alguns problemas raros de programação.
Por exemplo, usar uma multiplicação no
comando de incremento irá gerar uma progressão logarítmica:
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, Aplica um efeito de fading crescente
e decrescente em um LED com apenas um loop for:
void
loop() {
int x = 1;
for (int i = 0; i > -1; i = i + x) {
analogWrite(pinoPWM, i);
if (i == 255) {
x = -1; // muda a
direção no pico
}
delay(10);
}
}
goto
[Control Structure]
Descrição
Transfere o fluxo do programa para um ponto
rotulado no código.
Sintaxe
rótulo:
goto rótulo; // envia o fluxo do programa de
volta para o rótulo
Código
de Exemplo
O código abaixo "foge" de dentro
de todos os laços caso a leitura no pino analógico 0 seja maior que 250.
for (byte r = 0; r < 255; r++) {
for (byte g = 255; g > 0; g--) {
for (byte b = 0; b < 255; b++) {
if (analogRead(0) >
250) {
goto cancelar;
}
//
mais comandos ...
}
}
}
cancelar:
// mais comandos ...
Notas
e Advertências
O uso do goto é
desencorajado
na programação em C++, e alguns
autores de livros afirmam que o uso do comando goto nunca é necessário, mas se usado
judiciosamente ele pode simplificar certos programas. A pela qual muitos
programadores desaprovam o uso do goto é que com o uso descuidado de
comando goto,
é fácil criar um programa com fluxo indefinido, que não pode ser depurado.
Tendo dito isso, há algumas instâncias onde
o comando goto pode
ser considerado, por simplificar o código. Uma dessas situações é sair de
laços for profundamente
aninhados, ou blocos if, em determinada
condição
if
[Control Structure]
Descrição
O comando if checa uma condição e executas o
comando a seguir ou um bloco de comandos delimitados por chaves, se a condição
é verdadeira ('true').
Sintaxe
if (condição) {
//comando(s)
}
Parâmetros
condição: uma expressão booleana, isto é,
que pode resultar apenas em true ou false
Código
de Exemplo
As chaves podem ser omitidas depois de um
comando if.
Se isso é feito, a próxima linha (definida pelo ponto e vírgula) é interpretada
como o único comando condicional. Para mais de um comando, use as chaves para
delimitar o bloco de comandos.
if
(x > 120) {
digitalWrite(pinoLED, HIGH);
}
if
(x > 120) {
digitalWrite(pinoLED, HIGH);
}
if
(x > 120) {
digitalWrite(pinoLED, HIGH);
}
if
(x > 120) {
digitalWrite(pinoLED1, HIGH);
digitalWrite(pinoLED2,
HIGH);
} // todas as formas acima estão
corretas
Notas
e Advertências
As expressões sendo testadas dentro dos
parênteses geralmente requerem o uso de um ou mais dos operadores mostrados
abaixo.
Operadores
de comparação:
x == y (x é igual a y)
x != y (x é diferente de
y)
x < y (x é menor que y)
x > y (x maior que y)
x <= y (x é menor ou
igual a y)
x >= y (x é maior ou
igual a y)
Cuidado para não usar acidentalmente o
símbolo de igual simples (ex. if
(x = 10) ). O símbolo de igual simples é o
operador de atribuição, se atribui 10 a x (coloca
o valor 10 na variável x).
Em vez disso, o símbolo de igual duplo (ex. if (x == 10) ) deve ser
usado, que é o operador de comparação, e testa se x é igaul a 10 ou não. O último é apenas
verdadeiro se x é
igual a 10, enquanto o primeiro comando mostrado sempre resultará em
verdadeiro.
Isso acontece porque a linguagem C++
interpreta if (x=10) da
seguinte forma: 10 é atribuído a x (Lembre
que o símbolo de igual simples é o (operador
de atribuição)), então x agora contém 10. então o comando 'if'
testa 10, o que sempre resulta true,
desde que qualquer número diferente de zero resulta em true. Consequentemente, if (x = 10) irá sempre
resultar em true,
o que não é desejável ao se usar um comando 'if'. Além disso, a variável x irá receber o valor 10, o que também é
indesejado.
return
[Control Structure]
Descrição
Termina uma função e retorna um valor, caso
desejado.
Sintaxe
return;
return valor; // ambas as formas são válidas
Parâmetros
valor:
qualquer variável ou constante de qualquer tipo de dado
Código
de Exemplo
Uma função para comparar a saída de um
sensor com um limiar
int
checaSensor() {
if (analogRead(0) > 400) {
return 1;
}
else {
return 0;
}
}
The return keyword is handy to test a section of code without having to
"comment out" large sections of possibly buggy code.
void
loop() {
return;
// the rest of a dysfunctional sketch here
// this code will never be executed
}
Ver
Também
switch...case
[Control Structure]
Descrição
Da mesma forma que o comando if,
o comando switch
case controla o fluxo do programa permitindo ao
programador especificar código diferente para ser executado em várias
condições. Em particular, um comando switch compara
o valor de uma variável aos valores especificados nos comandos case. Quando um comando case é encontrado cujo valor é igual ao da
variável, o código para esse comando case é
executado.
A palavra-chave break interrompe
o comando switch, e é tipicamente usada no final de cada case. Sem um comando break, o comando switch irá continuar a executar as expressões
seguintes (desnecessariamente) até encontrar um break, ou até o final do
comando switch ser alcançado.
Sintaxe
switch
(var) {
case valor1:
// comando(s)
break;
case
valor2:
//
comando(s)
break;
default:
// comando(s)
break;
}
Parâmetros
var:
uma variável para ser comparada com os vários cases. Tipos de dados permitidos: int,
char
valor1, valor2: constantes. Tipos de dados permitidos: int, char
valor1, valor2: constantes. Tipos de dados permitidos: int, char
Retorna
Nada
Código
de Exemplo
switch (var) {
case 1:
//
faz algo quando var é igual a 1
break;
case 2:
//
faz algo quando var é igual a 1
break;
default:
// Se
nenhum dos anteriores, faz o caso padrão default
// default é opcional
break;
}
while
[Control
Structure]
Descrição
Um loop while irá se repetir continuamente, e
infinitamente, até a expressão dentro dos parênteses (), se torne falsa. Algo
deve mudar a variável testada, ou o loop while nunca irá encerrar. Isso pode
ser no seu código, por exemplo, uma variável incrementada, ou uma condição
externa, como a leitura de um sensor.
Sintaxe
while (condição) {
// código a ser executado repetidamente
}
A condição é
uma expressão booleana que resulta em true ou false.
Código
de Exemplo
var = 0;
while (var < 200) {
// faz algo repetitivo 200 vezes
var++;
}
Outros Elementos da Sintaxe
#define (define)
#include (include)
/* */ (comentário em bloco)
// (comentário)
; (ponto e vírgula)
{} (chaves)
#include (include)
/* */ (comentário em bloco)
// (comentário)
; (ponto e vírgula)
{} (chaves)
Operadores Aritméticos
% (resto)
* (multiplicação)
+ (adição)
- (subtração)
/ (divisão)
= (operador de atribuição)
* (multiplicação)
+ (adição)
- (subtração)
/ (divisão)
= (operador de atribuição)
Operadores de Comparação
!= (diferente de)
< (menor que)
<= (menor que ou igual a)
== (igual a)
> (maior que)
>= (maior que ou igual a)
< (menor que)
<= (menor que ou igual a)
== (igual a)
> (maior que)
>= (maior que ou igual a)
Operadores Boleanos
! (NÃO lógico)
&& (E lógico)
|| (OU lógico)
&& (E lógico)
|| (OU lógico)
Operadores para Ponteiros
& (referência)
* (desreferência)
* (desreferência)
Operadores Bitwise
& (E)
<< (deslocamento à esquerda)
>> (deslocamento à direita)
^ (OU EXCLUSIVO)
| (OU)
~ (NÃO)
<< (deslocamento à esquerda)
>> (deslocamento à direita)
^ (OU EXCLUSIVO)
| (OU)
~ (NÃO)
Operadores de Atribuição Composta
%= (compound remainder)
&= (atribuição por e)
*= (atribuição por multiplicação)
++ (incremento)
+= (atribuição por adição)
-- (decremento)
-= (atribuição por subtração)
/= (atribuição por divisão)
^= (atribuição por ou exclusivo)
|= (atribuição por ou)
&= (atribuição por e)
*= (atribuição por multiplicação)
++ (incremento)
+= (atribuição por adição)
-- (decremento)
-= (atribuição por subtração)
/= (atribuição por divisão)
^= (atribuição por ou exclusivo)
|= (atribuição por ou)
Nenhum comentário:
Postar um comentário