Você está na página 1de 15

Programação em Arduino – anotações

 IDE: generalidades
 Exemplos

Abrindo-se a IDE do Arduino, segue-se o caminho: arquivo >


Exemplos > 01.Basics > ..., a fim de abrir algoritmos prontos.

 Selecionando a placa Arduino


Ferramentas > Placa > ..., escolhe-se o modelo de placa a se
trabalhar.

 Botões superiores

Verificar, carregar, novo, abrir e salvar, respectivamente. A


fim de transferir o programa para a placa selecionada, verifica-
se primeiro o algoritmo e depois o carrega-se.
Verificar > carregar

 Sketchbooks
Indo a Arquivo > Sketchbook > ..., vê-se a lista dos algoritmos
mais recentes salvos pelo usuário em pasta padrão do Arduino, a
saber: C:\Documentos\Arduino.

 Monitor serial

O monitor serial faz a interface entre a IDE e o hardware da


placa, mostrando OUTPUTS por ele produzidos.
 Linguagem C e programação em Arduino
 Comentários
//: anula a ação das instruções na mesma linha.
/*...*/: anula as ações de várias linhas.

 Estrutura básica de um programa


void setup(){
bloco de instruções;
}
void loop(){
bloco de instruções;
}
Sem a estrutura básica dessas duas funções declaradas (nulas), o
sketch sequer é compilado, gerando erro pela IDE.
*Em C, todas as instruções terminam em “;”.
*Funções nulas (void) não retorna um valor, e sim ações em
geral, isto é, aquelas que estão entre suas chaves.
A função void setup() só é executada uma vez, quando inicia-se o
programa.
- pinMode(N, INPUT/OUTPUT):seleciona o modo de operação da S/E
digital; onde N é o número do pino digital e INPUT ou OUTPUT o
seu modo de operação.
- digitalWrite(N, HIGH/LOW): seleciona a saída digital a ser
externada do circuito; onde N é o número do pino digital e HIGH
ou LOW a sua saída.
- delay(tempo): determina o tempo de execução da última tarefa
determinado em ms.
- Serial.println(argumento): imprime o valor do argumento no
monitor serial da IDE.

 Variáveis inteiras
int variável = valor
Declara-se uma variável com um valor numeral inteiro como acima.
O símbolo “=” é usado para atribuir valores a qualquer variável.

 Aritmética
+ Adição
- Subtração
* Multiplicação
/ Divisão
Os operadores seguem as mesmas convenções de hierarquia da
matemática usual.

 Comparadores
< Menor que
> Maior que
<= Menor ou igual a
>= Maior ou igual a
== Igual a/equivalente a
!= Diferente de
Operadores usados em expressões lógicas, ou seja, que retornam
TRUE ou FALSE apenas.

 Se... então (if... then)


if (condição){
bloco de instruções;
} else {
bloco de instruções;
}
A estrutura básica do if é como a acima.

 Laço for
for (int contador = valor inicial; condição; incremento){
bloco de instruções;
}
Ex: for(int i = 1 ; i<20 ; i++){
Serial.println(i);
}
O laço de repetição é utilizado para fazer tarefas repetitivas e
para diminuir o tamanho do código, porém é lento quanto ao
processamento; por isso, prefere-se usar uma condição if dentro
da função void loop(), como abaixo.

 Faça até
void loop(){
bloco de instruções;
if (condição){
bloco de instruções;
}
}

 Laço While
while (condição){
bloco de instruções;
incremento;
}
O laço while, como acima, pode substituir o laço for.

 Constantes
const int variável = valor //constante inteira, nesse caso
A fim de se declarar valores constantes a variáveis, faz-se como
acima; o que é bom hábito e economiza memória.
 Funções
 Função sem parâmetro
void função(){
bloco de instruções;
}
A sintaxe de uma função sem parâmetro é como acima e para chama-
la basta digitar: função().

 Função com parâmetro


