Uploaded by lucas paiva

Arduhack-rev2

advertisement
ARDUHACK
PARE DE COPIAR
PROJETOS E COMECE
A CONSTRUIR OS
SEUS AGORA MESMO
+ DE 15 PROJETOS BÔNUS
MÉTODO APROVADO
POR ALUNOS
DIRECIONADO A PRÁTICA
MATEUS D. DIAS
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
REVISÃO 2.0
SOBRE O AUTOR:
Mateus D. Dias é formado em Engenharia de Controle e
Automação, e trabalha com desenvolvimento IoT a mais de 2
anos. Possui experiencia em cloud computing, e é fundador da
empresa Vuker Tecnologias Inteligentes, na qual presta
consultoria para grandes empresas do setor de automação no
Brasil.
Trabalhando na área, viu o déficit de profissionais, por isso
tomou
como
missão
criar
a
maior
comunidade
de
desenvolvimento IoT do Brasil.
Atualmente
possui
um
projeto
para
ensinar
desenvolvedores a se especializarem em programação de
microcontroladores.
**********************************************************************************
CANAIS DE CONTATO:
Canal do Telegram:
https://t.me/canallobodarobotica
Instagram:
https://www.instagram.com/lobodarobotica/
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Blog Lobo da Robótica:
https://lobodarobotica.com/blog
Canal no Youtube:
https://lobodarobotica.com/canal-yt
Página do Facebook:
https://www.facebook.com/lobodarobotica/
Acesso ao Minicurso BÔNUS:
https://lobodarobotica.com/acesso-minicurso
E-mail:
suporte@lobodarobotica.com
2
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
DEDICATÓRIA
Dedico esse livro primeiramente a Deus por me permitir
construir esse trabalho. Além do meu querido pai, e minha
querida mãe. Agradeço pelo esforço e dedicação.
3
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
POR QUE ESCREVI ESSE LIVRO
Diariamente recebo pedidos de pessoas que querem
aprender a programar Arduíno e não sabem por onde começar,
ou ainda, sabem os conceitos básicos, mas não se sentem
confiantes para construir seus próprios projetos.
Veja bem, não há nada de errado em copiar projetos de
outras pessoas, ou até mesmo algumas partes de códigos, mas é
importantíssimo que você entenda o que você está copiando.
Uma criança aprende a falar, imitando as palavras dos pais,
até que se sinta confortável o suficiente para construir suas
próprias frases, e o processo de aprendizado na programação
não é diferente.
Por mais que você já saiba alguns conceitos que esse livro
vai te passar, eu recomendo fortemente que você não pule
capítulos, e execute todos os exercícios propostos, pois isso vai
te dar suporte para no futuro você construir projetos cada vez
maiores e mais complexos.
Cada capitulo deste livro foi projetado de maneira
sequencial, seguindo uma linha de raciocino, para que você
sempre consiga interligar as ferramentas.
Cada projeto foi pensado e construído para colocar em
pratica o que você aprendeu em cada capitulo, e nos capítulos
que o antecedem.
Bom Aprendizado!
4
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SUMÁRIO
REVISÃO 2.0 .......................................................................................1
SOBRE O AUTOR: ........................................................................1
DEDICATÓRIA ....................................................................................3
POR QUE ESCREVI ESSE LIVRO ....................................................4
KIT ARDUINO COMPLETO LOBO DA ROBÓTICA.....................8
TREINAMENTO COMPLETO DE ARDUINO ...............................9
CAPITULO 0 ......................................................................................13
0.1 APRESENTAÇÃO .......................................................................13
0.2 ARDUÍNO BLUEPRINT ..............................................................15
CAPITULO 1 ......................................................................................16
1.1 COMO FUNCIONA A PROTOBOARD?.....................................17
1.2 CONVERSANDO COM O ARDUINO.........................................19
EXERCÍCIO 1 ..............................................................................25
1.3 VOID LOOP E VOID SETUP ......................................................26
1.4 ARMAZENANDO INFORMAÇÕES COM VARIÁVEIS ..............27
CONTEXTO DE VARIÁVEIS.......................................................30
#DEFINE E CONSTANTES ........................................................32
EXERCÍCIO 2 ..............................................................................35
1.5 OPERADORES ARITMÉTICOS – FAZENDO CÁCULOS
DURANTE A PROGRAMAÇÃO .......................................................36
ATRIBUIÇÃO (=) .........................................................................36
ADIÇÃO (+) ..................................................................................37
SUBTRAÇÃO (-) ..........................................................................39
MULTIPLICAÇÃO (*) ...................................................................40
DIVISÃO (/) ..................................................................................42
RESTO (%) ..................................................................................44
SOMA UNITÁRIA (++) .................................................................45
SUBTRAÇÃO UNITÁRIA (--).......................................................46
CAPITULO 2......................................................................................47
5
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.1 OPERADORES LÓGICOS E DE COMPARAÇÃO ....................47
(==) IGUAL A: ..............................................................................47
(>) MAIOR QUE ...........................................................................48
(<) MENOR QUE .........................................................................48
(<=) MENOR IGUAL ....................................................................48
(>=) MAIOR IGUAL: .....................................................................49
(!=) DIFERENTE ..........................................................................49
2.2 SE (EU ESTUDAR O ARDUHACK) {VOU FAZER PROJETOS
CADA VEZ MELHORES} ..................................................................51
EXERCÍCIO 3: .............................................................................55
EXERCÍCIO 4 ..............................................................................58
(!) NOT .........................................................................................59
(&) AND ........................................................................................59
(|) OR ............................................................................................60
2.3 SAÍDAS DIGITAIS: ......................................................................61
PROJETO#1 - Blink com LED ..........................................................64
EXERCÍCIO 5 ..............................................................................66
2.4 ENTRADAS DIGITAIS ................................................................67
PROJETO#2 – Controlando um LED com um botão: ......................68
EXERCÍCIO 6 ..............................................................................70
2.5 SWITCH-CASE ...........................................................................71
EXERCÍCIO 7 ..............................................................................74
2.6 WHILE .........................................................................................75
EXERCÍCIO 8 ..............................................................................78
2.7 FOR .............................................................................................79
EXERCÍCIO 9 ..............................................................................81
EXERCÍCIO 10 ............................................................................82
PROJETO#3 – Scrolling LED: ..........................................................83
2.8 DO-WHILE ...................................................................................85
2.9 ENTRADAS ANALÓGICAS ........................................................86
6
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
CONVERSOR ANALÓGICO/DIGITAL ........................................86
PROJETO#4 – Controlando a frequência do LED com
potenciômetro: ...................................................................................88
2.10 SAÍDAS ANALOGICAS ............................................................90
PROJETO#5 – Controlando o brilho do LED com PWM: ................94
CAPITULO 3......................................................................................96
3.1 VETORES ...................................................................................96
PROJETO#6 – Controlando LEDs em série com potenciômetro: ...98
3.2 FUNÇÕES ................................................................................ 100
PROJETO#7 - Arduino Controlando Sinaleiro: ............................. 102
PROJETO#8 – Controlando um LED pela luminosidade do
ambiente: ........................................................................................ 104
3.3 RETORNOS ............................................................................. 107
PROJETO#9 – Lendo um sensor de temperatura: ....................... 110
3.4 PARÂMETROS ........................................................................ 113
3.5 CLASSES E BIBLIOTECAS .................................................... 114
COMO INCLUIR BIBLIOTECAS .............................................. 115
PROJETO#10 – Posicionamento com GPS NEO-6M .................. 123
PROJETO#11 – Tocando uma melodia com buzzer: ................... 125
PROJETO#12 – Controlando um servo: ....................................... 129
PROJETO#13 – Controlando um motor DC:................................. 131
PROJETO#14 – Display LCD: ....................................................... 134
PROJETO#15 - DHT11 Sensor de Temperatura e Umidade ....... 136
PROJETO#16 - Arduino com sensor de movimento PIR ............. 138
PROJETO#17 – Analise de solo com YL-69 ou HL-69:................ 140
IGNIÇÃO......................................................................................... 142
7
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
KIT ARDUINO COMPLETO LOBO DA ROBÓTICA
Muitos dos projetos desse e-book, eu irei ensinar como
utilizar um simulador online para desenvolver. Mas é notável a
diferença de aprendizado dos alunos que montam fisicamente
os projetos.
Por esse motivo, montei um kit completo com o maior
número de componentes, pelo menor preço disponível no
mercado.
Mateus, esse kit possui tudo o que preciso para construir
todos os projetos desse livro?
A resposta é não, pois o livro possui dezenas de projetos,
com os mais diversos componentes que existem.
O Kit Arduino completo Lobo da Robótica, possui os
componentes essenciais que você precisa ter.
Conheça mais através do link:
https://lobodarobotica.com/oferta-kit-alunos
8
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
TREINAMENTO COMPLETO DE ARDUINO
Desde que lancei a primeira versão desse livro, ele já ajudou
milhares de pessoas a transformarem ideias em projetos usando
o Arduino.
Parece até engraçado, mas a história é sempre a mesma, e
cheguei a fazer as contas pra te trazer em números aqui: 7 a cada
10 pessoas que leem este livro me contatam pedindo aulas em
vídeo.
Depois de milhares de pedidos, finalmente o conteúdo
desse ebook virou um treinamento.
No momento em que escrevo essa revisão, já são mais de
50 aulas em vídeo disponíveis na plataforma, e com certeza é
só o começo, pois nessa área, não da pra ficar parado.
Meu objetivo com esse treinamento, é te pegar pela mão e
te ensinar tudo o que eu sei sobre Arduino, lógica de
programação e eletrônica.
9
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Mas é claro que isso não é tudo...
Junto com esse treinamento, você recebe diversos bônus
que fazem total diferença na hora do aprendizado.
Veja alguns deles:
•
Acesso aos grupos Exclusivos do Telegram,
WhatsApp e Facebook
•
•
•
Módulo de Shields e Extensões do Arduino
Módulo de Eletrônica Aplicada
Certificado de Conclusão
Bom, vamos lá, vou comentar cada um desses bônus com
você, e começando pelo que na minha opinião, faz esse
treinamento ser um diferencial na sua vida: Os Grupos
Exclusivos.
De todos as avaliações que recebo desse treinamento, o que
mais elogiam é os grupos exclusivos, e principalmente o Grupo
do WhatsApp.
Isso por que não são simplesmente grupos, e sim tenho
orgulho de dizer que formamos uma comunidade. Onde todos
estão engajados com o mesmo objetivo.
Todos estamos dispostos a ajudar e serem ajudados, e é isso
que torna esses grupos tão especiais.
10
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
E como prova disso vou deixar aqui um print com um
depoimento que um aluno me mandou:
E como você pode ver, nas palavras dele, só os grupos já
pagam o valor investido.
Os outros bônus que também podem te ajudar na sua
jornada, são os módulos de eletrônica aplicada e de Shields,
nesses módulos vamos estudar a fundo a eletrônica, e como usala na criação dos seus projetos.
Além de que vamos estudar também todos as Shields e
extensões que o Arduino possui, e em cada uma dessas aulas vou
te dar ideias de como você pode estar utilizando em seus
projetos.
E, além de tudo isso, você também tem acesso ao
certificado de conclusão. Que pode alavancar sua carreira,
complementar sua faculdade ou apenas de dar a satisfação de ter
concluído mais essa etapa em sua vida.
11
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Ainda preciso te lembrar de que você tem 7 dias de garantia
total sobre o Curso, então você investindo nesse treinamento, e
por qualquer motivo que seja, você desistir da sua vaga, basta
você me encaminhar um e-mail que eu estorno 100% do valor
investido.
Faça parte desse treinamento e dessa comunidade através
do link abaixo:
https://lobodarobotica.com/treinamento-arduhackcompleto
12
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
CAPITULO 0
0.1 APRESENTAÇÃO
Agora que já nos conhecemos, está na hora de conhecer
como este livro está dividido.
Com certeza a melhor maneira de se aprender é
executando. Gosto de usar o seguinte exemplo:
“Imagine que você está em um caiaque, e você tem 2 remos
em suas mãos. O remo da mão esquerda é o remo do
aprendizado, já o da mão direita é o remo da execução. Se você
apenas remar sua mão esquerda, vai ficar girando em círculos e
não vai a lugar algum, e o mesmo vale para a mão direita.
Portanto de nada vale você aprender muito e não executar nada,
e não adianta você executar muito e nunca parar pra aprender.
Você só vai conseguir avançar se souber equilibrar as duas
coisas”.
Assim que você aprender algo novo nesse livro, vá e
coloque em prática!
Esse livro está dividido em explicações e exercícios, então a
cada novo capitulo que você estudar, terá exercícios para você
colocar em prática. Além de mais de 15 projetos bônus para você
construir, e colocar suas habilidades à prova.
Em cada capitulo eu irei explicar sobre um conceito novo
dentro do Arduíno e da programação C/C++, portanto pra cada
capitulo que você estudar você estará mais capaz de construir
13
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
suas próprias aplicações sozinho, de forma cada vez mais
profissional.
14
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
0.2 ARDUÍNO BLUEPRINT
Como bônus eu vou estar disponibilizando pra você o
ARDUÍNO BLUEPRINT, que é um mapa de tudo o que você pode
fazer com o Arduíno, contem explicações sobre as principais
funções e como você deve usar cada uma. É o caminho das
pedras que você precisa para construir suas aplicações. Quando
sentir dúvida em algo, basta consultar o Blueprint. O download
pode ser feito clicando no link abaixo:
https://lobodarobotica.com/arduino-blueprint
15
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
CAPITULO 1
Durante essa jornada você vai precisar de alguns
softwares, que vão te auxiliar e facilitar muito seu aprendizado.
Eu já vou deixar a indicação para você aqui, para que assim
que tenhamos que utilizar, você já tenha preparado tudo.
O primeiro deles, é um simulador de eletrônica e Arduino,
chamado TinkerCAD, ele funciona totalmente online, e não
precisa instalar nada no seu computador, apenas acessar o site e
criar um conta. Eu falo um pouco mais sobre ele no minicurso
bônus desse ebook. Pra você acessar e criar uma conta basta
entrar pelo link abaixo:
https://www.tinkercad.com/
O segundo software que mais vamos utilizar é a IDE do
Arduino, vamos utiliza-la pra fazer a gravação dos nossos
algoritmos nas placas.
Não se preocupe agora em entender o que cada um faz,
vamos estudar isso mais pra frente, mas eu recomendo que você
já deixe tudo preparado agora.
Esse software, diferente do TinkerCAD, precisa ser
instalado em seu computador, por isso, eu já deixei preparado
um artigo no meu blog explicando o passo a passo para você
instalar.
Basta acessar pelo link abaixo:
https://lobodarobotica.com/blog/ide-do-arduino-o-guiadefinitivo/
16
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
1.1 COMO FUNCIONA A PROTOBOARD?
A primeira coisa que você precisa entender antes de sair
escrevendo linhas de código, são quais ferramentas você tem
disponíveis pra te ajudar nesse processo. E nesse caso a
ferramenta que eu acredito fortemente que é a mais importante,
tanto
na
parte
de
aprendizado,
como
na
parte
de
desenvolvimento é a PROTOBOARD.
Essa placa cheia de furos pode parecer estranha, mas
quando você entender a sua funcionalidade tudo vai ficar mais
claro.
Você precisa ter em mente que a protoboard é utilizada
para que não se tenha a necessidade de soldar componentes,
principalmente na etapa de desenvolvimento, sair soldando
componentes sem testar, não é uma coisa muito inteligente de
se fazer.
A figura 1 mostra como as furações da protoboard estão
interligadas. Na parte central, as furações são interligadas
verticalmente, mas são separadas horizontalmente. E é
justamente essa configuração que permite, com que liguemos
diversos tipos de Cis (Circuito Integrado), sem que seja fechado
um curto circuito no componente.
Já as laterais da protoboard, são usadas basicamente para
fornecer alimentação elétrica para os circuitos que iremos
montar, como você pode perceber, diferente da parte central, as
laterais
são
interligadas
horizontalmente,
e
separadas
verticalmente.
17
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Figura 1 – Protoboard.
A protoboard da imagem, é dividida em 6 regiões conforme
está marcada na figura 2:
Figura 2 – Região de ligações.
Cada região demarcada em vermelho está isolada das
demais, mas seguindo as regras de ligação que descritas acima.
Mais à frente, iremos construir circuitos usando a
protoboard, não se preocupe se esse conceito ainda está abstrato
pra você.
18
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
1.2 CONVERSANDO COM O ARDUINO
Se você me perguntar se é possível, “conversar com o
Arduino”, eu irei responder, “Sim! Não só é possível, como
fazemos isso o tempo todo”.
Nesse capitulo vamos estudar mais sobre a Serial, e como
essa função pode nos ajudar no desenvolvimento dos nossos
códigos.
A Serial é uma função nativa presente no Arduíno, que
permite fazer a comunicação entre o Arduíno e o computador,
ou outros dispositivos. De certa forma é um canal de
comunicação que temos disponível para enviar e receber dados.
Com a Serial é possível enviar informações do computador
para o Arduíno, e também fazer o caminho inverso.
A sintaxe de utilização é bem simples, basta inserir na
programação que queremos utilizar a Serial, com o comando
Serial.begin(); porem precisamos também indicar qual vai ser a
velocidade de comunicação, passando o parâmetro 9600, dentro
do Serial.begin(), ficando dessa maneira: Serial.begin(9600).
As coisas começaram a complicar? Parâmetro? Função?
Calma, estudaremos cada uma dessas áreas separadamente
quando for a hora. Por enquanto você precisa entender que para
usar a comunicação Serial, primeiro você precisa indicar ao
Arduino que você deseja isso, e também indicar qual vai ser a
velocidade da comunicação.
As velocidades de comunicação mais comuns de serem
utilizadas são, 9600 e 115200. Você também pode encontrar
referências a elas como baud rate.
19
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Supondo que desejamos que, ao ligar o Arduíno, ele nos
envie a mensagem “Hello World”, como iremos fazer isso?
Já sabemos que o Serial.begin(9600) tem que estar
presente. Mas para o Arduíno enviar uma mensagem para o
computador, é necessário a função Serial.print(“Mensagem”).
A função Serial.print, é capaz de enviar um texto do
Arduíno para o computador, e o texto precisa ser passado entre
aspas dentro dos parênteses. Vamos ao nosso primeiro exemplo:
EXEMPLO:
void setup() {
//configura a comunicação serial com baud rate de 9600
Serial.begin(9600);
//Comando para que o Arduíno envie a mensagem Hello World
Serial.print("Hello World");
}
void loop() {
}
Apareceram duas funções aqui, void setup() e void loop(),
que estudaremos no próximo capitulo.
Repare também que existe a seguinte linha no código:
//configura a comunicação serial com baud rate de 9600
Essa é uma linha de comentário, ou seja, ela é ignorada pelo
Arduíno, e serve mais para você se localizar no código que você
estiver escrevendo. Se você se sentir confortável, pode escrever
quantas linhas de comentários quiser, dentro do seu código,
desde que cada linha tenha // no começo.
20
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Você também pode indicar que deseja escrever várias
linhas de comentário usando /* Comentário aqui */, como
mostra o exemplo abaixo:
Exemplo:
void setup() {
/* Eu sou um comentário de várias linhas, e sirvo para
quando você precisa digitar um texto grande dentro do seu
código */
//configura a comunicação seria com baud rate de 9600
Serial.begin(9600);
//Comando para que o Arduíno envie a mensagem Hello World
Serial.print("Hello World");
}
void loop() {
}
Você pode testar esse código no seu Arduíno, ou pode
também testar online usando a plataforma TinkerCAD.
Eu
tenho um ebook exclusivo ensinando como usar essa
ferramenta, que você pode baixar gratuitamente clicando AQUI.
Mas, muita atenção, até o momento em que publico esse
ebook, não é possível utilizar bibliotecas dentro da plataforma, e
apesar de ser uma ferramenta incrível, a falta desse recurso fará
falta no seu aprendizado. Minha recomendação é que os
exemplos e exercícios, você faça online, mas os projetos montem
fisicamente.
Ao executar o código do exemplo, a saída que você deve
obter deve ser a seguinte:
21
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Figura 3 – Serial Monitor.
Porém o Serial.print() tem uma peculiaridade, ele sempre
exibe as informações na mesma linha, ou seja, se você colocar
mais um Serial.print(“Hello World”), seguido do que já existe, o
resultado deve ser algo parecido com “Hello WorldHello World”.
Para
resolver
esse
problema,
existe
a
função
Serial.println(), que executa o mesmo que a função Serial.print,
com a diferença de que depois de cada função, ele insere uma
quebra de linha, em outras palavras, ele “pula” uma linha.
Vejamos o exemplo abaixo:
Exemplo:
void setup()
{
Serial.begin(9600);
Serial.println("Hello World");
Serial.println("Hello World");
}
void loop()
{
}
Quando esse código é executado, você deve receber um
resultado igual ao da imagem abaixo:
22
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Figura 4 – “Hello World” através da Serial.
Problema resolvido. Já sabemos como fazer o Arduíno
enviar uma informação para o computador, e como fazer essa
informação pular uma linha após ser escrita.
Pronto Mateus, podemos ir pro próximo capitulo?
A resposta é: Ainda não. Tem mais uma coisa muito
importante que precisamos discutir aqui, sobre a Serial. Já
sabemos como enviar uma informação do Arduíno para o
computador, mas e enviar uma informação do computador para
o Arduíno?
Para fazer isso, temos que usar a função Serial.read().
Vamos ao exemplo:
EXEMPLO:
void setup() {
//configura a comunicação seria com baud rate de 9600
Serial.begin(9600);
}
void loop() {
if (Serial.available()) //verifica se tem dados diponível
para leitura
{
23
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Serial.write(Serial.read()); //reenvia para o
computador o dado recebido
}
}
Se você executar esse código, vai perceber que ele não exibe
nada na tela, porém se enviarmos um caractere através da Serial,
você irá perceber que o mesmo caractere aparece sendo
imprimido na tela. Então o que está acontecendo nesse código?
Nele, existem funções que estudaremos mais a frente,
como por exemplo o if(), mas o intuito no momento é entender
exatamente como utilizar a Serial. Quando você digita algo no
seu teclado e envia; os dados são recebidos pela função
Serial.read(), que está dentro da função Serial.write, cujo o
objetivo, nada mais é que devolver pro computador, o que ele
acabou de enviar.
Difícil? O importante é que você tente executar os
exemplos por conta própria, e verifique se os resultados que você
está obtendo, são os que eu estou descrevendo aqui. Vamos
continuar?
24
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 1
Desenvolver um código que exiba o seguinte texto:
OBS: O texto precisa ser exibido exatamente como está abaixo, e
com as mesmas quebras de linha. Para isso use os comandos
Serial.print() e Serial.println().
Internet das Coisas.
O Arduino tem um
trabalho
muito importante
no
desenvolvimento e
prototipagem
de
produtos IoT.
Desenvolvimento
rapido e eficiente, o
Arduino eh uma
ferramenta muito
poderosa.
Clique AQUI para ver a resolução do exercício.
25
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
1.3 VOID LOOP E VOID SETUP
Vamos aprender agora as duas principais funções nativas
que estão presentes na programação do Arduíno, e que você
também vai encontrar em qualquer outro dispositivo que utilize
o framework do Arduíno.
Imagine um avião prestes a levantar voo, para não ter
perigo de ocorrer algum problema no ar, o piloto se encarrega de
fazer várias verificações antes de partir. “Combustível, OK”,
“Pressão, OK”, “Preparando para decolar voo”. É exatamente essa
a função do void setup(), ele é responsável por preparar o
Arduíno para a execução do programa, fazendo verificações e
instanciando dados.
Tudo o que precisamos que o Arduíno execute uma vez
antes de iniciar o seu ciclo, deve ficar dentro do void setup. Por
isso quando instanciamos a Serial, o código estava presente
dentro do setup e não do loop.
Tá, se o setup é a preparação, pra que serve o loop então?
O void loop é a função que irá ser repetida enquanto o
Arduíno permanecer ligado. Se por um acaso tivéssemos
colocado Serial.println(“Hello World”) dentro do void loop(),
veríamos a mensagem “Hello World” ser mostrada infinitas
vezes na tela, enquanto o código permanecesse em execução.
Resumindo, o programa que você vai efetivamente
escrever, deve ficar dentro do void loop() pois este se repete
infinitamente enquanto o dispositivo permanecer ligado.
26
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
1.4 ARMAZENANDO INFORMAÇÕES COM
VARIÁVEIS
Chegamos ao momento mais importante do nosso
capitulo, o que iremos aprender aqui vai ser usado em cerca de
99% de todos os códigos daqui pra frente.
O Arduíno possui integrado, várias memórias que são
capazes de armazenar informação. Uma variável nada mais é do
que uma ordem para o Arduíno usar um pedacinho das
memórias que ele tem disponível, pra armazenar alguma
informação que desejamos.
Mas o melhor de tudo é que, as variáveis permitem
alteração nos valores que estão dentro delas, durante a execução
do código. Nas linguagens C/C++ existem diversos tipos de
variáveis disponíveis para a utilização, veja algumas delas:
• int – Armazena um número inteiro. Ex: 256
• float – Armazena um número com casas decimais. Ex:
5.25
• long – Armazena um número muito grande. Ex:
196819819
• char – Armazena um caractere. Ex: ‘c’
• String – Armazena um texto. Ex: “Hello World”
• bool – Armazena um booleano. Ex: true
Podemos atribuir um valor pra uma variável dentro do
programa, usando o sinal de igualdade (=).
27
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SINTAXE:
Tipo Nome = valor
EXEMPLO:
/*
boolean: valor verdadeiro (true) ou falso (false)
char: um caractere
byte: um byte, ou sequência de 8 bits
int: número inteiro de 16 bits com sinal (-32768 a 32767)
unsigned int: número inteiro de 16 bits sem sinal (0 a
65535)
long: número inteiro de 16 bits com sinal (-2147483648 a
2147483647)
unsigned long: número inteiro de 16 bits sem sinal (0 a
4294967295)
float: número real de precisão simples (ponto flutuante)
double: número real de precisão dupla (ponto flutuante)
String: sequência de caracteres
void: tipo vazio (não tem tipo)
*/
int numero = 15;
float numero_virgula = 15.5;
long numero_grande = 15684651841;
char caractere = 'c';
String texto = "Hello World";
bool teste = false;
void setup()
{
}
void loop()
{
}
Conforme eu disse acima, o valor de uma variável pode
mudar ao longo da execução de um programa, basta atribuir o
novo valor com o sinal de igual, como mostra o exemplo abaixo:
28
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXEMPLO:
//O número 15 está armazenado dentro da variável numero
int num = 15;
void setup()
{
/*A partir desse momento a variável número passa a ter
o valor 625*/
num = 625;
}
void loop()
{
}
Também é possível usar a Serial para nos mostrar qual o
valor que está armazenado dentro de uma variável. Veja o
exemplo:
EXEMPLO:
int num = 15;
float num_virgula = 15.5;
long num_grande = 15684651841;
char caractere = 'c';
String texto = "Hello World";
bool teste = false;
void setup()
{
Serial.begin(9600);
Serial.print("Numero inteiro: ");
Serial.println(num);
Serial.print("Numero com casas decimais: ");
Serial.println(num_virgula);
Serial.print("Numero muito grande: ");
Serial.println(num_grande);
Serial.print("Caractere: ");
Serial.println(caractere);
29
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Serial.print("Texto: ");
Serial.println(texto);
Serial.print("booleano: ");
Serial.println(teste);
}
void loop()
{
}
O resultado desse código é mostrado na Figura 5:
Figura 5 – Variáveis sendo imprimidas na Serial.
OBS: Se você tentar exibir um texto com acento, ou com “ç”,
pode ser que o Arduíno não entenda e exiba alguns caracteres
sem sentido no lugar.
OBS: O valor booleano false, é equivalente a 0, assim como
o valor true é equivalente a 1.
CONTEXTO DE VARIÁVEIS
Legal, sabendo os tipos de variáveis, precisamos entender
sobre os contextos de variáveis. Dependendo da onde a variável
é declarada, pode interferir como ela será acessada durante o
programa.
30
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Basicamente podemos categorizar as variáveis em 2 tipos,
sendo elas as variáveis locais e as variáveis globais.
De maneira simples, podemos entender que as variáveis,
globais podem ser acessadas de qualquer lugar do código,
independente se estão dentro das funções nativas do Arduíno,
ou em funções criadas. Dessa maneira você pode entender, quer
quando uma variável global é criada, o valor que está
armazenado dentro dela pode ser acessado de qualquer lugar.
“Variáveis globais podem ser acessadas de qualquer lugar do
programa”
EXEMPLO:
String text = "Hello World";
void setup() {
Serial.begin(9600); // inicia a Serial
Serial.println(text); // referenciando a variável global
text
}
void loop() {
Serial.println(text); // referenciando a variável global
text
delay(5000);
}
Como complemento, as variáveis locais podem ser
acessadas apenas dentro do “contexto” em que elas foram
criadas. Dessa maneira você pode criar várias variáveis locais
com o mesmo nome, desde que estejam em contextos diferentes,
isso porque elas não têm relação uma com a outra.
“Variáveis locais existem apenas dentro do contexto em que
foram criadas”
31
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXEMPLO:
void setup() {
String text = "Eu so existo dentro do setup";
Serial.begin(9600); // inicia a Serial
Serial.println(text); // referenciando a variável global
text
}
void loop() {
String text = "Eu so existo dentro do loop";
Serial.println(text); // referenciando a variável global
text
delay(5000);
}
#DEFINE E CONSTANTES
Em alguns momentos, pode ser que precisemos usar
algumas variáveis para armazenar dados estáticos. Isso pode
parecer ambíguo, “armazenar um dado estático em uma
variável”, mas deixe-me te explicar o motivo pelo qual isso é
importante.
Nesse momento você já deve entender um pouco mais
sobre a estrutura do Arduíno, e do programa.
Sabendo disso, como vimos um pouco antes, podemos
definir variáveis para armazenar valores, e que esses valores
inclusive podem ser alterados conforme o fluxo do programa.
Más além disso, podemos guardar outros tipos de informações
dentro das variáveis, como por exemplo dados de pinagens.
Como assim guardar pinagens? Digamos que você queira
acender uma lâmpada usando o Arduino, em algum momento
você vai precisar dizer na programação que você deseja usar uma
32
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
porta, e que ela deva trabalhar como uma saída (calma, mais a
frente vamos estudar isso a fundo). Nesse “dizer ao Arduíno que
desejamos usar uma porta” nada mais é do que uma referência
numérica, ao pino em que será feito o acionamento.
O
Arduíno
tem
diversas
portas
que
podem
ser
manipuladas, e cada porta possui uma identificação, ou
numeração.
Ao fazermos um acionamento, podemos referenciar essa
identificação, todas as vezes que a utilizarmos. Ou melhor ainda,
podemos criar uma variável que armazena essa referência.
Para que um código seja enviado para dentro do
microcontrolador, primeiro ele precisa ser verificado por uma
espécie de “robô”, chamado de compilador. O compilador faz a
verificação do código, para saber se está tudo em ordem, e que
esse algoritmo pode ser enviado para dentro do dispositivo sem
causar problemas. (Possivelmente você vai conhecer o
compilador logo, pois é ele quem dá os avisos de erro no código).
Agora entramos na questão chave, o Arduínos possui
memorias, e isso já sabemos, porem essas memórias são
limitadas, e devemos usar de maneira inteligente.
Se você optar por usar a numeração do pino em todos os
lugares, você vai estar ocupando espaços de memória de
maneira desnecessária. E é aí que entram as variáveis.
Usando as variáveis para armazenas esses dados, o
compilador entende que não precisa repetir a mesma
informação várias e várias vezes durante o código, então ele
armazena essa informação apenas uma vez, e a partir disso usa
apenas referências a esse espaço de memória.
Usando o #define é uma mensagem clara ao compilador, de
que esse valor que está armazenado, não precisa ser repetido.
33
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SINTAXE:
#define pin 10 //cria uma referência ao pino 10 chamada
pin
O mesmo vale para a utilização do const, o compilador
entende que essa é uma variável de referência, e que esse valor
não vai mudar ao longo do código.
SINTAXE:
const int pin = 8 //cria uma variável constante que
armazena o número do pino 8,
Portanto, quando são usadas as referências #define, ou
const, você está dizendo claramente ao compilador: “Estou
armazenando algo que não vai mudar ao longo do código”.
Vale deixar uma coisa bem clara, você não pode fazer
alterações nessas variáveis ao longo do programa, isso por que
quando seu código foi enviado ao microcontrolador, ele entende
que esse tipo de variável só pode ser lida em outras partes do
programa, e não pode ser modificada.
34
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 2
Construa um algoritmo que receba incialmente os
seguintes valores para as variáveis:
• dolar = 5.23;
• nome = “Harv”;
• alarme = false;
Faça com que essas variáveis sejam printadas na serial com a
seguintes Strings:
• “Cotação do Dolar e: “
• “Meu nome e: “
• “O status do alarme e: “
Após exibir essas 3 variáveis em tela, substitua ainda
dentro do mesmo código, a variável dolar para a cotação atual do
dolar no dia que você estiver executando, a variável nome para
seu nome, e a variável alarme para true.
Clique AQUI para ter acesso ao exercício resolvido.
35
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
1.5 OPERADORES ARITMÉTICOS –
FAZENDO CÁCULOS DURANTE A
PROGRAMAÇÃO
Se estamos construindo uma aplicação, é por que ela tem
uma finalidade, e na maioria das vezes precisamos executar
alguns cálculos matemáticos dentro da aplicação, e para isso
existem os operadores aritméticos. Nesse capitulo vamos
desmembrar um por um dos operadores disponíveis na
programação. Vamos lá:
ATRIBUIÇÃO (=)
Já vimos nos exemplos acima, que nas linguagens de
programação, o operador de atribuição é o sinal de igualdade (=),
e sua principal função é atribuir um valor para uma variável.
EXEMPLO:
int i = 25;
int j = 0;
void setup() {}
void loop()
{
}
36
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
ADIÇÃO (+)
O operador de adição, ou soma, é o mesmo usado na
matemática, o sinal de “mais” (+), e sua função é atribuir uma
soma de dois valores.
SINTAXE:
soma = operando1 + operando2;
EXEMPLO:
int i = 3;
int j = 2;
int k = 0;
void setup()
{
k = j + i;
Serial.begin(9600);
Serial.print("Valor de i: ");
Serial.println(i);
Serial.print("Valor de j: ");
Serial.println(j);
Serial.print("Valor de k: ");
Serial.println(k);
}
void loop()
{
}
Também existe uma abreviação de soma que pode ser
utilizada, que é (+=), esse tipo de abreviação significa que a
variável vai receber o valor dela mesma mais alguma coisa.
37
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Por exemplo, se uma variável x vale 50, e você deseja somar
12 a esse valor, você não pode fazer a atribuição direta como:
x = 12
Pois dessa maneira o Arduino vai entender que é para
remover o 50 e substituir por 12. Um meio de fazer isso é usando
a sintaxe:
SINTAXE:
x = x + 12; // dessa maneira o x irá receber o valor de x que
é 50 mais o 12.
Ou você pode usar a abreviação desse modo que é (+=)
SINTAXE:
x += 12; // surte o mesmo efeito do exemplo acima.
EXEMPLO:
int s = 600;
void setup() {
Serial.begin(9600); // inicia a Serial
s = s + 10; // soma 10 unidades a s
Serial.println(s); //imprime o valor de s
s = 600; // atribui novamente 600 unidades a s
s += 10; //maneira abreviada de somar 10 unidades a s
Serial.println(s);
}
void loop() {
}
38
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SUBTRAÇÃO (-)
Também sendo o mesmo símbolo usado na matemática , o
operador de subtração (-) tem sua função de subtrair um valor
do outro.
SINTAXE:
diferenca = operando1 – operando2;
EXEMPLO:
int i = 3;
int j = 2;
int k = 0;
void setup()
{
k = j - i;
Serial.begin(9600);
Serial.print("Valor de i: ");
Serial.println(i);
Serial.print("Valor de j: ");
Serial.println(j);
Serial.print("Valor de k: ");
Serial.println(k);
}
void loop()
{
}
Da mesma maneira que a soma, caso você precise subtrair
um valor da variável, sem apagar o valor antigo você pode usar
a sintaxe:
39
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SINTAXE:
x = x – 12; // irá subtrair o valor 12 da variável x, sem
apagar o valor anterior
E também possui a abreviação:
SINTAXE:
x -= 12; // surte o mesmo efeito do exemplo anterior
EXEMPLO:
int s = 600;
void setup() {
Serial.begin(9600); // inicia a Serial
s = s - 10; // subtrai 10 unidades a s
Serial.println(s); //imprime o valor de s
s = 600; // atribui novamente 600 unidades em s
s -= 10; //maneira abreviada de subtrair 10 unidades a s
Serial.println(s);
}
void loop() {
}
MULTIPLICAÇÃO (*)
Na programação C/C++ o operador de multiplicação
utilizado é o símbolo de asterisco (*), e sua função é multiplicar
um valor sobre o outro:
40
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SINTAXE:
multiplicacao = operando1 * operando2;
EXEMPLO:
int i = 3;
int j = 2;
int k = 0;
void setup()
{
k = j * i;
Serial.begin(9600);
Serial.print("Valor de i: ");
Serial.println(i);
Serial.print("Valor de j: ");
Serial.println(j);
Serial.print("Valor de k: ");
Serial.println(k);
}
void loop()
{
}
De mesmo modo, a multiplicação também possui a
propriedade de construir uma multiplicação composta.
SINTAXE:
x = x *50 // irá multiplicar o valor de x por 50 e atribuir
novamente a x
No modo abreviado fica:
41
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SINTAXE:
x *= 50 // surte o mesmo efeito do exemplo anterior
EXEMPLO:
int s = 250;
void setup() {
Serial.begin(9600); // inicia a Serial
s = s * 10; // multiplica 10 unidades em s
Serial.println(s); //imprime o valor de s
s = 250; // atribui novamente 250 unidades em s
s *= 10; //maneira abreviada de multiplicar 10 unidades
em s
Serial.println(s);
}
void loop() {
}
DIVISÃO (/)
O símbolo do operador de divisão usado na linguagem é a
barra (/), e sua função é dividir um valor pelo outro.
SINTAXE:
div = operando1 / operando2;
EXEMPLO:
int i = 2;
int j = 4;
int k = 0;
42
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
void setup()
{
k = j / i;
Serial.begin(9600);
Serial.print("Valor de i: ");
Serial.println(i);
Serial.print("Valor de j: ");
Serial.println(j);
Serial.print("Valor de k: ");
Serial.println(k);
}
void loop()
{
}
Assim como os 3 casos anteriores, é possível fazer a divisão
de uma variável por ela mesma sem apagar o dado anterior
armazenado.
SINTAXE:
x = x/10; // divide o valor de x por 10 e atribui novamente
a x o novo valor
De modo abreviado
SINTAXE:
x /= 10; //surte o mesmo efeito do exemplo anterior
EXEMPLO:
int s = 250;
void setup() {
43
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Serial.begin(9600); // inicia a Serial
s = s / 10; // divide 10 unidades em s
Serial.println(s); //imprime o valor de s
s = 250; //atribui novamente 250 a variável s
s /= 10; //maneira abreviada de dividir 10 unidades em s
Serial.println(s);
}
void loop() {
}
RESTO (%)
E por último existe o operador de resto, representado pelo
sinal de porcentagem (%), esse operador permite saber se existe
resto em uma divisão de um inteiro pelo outro. Esse operador
também pode ser chamado de módulo, apesar do nome, não
confunda com o módulo da matemática (|x|), que na linguagem
do Arduíno é calculado por abs().
SINTAXE:
resto = dividendo % divisor;
int x = 0;
x = 7 % 5; // x agora contém 2
x = 9 % 5; // x agora contém 4
x = 5 % 5; // x agora contém 0
44
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SOMA UNITÁRIA (++)
A soma unitária é muito usada dentro laços de repetição
conforme vamos ver nos capítulos seguintes, mas sua função é
acrescentar 1 unidade a mais na variável.
SINTAXE:
i++;// adiciona 1 unidade a variável i
é equivalente a:
i = i + 1;
ou
i += 1;
EXEMPLO:
int i = 0;
void setup() {
Serial.begin(9600); // inicia a Serial
}
void loop() {
Serial.println(i);
i++; // adiciona 1 unidade a i cada vez que o loop é
executado
delay(5000);
}
45
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SUBTRAÇÃO UNITÁRIA (--)
A subtração unitária tem o mesmo propósito da soma, e
pode ser usada para fazer a subtração de 1 unidade em uma
variável:
SINTAXE:
i--; //subtrai uma unidade no valor de i
é o equivalente a:
i = i - 1;
ou
i -= 1;
EXEMPLO:
int i = 500;
void setup() {
Serial.begin(9600); // inicia a Serial
}
void loop() {
Serial.println(i);
i--; // subtrai 1 unidade a i cada vez que o loop é
delay(5000);
}
46
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
CAPITULO 2
2.1 OPERADORES LÓGICOS E DE
COMPARAÇÃO
As linguagens C/C++ permitem utilizar operadores lógicos
e de comparação dentro dos algoritmos, nesse capitulo vamos
estudar mais a fundo cada um deles e qual a sua utilização.
Já vimos acima que dentro da lógica de programação, o
sinal de igualdade (=) não é utilizado para equivaler dois valores,
e sim com o intuito de atribuição, mas então qual é o a
simbologia usada para a igualdade?
Dentro dos algoritmos o sentido de igualdade é dado pela
utilização de dois sinais de iguais (==), conforme vamos estudar
abaixo:
(==) IGUAL A:
Faz a comparação da variável da esquerda com a variável a
direita do operador, e também retorna o valor verdadeiro (true)
quando as duas são iguais.
SINTAXE:
x == y //retorna true se os valores forem iguais, e false se
forem diferentes.
47
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
(>) MAIOR QUE
Compara se o valor da variável esquerda do operador é
maior que o valor da variável direita do operador, quando o valor
da esquerda for maior que o valor da direita, ele retorna
verdadeiro (true).
SINTAXE:
x > y //retorna true se x for maior que y, e false se x for
menor ou igual a y.
(<) MENOR QUE
Esse operador faz o inverso do que o operador de MAIOR
QUE, ele compara se o valor da variável que está à esquerda do
operador é menor do que o valor da variável direita do operador.
SINTAXE:
x < y// retorna verdadeiro se x for menor que y e false se x
for maior ou igual a y
(<=) MENOR IGUAL
O operador menor que retorna um valor true, quando a
variável da esquerda menor do que a variável da direita, porém
ele retorna false se as duas forem iguais, o operador MENOR
IGUAL veio para resolver esse problema, caso na sua lógica você
48
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
precise comparar se a variável x é menor, ou igual a variável y,
esse operador vai retornar o valor true:
SINTAXE:
x <= y //retorna true caso x seja menor ou igual ao valor de
y
(>=) MAIOR IGUAL:
Assim como o operador MENOR IGUAL, o operador MAIOR
IGUAL é inclusivo no valor a ser comparado, portanto ele
retorna true também, se o valor da variável que está à esquerda
do operador for maior, ou igual, o valor que está na variável a
direita.
SINTAXE:
x >= y //retorna true caso o valor de x seja maior, ou igual
ao valor armazenado dentro de y.
(!=) DIFERENTE
Assim como existe o comparador de igualdade (==), existe
também o comparador de diferente.
Esse operador é utilizado para quando você quiser
comparar dois valores ou variáveis, e dizer se eles são diferentes.
49
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SINTAXE:
x != y //retorna true caso o valor de x seja diferente que o
valor de y
Meio complexo? Não se preocupe, estamos perto de ter
todas as ferramentas necessárias, para você começar a construir
seus próprios códigos, no próximo capítulo vamos estudar a
lógica If Else, e você irá entender melhor como são utilizados os
operadores.
50
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.2 SE (EU ESTUDAR O ARDUHACK) {VOU
FAZER PROJETOS CADA VEZ MELHORES}
Achou estranho o título desse capítulo? Se você entendeu a
ideia do título, você já aprendeu também o laço condicional if().
Se você não entendeu ainda, vamos a explicação:
Diariamente
em
nossas
vidas
usamos
esse
laço
condicional, deixa eu te dar alguns exemplos: Se estiver dia,
apague as luzes, ou, se começar a chover, feche as janelas; ainda
se o celular estiver sem bateria, coloque-o carregar. Na
programação, conseguimos fazer exatamente a mesma coisa
usando o laço condicional if(). Isso serve para quando desejamos
fazer alguma verificação, antes de executar um algoritmo.
Se o botão for pressionado, acenda o LED.
Se estiver escuro, ligue a lâmpada.
Se x for menor que 50, aumente a velocidade da máquina.
E sim, essa é a última etapa para começarmos a colocar
nossas ideias em prática. Então vamos aos estudos.
Todas as lógicas que estudamos acima, os operadores
lógicos e de comparação podem ser usados dentro do laço if().
SINTAXE:
if(verificação) {
//Aqui dentro fica o que deve ser feito caso a verificação
seja verdadeira
}
51
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXEMPLO:
/* Deixamos armazenado qual é o pino do LED, dentro da
variável pinoLED */
int pinoLED = 13;
int x = 130;
void setup()
{
// Definimos o pinoLED como um pino de saída
pinMode(pinoLED, OUTPUT);
/* Se x for maior que 120 então a lógica MAIOR QUE, irá
retornar verdadeiro e executar o que está dentro do IF */
if (x > 120) {
// Se x for maior que 120 o pinoLED é acionado.
digitalWrite(pinoLED, HIGH);
}
}
void loop()
{
}
Perceba que no exemplo acima, dentro da verificação do if()
eu usei o operador de comparação (MAIOR QUE), lembre-se que
esse operador retorna verdadeiro (true) quando...?
Isso mesmo, quando a variável da esquerda do operador for
maior que a variável da direita. Portanto, no exemplo acima
como x possui o valor de 130 armazenado. 130 é maior que 120,
então o código que está dentro do if() vai ser executado.
Se x (possui o valor 130 armazenado) for maior que 120,
então o Arduíno irá acionar o pinoLED, com o comando
digitalWrite(). Esse comando estudaremos no próximo capitulo,
onde iremos fazer nossos primeiros acionamentos com o
Arduino. Mas o importante agora é você entender como o if()
funciona, para que possamos usar nas nossas próximas lógicas.
Então vamos ver mais alguns exemplos:
52
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXEMPLO:
int x = 45;
int y = 92;
void setup()
{
Serial.begin(9600);
if (x <= y) {// testa se x é menor que ou igual a y
/* Se x for menor ou igual a y a seguinte mensagem será
exibida na Serial: */
Serial.println("x eh menor ou igual a y");
}
}
void loop()
{
}
O laço if() também pode ser usado em sequência, imagine
que você esteja lendo um nível de uma caixa d’agua, e você deseja
saber quando o nível dela está: abaixo de 50% ou acima de 50%.
Você poderia usar a seguinte lógica:
EXEMPLO:
int caixadagua = 48;
void setup()
{
Serial.begin(9600);
if (caixadagua <= 50) {// testa se a caixa está com menos
de 50% ou igual a 50%
// Se a variável caixadagua estiver com menos de 50
exibe na tela a mensagem "A caixa está abaixo de 50%"
Serial.println("A caixa está abaixo de 50%");
}
if (caixadagua > 50) {// testa se a caixa está com mais
de 50%
// Se for maior exibe na tela a mensagem "A caixa está
com mais de 50%"
Serial.println("A caixa está com mais de 50%");
}
53
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
}
void loop()
{
}
54
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 3:
Desenvolver um algoritmo que verifique uma variável com
o laço if(). O código deve possuir os seguintes requisitos:
• Deve conter uma variável chamada luminosidade do
tipo int
• Deve conter uma variável chamada status do tipo
bool
• Deve verificar
com o
laço
if
se a
variável
luminosidade é maior que 500, caso seja, deve fazer a
variável status receber false, e exibir a seguinte
mensagem na Serial: “A luz estah desligada”
• Deve verificar se a variável luminosidade é menor ou
igual a 200, caso seja verdadeiro, deve fazer a variável
status receber true, e exibir a seguinte mensagem na
Serial: “A luz estah ligada”.
• OBS: Lembre-se de não utilizar acentos ou caracteres
especiais nas mensagens da serial, pois ela pode não
entender,
Clique AQUI para ter acesso ao exercício resolvido.
55
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
O laço if é uma ferramenta fundamental para o
desenvolvimento de códigos eficazes, e além disso ela traz
consigo um complemento, que é a função else. E pra que ela
serve?
A função else nada mais é do que o “SENÃO” da vida real.
Vamos voltar aos exemplos:
• Se estiver escuro, ligue a lâmpada, senão deixe-a
desligada
• Se começar a chover feche as janelas, senão as deixe
abertas
• Se o botão for pressionado acenda o LED, senão deixe
ele desligado
O else é muito útil quando desejamos testar algo, e caso esse
teste não seja verdadeiro, o algoritmo execute alguma outra
coisa, vejamos um exemplo:
SINTAXE:
if (luminosidade < 500) {
Serial.println(“Luz acesa”);
}
else {
Serial.println(“Luz apagada”);
}
EXEMPLO:
int caixadagua = 48;
void setup()
{
56
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Serial.begin(9600);
if (caixadagua <= 50) {// testa se a caixa está com menos
de 50% ou igual a 50%
/* Se a variável caixadagua estiver com menos de 50
exibe na tela a mensagem "A caixa está abaixo de 50%"*/
Serial.println("A caixa está abaixo de 50%");
}
else {/*Senão é printado na Serial a mensagem “A caixa
está acima de 50%” */
Serial.println("A caixa está acima de 50%");
}
}
void loop()
{
}
57
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 4
Desenvolva o projeto anterior, trocando a verificação de
luminosidade <=200 pela função else.
• Deve conter uma variável chamada luminosidade do
tipo int
• Deve conter uma variável chamada status do tipo
bool
• Deve verificar
com o
laço
if se a
variável
luminosidade é maior que 500, caso seja, deve fazer a
variável status receber false, e exibir a seguinte
mensagem na Serial: “A luz estah desligada”
• Deve verificar se a variável luminosidade é menor ou
igual a 200, caso seja verdadeiro, deve fazer a variável
status receber true, e exibir a seguinte mensagem na
Serial: “A luz estah ligada”.
• OBS: Lembre-se de não utilizar acentos ou caracteres
especiais nas mensagens da serial, pois ela pode não
entender,
Clique AQUI para ter acesso ao exercício resolvido.
58
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
(!) NOT
O operador lógico NOT, vem da lógica booleana, e serve
para invertermos o valor de uma lógica. Por exemplo: Se x
armazena um valor true, logo !x irá retornar um valor false, e o
mesmo vale para: se x armazena um valor false, então !x irá
retornar um valor verdadeiro.
O operador NOT, também pode ser usado em verificações
compostas como mostra abaixo:
SINTAXE:
!(x < y) // Se x for menor que y então o retorno será true,
porém acrescentando a lógica NOT à frente, esse valor é
invertido, se tornando false.
(&) AND
O operador AND é usado para comparar valores booleanos,
ele retorna true apenas quando dos os valores analisados forem
verdadeiros, e false nas demais possibilidades. Vamos aos
exemplos:
(true & true) //retorna true.
(true & false) //retorna false.
(false & true) // retorna false.
(false & false) // retorna false.
Ficou abstrato esse conceito? Vejamos um exemplo com if()
59
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
if((x < 20) & (y > 500)){} // Nesse caso o if() só será
executado quando x for MENOR QUE 20 e o y também for MAIOR
QUE 500. Em qualquer outra possibilidade ele não será
executado.
Também é possível fazer quantas comparações forem
necessárias, desde que seja atribuído o & em cada uma delas:
if((x < 20) & (y > 500) & (z == 0)){
}
(|) OR
Com o operador OR, quando qualquer verificação for
verdadeira, ele retorna verdadeiro, veja o exemplo:
(true | false) // retorna true
(false | true) // retorna true
(true | true) // retorna true
(false | false) // retorna false
Usando a lógica if():
If(x< 20 | y > 500 | z == 0) //Nesse caso se qualquer uma
das comparações for verdadeira, o if() será executado:
Se x for MENOR QUE 20, não importa se o y for menor que
500 ou o z diferente de 0, o if() será executado.
60
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.3 SAÍDAS DIGITAIS:
Ufa, bastante coisa certo? Mas há chegado a hora. Sim!
vamos começar a estudar as portas do Arduíno, e nesse capitulo
vamos criar os primeiros acionamentos.
Para podermos dar início, existem alguns conceitos que
você precisa ter em mente. Vou explica-los agora!
As portas do Arduíno, e também da grande maioria dos
microcontroladores, podem trabalhar tanto como entradas, e
também como saídas. Só depende exclusivamente da maneira
como você configura cada uma. A mesma porta pode trabalhar
como uma entrada, se configurada como INPUT, ou pode
trabalhar como uma saída caso configurada como OUTPUT.
O comando usado para fazer essa seleção dentro do
Arduíno é o pinMode, e sua utilização é bem simples, veja a
sintaxe abaixo:
SINTAXE:
pinMode(pino, tipo) // Pino deve conter a numeração ou
variável com o número do pino, e o tipo pode ser INPUT e
OUTPUT
pinMode(13, INPUT) // pino 13 definido como entrada
pinMode(13, OUTPUT) //pino 13 definido como saída
Dentro desse capitulo vamos estudar mais afundo como
funcionam as saídas, e no próximo capitulo vamos estudar as
entradas.
61
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Vale
deixar
claro,
que
existem
outros
tipos
de
configurações de portas, mas nesse momento, você precisa
apenas entender bem a fundo essas 2 maneiras.
Quando um pino é definido como saída, isso significa que
ele irá emitir um sinal de acionamento, ou seja, que ele irá passar
para o valor true, quando falamos de lógica. Ou se falarmos de
circuitos elétricos, significa que dentro do Arduíno, o pino
passará de 0v para 5v
Com isso, podemos acionar um LED, acionar um relé, uma
sirene, ou qualquer outra coisa que dependa de um acionamento
digital.
Gosto muito de uma frase que diz o seguinte:
“Se você consegue controlar um LED, você consegue
controlar qualquer coisa”
Essa frase é muito verdadeira, pois o mesmo acionamento
que é utilizado para acender um LED, pode ser utilizado para
executar uma infinidade de outras coisas.
Vamos aos exemplos:
Depois de selecionar o pino para OUTPUT, o comando
utilizado para fazer o acionamento de uma porta é o
digitalWrite(). Sendo que esse deve ter como parâmetro o pino
do acionamento e o valor que esse pino deve assumir, sendo a
escolha entre: LOW que indica que o pino está desligado, e HIGH
que indica que o pino está ligado. Vejamos a sintaxe:
62
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
SINTAXE:
digitalWrite(13, LOW) // pino 13 desligado
digitalWrite(13, HIGH) //pino 13 ligado
No exemplo abaixo, eu mostro como pode ser utilizado o
acionamento das saídas,
EXEMPLO:
void setup()
{
pinMode(4, OUTPUT);
}
void loop()
{
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(4, LOW);
delay(1000);
}
// Liga o LED
// Aguarda 1 segundo
// Desliga o LED
// Aguarda 1 segundo
Vamos colocar isso em prática, e se prepare pois esse será o
seu primeiro projeto.
Conforme combinamos no começo desse livro, durante o
seu caminho de aprendizado, haverá diversos projetos para
serem montados. Eu recomendo fortemente que você construa
esses projetos fisicamente, usando o Arduíno e os componentes
eletrônicos, porém, também é verdade que alguns deles podem
ser construídos usando simuladores online.
Todos os projetos tem a sua descrição, lista de
componentes, diagramas, e também o código fonte.
63
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#1 - Blink com LED
Nesse projeto vamos fazer um LED piscar com o Arduíno,
onde podemos controlar a velocidade com que o LED pisca.
Componentes:
•
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - LED 5mm
1 - 220 Ω Resistor
Jumpers
Diagrama:
64
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
/* #1 – Blink com LED */
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
//
//
//
//
Liga o LED
Aguarda 1 segundo
Desliga o LED
Aguarda 1 segundo
/* Experimente mudar o tempo dentro do delay para ver a
velocidade em que o LED pisca mudar*/
65
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 5
Construa novamente o Projeto#1.
Dessa vez, armazenando o número do pino utilizado em
uma variável. Após isso utilize a variável como referência de
acionamento HIGH e LOW.
Veja o exemplo:
• int pinoLED = 13;
• pinMode(pinoLED, OUTPUT);
• digitalWrite(pinoLED, HIGH);
Clique AQUI para ter acesso ao exercício resolvido.
66
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.4 ENTRADAS DIGITAIS
Assim como eu expliquei no capítulo anterior, um pino
pode se comportar como saída, ou como entrada digital. Tudo
depende da maneira como você o configura usando o pinMode().
Uma entrada digital, tem o intuito de ler um sinal vindo de
um periférico externo; por exemplo: Imagine que você deseja
acionar uma lâmpada (saída digital), toda vez que escurecer.
Para saber quando escureceu, você pode usar um sensor digital,
e interliga-o no Arduíno. Então toda vez que o sensor enviar um
sinal digital para o Arduino, ele irá acionar a saída digital da
lâmpada.
Para lermos esse sinal vindo do sensor de luminosidade,
precisamos determinar um pino do Arduíno como uma INPUT,
dentro do pinMode.
Para se ler um sinal digital com um pino configurado como
entrada, basta usar o comando digitalRead(pino).
SINTAXE:
digitalRead(pino) // Onde pino, é a variável que contém o
número do pino, ou o número em si.
67
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#2 – Controlando um LED com um
botão:
Usando um Pushbutton para controlar o acionamento de
um LED.
O LED está conectado ao pino digital 13 do Arduíno e
acende quando o Pushbutton conectado ao pino 2 é pressionado.
* Nota: A maioria dos Arduínos já possui um LED integrado que
acende com o acionamento do pino 13.
Componentes:
•
•
•
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - LED 5mm
1 - 220 Ω Resistor
1 - 10K Ω Resistor
1 - Pushbutton
Jumpers
Diagrama:
68
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
/* Constantes não mudam. Elas são usadas para setar os
números dos pinos*/
const int buttonPin = 2; // Pino do Pushbutton
const int ledPin = 13; // Pino do LED
// Variáveis que vão mudar:
int buttonState = 0; // Status do Pushbutton
void setup() {
// Inicializa o pino do LED como SAÍDA:
pinMode(ledPin, OUTPUT);
// Inicializa o pino do Pushbutton como ENTRADA:
pinMode(buttonPin, INPUT);
}
void loop() {
// Lê o status do Pushbutton
buttonState = digitalRead(buttonPin);
// Checa se o Pushbutton foi pressionado
// Se pressionado a variável buttonState muda para HIGH:
if (buttonState == HIGH) {
// Liga o LED:
digitalWrite(ledPin, HIGH);
} else {
// Desliga o LED:
digitalWrite(ledPin, LOW);
}
}
69
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 6
Execute novamente o Projeto#2.
Dessa vez, invertendo a lógica, fazendo com que o LED
fique aceso quando o botão está livre, e apague quando o botão
for pressionado.
OBS: Você precisa mudar a comparação dentro do laço if()
Clique AQUI para ter acesso ao exercício resolvido.
70
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.5 SWITCH-CASE
Imagine que você está desenvolvendo seus projetos, e se
depara com a seguinte situação: Você precisa fazer 10
verificações em uma variável, para fazer diversos acionamentos
dependendo do valor dela. Você vai usar 10 laços if() para fazer
essas verificações?
Pode ser que sim! Más, não é a melhor alternativa, pois
existe uma função chamada Switch-Case, que, assim como o if(),
controla o fluxo do programa, permitindo ao programador
especificar diversos códigos para serem executados em diversas
condições.
SINTAXE:
switch (variável) {
case valor1:
//executa um comando
break;
case valor2:
//executa outro comando
break;
case valor3:
//executa outro comando
break
}
71
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXEMPLO:
int
int
int
int
Led1
Led2
Led3
Led4
=
=
=
=
7;
8;
9;
10;
void setup() {
Serial.begin(9600);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
pinMode(Led4, OUTPUT);
}
void loop() {
if (Serial.available()) {
char Led = Serial.read();
switch (Led) {
case '1':
digitalWrite(Led1, HIGH);
digitalWrite(Led2, LOW);
digitalWrite(Led3, LOW);
digitalWrite(Led4, LOW);
break;
case '2':
digitalWrite(Led1, LOW);
digitalWrite(Led2, HIGH);
digitalWrite(Led3, LOW);
digitalWrite(Led4, LOW);
break;
case '3':
digitalWrite(Led1, LOW);
digitalWrite(Led2, LOW);
digitalWrite(Led3, HIGH);
digitalWrite(Led4, LOW);
break;
case '4':
digitalWrite(Led1, LOW);
digitalWrite(Led2, LOW);
digitalWrite(Led3, LOW);
digitalWrite(Led4, HIGH);
break;
default:
Serial.print("Valor ");
Serial.print(Led);
Serial.println(" incorreto.");
digitalWrite(Led1, LOW);
digitalWrite(Led2, LOW);
digitalWrite(Led3, LOW);
digitalWrite(Led4, LOW);
}
72
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
}
}
Assim como se você estivesse utilizando diversos laços if()
em sequência, o switch-case testa condição por condição, e caso
uma delas seja atendida é executado o código que está dentro.
Repare que logo após a execução do código, é necessário
utilizar o comando break, para que o Arduino entenda que
aquele comando acabou.
73
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 7
Crie novamente o Projeto#1, dessa vez utilizando 4 LEDs, e
faça com que cada LED acenda dependendo de caractere que
você enviar na Serial. Você pode tomar como base o exemplo
usado nesse capitulo. O exercício deve atender os seguintes
requisitos:
• Utilização de no mínimo 4 LEDs
• Deve-se usar variáveis para referenciar as pinagens
usadas nos LEDs,
• Deve-se usar o switch-case para acionar os LEDs
• Quando enviado o caractere ‘a’ deve-se acender o
primeiro LED e o restante permanecer apagado
• Quando enviado o caractere ‘b’ deve-se acender os
dois primeiros LEDs e deixar apagado o restante
• Quando enviado o caractere ‘c’ deve-se acender 3
LEDs e 1 ficar apagado
• Quando enviado o caractere ‘d’ deve-se acender todos
os LEDs
Clique AQUI para ter acesso ao exercício resolvido.
74
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.6 WHILE
Agora, vamos estudar um conceito muito importante
dentro da programação, que são os laços de repetição, e o
primeiro que vamos aprender é o while().
Mas afinal, pra que serve um laço de repetição? Nesse
momento você já deve ter entendido bem, que o void setup é
executado apenas uma vez quando o Arduino é ligado, já o void
loop é executado infinitamente enquanto o Arduino permanecer
ligado. Deixa-me te contar uma coisa:
O void loop nada mais é do que um while() escondido por
baixo dos panos. Vamos entender o seu funcionamento.
SINTAXE:
while(var) {// analisa se a variável é verdadeira (true)
//Enquanto a variável for true o laço é executado.
}
EXEMPLO:
void setup() {
Serial.begin(9600);
while (true) {
Serial.println("Hello World");
delay(2000);
}
}
void loop() {
}
75
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Nesse exemplo o while será repetido infinitas vezes
enquanto o Arduíno permanecer ligado, mesmo estando dentro
da função setup(), isso por que eu coloquei o while(true)
diretamente dentro da verificação. A cada 2s será exibida a
mensagem “Hello World” na tela.
EXEMPLO:
int x = 0; //inicia uma variável x valendo 0
void setup() {
Serial.begin(9600); // instancia a Serial
}
void loop() {
while (x < 12) { // analisa se x é menor que 12
//Enquanto x for menor que 12 o laço é executado
Serial.print("X vale: "); //Exibe a mensagem x vale:
Serial.println(x); // Exibe o valor de x em frente a
string anterior
// O resultado é X vale: 1
// o valor de x aumenta uma unidade a cada vez que o
laço é repetido
// x recebe ele mesmo acrescido de 1 unidade
/*
Na primeira execução x vale 0, portanto x vai
receber 0 + 1
Na segunda execução x vale 1, portanto x vai
receber 1 + 1
Na segunda execução x vale 2, portanto x vai
receber 3 + 1
E assim por diante
*/
x = x + 1;
//delay de 2s
delay(2000);
//
}
}
O while() é executado repetidas vezes enquanto a variável
que está sendo analisada for igual a true, a cada iteração do ciclo
76
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
ele testa a variável para saber se ela ainda possui o valor
verdadeiro. Quando a variável se tornar false, o ciclo acaba e o
while() é interrompido.
77
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 8
Criar um algoritmo usando o while, que faça 50 iterações
com uma variável, e que exiba o valor dessa variável na Serial a
cada iteração:
• Você deve criar um algoritmo usando o while que conte de
0 a 50;
• A cada iteração deve ser exibida a seguinte mensagem: “O
valor da contagem e: “, seguido do valor da variável.
Exemplo:
• Na primeira iteração deve aparecer “O valor da contagem
e: 0”;
• Na segunda iteração deve aparecer “O valor da contagem e:
1”;
• E assim sucessivamente até que chegue a 50;
• Após a finalização da contagem deve ser exibida a
mensagem “Contagem Finalizada” na Serial, e também
deve ser aceso o LED integrado ao Arduíno no pino 13.
Clique AQUI para ter acesso ao exercício resolvido.
78
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.7 FOR
Além do while, outro laço de repetição muito utilizado é o
for(), porém sua diferença é que ele possui um momento para
começar, e um momento para terminar. Vejamos a sintaxe:
SINTAXE:
for (int i = 0; i < 50; i++) {
/* A variável i inicia com 0 e a cada ciclo é acrescido 1
unidade a ela, enquanto i for menor que 50 o for() é
executado, quando i for igual ou maior que 50 o for() acaba
*/
}
EXEMPLO:
void setup() {
Serial.begin(9600); // instancia a Serial
}
void loop() {
for (int i = 0; i < 12; i++) {
// inicia uma contagem que vai de 0 a 11
Serial.print("O valor de i e: "); //para cada iteração
é exibido em tela a mensagem "O valor de i e "
//Após a string anterior é exibido o valor de i
Serial.println(i);
delay(500);
}
}
Dessa maneira o for() precisa de uma varável, o valor em
que ela vai começar, o valor em que ela vai terminar, e qual vai
ser o passo dessa variável.
79
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
O passo é quanto será acrescentado na variável a cada ciclo
do for().
Além disso, ele também pode ser usado para contagens
inversas, veja o exemplo:
EXEMPLO:
void setup() {
Serial.begin(9600); // instancia a Serial
}
void loop() {
for (int i = 11; i > 0; i--) {
// inicia uma contagem que vai de 11 a 0
Serial.print("O valor de i e: "); //para cada iteração
é exibido em tela a mensagem "O valor de i e "
//Após a string anterior é exibido o valor de i
Serial.println(i);
}
}
Repare que ao invés de utilizar o i++, agora eu utilizei o i--,
o que significa que a cada iteração do for() o valor de i vai
diminuir 1 unidade.
Além disso, agora o i inicia em 11 e para quando for igual a
0.
80
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 9
Recriar o exercício do while, utilizando dessa vez o laço
for().
O exercício deve atender os mesmos requisitos do exercício
anterior.
• Você deve criar um algoritmo usando o for() que conte de 0
a 50;
• A cada iteração deve ser exibida a seguinte mensagem: “O
valor da contagem e: “, seguido do valor da variável.
Exemplo:
• Na primeira iteração deve aparecer “O valor da contagem
e: 0”;
• Na segunda iteração deve aparecer “O valor da contagem e:
1”;
• E assim sucessivamente até que chegue a 50;
• Após a finalização da contagem deve ser exibida a
mensagem “Contagem Finalizada” na Serial, e também
deve ser aceso o LED integrado ao Arduíno no pino 13.
Clique AQUI para ter acesso ao exercício resolvido.
81
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
EXERCÍCIO 10
Recrie o exercício anterior, dessa vez fazendo a contagem
inversa, iniciando em 50 e terminando em 0.
• Você deve criar um algoritmo usando o for() que conte de
50 a 0;
• A cada iteração deve ser exibida a seguinte mensagem: “O
valor da contagem e: “, seguido do valor da variável.
Exemplo:
• Na primeira iteração deve aparecer “O valor da contagem
e: 50”;
• Na segunda iteração deve aparecer “O valor da contagem e:
49”;
• E assim sucessivamente até que chegue a 0;
• Após a finalização da contagem deve ser exibida a
mensagem “Contagem Finalizada” na Serial, e também
deve ser aceso o LED integrado ao Arduíno no pino 13.
Clique AQUI para ter acesso ao exercício resolvido.
82
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#3 – Scrolling LED:
Esse projeto vamos acender 6 LEDs, 1 por vez fazendo um
efeito de scroll.
Componentes:
•
•
•
•
•
1 - Arduino Uno
1 - Protoboard
6 - LEDs 5mm
6 - 220 Ω Resistor
Jumpers
Diagrama:
83
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
/*
Scrolling LED usando o laço for
Demonstra o uso do for() loop.
Múltiplos LEDs em sequencia
Sobre o circuito:
* LEDs ligados do pino 2 até o 7
*/
int timer = 100; // tempo
void setup() {
// usa o laço for para definir os pinos de saída
for (int thisPin = 2; thisPin < 8; thisPin++) {
pinMode(thisPin, OUTPUT);
}
}
void loop() {
// loop do pino 2 até o 7
for (int thisPin = 2; thisPin < 8; thisPin++) {
// Liga o pino:
digitalWrite(thisPin, HIGH);
delay(timer);
// Desliga o pino
digitalWrite(thisPin, LOW);
}
// loop do pino 7 até o 2
for (int thisPin = 7; thisPin >= 2; thisPin--) {
// Liga o pino:
digitalWrite(thisPin, HIGH);
delay(timer);
// Desliga o pino:
digitalWrite(thisPin, LOW);
}
}
84
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.8 DO-WHILE
O do-while é exatamente igual ao while(), porem garante
que haverá ao menos 1 execução do laço antes que ele termine.
O código a ser executado deve ser colocado no do{} e após é
inserido o while com a condição. Caso a condição seja atendida o
while é repetido normalmente, caso contrário, o código segue o
fluxo de execução.
SINTAXE:
do {
//o que deve ser executado
} while(condição) //após ser executado 1 vez ele começa a
fazer as verificações
EXEMPLO:
int x = 2;
void setup() {
Serial.begin(9600); // instancia a Serial
do {
Serial.println("Fui exibido 1 vez");
} while (x > 5); // Só será executado 1 vez pois x
é MENOR QUE 5
}
void loop() {
}
85
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.9 ENTRADAS ANALÓGICAS
Voltamos novamente a trabalhar com as portas do
Arduino, e dessa vez vamos analisar mais a fundo as entradas
analógicas, como usa-las e quando as usar
Uma entrada analógica serve para analisar sinais de
tensão. No caso do Arduino ele consegue processar sinais que
vão de 0 a 5v. Em outros controladores como a ESP32 por
exemplo, esse sinal vai de 0 a 3.3V.
Antes de estudarmos as variáveis analógicas efetivamente,
precisamos entender como elas funcionam, e pra isso você
precisa saber o que é um conversor A/D
CONVERSOR ANALÓGICO/DIGITAL
Em termos técnicos um conversor A/D é capaz de traduzir
um sinal continuo no tempo, para um sinal discretizado. Mas em
meio termo, isso quer dizer que ele é capaz de pegar um sinal
analógico de tensão ou corrente, e transformar isso em valores
digitais, capazes de serem entendidos pelo microcontrolador.
Na natureza nem tudo são flores, raramente iremos
encontrar uma variável diretamente em corrente ou sinal
elétrico. Geralmente precisamos traduzir os sinais do mundo
físico, para uma linguagem em que os computadores entendam.
Para um avião ler a pressão atmosférica, ele precisa de um
sensor que capte a pressão e converta isso em um sinal elétrico
para que o computador de bordo entenda.
86
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Para um carro autônomo dirigir sozinho, ele precisa que as
imagens das câmeras e radares sejam convertidas em sinais
elétricos, para que ele entenda o trânsito e não cause acidentes.
SINTAXE:
analogRead(pino); // Sintaxe de leitura
int var = analogRead(pino); //Atribuição da leitura a uma
variável.
EXEMPLO:
int analogPin = A3; // Potenciômetro conectado ao pino A3
int val = 0; // variável para armazenar o valor lido
void setup() {
Serial.begin(9600); // inicia a Serial
}
void loop() {
val = analogRead(analogPin);// Lê o pino
Serial.println(val); // imprime o valor lido na tela
}
87
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#4 – Controlando a frequência do
LED com potenciômetro:
Usando um potenciômetro para controlar a frequência em
que um LED pisca. A resistência do potenciômetro é lida,
aumentando ou diminuído a velocidade com que o LED pisca.
A velocidade em que o LED irá piscar, depende do valor lido
na função analogRead()
Componentes:
•
•
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - LED 5mm
1 - 220 Ω Resistor
1 - Potenciômetro 10k Ω (Modelo Trimpot)
Jumpers
Diagrama:
88
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
int sensorPin = A0; // Pino de entrada do potenciômetro
int ledPin = 13; // Pino do LED
int sensorValue = 0;// Variável para armazenar o valor do
potenciômetro
void setup() {
// Declara o pino do LED como saída
pinMode(ledPin, OUTPUT);
}
void loop() {
// Lê o valor do potenciômetro
sensorValue = analogRead(sensorPin);
// Liga o LED
digitalWrite(ledPin, HIGH);
// Para o programa de acordo com o valor lido no
potenciômetro
delay(sensorValue);
// Desliga o LED
digitalWrite(ledPin, LOW);
// Para o programa de acordo com o valor lido no
potenciômetro
delay(sensorValue);
}
89
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
2.10 SAÍDAS ANALOGICAS
Você já ouviu falar em PWM? Se você nunca ouviu falar,
esse conceito pode parecer um pouco estranho pra você, mas vou
tentar simplificar ao máximo aqui, para seu entendimento.
Como
você
viu
no
capítulo
anterior,
os
microcontroladores, incluindo o Arduíno, permitem que você
faça leituras analógicas em suas portas. O que significa que ele
pega um sinal continuo, corta em vários pedacinhos, e
transforma isso em uma linguagem em que o processador
consiga entender.
Agora imagine o processo inverso. Sim! Esse mesmo
processo, totalmente invertido.
Quando falamos de saídas analógicas, significa que o
microcontrolador pega uma sequência de sinais e tenta
converter isso em um sinal analógico, ou seja continuo no
tempo. Por que eu usei a palavra “tenta”? Porque como já vimos
no capítulo anterior, o microcontrolador não entende a
linguagem física,
então
ele precisa usar
dos recursos
disponíveis, para criar um sinal mais parecido com um sinal
físico real. Mas nenhum processador é perfeito, e quem
determina se a qualidade desse sinal vai ser boa ou ruim, é a
resolução
dos
microcontroladores.
Vou
citar
aqui
2
microcontroladores para você entender melhor:
ARDUINO:
O Arduíno possuí uma resolução de 8 bits de saída, isso
quer dizer que os valores de saída podem variar de 0 a 255.
90
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
ESP32:
Esse microcontrolador possui um controle muito maior
que o Arduíno, e ele permite que varie a resolução de saída de 1 a
16 bits.
Pegando o exemplo do Arduíno, se pedirmos para ele
escrever um valor analógico em uma de suas saídas, usando o
comando analogWrite(), ele irá tentar replicar esse valor em
níveis de tensão. Isso se chama duty cicle, e é muito importante
você entender esse conceito. Vejamos o exemplo:
EXEMPLO:
Se você escrever 0 na saída, a tensão medida na porta é 0v
Se você escrever 255 na saída, a tensão medida na porta é
5V
Se você escrever na saída 128, a tensão medida é
aproximadamente 2.5V
Em outras palavras, o duty cicle é o tempo em que a porta
permanece ligada. Mas por que isso? Esse conceito envolve
eletrônica e eletricidade, mas basicamente a tensão em volts que
é medida em uma carga, nada mais é do que uma média de várias
tensões ao longo de um espaço de tempo.
Se o duty cicle é 0, significa que durante o período medido,
a porta permaneceu totalmente desligada
Se o duty cicle é 255, significa que durante o período
medido a porta permaneceu totalmente ligada
91
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
E se a duty cicle for 128? Isso aí, ele permaneceu
aproximadamente metade do tempo ligada, e metade do tempo
desligada.
A imagem abaixo mostra exatamente esse conceito:
Figura 6 – duty cicle.
Por que isso é importante para mim nesse momento? É que
usando o comando analogWrite(), você está controlando o duty
cicle da porta, e diretamente controlando a tensão de saída dessa
porta.
SINTAXE:
analogWrite(pino, valor)// pino é a numeração do pino a
ser controlado, e valor é o duty cicle.
EXEMPLO:
int ledPin = 9;// LED conectado ao pino digital 9
92
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
int analogPin = 3;// potenciômetro conectado ao pino
analógico 3
int val = 0;// variável para guardar o valor lido
void setup() {
pinMode(ledPin, OUTPUT);
}
// configura
o pino como saída
void loop() {
val = analogRead(analogPin);// lê o pino de entrada
analógica
analogWrite(ledPin, val / 4); // analogRead retorna
valores de 0 a 1023, analogWrite recebe de 0 a 255
}
93
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#5 – Controlando o brilho do LED
com PWM:
Usando o PWM vamos criar um algoritmo que irá
aumentar e diminuir a intensidade de brilho de um LED;
Esse efeito é chamado de fade.
Você pode identificar os pinos que permitem a saída
analógica no Arduíno com o símbolo de “~”. Como por exemplo:
~3, ~5, ~6, ~9.
Componentes:
•
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - LED 5mm //qualquer cor
1 - 220 Ω Resistor
Jumpers
Diagrama:
94
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
/*
Fade
*/
int LED = 9; // O pino PWM que será usado
int brightness = 0;
int fadeAmount = 5;
void setup() {
pinMode(LED, OUTPUT);
}
// declare pin 9 como SAÍDA
void loop() {
// seta o brilho do LED no pino 9 usando PWM
analogWrite(LED, brightness);
// Muda o brilho a cada iteração do loop
brightness = brightness + fadeAmount;
// Inverte o fade
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
// aguarda 30 milissegundos
delay(30);
}
95
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
CAPITULO 3
3.1 VETORES
Quando conversamos sobre variáveis, entendemos que
uma variável nada mais é do que um pedaço de memória que o
Arduínos separa para que você guarde um dado. E os vetores não
deixam de ser variáveis, a diferença é que dentro de um vetor, é
possível
guardar
vários
valores.
Vamos
fazer
umas
comparações.
Dentro de uma variável int é possível guardar um número
certo?
Dentro de um char é possível guardar um caractere certo?
Imagine se você pudesse guardar vários números dentro de
uma única variável, ou guardar vários caracteres dentro de uma
variável. É pra isso que foi criado o vetor
SINTAXE:
int meusInts[6]; //Cria um vetor de 6 posições
int meusPinos[] = {2, 4 ,8, 6 } // cria um vetor vazio e atribui
cada inteiro em uma posição
char letras[3] = {‘a’, ‘b’, ‘c’} // cria um vetor de char de 3
posições e atribui cada letra em uma posição
Quando estamos trabalhando com vetores uma, coisa
precisa ficar bem clara, todo o vetor, é regido por índices. Se eu
armazenar 3 números dentro de um vetor, como vou acessar
cada um desses números depois?
96
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Dessa maneira, a distribuição é feita por índices, onde a
primeira posição do vetor é o índice 0, a segunda posição é o
índice 1 e assim por diante. Voltamos ao exemplo anterior:
Se você criar o seguinte vetor:
vetor[3] = {250, 25, 5}
Nesse exemplo nós criamos um vetor de 3 posições, e na
primeira posição atribuímos o valor 250, na segunda posição o
valor 25, e na terceira posição o valor 5. Para acessar cada um dos
valores, você precisa usar a seguinte sintaxe:
Serial.println(vetor[0]) // Será exibido o valor 250
Serial.println(vetor[1]) //Será exibido o valor 25
Serial.println(vetor[2]) //Será exibido o valor 5
97
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#6 – Controlando LEDs em série
com potenciômetro:
Usando um potenciômetro, você pode controlar quantos
LEDs ficaram acesos ou apagados, dependendo da leitura
analógica vinda do potenciômetro.
O Arduíno irá controlar os LEDs em série, esse projeto pode
servir para qualquer desenvolvimento que você queira controlar
as saídas digitais baseando-se na leitura da entrada analógica
Componentes:
•
•
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - Potenciômetro
10 - LED 5mm
10 - 220 Ω Resistor
Jumpers
Diagrama:
98
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
/*
Barra de LEDs
*/
// Variáveis que armazenam as pinagens e não vão mudar
const int analogPin = A0; // Pino que vai ler o
potenciômetro
const int ledCount = 10; // Numero de LEDs
int ledPins[] = {
2, 3, 4, 5, 6, 7, 8, 9, 10, 11
}; // Vetor que contem a pinagem dos LEDs em sequencia
void setup() {
// for para definir todos os pinos como SAÍDA
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
pinMode(ledPins[thisLed], OUTPUT);
}
}
void loop() {
// Lê o potenciômetro
int sensorReading = analogRead(analogPin);
// função que converte o valor lido no número de LEDs:
int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
// Se o item do vetor for menor que o ledLevel
// Liga o pino correspondente ao elemento
if (thisLed < ledLevel) {
digitalWrite(ledPins[thisLed], HIGH);
}
// Desliga todos os pinos que são maiores que ledLevel
else {
digitalWrite(ledPins[thisLed], LOW);
}
}
}
99
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
3.2 FUNÇÕES
Desde o começo desse livro você está lendo a palavra
função, e chegou o momento de desmistificar esse conceito.
Imagine que você precise escrever um algoritmo descreva
a rota para seu trabalho, ou uma receita de bolo. Você poderia
criar um algoritmo que diga: Ande duas quadras, vire à esquerda
depois a direita; ou então, adicione 2 colheres de açúcar, 3
xicaras de farinha, 2 ovos e então bata tudo.
Até aí tudo bem, vai funcionar perfeitamente. Agora e se
você precisasse escrever esse algoritmo várias vezes? Uma
maneira é você copiar toda a receita, ou toda a rota, e colar ela
várias vezes dentro do mesmo código.
Porém essa não é a maneira mais eficaz de se criar um
código que precisa se repetido várias vezes. Foi para isso que as
funções foram criadas.
Usando o exemplo da receita de bolo, bastaria você criar
uma função com a receita, e depois se precisasse repeti-la, ao
invés de se copiar a receita inteira várias vezes, é só pedir para
que a função seja executada várias vezes.
Isso encurta muito o tamanho dos nossos códigos, e facilita
muito a legibilidade do código.
Um algoritmo bem escrito, possui cada função bem
definida, para que o programador olhe para determinada
função, e já saiba exatamente o que ela está fazendo.
Assim como você olha para o void setup e já sabe que ele é
executado só uma vez.
100
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
E assim como você também olha para o void loop e sabe que
essa função se repete enquanto o Arduíno estiver ligado; as
funções que você criar devem ser bem autoexplicativas.
SINTAXE:
void nome_da_funcao () {
//código a ser executado
}
Para se chamar uma função basta colocar o nome dela com
parênteses: nome_da_funcao();
EXEMPLO:
void setup() {
pinMode(13, OUTPUT); // Define o pino 13 como saída
}
void loop() {
changeLights(); // Chama a função
// Quando a função é finalizada o código continua aqui.
delay(15000); /* Aguarda 15 segundos depois que função é
executada */
}
// Função
void changeLights() {
// Liga o LED
digitalWrite(13, HIGH);
// Aguarda 1 segundo com o LED ligado
delay(1000);
// Desliga o LED
digitalWrite(13, LOW);
// Aguarda 1 segundo com o LED desligado
delay(1000);
} // Fim da função, retorna para o loop.
101
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#7 - Arduino Controlando
Sinaleiro:
Construa um sinaleiro usando LEDs verde, vermelho e
amarelo
Componentes:
•
•
•
•
•
•
•
•
1 – Resistor de10k-ohm
1 – Pushbutton
3 – Resistor 220-ohm
1 – Protoboard
Jumpers de conexão
1 – LED Vermelho
1 – LED Amarelo
1 – LED Verde
Diagrama:
102
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
int red = 10;
int yellow = 9;
int green = 8;
void setup() {
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
}
void loop() {
changeLights();
delay(15000);
}
void changeLights() {
// Verde desligado, amarelo ligado por 3 segundos
digitalWrite(green, LOW);
digitalWrite(yellow, HIGH);
delay(3000);
// Desliga o Amarelo e liga o Vermelho por 5 segundos
digitalWrite(yellow, LOW);
digitalWrite(red, HIGH);
delay(5000);
// Desliga o Vermelho e liga o Verde
digitalWrite(yellow, LOW);
digitalWrite(red, LOW);
digitalWrite(green, HIGH);
delay(3000);
}
103
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#8 – Controlando um LED pela
luminosidade do ambiente:
Usando um Fotoresistor para controlar intensidade de
brilho de um LEDs de acordo com a quantidade de luz presente
no ambiente.
Um Fotoresistor é um componente que varia sua
resistência de acordo com a quantidade de luz que incide sobre o
mesmo. Vamos usar essa propriedade para controlar um LED.
Componentes:
•
•
•
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - LED 5mm
1 - 330 Ω Resistor
1 - 10K Ω Resistor
1 - Fotoresistor
Jumpers
Diagrama:
104
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
// Constantes que armazenam as pinagens, para facilitar o
código
const int sensorPin = 0;
const int ledPin = 9;
// Vamos setar algumas variáveis globalmente
int lightLevel;
int calibratedlightLevel;
int maxThreshold = 0; // usado para setar o máximo de luz
int minThreshold = 1023; // usado para setar o mínimo de
luz
void setup()
{
pinMode(ledPin, OUTPUT);// Seta o pino do LED como SAÍDA
Serial.begin(9600);
}
void loop()
{
lightLevel = analogRead(sensorPin); // lê a porta
Serial.print(lightLevel);
//autoRange(); // executa a função autoRange
calibratedlightLevel = map(lightLevel, 0, 1023, 0,
255); //muda a escala de leitura de 0 a 1023 para 0 a 255
Serial.print("\t"); // imprime um tab
Serial.print(calibratedlightLevel);
analogWrite(ledPin, calibratedlightLevel); // Seta o
brilho do LED de acordo com o valor lido.
}
/*
Essa função seta o valor das variáveis minThreshold e
maxThreshold para o nível de luz do ambiente. Mova sua mão
em cima do sensor para calibrar.
O sensor irá perceber o range total de luz e vai
autocalibrar as entradas
*/
void autoRange()
{
if (lightLevel < minThreshold)
minThreshold = lightLevel;
if (lightLevel > maxThreshold)
105
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
maxThreshold = lightLevel;
// uma vez calibrado você pode inserir diretamente os
valores dentro da função map
lightLevel = map(lightLevel, minThreshold, maxThreshold,
0, 255);
lightLevel = constrain(lightLevel, 0, 255);
}
106
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
3.3 RETORNOS
Os retornos são um complemento para as funções. A
maioria das funções que estudamos até agora são void, ou seja,
elas não retornam nada, mas você pode criar funções que
retornam valores.
Você pode criar uma função que soma dois números e
retorna o resultado, ou ainda, você pode construir uma função
que diga se é dia ou noite, e retorne o status.
As possibilidades são gigantes, pois permite ainda mais a
segmentação dos códigos, vejamos a sintaxe:
SINTAXE:
int func_com_retorno(){ //definida que a função irá
retornar um int
//Executa algo
int a = 20; // cria uma variável com o valor 20
int b = 5; // cria uma variável com o valor 5
return a+b //soma a + b e retorna o valor
}
Temos algumas coisas para discutir aqui, repare que ao
invés de declarar a função como void, agora ela é do tipo int, isso
indica que o valor que ela irá retornar deve ser um inteiro. Assim
como uma variável precisa ter um tipo quando declarada, uma
função com retorno também precisa.
107
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Segundo: para retornar o valor desejado, usa-se a sintaxe
return.
E por último, como acessar o valor retornado pela função?
Da mesma maneira que os valores são acessados dentro de
uma variável, veja:
Você pode exibir o valor retornado usando a Serial:
Serial.println(func_com_retorno());
Ou pode atribuir o valor retornado dentro de uma outra
variável:
int x = func_com_retorno();
Também é permitido utilizar qualquer um dos operadores
estudados:
int x = func_com_retorno() + 200;
if(func_com_retorno() <= 50){}
EXEMPLO
//experimente mudar esses valores para testar os resultados
int x = 50;
int y = 12;
void setup() {
Serial.begin(9600); // inicia a Serial
int somatorio = soma(); // atribui o retorno da função na
variável somatorio
Serial.println(somatorio); //imprime o valor que foi
atribuido a variável somatorio
}
void loop() {
}
int soma() {
108
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
return x + y; //retorna a soma de x + y
}
109
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#9 – Lendo um sensor de
temperatura:
Medindo a temperatura do ambiente usando um sensor de
temperatura. Nesse projeto a temperatura será mostrada
usando a Serial do Arduíno.
Componentes:
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 – Sensor de Temperatura – TMP36
Jumpers
Diagrama:
110
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
/*
Medindo temperatura com o sensor TMP36.
A saída de tensão do sensor é proporcional a temperatura
do ambiente, portanto basta converter o sinal de tensão em
leitura analógica apara calcular a temperatura
*/
const int temperaturePin = A0; // Le o sensor no pino A0
void setup()
{
Serial.begin(9600); // inicializa a Serial
}
void loop()
{
float voltage, degreesC, degreesF; //declara 3 variáveis
float, para o armazenamento da tensão, graus célsius e
graus Fahrenheit
voltage = getVoltage(temperaturePin); // mede a voltagem
no pino
degreesC = (voltage - 0.5) * 100.0; // converte tensão em
graus célsius
degreesF = degreesC * (9.0 / 5.0) + 32.0; //converte
graus celsius para Fahrenheit
// Imprime na serial a seguinte mensagem com os valores
// "voltage: 0.73 deg C: 22.75 deg F: 72.96"
Serial.print("voltagem: ");
Serial.print(voltage);
Serial.print(" Graus C: ");
Serial.print(degreesC);
Serial.print(" Graus F: ");
Serial.println(degreesF);
delay(1000); // Repete uma vez por segundo, (mude se
desejar)
}
float getVoltage(int pin) //Função para ler e retornar a
tensão
{
return (analogRead(pin) * 0.004882814);
111
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
}
// Outras coisas para testar com esse projeto:
//
Ligar um LED se a temperatura exceder um valor
//
Criar um termostato
112
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
3.4 PARÂMETROS
Ainda estudando sobre funções, existem os parâmetros
que podem ser usados dentro de uma função.
Imagine que você precise construir uma função que some
2 números, mas esses números existem fora da função.
Você pode resolver isso de 2 maneiras, sendo a primeira
declarando duas variáveis globais, e utilizando dentro da
função.
Ou passar essas variáveis por parâmetros dentro da
função.
SINTAXE:
void minha_fun(int x, int y){
return x + y;
}
//chamada da função:
minha_fun(45, 90); // o valor 45 é atribuído a x dentro da
função, e o valor 90 é atribuído a y dentro da função
113
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
3.5 CLASSES E BIBLIOTECAS
E nosso último objeto de estudos são as classes, mais
popularmente conhecidas como as bibliotecas ou libraries.
Mas afinal, o que é uma classe?
Deixe-me tentar ser o mais claro possível aqui: Imagine que
você criou uma programação para um Arduínos. Colocou ele
para rodar e funcionou da maneira que você gostaria. Depois de
algum tempo você percebe que se você usasse esse mesmo
código em outro projeto, você teria resultados bem melhores.
Assim como tudo até agora, você tem 2 maneiras de fazer isso.
Que é:
Abrir o código que você construiu e copia-lo para seu outro
projeto.
Ou você pode construir uma classe que contém as funções
que você precisa, e apenas importar essa classe no seu segundo
projeto. Ou seja, as classes assim como as funções, nos poupam
trabalho e extensas linhas de desenvolvimento.
Aumentando ainda mais esse exemplo, imagine que é
professor, e todos os seus alunos estão tendo dificuldades
justamente no problema que o código que você desenvolveu
resolve. Você vai passar o seu código individualmente para cada
aluno copiar? Pensando bem... É melhor construir uma
biblioteca que contém o código certo?
Graças ao mundo maker, temos desenvolvedores ao redor
do mundo que estão constantemente criando bibliotecas para
tudo o que você imaginar.
Biblioteca para ler sensor de temperatura: TEM!
Biblioteca para conexão com a internet: TEM!
114
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
E por isso é tão importante o fomento das comunidades
makers e open source.
Se você chegou até aqui, executou todos os exercícios e
projetos propostos, provavelmente em algum momento você já
se deparou com a seguinte sintaxe:
#include <AlgumNome.h>
Isso nada mais é do que uma importação de uma biblioteca.
Provavelmente dentro da biblioteca AlgumNome, exista alguma
função que você queira utilizar no seu código, e por isso precisa
informar ao Arduíno que você deseja importar tudo que existe
dentro dessa biblioteca, com o comando #include.
COMO INCLUIR BIBLIOTECAS
Com toda certeza, daqui pra frente você vai utilizar muito
essa ferramenta.
Como eu já expliquei, as bibliotecas servem para auxiliar, e
complementar o desenvolvimento. Com sua utilização, você
pode reaproveitar códigos, e inclusive até mesmo de outros
desenvolvedores.
Vou citar aqui o exemplo do Projeto#17 - DHT11 Sensor de
Temperatura e Umidade. Esse projeto é muito interessante, pois
é o projeto mais procurado no Google. Inclusive eu fiz uma aula
explicando como montar na prática, basta clicar AQUI .
Nesse projeto você vai precisar utilizar a biblioteca
“dht11.h”. Você pode encontrar ela disponível no Github
clicando AQUI.
Ao entrar no Github, você vai se deparar com a página
mostrada na figura 7:
115
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Figura 7: Página de download da biblioteca, dentro do Github.
Para fazer o download da biblioteca, você precisa clicar no
botão verde “Clone or download”, e depois em “Download ZIP”.
Após isso será baixado um arquivo compactado com extensão
.zip para seu computador.
Além disso, você também vai precisar fazer o mesmo
procedimento com a biblioteca Adafruit Sensor, pois a DHT
depende dela.
Você pode baixa-la AQUI
Você irá precisar encontrar aonde esses arquivos foram
baixados em seu computador, e fazer a descompactação dos
mesmos.
116
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Essa descompactação irá criar uma pasta. Dentro desta
pasta criada, você encontrará uma outra pasta que contém toda
a biblioteca. Você precisa copiar essa pasta que contem toda a
biblioteca para o diretório do Arduino\libraries no seu
computador. Na figura 8 você consegue ver o que existe dentro
da biblioteca “DHT11.h”. Cada arquivo desse tem uma função,
que colabora para que seu código funcione.
A criação de bibliotecas pode parecer um pouco
embaraçoso para você que está começando, portanto vamos nos
atentar aqui em aprender a usar as bibliotecas que já existem.
Figura 8: Conteúdo de uma biblioteca.
Você precisa copiar a pasta que contem todos esses
arquivos para o diretório que eu citei, assim como mostra a
figura 9, para que a IDE do Arduíno reconheça a biblioteca.
117
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Figura 9: Pasta correta a copiada.
Em computadores com Windows, você possivelmente irá
encontrar o diretório do Arduíno em:
“D:\Documentos\Arduino”
Ou também:
“C:\Users\Mateus Dias\Documentos\Arduino”
É importante você encontrar esse diretório em seu
computador, pois é nele que vamos colar a biblioteca que
baixamos.
Dentro do diretório do Arduíno você deve encontrar algo
parecido com isso:
Figura 10: Pasta libraries aonde devem ser colocadas as
bibliotecas.
118
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
E é dentro desta pasta libraries que você deve colar todas as
bibliotecas que você precisar.
Automaticamente se uma biblioteca estiver contida dentro
da pasta libraries, a IDE do Arduíno irá reconhece-la.
OBS: Se você fez a instalação da IDE do Arduíno pelo Microsoft
Store. Eu recomendo fortemente que você remova essa
instalação, e baixe o instalador diretamente do site do Arduino
Isso por que quando a instalação é feita pela loja da
Microsoft,
alguns
diretórios
podem
ficar
escondidos.
Dificultando deu aprendizado.
Após essa etapa de preparação você precisa abrir a IDE do
Arduíno, e construir o código conforme o projeto especifica.
Dentro da IDE você vai encontrar alguns botões, e vou
explicar o que cada um deles faz.
Figura 10 – Botões IDE
Em vermelho: Botão de compilação do código, é nele que
acionamos aquela espécie de “robô” que comentei a alguns
capítulos atrás. Com a verificação você consegue saber se está
tudo ok com seu código, antes de enviá-lo para o Arduíno.
Em alaranjado: Está o botão que faz o envio do código para
o Arduíno. Mesmo que você não tenha feito a compilação
manual antes de enviar, quando esse botão é pressionado ele
119
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
aciona o compilador, faz a verificação do código e após o término
da verificação ele faz o envio.
Seguindo, após o botão de envio, temos respectivamente o
botão de criar um novo projeto, o botão de abrir um projeto
existente, e o botão de salvar.
TRICK: Se você pressionar CTRL+T dentro da sua IDE, ela irá
fazer
a
formatação
automática
do
código,
deixando-o
organizado nos padrões do framework Arduino.
Com as teclas CTRL+S você consegue salvar o seu projeto.
Seu projeto deve ficar conforme o da figura 11:
Figura 11 – Código fonte Projeto#17
120
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Para fazer a compilação do seu código, basta clicar no botão
verificar. E se tudo estiver correto você deve receber a seguinte
mensagem:
Figura 12: Compilação terminada com sucesso.
Isso significa que agora você já pode plugar o Arduíno no
seu computador e fazer o envio do código para dentro dele.
O procedimento de inclusão de bibliotecas é o mesmo para
qualquer biblioteca que você precisar. Fazer o download,
descompactar, colar dentro da pasta libraries dentro do diretório
do Arduino, e sair usando.
Vou te mostrar agora algumas coisas que podem te ajudar.
A grande maioria das bibliotecas vem com exemplos
incluídos, para você conseguir se basear em seus projetos. Após
seguir o procedimento para incluir a biblioteca, você pode
encontrar os exemplos da mesma, seguindo os passos:
Abra a IDE -> Arquivo -> Exemplos -> Nome da biblioteca
A figura 13 mostra o passo a passo.
Além disso nesse menu, você pode encontrar diversos
outros exemplos que a própria Arduino disponibiliza para te
auxiliar.
121
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Figura 13 – Exemplos embutidos em bibliotecas.
Existe também uma segunda maneira de se adicionar
bibliotecas dentro da IDE do Arduino. Porém não recomendo,
pois não são todas as bibliotecas que você encontra nesse
método.
Ao pressionar CTRL+SHIFT+I em seu teclado, deve abrir o
gerenciador de bibliotecas do Arduino, conforme a figura 14, e
dentro do mesmo, você consegue fazer uma busca por
bibliotecas que necessita. Mas como eu disse, não são todas as
bibliotecas que estão dentro desse gerenciador. Por vezes você
irá precisar seguir o método manual que eu ensinei você.
Figura 14 – Gerenciador de bibliotecas.
122
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#10 – Posicionamento com GPS
NEO-6M
Usando um módulo GPS podemos receber o
posicionamento do Arduino em tempo real, e visualizar a
latitude e longitude através da Serial.
Esse projeto é um exemplo de como a comunicação Serial
pode ser usada com outro dispositivo fora do computador.
Iremos criar um a comunicação Serial com o computador, e
outra comunicação Serial com o GPS
Componentes:
• 1 - Arduino UNO
• 1 – Módulo NEO-6M GPS
• Jumpers
Diagrama:
123
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
#include <SoftwareSerial.h> //Inclui a biblioteca
SoftwareSerial.h. Não precisa baixar externamente, pois
essa biblioteca já vem junto com o pacote da IDE
// Serial usada para se comunicar com o módulo
SoftwareSerial ss(4, 3);
void setup() {
Serial.begin(9600); //inicia a Serial com o computador
ss.begin(9600); //Inicia a Serial com o GPS
}
void loop() {
while (ss.available() > 0) {
// Le os dados do GPS
byte gpsData = ss.read();
Serial.write(gpsData);
}
}
124
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#11 – Tocando uma melodia com
buzzer:
Nesse projeto vamos tocar uma pequena melodia usando
o Arduíno e um piezo buzzer/speaker.
Componentes:
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - Piezo Buzzer
Jumpers
Diagrama:
125
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
/*
circuito:
8-ohm buzzer conectado no pino digital 8
*/
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
126
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
NOTE_A4
NOTE_AS4
NOTE_B4
NOTE_C5
NOTE_CS5
NOTE_D5
NOTE_DS5
NOTE_E5
NOTE_F5
NOTE_FS5
NOTE_G5
NOTE_GS5
NOTE_A5
NOTE_AS5
NOTE_B5
NOTE_C6
NOTE_CS6
NOTE_D6
NOTE_DS6
NOTE_E6
NOTE_F6
NOTE_FS6
NOTE_G6
NOTE_GS6
NOTE_A6
NOTE_AS6
NOTE_B6
NOTE_C7
NOTE_CS7
NOTE_D7
NOTE_DS7
NOTE_E7
NOTE_F7
NOTE_FS7
NOTE_G7
NOTE_GS7
NOTE_A7
NOTE_AS7
NOTE_B7
NOTE_C8
NOTE_CS8
NOTE_D8
NOTE_DS8
440
466
494
523
554
587
622
659
698
740
784
831
880
932
988
1047
1109
1175
1245
1319
1397
1480
1568
1661
1760
1865
1976
2093
2217
2349
2489
2637
2794
2960
3136
3322
3520
3729
3951
4186
4435
4699
4978
// cria um vetor de notas
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3,
NOTE_C4
};
127
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
// duração das notas
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void setup() {
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// para a música
noTone(8);
}
}
void loop() {
}
128
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#12 – Controlando um servo:
Nesse projeto vamos controlar um microservo modelo 9g
usando o Arduíno.
OBS: teste apenas com 1 microservo 9g pois o Arduino não
possui corrente o suficiente para alimentar mais de 1, ou servos
maiores.
Componentes:
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - Servo
Jumper
Diagrama:
129
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
#include <Servo.h> // Inclui a biblioteca do servo
Servo servo1; // cria o objeto do servo
void setup()
{
servo1.attach(9, 900, 2100); //conecta o servo no pino 9
//com o valor mínimo de PWM
//900 e o valor máximo de PWM
//2100.
}
void loop()
{
int position;
// Para controlar o servo você precisa do angulo de
posição
// Ele não pode ser movido 360°
// Você pode move-lo de 0 a 180°
// A posição muda em velocidade máxima
servo1.write(90); // manda o servo ir para 90°
delay(1000); // Pausa
servo1.write(180); // manda o servo ir para 180°
delay(1000); // Pausa
servo1.write(0); // manda o servo ir para 0°
delay(1000); // Pausa
// manda o servo se movimentar 180° pulando 1 grau de
cada vez
for (position = 0; position < 180; position += 1)
{
servo1.write(position); // move para a próxima posição
delay(20); // pequena pausa antes de se movimentar
novamente
}
// manda o servo se movimentar 180° pulando 1 grau de cada
vez
for (position = 180; position >= 0; position -= 1)
{
servo1.write(position);
delay(20);
}
}
130
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#13 – Controlando um motor DC:
Usando um transistor, nós podemos controlar um motor
DC com corrente superior à que o Arduino suporta, isso por que
o transistor funciona como uma válvula que regula o quanto de
corrente flui da fonte para o motor.
Componentes
•
•
•
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - Motor DC
1 - 330 Ω Resistor
1 - Diodo 1N4148
1 - NPN Transistor
Jumpers
Diagrama
131
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
/*
Esse exemplo exige o uso de um transistor operando como
chave. O Arduino permite apenas 40mA de corrente em suas
portas, o que não é suficiente para acionar um motor DC,
que necessita no mínimo 150mA
*/
const int motorPin = 9; // conecte a base do transistor no
pino 9.
// Não conecte o pino diretamente no motor
void setup()
{
pinMode(motorPin, OUTPUT); // seta o pino como saída
Serial.begin(9600); // inicializa a Serial
}
void loop()
{/* Esse exemplo basicamente replica o Blink substituindo o
LED por um motor DC.*/
int onTime = 3000; // tempo para o motor ligar
int offTime = 3000; // tempo para o motor desligar
analogWrite(motorPin, 255); // liga o motor (velocidade
máxima)
delay(onTime); // delay
analogWrite(motorPin, 0); // desliga o motor
delay(offTime); // delay
// remova as // para ativar as funções
// speedUpandDown();
// serialSpeed();
}
// essa função acelera o motor até a velocidade máxima
// então desacelera até ele parar
void speedUpandDown()
{
int speed;
int delayTime = 20; // milissegundos para cada passo
// acelera o motor
for (speed = 0; speed <= 255; speed++)
{
analogWrite(motorPin, speed); // seta a nova velocidade
delay(delayTime); // delay entre os passos
}
// desacelera o motor
for (speed = 255; speed >= 0; speed--)
{
132
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
analogWrite(motorPin, speed); // seta a nova velocidade
delay(delayTime); // delay entre os passos
}
}
// Entra a velocidade entre 0 e 255 na Serial
void serialSpeed()
{
int speed;
Serial.println("Digite uma velocidade entre 0 e 255");
Serial.println(); // imprime uma linha em branco
while (true) //loop “para sempre”
{
// Checa se existe alguma informação na Serial
while (Serial.available() > 0)
{
speed = Serial.parseInt(); // lê o valor inteiro
digitado na Serial.
speed = constrain(speed, 0, 255);
Serial.print("Velocidade setada: "); // feedback
Serial.println(speed);
analogWrite(motorPin, speed); // seta a velocidade do
motor.
}
}
}
133
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#14 – Display LCD:
Um LCD é um display de cristal líquido que permite
escrever texto no display.
Nesse projeto você vai conseguir escrever a String “Hello
World” no display.
Nesse
projeto
também
será
acrescentado
potenciômetro para ajustar o contraste do display.
um
Componentes
•
•
•
•
•
1 - Arduino Uno
1 - Protoboard
1 - Display LCD
1 - Potenciômetro
Jumpers
Diagrama
134
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
/*
LIQUID CRYSTAL DISPLAY (LCD)
Um LCD é um display de cristal líquido, é um modulo
sofisticado que pode exibir texto e dados numéricos.
Esse modelo de display pode exibir até 16 caracteres, e
possui luz de fundo (backlight).
Se você já construiu alguns projetos usando o Serial
Monitor, o display LCD vai prover diversos benefícios pros
seus desenvolvimentos.
Esse projeto demonstra como você pode ligar um LCD em seu
Arduíno e mostrar qualquer dado que você quiser.
*/
// Carrega a biblioteca do LCD
// A biblioteca trás funções de comando LCD
#include <LiquidCrystal.h>
// Inicializa a biblioteca com os pinos que você está
utilizando.
// Nota: Você pode utilizar pinos diferentes
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
lcd.begin(16, 2); //Inicializa o LCD 16x2
lcd.clear();
// Limpa o LCD
lcd.print("Hello, World!"); // Imprime Hello, World!
}
void loop()
{
lcd.setCursor(0, 1);
//Seta o cursor na coluna 0,
linha 1.
lcd.print(millis() / 1000); //Imprime o número de
segundos desde que o Arduíno foi ligado.
}
135
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#15 - DHT11 Sensor de
Temperatura e Umidade
Esse projeto será capaz de construir um medidor de
temperatura e umidade usando o sensor DHT11.
Nesse projeto você vai precisar utilizar a biblioteca
“dht11.h”. Você pode encontrar ela disponível no Github
clicando AQUI.
Também irá precisar da biblioteca Adafruit Sensors. Você pode
baixa-la AQUI
Componentes
•
•
•
•
•
1 - Arduino UNO
1 - DHT11 sensor de temperatura e umidade
1 - Protoboard
1 - 4.7k Ohm Resistor
Jumpers
Diagrama:
136
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
// importa a biblioteca DHT11
#include "DHT.h"
#define DHTPIN 2 //Define o pino para ser conectado
// descomente a linha do modelo do sensor.
#define DHTTYPE DHT11
// DHT 11
//#define DHTTYPE DHT22
// DHT 22 (AM2302)
//#define DHTTYPE DHT21
// DHT 21 (AM2301)
// Inicializa o sensor
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("DHTxx teste!");
dht.begin();
}
void loop() {
// Aguarda 2 segundos para a medição
delay(2000);
// Lê
float
// Lê
float
// Lê
float
a umidade
h = dht.readHumidity();
temperatura como celcius
t = dht.readTemperature();
temperatura como Fahrenheit
f = dht.readTemperature(true);
Serial.print("Umidade: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
}
137
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#16 - Arduino com sensor de
movimento PIR
Montando um sensor de movimento usando um sensor de
movimento HC-SR501 (PIR).
Componentes:
•
•
•
•
1 - Arduino UNO
1 - PIR Motion Sensor (HC-SR501)
1 - LED
Jumpers
Diagrama:
138
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
int
int
int
int
led = 13; // pino de conexão do LED
sensor = 2; // pino do sensor
state = LOW; // por padrão o sensor fica em LOW
val = 0; // variável para armazenar o status do sensor
void setup() {
pinMode(led, OUTPUT); // inicializa o LED com SAÍDA
pinMode(sensor, INPUT); // inicializa o sensor como
ENTRADA
Serial.begin(9600); // inicializa a serial
}
void loop() {
val = digitalRead(sensor); // lê o sensor
if (val == HIGH) {// checa se o sensor está em HIGH
digitalWrite(led, HIGH); // liga o LED
delay(100); // delay de 100 milissegundos
if (state == LOW) {
Serial.println("Movimento detectado!");
state = HIGH; // faz o update da variável para HIGH
}
}
else {
// caso não seja detectado movimento
digitalWrite(led, LOW); // desliga o LED
delay(200);
// delay de 200 milissegundos
if (state == HIGH) {
Serial.println("Sem movimento detectado!");
state = LOW; // muda a variável para LOW
}
}
}
139
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
PROJETO#17 – Analise de solo com YL-69 ou
HL-69:
Criando um dispositivo para análise de umidade de solo, e
controlando LEDs para o solo ideal.
Componentes
•
•
•
•
•
•
•
1 - Arduino UNO
1 - YL-69 sensor de umidade de solo
1 - Protoboard
2 - 220 Ohm Resistor
1 – LED Vermelho
1 – LED Verde
Jumpers
Diagrama
140
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
int rainPin = A0; // Pino do sensor
int greenLED = 6; // Pino do LED verde
int redLED = 7; // Pino do LED vermelho
// você pode ajustar o setpoint
int thresholdValue = 800;
void setup() {
pinMode(rainPin, INPUT); // seta o sensor como ENTRADA
pinMode(greenLED, OUTPUT); // LED verde como SAÍDA
pinMode(redLED, OUTPUT); // LED vermelho como SAÍDA
digitalWrite(greenLED, LOW); // LED verde inicia em LOW
digitalWrite(redLED, LOW); // LED vermelho inicia em LOW
Serial.begin(9600); // inicia a Serial
}
void loop() {
// Lê a entrada no pino 0
int sensorValue = analogRead(rainPin);
Serial.print(sensorValue);
if (sensorValue < thresholdValue) {
Serial.println(" – Nao precisa de agua");
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
}
else {
Serial.println(" – Hora de regar sua planta");
digitalWrite(redLED, HIGH);
digitalWrite(greenLED, LOW);
}
delay(500);
}
141
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
IGNIÇÃO
Primeiro gostaria de lhe dar os parabéns por ter concluído
todos os exemplos, exercícios e todos os projetos.
Agora você já tem o direcionamento, e a bagagem de
conhecimento para construir seus próprios projetos.
Sinta-se à vontade para consultar esse livro quantas vezes
forem necessárias durante a sua jornada. Lembre-se também
que deixei o Arduino Blueprint de presente para você, que
também irá te auxiliar muito.
Cada capitulo você aprendeu funcionalidades novas, que te
deram o direcionamento para continuar evoluindo como
desenvolvedor.
O importante é treino, pratica e consistência.
A partir daqui você pode buscar novos projetos para
construir, e vou deixar de recomendação alguns lugares aonde
você pode conseguir bons projetos:
Arduino Project Hub : https://create.arduino.cc/projecthub
Lobo da Robótica Blog: https://lobodarobotica.com/blog/
Fritzing Projects : https://fritzing.org/projects/
Sempre que você construir um projeto novo, me marque no
Instagram para eu acompanhar sua evolução.
Ficarei feliz em ver que fiz parte do seu processo de
aprendizado.
142
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Infelizmente um livro uma vez baixado, não há como
adicionar novos exemplos, projetos e capítulos. Diferente do
treinamento completo, que você recebe todas as atualizações.
Esse pode ser um bom motivo para eu ver você novamente
dentro do Treinamento completo Arduhack, pois lá você
receberá todas as aulas já postadas e todas as aulas que eu ainda
vou disponibilizar.
E ainda mais, podemos estar em contato através dos
grupos exclusivos.
Você pode participar do treinamento através do link
abaixo:
https://lobodarobotica.com/treinamento-arduhackcompleto
Espero te ver lá, um grande abraço!
“Tudo parece impossível até que seja feito”
Vejo você em breve - Mateus D. Dias
Todos os direitos reservados – Lobo da Robótica 2020
143
Lobo da Robótica - ma.domingues.dias@gmail.com - CNPJ: 33.039.661/0001-80
Download