Apostila Arduino
Apostila Arduino
Apostila Arduino
Exemplos de aplicação
Alexandre
03/10/2016
2
Apostila de Arduino
1. Introdução
2. Base Eletrônica
Sistemas digitais:
• Sistema combinacional: Saída depende apenas dos estados das entradas.
Ex.: decodificador
• Sistema sequencial: Saídas dependem das entradas e dos estados anteriores
das saída.
Ex.: Contador
• Sistema computacional: um hardware genérico tem sua função definida por
um software.
Ex.: Microcontrolador
Arquitetura Harvard :
• Ciclos de leitura (fetch) e ciclos de execução simultâneos: pipeline;
• Cada instrução ocupa (tipicamente) um endereço de memória (1
instrução = 1 endereço);
• Mesmo tempo de execução para (quase) todas instruções;
• Memória de programa é mais larga que barramento de dados (operando +
Operador).
3. Componentes Eletrônicos
Componente :
Componente :
Componente :
Componente :
Componente :
Arduino :
Família Arduino:
Alguns Shields :
4. Programação Arduino
4.1 Estruturas:
São duas funções principais que deve ter todo programa em Arduino.
A função setup() é chamada quando um programa começa a rodar. Use
esta função para inicializar as suas variáveis, os modos dos pinos, declarar o
uso de bibliotecas, etc. Esta função será executada apenas uma vez após a
placa Arduino ser ligada ou ressetada.
setup()
{
// configurações
}
Após criar uma função setup() que declara os valores iniciais, a função
loop() faz exatamente o que seu nome sugere, entra em looping (executa
sempre o mesmo bloco de código),permitindo ao seu programa fazer
mudanças e responder. Use esta função para controlar ativamente a placa
Arduino.
loop()
{
// comandos
}
4.2 Variáveis :
São expressões que você pode usar em programas para armazenar
valores como a leitura de um sensor em um pino analógico, elas reservam
espaço de memória de acordo com o tipo especificado. Aqui destacamos
alguns tipos:
- Variáveis Booleanas - Variáveis boolenas, assim chamadas em homenagem
a George Boole, podem ter apenas dois valores: verdadeiro (true) e falso
(false);
- Int : Inteiro é o principal tipo de dado para armazenamento numérico capaz de
guardar números de 2 bytes. Isto abrange a faixa de -32.768 a 32.767;
- Char : Um tipo de dado que ocupa 1 byte de memória e armazena o valor de
um caractere ASCII.Caracteres literais são escritos entre aspas.
Exemplos :
char letra = ‘A’;
int valor = 47;
boolean teste ;
- ! (negação) :
Verdadeiro apenas se o operando for falso.
Exemplo:
if (!x)
{
// executa se a variavel booleana x for falsa ( x = 0 )
}
Operadores de comparação :
x == y (x é igual a y)
x != y (x é não igual a 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)
Operadores aritméticos :
= (atribuição)
+ (adição)
- (subtração)
* (multiplicação)
/ (divisão)
% (resto da divisão)
- While : fará com que o bloco de código entre chaves se repita contínua e
indefinidamente até que a expressão entre parentesis () se torne falsa. Algo
tem que provocar uma mudança no valor da variável que está sendo verificada
ou o código vai sempre ficar dando voltas dentro do while. Isto poderia ser o
incremento de uma variável ou uma condição externa, como o teste de um
sensor. Sintaxe :
valor = <Valor Inicial>;
while(valor < Valor Final)
{
// algum código que se repete do valor inicial até o valor final
// no passo indicado
<Passo>; // por exemplo valor++ , incrementa valor em uma unidade
}
- For :A sentença for é utilizada para repetir um bloco de código delimitado por
chaves. Um contador com incremento normalmente é usado para controlar e
finalizar o loop. A sentença for é útil para qualquer operação repetitiva, e é
frequentemente usada com arrays ( matrizes ) para operar em conjuntos de
dados ou de pinos. Sintaxe :
for (int variavel=<valor inicial>; <condição final>; <passo>)
{
// repete do valor inicial ao final no passo descrito
}
5.Programas de aplicação
/* Pisca-Pisca
* -------------------------------------------------------
*ligar um led e um resistor de 220 ohms entre o pino 13 e o gnd
*/
void setup()
{
pinMode(ledPin, OUTPUT); // define pino 13 como saída
}
void loop()
{
digitalWrite(ledPin, HIGH); // seta o pino 13
delay(2500); // aguarda 2,5 seg
digitalWrite(ledPin, LOW); // zera pino 13
delay(4000); // aguarda 4 seg
}
/*
Alexandre Lima de Carvalho
Botao
Liga e desliga um LED conectado ao pino digital 13 quando pressionado um
botao conectado ao pino 2.
O Circuito:
* LED conectado ao pino 13 e ao terra
* botao conectado ao pino 2 desde 5V
* resistor de 10K conectado ao pino 2 desde o terra
*/
// Sao usadas aqui para definir os numeros dos pinos: ( constantes )
const int botao = 2; // o numero do pino do botão
const int led = 13; // o numero do pino do led
// declaração de variaveis
int estadobotao = 0; // variavel para ler o estado do botao
void setup()
{
// inicializa o pino do LED como saida:
pinMode(led, OUTPUT);
// inicializa o pino do botao como entrada:
pinMode(botao, INPUT);
}
void loop()
{
// faz a leitura do valor do botao:
estadobotao = digitalRead(botao);
// verifica se o botao esta pressionado.
if (estadobotao == HIGH)
{
// liga o LED:
digitalWrite(led, HIGH);
}
else
{
// desliga o LED:
digitalWrite(led, LOW);
}
}
Exercício : Alterar o programa acima para que somente se acionar dois botões
( nos pinos 2 e 3 ) o led acenda .
/*
Alexandre Lima de Carvalho
DigitalReadSerial
Le a entrada digital no pino 2 e imprime o resultado no monitor serial.
Este exemplo e de dominio publico.
*/
int botao = 2; // o pino 2 tem um botao ligado nele.
int led = 13; // entrada do LED no pino 13.
void setup()
{
// Inicializa a comunicacao serial a 9600 bits por segundo:
Serial.begin(9600);
pinMode(botao, INPUT); // define o botao como uma entrada.
pinMode(led, OUTPUT); //define o LED como uma saída.
}
void loop()
{
// faz a leitura do pino de entrada:
int estado = digitalRead(botao); // define a variavel inteira estado
if (estado == 1)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
}
// imprime o estado do botao:
Serial.println(estado);
delay(1000); // delay entre leituras (em milissegundos)
}
/*
Alexandre Lima de Carvalho
Le a entrada digital no pino 2 , conta quantas vezes a entrada variou em borda
de subida. A cada 5 variações acende um led no pino 13
Este exemplo e de dominio publico.
*/
void setup()
{
pinMode(botao, INPUT); // inicializa o pino do botao como entrada
pinMode(led, OUTPUT); // inicializa o pino digital como saida
Serial.begin(9600); // inicializa a comunicacao serial
}
void loop()
{
// faz a leitura do valor do botao:
estado = digitalRead(botao);
// salva o estado atual do botao como ultimo estado para iniciar o próximo loop
anterior = estado;
/*
Alexandre Lima de Carvalho
*/
// constantes nao sao alteradas:
const int entradaAnal = A0; // Entrada analogica do potenciometro
const int saidaAnal = 9; // Saida analogica onde o LED esta conectado
int sensor = 0; // leitura do potenciometro
int valor = 0; // leitura da saida PWM (analogica) inicializa com Zero
void setup()
{
// inicializa a comunicacao serial:
Serial.begin(9600);
}
void loop()
{
// faz a leitura da entrada analogica:
sensor = analogRead(entradaAnal);
//**************************************************************************
//* Codigo para teste de Arduino acionando rele do kit Multilogica,
//* ligado na saida digital 2 e GND, monitorado pelo Led 13
//* Alexandre Lima de Carvalho
//**************************************************************************
//inicializa uma variavel do tipo char que utiliza 1 byte para armazenar 1
//caracter
char le= 0;
int rele=2; // saída para o rele
int led=13; // saída para led - pode utilizar o próprio led interno
boolean y=true; //inicializa uma variavel do tipo booleano para inverter posição
void setup()
{
pinMode(rele,OUTPUT);
pinMode(led,OUTPUT);
Serial.begin(9600); // inicializa comunicação e mensagem de comunicação
Serial.println();
Serial.print("**Codigo para acionar rele conectado ao pino 2 do Arduino ");
Serial.println("atraves do monitor serial**");
Serial.println("");
Serial.println("Pressione 1 e depois ENTER para inverter o estado do rele
novamente");
Serial.println("Aguardando comando :");
}
void loop()
{
if (Serial.available() > 0) // verifica se pode receber informação serial
{
le= Serial.read(); // le a porta serial
if (le =='1') // se digitou o número 1
{
Serial.print("O rele agora esta ");
if(y)
{
digitalWrite(rele, HIGH);
digitalWrite(led, HIGH);
Serial.println("ligado");
}
else
{
digitalWrite(rele, LOW);
digitalWrite(led, LOW);
Serial.println("desligado");
}
y=!y; // inverte o valor da variavel booleana para inverter o rele no
//próximo comando
}
else
{
Serial.println("Comando invalido");//se não digitou 1 aparece essa
// mensagem
}
}
}
/*
Alexandre Lima de Carvalho
Fade ( variação gradual )
Este exemplo mostra como executar um fade em um LED no pino 9 usando a
funcao analogWrite()- escrita com valor analógico PWM ( 8 bits - 0 a 255 ).
*/
int led = 9; // pino do LED
int brilho = 0; // intensidade do brilho do LED
int passo = 5; // em quantos pontos aplicar o fade no LED
void setup()
{
// define o pino 9 como saida:
pinMode(led, OUTPUT);
}
/*
Alexandre Lima de Carvalho
equivale a montagem da super máquina do primeiro ano
Demonstra o uso da funcao for() loop.
Acende varios LEDs em sequencia e depois apaga
int tempo = 80; // Quanto maior o valor, mais lenta a sequencia de Leds.
void setup()
{
// Use for loop para inicializar cada pino como saida:
for (int pino = 2; pino < 8; pino++) // declara a variavel pino com inteira e já
//atribui um valor inicial dentro do laço for
{
pinMode(pino, OUTPUT);
}
}
void loop()
{
// loop desde o pino mais baixo ate o mais alto:
for (int pino = 2; pino < 8; pino++) // declara a variavel pino novamente já
// que ela é local
{
// liga este pino:
digitalWrite(pino, HIGH);
delay(tempo);
// desliga este pino:
digitalWrite(pino, LOW);
}
// loop desde o pino mais alto ate o mais baixo:
for (int pino = 7; pino >= 2; pino--)
{
*/
//Armazenar os dados recolhidos pelo sensor LDR:
int valorLDR = 0;
//Definir os pinos de entrada dos LEDs:
int led1 = 12;
int led2 = 11;
int led3 = 10;
int led4 = 9;
int led5 = 8;
//Definir pino de entrada do sensor LDR
int pinLDR = 0;
void setup()
{
Serial.begin(9600);
//Definir os pinos de saida dos LEDs:
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
// Definimos o uso de uma referencia externa , com um potenciometro na
entrada Aref : pinMode(EXTERNAL);
}
void loop()
{
//Guardar o valor da leitura de uma variavel:
valorLDR = analogRead(pinLDR); // leitura de valor de tensão segundo a
// referencia ( potenciomentro na entrada external )
Serial.println(valorLDR);
{
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
}
else if((valorLDR >= 223) & (valorLDR < 423))
{
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, LOW);
}
else
{
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
}
}
void setup(void)
{
Serial.begin(9600);
}
void loop(void)
{
float leitura;
float leitura1;
leitura = analogRead(pino_termistor); // leitura real da porta
Serial.print("Leitura pino A0 = ");
Serial.println(leitura);
leitura1 = (leitura*0.2027)-72; // leitura em escala
Serial.print("Temperatura aprox. Celsius = ");
Serial.println(leitura1);
Serial.println("");
delay(3000);
}
5.10 Motor cc
void setup()
{
pinMode(botao, INPUT);
pinMode(motor, OUTPUT);
}
void loop()
{
estado = digitalRead(botao);
if (estado == HIGH)
{
digitalWrite(motor, HIGH);
}
else
{
digitalWrite(motor, LOW);
}
}
Circuito :
void loop()
{
}
B)
/*
Alexandre Lima de Carvalho
Biblioteca LiquidCrystal
C)
/*
Alexandre Lima de Carvalho
Biblioteca LiquidCrystal
Demonstra o uso do display de 16x2 caracteres
*/
// Inclui o codigo da biblioteca:
#include <LiquidCrystal.h>
}
// delay no final do loop:
delay(2000);
}
Programa :
// Alexandre Lima de Carvalho
// Programa display de 7 segmentos - catodo comum
// ligar pinos : 2 no a , 3 no b , ... , 8 no g do display
void setup()
{
void loop()
{
// não foi vantajoso criar a função pois NÂO podemos copiar uma matriz
// diretamente para outra
for (cont=0;cont<7;cont++)
envia[cont] = zero[cont];
numero();
for (cont=0;cont<7;cont++)
envia[cont] = um[cont];
numero();
for (cont=0;cont<7;cont++)
envia[cont] = dois[cont];
numero();
for (cont=0;cont<7;cont++)
envia[cont] = tres[cont];
numero();
for (cont=0;cont<7;cont++)
envia[cont] = quatro[cont];
numero();
for (cont=0;cont<7;cont++)
envia[cont] = cinco[cont];
numero();
for (cont=0;cont<7;cont++)
envia[cont] = seis[cont];
numero();
for (cont=0;cont<7;cont++)
envia[cont] = sete[cont];
numero();
for (cont=0;cont<7;cont++)
envia[cont] = oito[cont];
numero();
for (cont=0;cont<7;cont++)
envia[cont] = nove[cont];
numero();
}
void numero()
{
for (cont=0;cont<7;cont++)
{
digitalWrite(cont+2, envia[cont]); // turn the LED on (HIGH is the voltage
level)
}
delay(1000);
}