void função(int valor1 , int valor2){ //nesse caso, ambos
int
bloco de instruções;
}
A sintaxe de uma função com parâmetros é como acima e para
chama-la basta digitar: função(parâmetro1 , parâmetro2).

 Funções com retorno


int função(int parâmetro1 , ...){ //retorna valor int, no
caso
bloco de instruções;
return valor;
}
Toda função que retorna um valor de variável, ou seja, uma não-
nula, deve declarar previamente o valor da variável de retorno,
bem como apresentar a palavra-chave return em seu escopo (uma ou
mais vezes).
 Variáveis
 Variáveis locais, globais e parâmetros
As globais são visíveis a qualquer função do programa; já as
locais só existem dentro das funções, bem como os seus
parâmetros, enquanto elas forem executadas.

 Variáveis estáticas
static int variável = valor // nesse caso, inteira
Uma variável estática é aquela que, dentro de uma função, tem
seu valor inicializado apenas uma vez. Assim, caso esteja em um
laço de repetição, a sua primeira atribuição (static) será
ignorada a cada nova iteração.
 Tipos de variáveis
- int: variáveis inteiras (2 bytes);
- float: variáveis de ponto flutuante (4 bytes);
- char: caractere (1 byte);
- boolean: variáveis lógicas (TRUE ou FALSE);
- long: números muito grandes;
- unsigned int: de 0 a 65535.
 Operadores lógicos
&& AND
|| OR
! NOT
 Arrays
int matriz[] = {valor1 , valor2 , ...} //uma matriz-linha de
int’s
A declaração de uma matriz é como acima. Neste caso, uma matriz-
linha de inteiros.
matriz [índice] //acessar o valor de uma matriz
Para acessar o valor contido na matriz-linha, basta adicionar o
índice do elemento entre os colchetes.
*As matrizes começam sempre com o índice 0.
 Char
São variáveis do tipo char que representam letras do alfabeto e
caracteres especiais, de acordo com a ASCII.
Cada caractere apresenta um valor na tabela ASCII, como acima.
*Toda variável char termina com um caractere especial: “\0”.
 Definindo Caracteres
char string[] = “valorNome” //define uma string
char *string = “valorNome” //também define uma string
Para definir uma variável string, basta fazer como acima; e seu
valor sempre vai entre aspas duplas.

 Matriz de char
char* matriz[] = {“valorNome1” , “valorNome2”, ...}
Como acima pode-se definir uma matriz com várias strings
literais em seu interior.
Serial.begin(taxa) //inicia o buffer do Serial a uma taxa
dada
Inicia a porta serial a uma dada taxa (geralmente 9600),
habilitando seu uso pela placa.
Serial.avaible() //verifica se há dados no buffer
É uma função que retorna o valor de bytes de informação
presentes no buffer.
Deve-se chamá-la a fim de se verificar o que há de entrada vinda
do Serial e para um posterior uso dessas informações.
Serial.read() //lê os dados do buffer do Serial
Lê o que está no buffer, isto é, as entradas do usuário pelo
Serial.
 Operações com Caracteres
Uma vez que a cada char corresponde um valor (número) bem
definido no código ASCII, pode-se utilizá-las como índices, ou
números que são; cabendo-lhes as operações aritméticas usuais e
os comparativos lógicos.
Ex1:
if (char>=”a” && char<=”z”){ //compara o valor de char e “a”
bloco de comandos; //no caso, 97<=char<=114
(minúsculas)
}
Ex2:
letras [char – “a”]; // é o mesmo que char – 97 (valor de
“a”)
 INPUT e OUTPUT
 Saída digital
pinMode (int Pin , OUTPUT/INPUT/INPUT_PULLUP) //configura o
pino para I/O
Na função setup(), deve-se configurar o pino como feito acima.
digitalWrite (int outPin , HIGH/LOW) //configura o pino para 1/0
A fim de configurar a saída (alta ou baixa) do pino, deve-se
usar a função como acima.
*Pode-se ainda usar pinos analógicos como saída digital, porém a
notação a ser usada deve ser a seguinte: “A0”, por exemplo, como
primeiro argumento da função.
 Entrada digital
