Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Dedicatória
Dedico este trabalho a todos os meus familiares, colaboradores e principalmente aos meus
alunos que são a razão principal pela qual trabalho ensinando esta profissão maravilhosa.
Muito obrigado a todos e vamos seguindo em frente.
Bibliografia
Todo o texto contido neste curso é de minha inteira autoria e responsabilidade. Algumas fotos e
códigos foram retirados da internet porém todos estes modificados por nós da Burgoseletronica
Ltda para adequar-se ao curso. Segue abaixo alguns sites interessantes para quem quer obter
códigos, apender mais coisas, comprar acessórios e até simular o funcionamento de Arduino:
www.arduino.cc
www.labdegaragem.com.br
www.oarduino.com
http://123d.circuits.io
www.comofazerascoisas.com.br
http://alexmartins.net
www.modkit.com
http://arduinobymyself.blogspot.com.br
http://www.arduinoecia.com.br
ÍNDICE
I. Introdução ______________________________________________________________01
II. O Arduino ______________________________________________________________01
III. Testando a placa de Arduino do curso ________________________________________03
IV. Trabalhando com o Arduino – Montagem de experiências ________________________07
1. Experiência nº 1 – Pisca-pisca simples _______________________________________07
2. Experiência nº 2 – Pisca-pisca duplo _________________________________________11
3. Experiência nº 3 – Botão liga-desliga _________________________________________13
4. Experiência nº 4 – Semáforo brasileiro _______________________________________15
5. Experiência nº 5 – Semáforo duplo sincronizado ________________________________17
6. Experiência nº 6 – Porta lógica NÃO (NOT) e os resistores “pull up” “pull down” _______19
7. Experiência nº 7 – Portas lógicas com Arduino _________________________________22
8. Experiência nº 8 – Led de brilho variável (PWM) do Arduino ______________________25
9. Experiência nº 9 – Controle de brilho do led ___________________________________27
10. Experiência nº 10 – Led tricolor com brilhos e cores variáveis _____________________31
11. Experiência nº 11 – Semáforo com botão acionador _____________________________34
12. Experiência nº 12 – Sequencial com 4 leds ____________________________________37
13. Experiência nº 13 – Sequencial com 10 leds ___________________________________39
14. Experiência nº 14 – Sequencial com 10 leds controlado manualmente _______________41
15. Experiência nº 15 – Comparador de tensão e fotocélula com Arduino _______________43
16. Experiência nº 16 – Efeito de chama de fogueira com leds ________________________45
17. Experiência nº 17 – Led tricolor RGB com controle serial através do PC _____________47
18. Experiência nº 18 – Sensor de luz com 3 leds __________________________________51
19. Experiência nº 19 – Pisca-pisca controlado por potenciômetro e luz _________________53
20. Experiência nº 20 – Dado eletrônico _________________________________________55
www.burgoseletronica.net
http://loja.burgoseletronica.net
www.lojaburgoseletronica.com.br
I. INTRODUÇÃO
Neste curso que ora iniciamos ensinaremos ao aluno, seja ele técnico ou hobbista na área da
eletrônica, como funciona e como programar o Arduino através de experiências que serão
feitas ao longo do curso. O curso é formado por este livro, vídeo aula e o material didático que
o aluno receberá para acompanhá-lo e desenvolver bem rápido seu aprendizado. Portanto
prestem bastante atenção ao curso que vocês verão como é bem fácil trabalhar com Arduino.
II. O ARDUINO
Existem diversos tipos de Arduinos no mercado cada um com um micro e quantidade diferente
de entradas/saídas adequando-se aos milhares de projetos envolvendo este hardware. Porém
conforme já explicado para o desenvolvimento de nosso curso usaremos o Arduino UNO (um
em italiano) por ser o mais simples de trabalhar e também bastante didático. Os demais usam
o mesmo conceito do modelo UNO.
1. - Instalação do software
O software ou programa do Arduino é uma interface com ambiente de desenvolvimento, sendo
chamada de IDE (Interface Development Environment) em inglês. É com este programa que
gravaremos as instruções no Arduino. Ele também permite a escrita do código diretamente na
interface. Para obtenção gratuita do software vá ao endereço http://www.arduino.cc/
Após entrar no site do fabricante, vá à aba “Download”:
E dentro você encontrará duas versões a 1.0.5 (estável) e a 1.5.7 (beta), porém você pode usar
qualquer uma das duas para nosso Arduino UNO. Pode ser que quando estiver estudando este
curso já hajam versões mais atualizadas que estas. Daí você vai clicar e baixar a versão
correspondente ao seu sistema operacional (Windows, MAC ou Linux), como abaixo vemos
para a opção Windows (serve para XP, 7 e 8 sem problemas):
Agora esperamos baixar o programa e para instalá-lo é bem simples bastando um clique duplo
e se seu PC usa o Windows 7 ou 8 clique com o botão direito do mouse sobre o instalador do
programa e no menu que abre escolha “Executar como administrador”. Daí é só concordar com
os termos e dar o “next” para começar a instalar o software.
E na próxima tela clicar em “Install” e esperar a conclusão da instalação que pode demorar um
pouco mais ou menos dependendo da velocidade de seu PC ou laptop. Para a instalação do
programa não é necessário que o Arduino esteja conectado ao PC ou laptop. Após completar a
instalação clique em “Close” e o programa já está instalado em seu PC ou laptop e pronto para
usar. Se ao ligar pela primeira vez a placa do Arduino no PC e a instalação do driver falhar e
precisar instalar o driver manualmente veja o procedimento no apêndice no final deste livro.
Vai aparecer uma tela com um código de um pisca-pisca, mas não se preocupe com este
código por enquanto. Clique no botão “Verificar” para o programa compilar e testar o código. Se
no final aparecer “Compilação terminada”, o código está correto e se aparecer “Erro
compilando” em laranja, o código está com algum erro que deve ser corrigido:
Se aparecer uma mensagem em laranja após o carregamento, indica que houve um erro na
transferência de dados para o Arduino. Isto geralmente ocorre quando há um defeito na placa
do Arduino que não está se comunicando com o PC/laptop. Neste caso devemos substituir esta
placa. Veja abaixo:
A partir deste tópico, depois de testado, aprenderemos a usar o Arduino através da montagem
de algumas experiências usando o material do curso. Também falaremos um pouco a respeito
da programação que ele usa, porém de uma forma mais simples, até porque encontramos
milhares de códigos na internet para usar o Arduino nas mais variadas funções em vários
ramos da eletrônica. Não nos aprofundaremos muito no quesito códigos de operação, porém
noções básicas sim para que o aluno possa escrever alguns mais simples e pegar alguns mais
complexos pela internet e modifica-los de acordo com sua necessidade.
Observação - A palavra Arduino é patenteada, porém o circuito eletrônico e os códigos em
linguagem C não são de modo que qualquer pessoa ou empresa pode criar um Arduino (com
outro nome), programar ou modificar os códigos para adequar-se às suas necessidades.
Lista de materiais
Procedimento
Monte o circuito como indicado abaixo usando o Arduino e a protoboard. Os desenhos foram
feitos num software chamado Fritzing (http://fritzing.org).
Na página a seguir temos o esquema elétrico do circuito que também foi elaborado no Fritzing.
No desenho só aparece uma parte da protoboard que é onde vamos usar para montar nosso
primeiro circuito deste curso.
// Experiência 1 ‐ Pisca pisca simples
int ledPin = 10; // variável inteira LedPin (poderia ter outro nome) ligado no pino 10
void setup() { // esta função roda só uma vez cada vez que o circuito é ligado
pinMode(ledPin, OUTPUT); // indica que o led no pino 10 é para saída de dados
}
void loop() { // esta função roda continuamente enquanto o circuito está ligado
digitalWrite(ledPin, HIGH); // O pino 10 onde está o led passa para nível alto (acende)
delay(1000); // Espera de 1000 milissegundos ou 1 segundo
digitalWrite(ledPin, LOW); // O pino 10 onde está o led passa para nível baixo (apaga)
delay(1000); // Espera de 1000 milissegundos ou 1 segundo
}
Agora você abre o programa do Arduino (IDE), Vai ao menu “Arquivo” opção “Novo” e digita lá
o código acima. Ou se quiser para facilitar o trabalho, seleciona todo o texto copia e cola. Após
clica no botão “Verificar” para testar o código e estando correto clica em “Carregar” para
mandar o código para o Arduíno. Após o carregamento completo devemos ver o led piscar à
velocidade de uma piscada a cada segundo. Se isto ocorrer, seu circuito funcionou
perfeitamente. Todos os códigos usados por todas as experiências deste curso além de
estarem neste livro também mandamos separadamente como arquivos txt (para blocos de
notas) numa pasta separada. Assim você pode usá-los ou modifica-los da forma que quiser. Na
página a seguir mostramos uma figura com o código acima escrito no IDE do Arduino.
Como podemos observar o código escrito na sketch (rascunho) do programa será gravado no
Arduino para que ele execute a função indicada.
int ledPin = 10; // variável inteira LedPin (poderia ter outro nome) ligado no pino 10
void setup() { // esta função roda só uma vez cada vez que o circuito é ligado
pinMode(ledPin, OUTPUT); // indica que o led no pino 10 é para saída de dados
}
void loop() { // esta função roda continuamente enquanto o circuito está ligado
digitalWrite(ledPin, HIGH); // O pino 10 onde está o led passa para nível alto (acende)
delay(1000); // Espera de 1000 milissegundos ou 1 segundo
digitalWrite(ledPin, LOW); // O pino 10 onde está o led passa para nível baixo (apaga)
delay(1000); // Espera de 1000 milissegundos ou 1 segundo
} // Podemos usar este código para nosso pisca de 1 segundo
void setup() { // esta função roda só uma vez cada vez que o circuito é ligado
pinMode(10, OUTPUT); // indica que o pino 10 é para saída de dados
}
void loop() { // esta função roda continuamente enquanto o circuito está ligado
digitalWrite(10, HIGH); // O pino 10 onde está o led passa para nível alto (acende)
delay(1000); // Espera de 1000 milissegundos ou 1 segundo
digitalWrite(10, LOW); // O pino 10 onde está o led passa para nível baixo (apaga)
delay(1000); // Espera de 1000 milissegundos ou 1 segundo
} // Ou podemos usar este aqui que dá o mesmo resultado
Lista de materiais
Procedimento
// Experiência 2 ‐ Pisca pisca duplo
int ledverm = 10; // led vermelho no pino 10
int ledverd = 9; // led verde no pino 9
void setup() {
pinMode(ledverm, OUTPUT); // pino 10 do led vermelho como saída
pinMode(ledverd, OUTPUT); // pino 9 do led verde como saída
}
void loop() {
digitalWrite(ledverm, HIGH); // pino 10 vai a nível alto e acende o led vermelho
digitalWrite(ledverd, LOW); // pino 9 vai a nível baixo e apaga o led verde
delay(1000); // espera 1 seg
digitalWrite(ledverm, LOW); // pino 10 vai a nível baixo e apaga o led vermelho
digitalWrite(ledverd, HIGH); // pino 9 vai a nível alto e acende o led verde
delay(1000); // espera 1 seg
}
Ao carregar este código para a placa os dois leds piscarão alternadamente à frequência de 1
piscada por segundo. Se quiser modificar a velocidade das piscadas basta alterar o valor da
linha delay(1000) para aumentar ou diminuir o tempo conforme já explicado. Nesta experiência
se quiser você também pode usar um código mais simples como indicado abaixo:
// Experiência 2 ‐ Pisca pisca duplo
void setup() {
pinMode(10, OUTPUT); // pino 10 como saída
pinMode(9, OUTPUT); // pino 9 como saída
}
void loop() {
digitalWrite(10, HIGH); // pino 10 vai a nível alto e acende o led vermelho
digitalWrite(9, LOW); // pino 9 vai a nível baixo e apaga o led verde
delay(1000); // espera 1 seg
digitalWrite(10, LOW); // pino 10 vai a nível baixo e apaga o led vermelho
digitalWrite(9, HIGH); // pino 9 vai a nível alto e acende o led verde
delay(1000); // espera 1 seg
}
Observe que cada função no código começa com uma chave “{” e termina com outra
chave “}”.
Lista de materiais
Procedimento
// Experiência 3 ‐ Botão liga/desliga
int led = 7; // led no pino 7
int botao = 6; // botão no pino 6
int estadobotao = 0; //Estado inicial do botão (0 = aberto ou desligado)
void setup() {
pinMode(led, OUTPUT); // pino 7 do led como saída
pinMode(botao, INPUT); // pino 6 do botão como entrada
}
void loop() {
estadobotao = digitalRead(botao); // leitura de que estado (aberto ou fechado) está o botão
if (estadobotao == HIGH) { // Se o botão está igual a nível alto (ligado)
digitalWrite(led, HIGH); // pino 7 vai a nível alto e acende o led
} else { // senão
digitalWrite(led, LOW); // pino 7 vai a nível baixo e apaga o led
}
}
Ao carregar o código você observará que o led fica apagado e acende a cada toque na tecla.
Se quiser inverter o processo, ou seja, deixar o led aceso a apagá-lo com um toque na tecla
basta modificar no código (led, HIGH) para (led, LOW) e vice-versa.
Este código do botão liga/desliga também pode ser simplificado como indicado abaixo:
// Experiência 3 ‐ Botão liga/desliga
void setup() {
pinMode(7, OUTPUT); // pino 7 do led como saída
pinMode(6, INPUT); // pino 6 do botão como entrada
}
void loop() {
digitalRead(6); // leitura do estado do pino 6
if (6 == HIGH) { // Se o pino 6 está em nível alto (botão ligado)
digitalWrite(7, HIGH); // pino 7 vai a nível alto e acende o led
} else { // senão
digitalWrite(7, LOW); // pino 7 vai a nível baixo e apaga o led
}
}
Observe que excluímos as variáveis do código deixando apenas os números dos pinos do
Arduino onde serão ligados o led e a microchave.
Lista de materiais
Procedimento
// Experiência 4 ‐ Semáforo Brasileiro
int luzvermelha = 10; // led representando a luz vermelha no pino 10
int luzamarela = 9; // led representando a luz amarela no pino 9
int luzverde = 8; // led representando a luz verde no pino 8
void setup() {
pinMode(luzvermelha, OUTPUT); // led ligado no pino 10 como saída
pinMode(luzamarela, OUTPUT); // led ligado no pino 9 como saída
pinMode(luzverde, OUTPUT); // led ligado no pino 8 como saída
}
void loop() {
digitalWrite(luzvermelha, HIGH); // acende o led vermelho (PARE)
digitalWrite(luzamarela, LOW); // led amarelo apagado
digitalWrite(luzverde, LOW); // led verde apagado
delay(5000); // espera 5 segundos
digitalWrite(luzvermelha, LOW); // led vermelho apagado
digitalWrite(luzamarela, LOW); // led amarelo apagado
digitalWrite(luzverde, HIGH); // acende o led verde (SIGA)
delay(5000); // espera 5 segundos
digitalWrite(luzvermelha, LOW); // led vermelho apagado
digitalWrite(luzamarela, HIGH); // acende o led amarelo (ATENÇÃO)
digitalWrite(luzverde, LOW); // led verde apagado
delay(2000); // espera 2 segundos
}
Ao carregar este código você observará como funciona um semáforo no qual os leds
representam suas luzes. Inicialmente o led vermelho acende, ficando 5 segundos neste estado
enquanto os demais permanecem apagados. Após este tempo o led vermelho apaga enquanto
o verde acende e permanece assim por 5 segundos. Após o tempo o amarelo acende e fica 2
segundos aceso antes de acender de volta o vermelho e assim o ciclo se repete como nos
semáforos reais (porém a diferença é que estes operam por mais segundos que o de nossa
experiência).
Este código também pode ser simplificado retirando-se as variáveis “int” antes do “void setup”
e substituindo-se as palavras “luzvermelha, luzamarela e luzverde” pelos respectivos
números “10, 9 e 8”. Veja por exemplo uma parte do código modificado abaixo:
pinMode(10, OUTPUT); // led ligado no pino 10 como saída
pinMode(9, OUTPUT); // led ligado no pino 9 como saída
pinMode(8, OUTPUT); // led ligado no pino 8 como saída
}
void loop() {
digitalWrite(10, HIGH);
Lista de materiais
Procedimento
// Experiência 5 ‐ Semáforo duplo sincronizado
int luzvermelha1 = 10; // led vermelho do semáforo nº 1
int luzamarela1 = 9; // led amarelo do semáforo nº 1
int luzverde1 = 8; // led verde do semáforo nº 1
int luzvermelha2 = 7; // led vermelho do semáforo nº 2
int luzamarela2 = 6; // led amarelo do semáforo nº 2
int luzverde2 = 5; // led verde do semáforo nº 2
void setup() {
pinMode(luzvermelha1, OUTPUT);
pinMode(luzamarela1, OUTPUT);
pinMode(luzverde1, OUTPUT); // define os pinos dos leds como saída
pinMode(luzvermelha2, OUTPUT);
pinMode(luzamarela2, OUTPUT);
pinMode(luzverde2, OUTPUT);
}
void loop() {
digitalWrite(luzvermelha1, HIGH); //acende o vermelho do semáforo 1 (PARE)
digitalWrite(luzamarela1, LOW);
digitalWrite(luzverde1, LOW);
digitalWrite(luzvermelha2, LOW);
digitalWrite(luzamarela2, LOW);
digitalWrite(luzverde2, HIGH); //acende o verde do semáforo 2 (SIGA)
delay(5000); //espera 5 segundos
digitalWrite(luzvermelha1, HIGH); //mantém o vermelho aceso no semáforo 1 (PARE)
digitalWrite(luzamarela1, LOW);
digitalWrite(luzverde1, LOW);
digitalWrite(luzvermelha2, LOW);
digitalWrite(luzamarela2, HIGH); //acende o amarelo do semáforo 2 (ATENÇÃO)
digitalWrite(luzverde2, LOW);
delay(2000); //espera 2 segundos
digitalWrite(luzvermelha1, LOW);
digitalWrite(luzamarela1, LOW);
digitalWrite(luzverde1, HIGH); //acende o verde do semáforo 1 (SIGA)
digitalWrite(luzvermelha2, HIGH); //acende o vermelho do semáforo 2 (PARE)
digitalWrite(luzamarela2, LOW);
digitalWrite(luzverde2, LOW);
delay(5000); //espera 5 segundos
digitalWrite(luzvermelha1, LOW);
digitalWrite(luzamarela1, HIGH); //acende o amarelo do semáforo 1 (ATENÇÃO)
digitalWrite(luzverde1, LOW);
digitalWrite(luzvermelha2, HIGH); //mantém o vermelho aceso no semáforo 2 (PARE)
digitalWrite(luzamarela2, LOW);
digitalWrite(luzverde2, LOW);
delay(2000); //espera 2 segundos
}
Quando o semáforo 1 está no vermelho, o 2 está no verde (como num cruzamento entre duas
ruas ou avenidas). Quando o 1 passa para verde, o 2 passa para vermelho ao mesmo tempo e
entre estas fases temos o amarelo para cada semáforo.
Lista de materiais
Procedimento
// Experiência 6 ‐ Porta lógica NOT (NÃO)
int led = 10; // led no pino 10
int botao = 9; // botão no pino 9
void setup() {
pinMode(led, OUTPUT); // pino 10 do led como saída
pinMode(botao, INPUT); // pino 9 do botão como entrada
}
void loop() {
boolean botaoState = digitalRead(botao); // leitura do estado do botão
boolean ledState; // Estado do led ligado ao pino 10
ledState = !botaoState ; // Estado do botão Invertido (!) em relação ao led (função NOT)
digitalWrite(led, ledState); // pino 10 vai a nível baixo ou alto de acordo com o botão
}
Resistores “pull up” mantém um pino do CI sempre a nível alto porque vai ligado à linha de
+B do circuito. Tal resistor é de alguns KΩ e mantém a estabilidade de funcionamento de um
circuito digital. No Arduino podemos acrescentar o resistor fora ou usar o que ele já tem interno
usando um comando para habilitá-lo. A chave CH1 quando pressiona leva o pino ao nível
baixo. Sem apertar a chave o pino fica sempre em nível alto. Em algumas de nossas
experiências usaremos o resistor “pull up” que o Arduino já tem interno.
Podemos simplificar os projetos com portas lógicas usando o resistor interno do Arduino. Assim
o circuito nº 6 fica como indicado abaixo e apenas devemos acrescentar a palavra PULLUP na
linha de código pinMode(botao, INPUT);. Fica assim: pinMode(botao, INPUT_PULLUP);
// Experiência 6 ‐ Porta lógica NOT (NÃO) com o resistor pull up interno
int led = 10; // led no pino 10
int botao = 9; // botão no pino 9
void setup() {
pinMode(led, OUTPUT); // pino 10 do led como saída
pinMode(botao, INPUT_PULLUP); // pino 9 do botão como entrada com pull up interno
}
void loop() {
boolean botaoState = digitalRead(botao); // leitura do estado do botão
boolean ledState; // Estado do led ligado ao pino 10
ledState = !botaoState ; // Estado do botão Invertido (!) em relação ao led (função NOT)
digitalWrite(led, ledState); // pino 10 vai a nível baixo ou alto de acordo com o botão
}
Lista de materiais
Procedimento
// Experiência 7 ‐ Portas lógicas com Arduino
int led = 6; // led no pino 6
int botao1 = 5; // botão 1 no pino 5
int botao2 = 4; // botão 2 no pino 4
void setup() {
pinMode(led, OUTPUT); // pino 6 do led como saída
pinMode(botao1, INPUT_PULLUP); // pino 5 do botão1 como entrada
pinMode(botao2, INPUT_PULLUP); // pino 4 do botão2 como entrada
}
void loop() {
boolean botao1State = digitalRead(botao1); // leitura do estado do botão1
boolean botao2State = digitalRead(botao2); // leitura do estado do botão2
boolean ledState; // Estado do led ligado ao pino 6
ledState = (botao1State & botao2State); // Saída depende do estado botão 1 e 2
digitalWrite(led, ledState); // pino 6 segue a tabela da verdade ‐ porta E (AND)
}
/* Para a mudança do tipo de porta mudamos apenas a linha de comando:
ledState = (botao1State & botao2State); para porta E (AND);
ledState = !(botao1State & botao2State); para porta NE (NAND);
ledState = (botao1State | botao2State); para porta OU (OR);
ledState = !(botao1State | botao2State); para porta NOU (NOR);
ledState = (botao1State ^ botao2State); para porta OU exclusiva (XOR);
ledState = !(botao1State ^ botao2State); para porta NOU exclusiva (XNOR);
*/
ledState = (botao1State & botao2State); para porta E (AND);
ledState = !(botao1State & botao2State); para porta NE (NAND);
ledState = (botao1State | botao2State); para porta OU (OR);
ledState = !(botao1State | botao2State); para porta NOU (NOR);
ledState = (botao1State ^ botao2State); para porta OU exclusiva (XOR);
ledState = !(botao1State ^ botao2State); para porta NOU exclusiva (XNOR);
Lista de materiais
Procedimento
// Experiência 8 ‐ Led de brilho variável (PWM do Arduino)
int led = 11; // Led ligado no pino 11 (PWM)
int valor = 0; // Valor inicial do led (apagado)
void setup()
{ // Aqui não temos nada para configurar
}
void loop()
{
for(valor = 0; valor <= 255; valor += 5) // aumenta o nível de brilho 5 passos por vez
{
analogWrite(led, valor); // aumenta o brilho entre 0 e 255
delay(50); // 50 milissegundos para visualizar entre um nível de brilho e outro
}
for(valor = 255; valor >= 0; valor ‐= 5) // diminui o nível de brilho 5 passos por vez
{
analogWrite(led, valor); // diminui o brilho entre 255 e 0
delay(50); // 50 milissegundos para visualizar entre um nível de brilho e outro
}
}
Nesta experiência estamos usando um dos pinos do Arduino com a função PWM (“Pulse Width
Modulation” ou modulação por largura de pulso). Os pinos com esta função vêm marcados com
o nome PWM ou com o símbolo “~”. Os pinos do Arduino são digitais onde a tensão pode
atingir dois níveis: baixo ou “0” (0 V) e alto ou “1” (5 V). Porém alguns pinos além de
trabalharem digitalmente com dois níveis também podem trabalhar como se fossem
analógicos. Para isto eles emulam (imitam) uma variação de tensão analógica através de
pulsos digitais chamados PWM. O PWM é uma onda quadrada de frequência fixa (no Arduino é
cerca de 500 Hz), mas cujos pulsos podem variar de largura. Para o pino fornecer tensão
menor os pulsos são mais finos (mais tempo em nível baixo que alto). Para fornecer tensão
maior os pulsos são mais grossos (mais tempo em nível alto que baixo). Veja abaixo:
O PWM é estreitado e alargado em 256 passos entre o zero e 255. Cada passo o sinal terá
certa largura e oferecerá uma tensão no pino 11 (em nosso caso) entre 0 e 5 V. Assim o led
aumentará e diminuirá o brilho. Entre um nível e outro há um tempo que pode ser alterado no
comando delay(50); Tente mudar este valor e veja a velocidade da variação de brilho. Mudando
o valor += 5 e valor ‐= 5 fazemos o brilho variar quantos passos por vez quisermos. Tente.
Lista de materiais
Procedimento
//Experiência 9 ‐ Controle de brilho do led
int pinoled = 9; // Pino do led ‐PWM
int pinopot = 0; // Entrada analógica ligada ao centro do potenciômetro
int valorpot = 0; // Valor inicial do potenciômetro, entre 0 e 1023
int brilho = 0; // Valor inicial de brilho do led entre 0 e 255
void setup()
{
pinMode(pinoled, OUTPUT); // pino do led como saída
pinMode(pinopot, INPUT); // pino do potenciômetro como entrada
}
void loop()
{
valorpot = analogRead(pinopot); // leitura do valor analógico do potenciômetro
brilho = map(valorpot, 0, 1023, 0, 255); /*Converte o valor do potenciômetro entre 0 e 1023
para um valor PWM entre 0 e 255 para o brilho do led*/
analogWrite(pinoled, brilho); // Envia o valor de brilho para o led entre 0 e 255
}
Neste código podemos observar um valor inicial para o potenciômetro (este vai de 0 a 1023) e
outro para o led (conforme vimos na experiência anterior o PWM que sai do CI para controlar o
brilho do led vai de 0 a 255). A linha de comando brilho = map(valorpot, 0, 1023, 0, 255); possui à
esquerda os valores inicial e final do potenciômetro e à direita os valores inicial e final do brilho
do led. Mudando os valores 0, 255 podemos definir como será o brilho inicial e final do led em
todo o giro do potenciômetro. Mudando os valores 0 e 1023 (à esquerda) definimos qual fração
do giro do potenciômetro o brilho vai do mínimo ao máximo e ao continuar o giro o brilho vai de
mínimo ao máximo novamente. Para controle uniforme do brilho os valores devem estar como
no código.
O programa do Arduino tem no canto superior direito um ícone para ativar um monitor de
estado que podemos usar para verificar o comportamento dos dados nos pinos entradas e
saídas da experiência realizada. Veja abaixo o local do ícone citado:
//Experiência 9 ‐ Controle de brilho do led com o monitor serial
int pinoled = 9; // Pino do led ‐PWM
int pinopot = 0; // Entrada analógica ligada ao centro do potenciômetro
int valorpot = 0; // Valor inicial do potenciômetro, entre 0 e 1023
int brilho = 0; // Valor inicial de brilho do led entre 0 e 255
void setup()
{
Serial.begin(9600); // inicia a porta serial COM3 do monitor
pinMode(pinoled, OUTPUT); // pino do led como saída
pinMode(pinopot, INPUT); // pino do potenciômetro como entrada
}
void loop()
{
valorpot = analogRead(pinopot); // leitura do valor analógico do potenciômetro
brilho = map(valorpot, 0, 1023, 0, 255); /*Converte o valor do potenciômetro entre 0 e 1023
para um valor PWM entre 0 e 255 para o brilho do led*/
analogWrite(pinoled, brilho); // Envia o valor de brilho para o led entre 0 e 255
Serial.print(“Valor do potenciometro :”); // imprime no monitor o que está entre aspas
Serial.print(valorpot); // imprime o valor atual do potenciômetro no monitor
Serial.print(“ = Brilho do led:”); // imprime no monitor o que está entre aspas
Serial.println(brilho); //imprime o valor do brilho atual do led no monitor
}
Após o carregamento do código você abre primeiro verifica se a porta COM3 está selecionada
no programa do Arduino como mostrado abaixo:
Observações importantes:
- O que vai escrito dentro dos parênteses e aspas das duas linhas de comando:
Serial.print(“Valor do potenciometro:”);
Serial.print(“= Brilho do led:”);
Vai aparecer na tela do monitor como podemos observar. Podemos escrever qualquer coisa aí,
porém escreva dados que tem a ver com o circuito para facilitar a leitura pelo monitor;
- Você pode copiar e colar o código para o programa do Arduino como nas outras experiências,
mas corrija as aspas destas duas linhas de comandos: (“Valor do potenciometro:”); (“= Brilho do
led:”); com o teclado do PC (refaça estas aspas) de tal modo que estes dois códigos apareçam
na cor azul no programa. Senão o código não funcionará.
- A linha de código Serial.println(brilho); usa a letra “L” (ele) minúscula após a palavra print.
Lista de materiais
Procedimento
// Experiência 10 ‐ Led RGB tricolor com brilho e cores variáveis
int ledvermelho = 11; // Led ligado no pino 11 (PWM)
int ledverde = 10; // Led ligado no pino 10 (PWM)
int ledazul = 9; // Led ligado no pino 9 (PWM)
int valor = 0; // Valor inicial dos leds (apagados)
void setup()
{
} // Aqui não temos nada para configurar
void loop()
{
for(valor = 0; valor <= 255; valor += 5) // aumenta o nível de brilho 5 passos por vez
{analogWrite(ledazul, valor); // aumenta o brilho do AZUL
delay(50);} // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 255; valor >= 0; valor ‐= 5) // diminui o nível de brilho 5 passos por vez
{analogWrite(ledazul, valor); // diminui o brilho do AZUL
delay(50); } // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 0; valor <= 255; valor += 5) // aumenta o nível de brilho 5 passos por vez
{analogWrite(ledazul, valor); // aumenta o brilho do azul e vermelho (ROXO)
analogWrite(ledvermelho, valor);
delay(50);} // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 255; valor >= 0; valor ‐= 5) // diminui o nível de brilho 5 passos por vez
{analogWrite(ledazul, valor); // diminui o brilho do azul e vermelho (ROXO)
analogWrite(ledvermelho, valor);
delay(50); } // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 0; valor <= 255; valor += 5) // aumenta o nível de brilho 5 passos por vez
{analogWrite(ledvermelho, valor); // aumenta o brilho do VERMELHO
delay(50);} // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 255; valor >= 0; valor ‐= 5) // diminui o nível de brilho 5 passos por vez
{analogWrite(ledvermelho, valor); // diminui o brilho do VERMELHO
delay(50); } // 50 milissegundos para visualizar entre um nível de brilho e outro
/*Código continua na próxima página*/
O código continua na próxima página e você observará que ao carrega-lo para o Arduino o led
ficará alternado entre as cores azul, roxa, vermelho, amarelo, verde, ciano e branco, sempre
aumentando e diminuindo o brilho para cada uma delas.
for(valor = 0; valor <= 255; valor += 5) // aumenta o nível de brilho 5 passos por vez
{analogWrite(ledverde, valor); // aumenta o brilho do verde e vermelho (AMARELO)
analogWrite(ledvermelho, valor);
delay(50);} // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 255; valor >= 0; valor ‐= 5) // diminui o nível de brilho 5 passos por vez
{analogWrite(ledverde, valor); // diminui o brilho do verde e vermelho (AMARELO)
analogWrite(ledvermelho, valor);
delay(50); } // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 0; valor <= 255; valor += 5) // aumenta o nível de brilho 5 passos por vez
{analogWrite(ledverde, valor); // aumenta o brilho do VERDE
delay(50);} // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 255; valor >= 0; valor ‐= 5) // diminui o nível de brilho 5 passos por vez
{analogWrite(ledverde, valor); // diminui o brilho do VERDE
delay(50); } // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 0; valor <= 255; valor += 5) // aumenta o nível de brilho 5 passos por vez
{analogWrite(ledazul, valor); // aumenta o brilho do azul e verde (CIANO)
analogWrite(ledverde, valor);
delay(50);} // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 255; valor >= 0; valor ‐= 5) // diminui o nível de brilho 5 passos por vez
{analogWrite(ledazul, valor); // diminui o brilho do azul e verde (CIANO)
analogWrite(ledverde, valor);
delay(50); } // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 0; valor <= 255; valor += 5) // aumenta o nível de brilho 5 passos por vez
{analogWrite(ledverde, valor); // aumenta o brilho dos três leds (BRANCO)
analogWrite(ledvermelho, valor);
analogWrite(ledazul, valor);
delay(50);} // 50 milissegundos para visualizar entre um nível de brilho e outro
for(valor = 255; valor >= 0; valor ‐= 5) // diminui o nível de brilho 5 passos por vez
{analogWrite(ledverde, valor); // diminui o brilho dos três leds (BRANCO)
analogWrite(ledvermelho, valor);
analogWrite(ledazul, valor);
delay(50); } // 50 milissegundos para visualizar entre um nível de brilho e outro
}
Como podemos observar o código é o mesmo da experiência 8 com mais linhas de código para
controlarmos o brilho dos leds individualmente formando as três primárias (RGB), de dois em
dois formando as secundárias (ciano, amarelo e roxo) e os três ao mesmo tempo formando o
branco. Veja o resultado ao alimentar o circuito e mandar o código ao Arduino.
Lista de materiais
Procedimento
// Experiência 11 ‐ Semáforo com botão acionador
int carroR = 12; // Led vermelho semáforo dos carros
int carroY = 11; // Led amarelo semáforo dos carros
int carroG = 10; // Led verde semáforo dos carros
int pedR = 8; // Led vermelho semáforo dos pedestres
int pedG = 9; // Led verde semáforo dos pedestres
int botao = 4; // Botão de acionamento pelos pedestres
int tempoatravessar = 7000; //Tempo para os pedestres atravessarem
unsigned long changeTime; // Tempo decorrido deste que o botão foi acionado
void setup() {
pinMode(carroR, OUTPUT);
pinMode(carroY, OUTPUT);
pinMode(carroG, OUTPUT); // Pinos dos leds como saídas
pinMode(pedR, OUTPUT);
pinMode(pedG, OUTPUT);
pinMode(botao, INPUT_PULLUP); // Botão como entrada usando os resistores “pull up”
digitalWrite(carroG, HIGH); // Condição normal do semáforo dos carros (verde aceso)
digitalWrite(pedR, HIGH); // Condição normal do semáforo dos pedestres (vermelho aceso)
}
void loop() {
int estado = digitalRead(botao); // Lê o estado do botão
if (estado == LOW && (millis() ‐ changeTime) > 5000) { /* Verifica o acionamento do botão e se
passaram 5 segundos desde o último acionamento*/
delay(5000); // após o pedestre apertar o botão, o semáforo aguarda 5 segundos
changeLights (); // Semáforo muda as luzes
}
}
void changeLights() {
digitalWrite(carroG, LOW); // Semáforo dos carros apaga o verde
digitalWrite(carroY, HIGH); // Semáforo dos carros acende o amarelo
delay(2000); // Espera 2 segundos
digitalWrite(carroY, LOW); // Semáforo dos carros apaga o amarelo
digitalWrite(carroR, HIGH); // Semáforo dos carros acende o vermelho
delay(1000); // Espera 1 segundo por segurança
digitalWrite(pedR, LOW); // Semáforo de pedestres apaga o vermelho
digitalWrite(pedG, HIGH); // Semáforo de pedestres acende o verde
delay(tempoatravessar); // Espera o tempo dos pedestres passarem (7 seg definidos acima)
digitalWrite(pedG, LOW); // Semáforo de pedestres apaga o verde
/* Código continua na próxima página */
/* Continuação do código*/
for (int x=0; x<10; x++) { // Inicia a função pisca‐pisca para o vermelho de pedestres
digitalWrite(pedR, HIGH); // Semáforo de pedestres acende o vermelho
delay(250); // Espera 0,25 segundos
digitalWrite(pedR, LOW); // Semáforo de pedestres apaga o vermelho
delay(250); // Espera 0,25 segundos
}
digitalWrite(pedR, HIGH); // Semáforo de pedestres acende e mantém o vermelho
delay(500); // Espera 0,5 segundos
digitalWrite(carroR, LOW); // Semáforo dos carros apaga o vermelho
digitalWrite(carroG, HIGH); // Semáforo dos carros acende e mantém o verde
changeTime = millis(); // Inicia novamente o loop do semáforo
}
Observação - Mesmo que alguma experiência deste curso tenha seu código escrito em duas
partes por não caber todo numa folha só (como é o caso desta), você pode copiar e colar no
programa do Arduino em duas partes uma em cima da outra, que funciona normalmente.
== (igual a)
!= (não igual a ou diferente de)
< (menor que)
> (maior que)
<= (menor ou igual a)
>= (maior ou igual a)
x++ (eleva o valor de x em 1 unidade. É o mesmo que x = x+1)
Quando um comando ou um código é escrito para o Arduino executar ele possui diversas
linhas. Várias destas linhas tem indicado o tipo de dado que o comando é e desta forma qual o
espaço que vai ocupar na memória RAM do Arduino. Conforme vimos cada tipo de Arduino
possui um tipo de CI micro e consequentemente uma capacidade de armazenamento diferente.
No modelo UNO que usamos neste curso o CI tem uma capacidade de 32 Kbytes o que é
bastante uma vez que os códigos de uma forma geral que usamos são muito menores não
chegando nem perto deste valor total de armazenamento. Na página seguinte temos uma
tabela dos tipos de dados, espaço ocupado e o intervalo de valores que eles podem assumir.
Lista de materiais
Procedimento
Na página seguinte temos o esquema elétrico e o código. Ao gravar o código observe como os
leds acendem e apagam em sequencia num sentido e no outro. A velocidade depende de um
dado colocado no código.
//Experiência 12 ‐ Sequencial com 4 leds
byte pinosLEDs [] = {9, 10, 11, 12}; //arranjo com os pinos ligados aos leds
int atrasoLEDs(100); // Tempo entre apagar um led e acender o seguinte (0,1 segundo)
int sentido = 1; // Sentido para correr os leds (direita ou esquerda)
int LEDatual = 0; // led atual da sequencia
unsigned long mudaTempo;
void setup() {
for (int x=0; x<4; x++) {
pinMode(pinosLEDs[x], OUTPUT); } // Estabelece os pinos dos leds como saídas
mudaTempo = millis();
}
void loop() {
if ((millis() ‐ mudaTempo) > atrasoLEDs) { // Verifica se já passou o tempo de atraso dos leds
mudaLED(); // Muda o estado dos leds
mudaTempo = millis();
}
}
void mudaLED() {
for (int x=0; x<4; x++) {
digitalWrite(pinosLEDs[x], LOW); //Apaga todos os leds
}
digitalWrite(pinosLEDs[LEDatual], HIGH); // Acende o led atual
LEDatual += sentido; // Cria a sequencia para os leds
if(LEDatual == 3) {sentido = ‐1;} // muda o sentido quando chega no final da carreira
if(LEDatual == 0) {sentido = 1;} // muda o sentido quando chega no final da carreira
}
Lista de materiais
Procedimento
//Experiência 13 ‐ Sequencial com 10 leds
byte pinosLEDs [] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; //arranjo com os pinos ligados aos leds
int atrasoLEDs(50); // Tempo entre apagar um led e acender o seguinte (50 milissegundos)
int sentido = 1; // Sentido para correr os leds (direita ou esquerda)
int LEDatual = 0; // led atual da sequencia
unsigned long mudaTempo;
void setup() {
for (int x=0; x<10; x++) { // Aqui colocamos a quantidade de leds do sequencial
pinMode(pinosLEDs[x], OUTPUT); } // Estabelece os pinos dos leds como saídas
mudaTempo = millis();
}
void loop() {
if ((millis() ‐ mudaTempo) > atrasoLEDs) { // Verifica se já passou o tempo de atraso dos leds
mudaLED(); // Muda o estado dos leds
mudaTempo = millis();
}
}
void mudaLED() {
for (int x=0; x<10; x++) {
digitalWrite(pinosLEDs[x], LOW); //Apaga todos os leds
}
digitalWrite(pinosLEDs[LEDatual], HIGH); // Acende o led atual
LEDatual += sentido; // Cria a sequencia para os leds
if(LEDatual == 9) {sentido = ‐1;} // muda o sentido quando chega no final da carreira
if(LEDatual == 0) {sentido = 1;} // muda o sentido quando chega no final da carreira
}
Observe que é praticamente o mesmo código do circuito anterior onde fizemos pequenas
alterações. Ao carregar para o Arduino, os leds acendem e apagam em sequencia bem rápido
indo e voltando. Ao mudar o valor da linha int atrasoLEDs(50); fazemos a sequencia andar mais
rápido ou devagar. Experimente outros números, mas lembrando de que o valor está em
milissegundos. A linha for (int x=0; x<10; x++) { deve ser modificada para a quantidade de leds
que temos na sequencia. Neste caso temos 10. Se tiver menos coloque a quantidade certa. Já
na linha de comando if(LEDatual == 9) {sentido = ‐1;} você coloca a quantidade de leds da
sequencia menos 1. Como tem 10 leds colocamos o número 9. Se tiver 4 leds, coloca 3 e
assim por diante. A contagem dos pinos para o circuito digital não é de 1 a 10 e sim de 0 a 9.
Agora neste mesmo circuito vamos acrescentar um potenciômetro para controlar a velocidade
dos leds e esta será nossa próxima experiência.
Lista de materiais
Procedimento
//Experiência 14 ‐ Sequencial com 10 leds controlado manualmente
byte pinosLEDs [] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; //arranjo com os pinos ligados aos leds
int atrasoLEDs; // Tempo entre apagar um led e acender o seguinte
int sentido = 1; // Sentido para correr os leds (direita ou esquerda)
int LEDatual = 0; // led atual da sequencia
unsigned long mudaTempo;
int potenc = 3; // pino analógico onde vai o potenciômetro
void setup() {
for (int x=0; x<10; x++) { // Aqui colocamos a quantidade de leds do sequencial
pinMode(pinosLEDs[x], OUTPUT); } // Estabelece os pinos dos leds como saídas
mudaTempo = millis();
}
void loop() {
atrasoLEDs = analogRead(potenc); // Lê o valor do potenciômetro para o atraso dos LEDs
if ((millis() ‐ mudaTempo) > atrasoLEDs) { // Verifica se já passou o tempo de atraso dos leds
mudaLED(); // Muda o estado dos leds
mudaTempo = millis();
}
}
void mudaLED() {
for (int x=0; x<10; x++) {
digitalWrite(pinosLEDs[x], LOW); //Apaga todos os leds
}
digitalWrite(pinosLEDs[LEDatual], HIGH); // Acende o led atual
LEDatual += sentido; // Cria a sequencia para os leds
if(LEDatual == 9) {sentido = ‐1;} // muda o sentido quando chega no final da carreira
if(LEDatual == 0) {sentido = 1;} // muda o sentido quando chega no final da carreira
}
Lista de materiais
Procedimento
//Experiência 15 ‐ Arduino como comparador de tensão e fotocélula
int led = 9; // Pino do led
int V1 = 1; // Entrada analógica para a tensão V1 (divisor formado por R2 e R3/LDR)
int V2 = 2; // Entrada analógica para a tensão V2 (potenciômetro)
int valorV1 = 0; // Valor inicial da tensão V1
int valorV2 = 0; // Valor inicial da tensão V2
void setup() {
pinMode(led, OUTPUT); // Pino do led como saída
pinMode(V1, INPUT); // Pino da tensão analógica V1 como entrada
pinMode(V2, INPUT); // Pino da tensão analógica V2 como entrada
}
void loop() {
valorV1 = analogRead(V1); // Leitura analógica do valor da tensão V1
valorV2 = analogRead(V2); // Leitura analógica do valor da tensão V2
if(valorV2 > valorV1) { // Se a tensão V2 é maior que V1
digitalWrite(led, HIGH); // O led acende
}else{ // Senão
digitalWrite(led, LOW); // O led apaga
}
}
Neste circuito comparamos duas tensões (V1 e V2) nas entradas analógicas do Arduino e se
uma delas é maior que a outra (neste caso V2 maior que V1 definida pelo código acima), a
saída vai a nível alto acendendo o led. Funciona como um amplificador operacional
comparador e tais circuitos são muito úteis na eletrônica.
Fotocélula
Para fazer a fotocélula basta trocar R3 pelo LDR. Não precisa mexer em mais nada no circuito
nem no código. Veja como fica o circuito na protoboard usando o LDR:
Coloque o circuito no escuro e gire devagar o potenciômetro até que o led acenda. Quando for
para um ambiente claro o led apaga. Assim você calibrou o circuito para o nível de escuro
desejado para que o led acenda. Pode ser mais ou menos escuro de acordo com o ajuste.
Lista de materiais
Procedimento
// Experiência nº 16 ‐ Efeito fogueira
int led1 = 11;
int led2 = 10;
int led3 = 9; // Pinos dos leds (o led 3 é o vermelho)
int led4 = 6;
int led5 = 5;
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT); // Pinos dos leds como saídas
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
}
void loop() {
analogWrite(led1, random(120)+136); // cada pino do led assume valores PWM aleatórios
analogWrite(led2, random(120)+136); //entre 0 e 119 (120 passos total) e se soma a 136 passos
analogWrite(led3, random(120)+136); //para chegar no brilho máximo. Isto dá o efeito de
analogWrite(led4, random(120)+136); //brilho variável como o de uma chama
analogWrite(led5, random(120)+136);
delay(random(100)); // Espera um tempo aleatório entre 0 e 100 ms e recomeça o efeito
}
Lista de materiais
// Experiência nº 17 – Led tricolor RGB com controle serial através do PC
char buffer[18]; // Define um arranjo de caracteres com 18 letras
int vermelho, verde, azul; // Cores dos leds da experiência
int Vermelho = 11;
int Verde = 10; // Define os pinos do led RGB usado no circuito
int Azul = 9;
void setup() {
Serial.begin(9600); // Inicia a comunicação serial com o PC a 9600 caracteres por segundo
Serial.flush(); // Limpa a linha para o próximo grupo de caracteres
pinMode(Vermelho, OUTPUT);
pinMode(Verde, OUTPUT); // Define os pinos do led RGB como saída
pinMode(Azul, OUTPUT);
}
void loop() {
if (Serial.available() > 0) { // Se os dados são enviados pela linha serial
int index=0; // Define um inteiro (index) com o valor “0”
delay(100); // Aguarda 100 milissegundos para encher o buffer com os dados
int numChar = Serial.available(); // Dados seriais que acabaram de chegar
if (numChar>15) { // Se tais dados tiverem mais de 15 caracteres
numChar=15; // Define como máximo de 15 caracteres por linha
}
while (numChar‐‐) { // Subtrai 1 do número de caracteres enquanto este não for zero
buffer[index++] = Serial.read(); // Soma 1 ao inteiro e define como valor lido de caracteres
}
splitString(buffer); // Lê os dados do buffer e o separa por linhas de acordo como comando
}
}
void splitString(char* data) { // Separa os caracteres por comandos (ex: R do G e do B)
Serial.print("Data entered: "); // Mostra no PC os dados digitados na linha de comandos
Serial.println(data); // Mostra no PC os dados já organizados por linhas
char* parameter; // Declara os parâmetros dos caracteres
parameter = strtok (data, " ,"); // Caracteres que representam espaços e vírgulas
while (parameter != NULL) { // Enquanto o conteúdo de caracteres não estiver vazio
setLED(parameter); // Ajusta os parâmetros dos leds
parameter = strtok (NULL, " ,"); // Limpa os buffers
}
/* Código continua na próxima página*/
/* Continuação do código */
for (int x=0; x<16; x++) { // Repete a próxima linha 16 vezes
buffer[x]='\0'; // Esvazia o buffer
}
Serial.flush(); // Limpa novamente a linha para o próximo grupo de caracteres
}
void setLED(char* data) { // Função ajuste dos leds
if ((data[0] == 'r') || (data[0] == 'R')) { // Se for digitado “R” ou “r”
int Ans = strtol(data+1, NULL, 10); //Define Ans como número após “R” ou “r”
Ans = constrain(Ans,0,255); // Define Ans entre 0 e 255
analogWrite(Vermelho, Ans); //Escreve o valor Ans no pino do led vermelho
Serial.print("Vermelho esta em: "); // Mostra “Vermelho esta em” no monitor do Arduino
Serial.println(Ans); // Mostra o valor do led vermelho
}
if ((data[0] == 'g') || (data[0] == 'G')) { // Se for digitado “G” ou “g”
int Ans = strtol(data+1, NULL, 10); //Define Ans como número após “G” ou “g”
Ans = constrain(Ans,0,255); // Define Ans entre 0 e 255
analogWrite(Verde, Ans); //Escreve o valor Ans no pino do led verde
Serial.print("Verde esta em: "); // Mostra “Verde esta em” no monitor do Arduino
Serial.println(Ans); // Mostra o valor do led verde
}
if ((data[0] == 'b') || (data[0] == 'B')) { // Se for digitado “B” ou “b”
int Ans = strtol(data+1, NULL, 10); //Define Ans como número após “B” ou “b”
Ans = constrain(Ans,0,255); // Define Ans entre 0 e 255
analogWrite(Azul, Ans); //Escreve o valor Ans no pino do led azul
Serial.print("Azul esta em: "); // Mostra “Azul esta em” no monitor do Arduino
Serial.println(Ans); // Mostra o valor do led azul
}
}
Este circuito é bastante interessante porque com ele você poderá controlar o brilho e a cor do
led RGB apenas digitando no monitor do IDE do Arduino. A primeira coisa a fazer é carregar o
código no programa do Arduino. Inicialmente o led não acenderá nenhuma cor. Então você
abre o monitor da IDE do Arduino como mostrado abaixo:
Para apagar todas as cores basta digitar r0, g0, b0 ou simplesmente r, g, b conforme podemos
ver abaixo:
Assim podemos obter muitas (mais de 16 milhões) de cores intermediárias digitando valores
diferentes para rgb, como por exemplo, se digitar r255, b120 obtemos um violeta bem suave,
r100, g100 dá amarelo, r180, g100 dá laranja, r150, g150, b100 dá um verde suave. Vá
experimentando valores diferentes e veja o resultado no led RGB.
Lista de materiais
// Experiência nº 18 – Sensor de luz controlado por três leds
int ldr = 3; // Identifica o pino analógico onde está ligado o LDR
int valorldr = 0; // Valor inicial do LDR
int ledvm = 7; // Pino do led vermelho
int ledam = 6; // Pino do led amarelo
int ledvd = 5; // Pino do led verde
void setup() {
pinMode(ledvm, OUTPUT);
pinMode(ledam, OUTPUT); // Define os pinos dos leds como saídas
pinMode(ledvd, OUTPUT);
}
void loop() {
valorldr = analogRead(ldr); // Lê o valor analógico do LDR (luz incidente sobre ele)
if(valorldr < 750) { // Se o valor está abaixo de 750 (condição escuro)
apagaosleds(); // Apaga os demais leds
digitalWrite(ledvm, HIGH); // E acende o led vermelho
}
if(valorldr >= 750 && valorldr <= 800) { // Se o valor está entre 750 e 800 (penumbra)
apagaosleds(); // Apaga os demais leds
digitalWrite(ledam, HIGH); // E acende o led amarelo
}
if(valorldr > 800) { // Se o valor está acima de 800 (condição claro)
apagaosleds(); // Apaga os demais leds
digitalWrite(ledvd, HIGH); // E acende o led verde
}
delay(50); // Espera 50 milissegundos
}
void apagaosleds() { // Função usada para apagar todos os leds
digitalWrite(ledvm, LOW);
digitalWrite(ledam, LOW); // Apaga os leds não usados naquela condição de luz
digitalWrite(ledvd, LOW);
}
Ao copiar o código para a IDE do Arduino, verificamos que dependendo do nível de luz sobre o
sensor (LDR) vai acender um dos três leds, sendo que para ambiente escuro (cobrindo o ldr,
por exemplo) acende o vermelho, meia luz (jogando uma sombra) acende o amarelo e para
ambiente iluminado acende o verde.
Lista de materiais
// Experiência nº 19 – Pisca pisca controlado por potenciômetro e luz
int led1 = 6; // Pino do led verde
int led2 = 5; // Pino do led vermelho
int ldr = 3; // Pino do LDR (3 analógico)
int pot = 2; // Pino do potenciômetro (2 analógico)
int valorpot = 0; // Valor inicial do potenciômetro
int valorldr = 0; // Valor inicial do LDR
int brilho = 0; // Brilho inicial dos leds
void setup() {
pinMode(led1, OUTPUT); // Pino do led verde como saída
pinMode(led2, OUTPUT); // Pino do led vermelho como saída
pinMode(ldr, INPUT); // Pino do LDR como entrada
pinMode(pot, INPUT); // Pino do potenciômetro como entrada
}
void loop() {
valorpot = analogRead(pot); // Leitura do valor do potenciômetro
valorldr = analogRead(ldr); // Leitura do valor do LDR
brilho = map(valorldr, 0, 1023, 0, 255); // Converte o valor do LDR para valor aos leds
analogWrite(led1, brilho); // Acende o led verde com brilho de acordo com o LDR
analogWrite(led2, 0); // Apaga o led vermelho
delay(valorpot); // Espera o tempo definido pelo potenciômetro
analogWrite(led1, 0); // Apaga o led verde
analogWrite(led2, brilho); // Acende o led vermelho com brilho de acordo com o LDR
delay(valorpot); // Espera o tempo definido pelo potenciômetro
}
A seguir carregamos o programa para a IDE do Arduino e podemos ver que os dois leds
piscam alternadamente conforme outra experiência que fizemos neste curso, porém agora o
ritmo das piscadas e o brilho dos leds são controlados pelo potenciômetro e pelo LDR. O LDR
ligado ao pino 2 capta a luz do ambiente e sua resistência depende dela. Quando o ambiente
está mais escuro, a resistência do LDR é maior e a tensão no pino A3 aumenta fazendo o
Arduino mandar maior tensão para os pinos 5 e 6 (PWM). Desta forma os leds brilham mais
forte. Se a luz do ambiente for mais forte a resistência do LDR diminui e os leds brilham mais
fraco. O potenciômetro fornece uma tensão ao pino A2 e dependendo dela os leds piscam mais
rápido ou mais devagar. Resumindo o LDR controla o brilho e o potenciômetro controla a
velocidade do pisca.
Lista de materiais
// Experiência nº 20 – Dado eletrônico
int leds[7] = {6, 7, 8, 9, 10, 11, 12}; // Pinos dos leds do led A ao led F
int formatodado[7][7] = { // Aqui damos um formato de dado ao arranjo dos leds na placa
/* Para seu arranjo de leds funcionar legal na placa recomendo que, para a maneira que os leds
estão ligados e indicados por letras, distribua a matriz abaixo da maneira colocada aqui */
// Leds: {A, B, C, D, E, F, G}
{0, 0, 0, 1, 0, 0, 0}, // Mostra o 1
{0, 0, 1, 0, 0, 0, 1}, // Mostra o 2
{0, 0, 1, 1, 0, 0, 1}, // Mostra o 3
{1, 0, 1, 0, 1, 0, 1}, // Mostra o 4
{1, 0, 1, 1, 1, 0, 1}, // Mostra o 5
{1, 1, 1, 0, 1, 1, 1}, // Mostra o 6
{0, 0, 0, 0, 0, 0, 0} // Não mostra nada
};
int botao = 3; // Pino do botão
int blank = 6; // Quando cair “não mostra nada” define como 6
void setup()
{
for (int i = 0; i < 7; i++) // Definição dos pinos
{
pinMode(leds[i], OUTPUT); // Define todos os pinos dos leds como saída
digitalWrite(leds[i], LOW); // Apaga todos os leds inicialmente
}
randomSeed(analogRead(0)); // Lê a porta analógica 0 e cria um número aleatório
}
void loop()
{
if (digitalRead(botao)) // Lê o estado do botão. Caso seja pressionado (nível alto)
{
rodaodado(); // Roda o dado
}
delay(100); // Tempo de espera para nova rodada do dado
}
/* Código continua na próxima página */
/* Continuação do código */
void rodaodado() // Função para a rodada do dado
{
int resultado = 0; // Inicia a variável “resultado” com zero (0)
int comprimentorodada = random(20, 30); /* Ao apertar o botão o dado passa por uma
sequencia aleatória entre 20 e 30 números antes de mostrar o resultado final */
for (int i = 0; i < comprimentorodada; i++) // De 0 até a sequencia aleatória de números
{
resultado = random(0, 6); // Número aleatório entre 0 e 6 (entre 7 algarismos no total)
mostra(resultado); // Mostra o resultado do dado
delay(50 + i * 10); // Demora para mostrar o resultado
}
for (int j = 0; j < 3; j++) // Pisca três vezes o resultado final
{
mostra(blank); // Apaga os leds
delay(500); // Espera 500 ms (0,5 segundos)
mostra(resultado); // Mostra o resultado
delay(500); // Espera 500 ms (0,5 segundos)
}
}
void mostra(int resultado) // Mostra o resultado nos leds
{
for (int i = 0; i < 7; i++) // Controla do led A ao led G (7 resultados no total)
{
digitalWrite(leds[i], formatodado[resultado][i]); /* Acende os leds (ou led) para mostrar o
resultado final */
}
}
Ao transferir o código para a IDE do Arduino inicialmente os leds permanecem apagados até
que a chave seja pressionada. Ao pressionarmos, os leds começam a piscar aleatoriamente
até que um resultado (de um a seis leds) pisque por três vezes e seja mostrado. Para rodar o
dado novamente basta apenas pressionar a microchave e ele mostrará outro resultado (ou o
mesmo) aleatoriamente.
Chegamos ao final desta parte do nosso curso de Arduino onde aprendemos a trabalhar com
leds. Na próxima parte ensinaremos a trabalhar com outros periféricos acoplados ao Arduino.
Para dúvidas, críticas ou sugestões temos nossos e-mails a seguir:
1. Instalando drivers para os Arduinos Uno ou Mega 2560 no Windows7, Vista, ou XP:
Conecte a sua placa e aguarde até que o Windows inicie o processo de instalação de
drivers. Depois de alguns instantes, o processo irá falhar.
Clique no menu iniciar e vá até o Painel de Controle
Selecione Sistema e Segurança > Sistema > Gerenciador de Dispositivos.
Procure na seção "Portas (COM e LPT)". Você deverá encontrar um porta aberta chamada
"Arduino UNO (COMXX)".
Clique com o botão direito na porta "Arduino UNO (COMXX)" e selecione "Atualizar
Driver...".
Depois selecione a opção "Procurar software de driver no computador".
Finalmente, navegue até a pasta "drivers" dentro do aplicativo do Arduino, na pasta que foi
descompactada anteriormente, e selecione o arquivo "arduino.inf".
Quando você conectar a placa, o Windows deve iniciar o processo de instalação dos drivers,
caso você ainda não tenha usado o computador com um Arduino antes.
Você pode verificar que os drivers foram instalados clicando no menu iniciar e depois
em Painel de Controle > Sistema e Segurança > Sistema > Gerenciador de Dispositivos.
Procure por uma "USB Serial Port" na seção "Portas (COM e LPT)".