digitalRead (inputPin) //faz a leitura do pino digital
escolhido
Para ler a entrada fornecida a um pino digital, usa-se a função
acima; podendo o valor ser alto (>2.5 V) ou baixo (<=2.5 V).
Retorna HIGH ou LOW.
 Resistor Pull-up

São divisores de tensão, ligados ao terra, acionados por chave


que, como visto acima, regulam a tensão na entrada digital do
pino escolhido. Evitam a flutuação do pino.
Assim, se a chave for fechada, a entrada digital reconhece o
valor de GND (0 V), caso contrário, reconhece o valor do Vcc (5
V).
pinMode (inputPin , INPUT_PULLUP) //aciona a entrada
Pullup
 Saída analógica
analogWrite(int Pin , float valorPWM) //saída analógica da
porta
A saída analógica funciona por PWM, o que faz variar a
frequência do valor alto de saída ao longo de um mesmo período
total de onda. O valor de PWM vai de 0 a 255 (o segundo
parâmetro).
*Serial.parseFloat(): retorna o primeiro número de ponto
flutuante do buffer do Serial.
 Entrada analógica
analogRead (int Pin) //faz a leitura analógica da
porta
Retornam valores entre 0 e 1023, o que corresponde a 0V e 5V,
respectivamente.
 Biblioteca Padrão
 Números aleatórios
random (int inf, int sup) //retorna valor int entre inf e sup-1
random (int sup) //retorna valor int entre 0 e sup-1
As duas formas retornam inteiros entre os limites pré-
estabelecidos, porém seguem sempre um padrão. Assim, pode-se
usar a função a seguir, que é declarada apenas no setup(), e
usa-se o pino analógico flutuante como meio de randomizar o
processo:
randomSeed(analogRead(int Pin)) //usa o pino analógico
flutuante

 Funções matemáticas
abs (a) Valor absoluto de a
constrain (x , a , b) Retorna a se x<a, x se a<x<b e b se
b<x
map (x , a , b , A , B) Retorna valores de x de acordo com a
proporção: a:A::b:B
max (a , b) Retorna o maior entre a e b
min (a , b) Retorna o menor entre a e b
pow (a , b) Mesmo que a^b
sqrt (a) Raiz quadrada de a
sin , cos , tan (a) Funções trigonométricas
log (a) Mesmo que ln (a)

 Manipulação de Bit’s
int x = 0x<valor_hexadecimal> //cria um valor
hexadecimal
int x = 0b<valor_binario> //cria um valor binário para
x
Para declarar valores hexadecimais e binários, usa-se,
respectivamente, os seguintes prefixos: 0x... e 0b... .

 bitRead
bitRead (int índice) //retorna o bit indicado pelo
índice
Começando do bit menos significativo, vai o índice até o último.

 bitWrite
bitWrite (int número , int índice , int bitTroca)
Altera o valor do bit indicado pelo índice (segundo argumento)
do número binário em questão (primeiro argumento) pelo bit
indicado no último argumento.
 Tons
tone (int pino , int frequencia , int duracao)
Gera uma onda quadrada de acordo com os parâmetros acima como
saída.
Caso o terceiro argumento não seja definido, a onda é produzida
ininterruptamente, sendo necessário usar a seguinte função para
pará-la:
noTone(int pino)
 Interrupts
attachInterrupt(0/1 , funcaoInterrupt , FALLING/RISING/CHANGE)
Interrompe o funcionamento do programa atual mediante entrada no
pino digital D2 (primeiro argumento 0) ou D3 (primeiro argumento
1) e faz executar outra função (segundo argumento), podendo
funcionar em três modos distintos: FALLING, RISING e CHANGE.
O modo CHANGE faz a interrupção tanto no FALLING quanto no
RISING.
noInterrupts() //desabilita qualquer interrupt
escrito
interrupts() //reativa todos os interrupts
 Armazenamento de dados
 Constantes
const char* variável //constante
char
É uma forma de armazenar dados na memória RAM de maneira que não
sejam alterados ao longo do programa.

 Memória Flash (PROGMEM)


É uma biblioteca de funções que habilita salvar dados na memória
de programa (PROGMEM):
#include<avr/pgmspace.h> //inclui a biblioteca do
PROGMEM
PROGMEM const matriz[tamanho] //salva a matriz no PROGMEM
const matriz[tamanho] PROGMEM //também salva no PROGMEM
Para salvar uma lista na memória Flash, faz-se como acima.
memcpy_P(&lista1 , lista2 , tamanhoDeLista2) //copia L2 para
L1
A função acima copia os dados de lista2 que foi declarada na
memória Flash para lista1, que foi criada na memória RAM.
*O símbolo & indica que passados os elementos para a lista1,
podem ser nela alterados.
Para copiar uma string de uma lista de strings salva na PROGMEM,
usa-se a seguinte função:
strcpy_P(buffer , (char*)pgm_read_word(&(listadeString[i])))
Onde o primeiro parâmetro (buffer) deve ter espaço suficiente
para armazenar qualquer sequência de caracteres da lista e dever
ser declarado como variável global.
Se houver a necessidade de se repetir uma sequência padrão de
mensagens ou uma mensagem qualquer durante o programa, mas sem
que seja necessário alterá-la, pode usar a seguinte construção:
Serial.print(F(“Mensagem-padrão”)) //Exibe e salva a mensagem na
memória Flash
 Memória EEPROM
#include <EEPROM.h> //Inclui a biblioteca no
programa
Essa memória pode, ao contrário da PROGMEM, ser alterada ao
longo do código, porém armazena, no máximo, apenas 1 byte de
cada vez, se usada a biblioteca padrão do Arduino.
EEPROM.read(endereço) //Lê o valor localizado no
endereço
EEPROM.write(endereço , var) //Salva a variável no endereço
O parâmetro endereço da função vai de 0 a 1023.
Para salvar um inteiro (2 bytes) na EEPROM, deve-se usar as
seguintes funções:
int var = valor;
EEPROM.write(endereço1 , highByte(var));
EEPROM.write(endereço2 , lowByte(var));
Para ler os valores do inteiro passado para dois endereços na
EEPROM, faz-se o seguinte:
byte high = EEPROM.read(endereço1);
byte low = EEPROM.read(endereço2);
int x = (high << 8) + low;
Onde << indica que os valores da variável high encontram-se
dispostos nos 8 bits mais significativos.

 AVR EEPROM
#include <avr/eeprom.h> //Inclui a biblioteca no
programa
Essa biblioteca facilita a utilização da memória EEPROM, devido
a duas funções, principalmente:
eeprom_write_block(&var1 , endereço , numBytes)
eeprom_read_block(&var2 , endereço , numBytes)
A primeira salva na memória EEPROM o valor de var1, de acordo
com referência à sua posição na RAM (&), no endereço (0 a 1023)
especificado; a segunda função lê o valor no endereço dado e o
salva em var2, levando em conta o seu tamanho em bytes
(numBytes).
* while(!Serial.avaible()){};
* A expressão acima para o loop infinito até que o Serial seja
conectado, momento em que a condicional torna-se falsa.
Serial.readBytesUntil(char , buffer , tamanho)
A função acima retorna um inteiro cujo valor é o número de
caracteres lidos até o caractere char (primeiro parâmetro) dado.
Além disso, os caracteres lidos no buffer do serial (de acordo
com os outros dois parâmetros dados) são salvos no parâmetro
buffer, que é uma variável global a esta função.

Você também pode gostar