Microcontroladores e AppInventor
Microcontroladores e AppInventor
Microcontroladores e AppInventor
1. Introdução ........................................................................................................................... 1
3. ARDUINO ..........................................................................................................................23
ii
3.5. Bibliotecas ..................................................................................................................42
– IF ....................................................................................................................................46
– FOR ................................................................................................................................48
– WHILE ............................................................................................................................48
– SWICTH/CASE ...............................................................................................................48
BLINK ................................................................................................................................59
SEMAFORO ......................................................................................................................65
VIEWER ............................................................................................................................84
PALETTE ...........................................................................................................................85
PROPERTIES ....................................................................................................................88
iii
MEDIA ...............................................................................................................................89
BLOCKS ............................................................................................................................90
VIEWER ............................................................................................................................91
DIVISOR DE TENSÃO.....................................................................................................129
FUNCIONAMENTO DO SISTEMA...................................................................................134
FUNCIONAMENTO DO SISTEMA...................................................................................156
iv
PROGRAMAÇÃO NO ARDUINO .....................................................................................158
FUNCIONAMENTO DO SISTEMA...................................................................................172
REED-SWITCH................................................................................................................186
BOOT MODES.................................................................................................................190
ST-LINK ...........................................................................................................................191
v
MONTAGEM DO SISTEMA .............................................................................................229
9. ANEXOS ..........................................................................................................................276
vi
1. Introdução
1.1. Justificativa
A bagagem mobile com a qual os estudantes chegam numa instituição de ensino é enorme.
O uso de smartphones e tablets pelas pessoas já vem de berço e, ao entrar numa faculdade de
engenharia, abdicar de toda essa bagagem com que os alunos chegam não é uma das melhores
ideias para o ensino de diversas disciplinas.
Além disso, a utilização de dispositivos móveis faz parte do dia a dia e a utilização de
computadores e notebooks está cada vez mais em desuso, salvo para a elaboração de trabalhos
que exigem suas capacidades. O que queremos é manter a rotina e utilização dos dispositivos
móveis, acrescentando uma forma de aplicação útil dos mesmos.
Assim, a partir da apresentação do conteúdo de maneira simples ao aprendizado, o aluno
terá conhecimento dos conceitos mínimos necessários para que desempenhem, posteriormente
e com mais facilidade, atividades na construção de tipos básicos de sistemas de automação
residencial. E de posse desses conhecimentos, eles poderão partir para aplicações mais
complexas em disciplinas que exigem um conhecimento mais profundos.
De posse do seu dispositivo móvel, o aluno será capaz de realizar o controle de cargas em
sua própria residência e, além disso, aprenderá sobre questões de confiabilidade dos resultados
do seu controle. Ou seja, será capaz de verificar se, ao solicitar uma ação, ela foi executada
como pretendida, garantindo segurança das ações a serem realizadas.
1
Por fim, a partir do que aqui será exposto espera-se que a aquisição desses conhecimentos
desperte o interesse não apenas em automação residencial, mas em microcontrolados, IoT
(Internet of Things) e áreas associadas, agregando conhecimento e motivando na busca por
maior competência em cursos como Engenharia da Computação, Engenharia de Controle e
Automação, Engenharia Mecatrônica, dentre outras.
2
2. Conceitos Básicos de Eletricidade e Eletrônica com analogia
Hidráulica
Para transferir água de uma caixa para outra precisaremos de um condutor de água, como
por exemplo, um cano (Fig. 2.2).
3
O cano conduz com facilidade a água, pois ele é oco e liso não oferecendo oposição ao fluxo
de água. Se colocarmos o cano na parte superior da caixa somente um pouco de água irá passar
de uma caixa para a outra e o fluxo irá parar rapidamente fazendo com que o objetivo não seja
atingido, não se transferirá toda a quantidade de uma caixa para outra (Fig. 2.3).
Se colocarmos o cano na parte inferior as duas caixas ficarão com a mesma quantidade de
água e quando isso acontecer o fluxo deixara de acontecer e o objetivo não será atingido pois
não se transferiu toda a quantidade de uma caixa para outra.
Se colocarmos as caixas em alturas diferentes (caixa com água mais alta que a caixa
sem água) a água irá fluir para a caixa mais baixa (Fig. 2.5). O tempo gasto neste processo
dependerá da espessura interna do cano e da diferença de altura entre as duas caixas.
4
Com isso conclui-se que:
A água sempre irá da caixa mais alta para a caixa mais baixa desde que haja um condutor
interligando-as;
A agua naturalmente irá do potencial mais alto para o potencial mais baixo;
Sem diferença de potencial (neste caso a altura) não existe fluxo de água;
O fluxo acaba quando acabar (esvaziar) a água da caixa de potencial mais alto ou quando
for retirado o elemento condutor, neste caso o cano;
Quanto mais fino o condutor (cano) menor é o fluxo de água e maior é a resistência à
passagem de água;
O fluxo não depende do tamanho das caixas e sim da diferença de potencial (altura) entre
elas.
Da mesma forma que temos fluxo de água no condutor hidráulico (cano) temos o fluxo
ordenado de partículas portadoras de carga elétrica no condutor elétrico (fio). Esse fluxo se dá
pela diferença de potencial elétrico nas extremidades do condutor elétrico, como pode ser visto
na Fig. 2.6 à seguir:
5
Para que um material seja condutor é preciso que o mesmo atenda uma propriedade
física chamada condutividade. Condutividade é a capacidade dos materiais de conduzirem
corrente elétrica. Quanto à condutividade os materiais podem se classificar em:
Condutores – Que conduzem naturalmente corrente elétrica;
Semicondutores – Necessitam de estímulo via diferença de potencial (DDP) para
conduzirem;
Isolantes – Não conduzem corrente elétrica.
No item “2.1. Condução Hidráulica Contínua” foi demonstrado o fluxo de água de uma
caixa d’água A para uma caixa d’água B. Nesse caso, percebe-se que a água flui apenas em
uma direção, pois há uma diferença de altura entre as caixas d’água. Agora será demonstrado
como se obtém o fluxo nas duas direções.
Supõem-se duas caixas de água conforme apresentadas na Fig. 2.8.
6
Como pode ser visto a caixa d’água A está mais alta que a caixa d’água B. Isso implica
no fluxo natural da caixa d’água A para a caixa d’água B.
Se após a caixa d’água B estiver cheia houver a elevação da altura da mesma em relação
a caixa d’água A que vai estar vazia, ocorrerá o processo inverso, o fluxo de água ocorrerá da
caixa d’água B para a caixa d’água A, conforme Fig. 2.9 a seguir.
Se este movimento for constante, a troca de altura entre as caixas assim que a caixa de
altura superior estiver vazia, produzirá um fluxo constante ordenado de um lado para o outro
conforme Fig. 2.10 a seguir.
7
Figura 2.10. Ciclo de fluxo de água entre as caixas d'agua.
Figura 2.11. Fluxo d’água entre as caixas. Observa-se um movimento análogo ao senoidal.
8
2.4. Condução elétrica alternada
Agora que está entendido o fluxo de água de uma caixa d‟água A pra outra caixa d‟água
B e vice-versa em um movimento e vai e vem constante, fica fácil imaginar o movimento dos
elétrons quando se trata de corrente alternada.
A corrente elétrica alternada varia o sentido do fluxo dos elétrons ao longo do tempo. A
forma de onda mais usual é a senoidal, em forma de senóide conforme Fig. 2.12.
Como os elétrons vão de um potencial mais alto para o potencial mais baixo, fica claro
que essa variação de potencial ocorre constantemente invertendo assim o sentido do fluxo dos
elétrons. Na maioria dos países da América, inclusive Brasil e EUA a frequência da rede elétrica
é 60 Hz. Isso significa que o fluxo de elétrons inverte seu sentido 60 vezes a cada segundo.
9
Figura 2.13. Esquema mecânico de uma válvula de retenção.
10
elétrica. No primeiro caso temos a proteção e, no segundo, temos a retificação que nada mais é
que a utilização da corrente em um único sentido, descartando, assim, a corrente no sentido
contrário.
Para isso, utiliza-se um componente chamado “diodo” e seu símbolo eletrônico bem como
a representação de um modelo convencional em eletrônica pode ser visto na Fig. 2.15.
11
Dessa forma fica fácil entender que caso haja algum obstáculo no interior do tubo ou
mesmo acúmulo de algum tipo de sujeira no mesmo a passagem do fluído ficará comprometida
como pode ser visto na Fig. 2.17.
Da mesma forma se o tubo estiver com dano físico, amassado, criará também uma
oposição à passagem do fluído conforme Fig. 2.18.
Às vezes é preciso criar uma resistência hidráulica para que se possa diminuir o fluxo de água
em determinadas situações. Para isso emprega-se o uso um componente chamado redução e
seu esquema pode ser visto na Fig. 2.19 e um exemplar do memso em Fig. 2.20.
12
Figura 2.19. Esquema de redução hidráulica.
13
Figura 2.21. Comportamento dos eletrons no condutor metálico. Fonte:
http://biocasantanabloguefq.blogspot.com.br/2014_05_01_archive.html. Acesso em out/2018.
O seu valor nominal é apresentado por faixas coloridas (código de cores), que obedecem
ao seguinte critério: partindo da extremidade, as duas primeiras cores formam um número com
14
dois algarismos; a terceira cor corresponde ao expoente da potência de 10 que multiplica o
número inicial; a quarta cor corresponde à tolerância que mostra, percentualmente, a faixa de
valores em que pode variar a resistência do resistor. A tabela a seguir mostra o código de cores
com suas correspondências.
Alguns resistores são dotados de cinco faixas, ao invés de quatro. Nesses casos, as três
primeiras cores irão formar um número de 3 algarismos e as faixas seguintes sequem o mesmo
princípio já exposto (multiplicador e tolerância). A imagem a seguir traz um exemplo de tabela de
cores para resistores.
Com um tabela dessas podemos agora calcular o valor de um resistor. Tomemos como
exemplo o resistor da Fig. 2.24 para verificarmos o seu valor.
15
Figura 2.24. Resistor de 47000 ohms.
As duas primeiras cores, Amarelo (4) e Violeta (7), formam o número 47. A terceira cor,
laranja (3), corresponde ao expoente da potência de dez: 103; a quarta cor, prata (10%), indica a
tolerância. Assim, a resistência elétrica é: 47103Ω (ou 47000Ω ou, ainda, 47kΩ) ± 10%.
Uma vez que foram apresentados todos os modelos ficam claras as suas associações e
intuitivas as relações de proporção de acordo com a Primeira e Segunda lei de Ohm.
A Primeira Lei de Ohm postula que para um condutor ôhmico (resistência constante),
mantido à temperatura constante, a intensidade de corrente elétrica será proporcional à diferença
de potencial (ddp) aplicada entre suas extremidades. É representada pela seguinte fórmula:
𝑈
𝑅=
𝐼
Onde:
R – resistência, medida em Ohm
U – ddp, medida em Volts (V)
I – intensidade de corrente elétrica, medida em Àmpere (A).
16
2.9. Usando modelo de acionamento para produzir trabalho
Uma das máquinas hidráulicas mais simples inventadas pelo homem, o monjolo (Fig.
2.25) chegou ao Brasil com os portugueses durante o período colonial. E, por muito tempo,
tornou-se ferramenta indispensável na lida, pois dispensava o uso de mão-de-obra escrava, que
antes socava e moía os grãos em pilões.
A força da queda d'água o impulsiona como se fosse uma gangorra. De um lado, uma
concha recebe a água até se encher totalmente. Isso faz com que a outra parte do monjolo, onde
há uma estaca, se levante. Ao esvaziar a cuba, o movimento se inverte. E nesse sobe-e-desce,
o grão vai sendo socado e moído dentro de um pilão. Obviamente que a tarefa é mais demorada,
se comparada ao uso de equipamentos elétricos.
O funcionamento deste equipamento mostra claramente a utilização de um tipo de
acionamento (hidráulico) produzindo um trabalho (mecânico).
Da mesma forma que foi mostrado o monjolo e seu modelo de acionamento separado do
trabalho, na eletrônica também são usados componentes com essa função onde o acionamento
é isolado da carga. A esse componente dá-se o nome de relé e pode ser visto na Fig. 2.26.
17
Figura 2.26. Relé e suas esquematizações. Fonte:
http://eletronicaemcasa.blogspot.com/2013/12/como-acionar-um-rele-com-arduino-ou-pic.html.
Acesso: out/2018.
18
Figura 2.27. Registro de gaveta. Fonte: https://www.leroymerlin.com.br/registro-de-gaveta-rotativo-
32mm-ou-1-docol_86943913. Acesso em: out/2018.
19
Como pode ser visto, conforme se gira o registro a passagem de água é obstruído ou
liberado aos poucos.
20
O recurso consiste em uma pequena partícula de material semicondutor como o silício ou
germânio, cuja capacidade de conduzir corrente elétrica se situa entre as dos
materiais condutores e isolantes. Cada transistor tem três terminais, como se fossem canais,
que recebem o nome de “emissor”, “coletor” e “base” podendo se apresentar de dois modos
distintos baseados na ordem em que os materiais semicondutores se organizam no componente
(PNP ou NPN) os quais podem ser vistos na Fig. 2.30.
A classificação NPN e PNP é baseada no tipo do material semicondutor empregado.
Observando a letra do meio pode-se dizer qual o tipo do material da base, a qual é o registro do
transistor, sendo assim, se for tipo N significa que é controlado por carga negativa, ser for tipo P
significa que é controlado por carga positiva.
Um dos terminais (coletor) recebe a tensão elétrica, e o outro envia o sinal amplificado
(emissor). Já o canal do meio (base) – também conhecido como terminal de controle – é o
responsável por fazer a mediação deste processo, uma vez que a corrente elétrica só entra e sai
pelos condutores das pontas somente quando o do meio recebe uma tensão elétrica. Portanto,
ele que faz o controle do processo. A quantidade de tensão aplicada ao terminal do meio
determinará qual será a intensidade da corrente que sairá pelo terminal de saída.
Em computadores e sistemas microcontrolados o transistor não é empregado como
amplificado, ele trabalha como chave, pois controlam a chamada “lógica binária” ou “lógica
digital” para executarem suas operações internas.
A lógica digital é um ramo peculiar da lógica matemática que por sua vez é um ramo da
lógica formal. A peculiaridade consiste no fato de que suas variáveis podem assumir apenas dois
valores mutuamente exclusivos: verdadeiro ou falso, jamais um valor intermediário.
Estes dois valores são usados para representar os algarismos “um” e “zero” empregados
nas operações internas dos computadores. Desta forma podemos afirmar que “Verdadeiro = 1”
21
e “Falso = 0” e, apenas com estes dois algarismos, representar todos os números no sistema
numérico binário, ou de base 2.
22
3. ARDUINO
O Arduino é uma plataforma de prototipagem sendo, nesse quesito, utilizada tanto para
testes quanto para o planejamento e desenvolvimento de projetos. É uma placa com
microcontrolador, capaz de comandar e responder à estímulos de elementos externos
conectados ao mesmo.
Nesse livro, o objetivo do uso desse e de outros microcontroladores é o de criar
ferramentas que são acessíveis, de baixo custo, flexíveis e fáceis de usar por profissionais,
amadores e, principalmente, para aqueles que não teriam alcance aos controladores mais
sofisticados e de ferramentas mais complexas.
Esse material trás em específico algumas informações referentes a versão do
microcontrolador denominado Arduino Uno, e todas as implementações realizadas que
envolverem a plataforma serão relativos ao modelo nesse capítulo.
Para mais informações sobre modelos de Arduino consulte o Anexo I
23
Praticidade;
Por ser uma plataforma de desenvolvimento completa com os circuitos básicos
necessários (controladores de tensão, comunicação serial, clock, ...) torna-se prático o
desenvolvimento e teste de projetos.
Escalabilidade;
Por ser de fácil integração com placas de expansão é possível o empilhamento de
placas e recursos, tornando o projeto adaptável a mudanças e melhorias.
Diversidade de modelos;
Com um número superior a 20 modelos existentes no mercado, as opções de escolha
para um determinado projeto ficam evidentes.
Diversidade de Shields.
Uma grande variedade de placas de expansão está disponível no mercado.
24
Cada pino do Arduino Uno possui internamente um resistor de pull-up com resistência de
20-50kΩ e que estão desabilitados, por padrão, mas que podem ser habilitados via software.
Além disso, alguns desses pinos possuem algumas funções únicas:
Comunicação serial: os pinos 0 (RX) e 1 (TX) são responsáveis pela recepção e
transmissão, respectivamente, serial de dados. Os mesmos realizam a
comunicação USB com o computador do usuário e, sendo assim, é necessário
que estejam livres de qualquer conexão no momento da compilação de um
programa desse computador para a placa para que não ocorram erros.
Interrupção externa: quando desejamos que uma atividade seja interrompida para
que outra seja realizada podemos executar essa ação programando o pino 2 ou 3
para tanto.
PWM: os pinos 3, 5, 6, 9, 10 e 11 permite uma saída PWM (Modulação por Largura
de Pulso, do inglês Pulse-Width Modulation) de 8-bits e pode ser utilizado para
controlar o nível de tensão do pino, por exemplo.
SPI: um protocolo de dados serial que permite que o Arduino se comunique com
outros dispositivos formando uma rede de arquitetura mestre-escravo entre eles.
Utiliza, para tanto, os pinos 10, 11, 12 e 13.
LED: O pino 13 é capaz de controlar um LED construído na própria placa
alternando o nível de tensão que passa pelo mesmo para ligar ou desligar o
componente.
Ainda sobre os pinos, é interessante saber que os analógicos fornecem uma resolução
de 10-bits do valor de tensão que passa por eles. Isso significa que o valor de tensão pode ser
dividido numa faixa de até 1024 valores (0 à 1023).
O microcontrolador do Arduino Uno possui uma memória flash1 de 32 KB, sendo que 0.5
KB já estão em uso pelo bootloader2. Embora possa parecer uma memória muito pequena, ela
é suficiente para o desenvolvimento de aplicações diversas e mais que suficiente para os projetos
que serão desenvolvidos aqui.
As placas Arduino em seus diferentes modelos possuem uma extensa documentação,
indo bem além do que já foi aqui exposto. Afim de não delongar e tomar foco no que é de
interesse nesse material, outras informações relativas ao Uno (e outros modelos), além de
detalhamento mais aprofundado, podem ser melhor verificada no site: https://www.arduino.cc/.
1 A flash é uma memória não volátil onde os softwares elaborados são armazenados.
2 O bootloader é um software pré-gravado executado ao ser dado o boot (um reset) na placa e é
responsável por carregar na memória Flash um programa que é recebido pela porta serial e também pela
sua execução. Caso não haja um programa a ser carregado, é feita uma procura já na memória buscando
a existência prévia de algum software para execução.
25
A seguir, na Fig. 3.2., algumas características importantes sobre a placa de prototipagem
em questão.
26
Figura 3.3. Informações técnicas, em resumo, do Arduino Uno. Fonte: disponível em:
https://store.arduino.cc/usa/arduino-uno-rev3. Acessado em: set/2017.
27
3.3. Shields
Embora o Arduino seja um microcontrolador útil para diversas aplicações, cada versão
da plataforma possui suas limitações. Para tornar possível a conexão com uma rede local ou
facilitar a utilização de um motor, por exemplo, são utilizados os chamados shields.
Um shield é uma placa de circuito que funcionam como uma extensão do Arduino, sendo
acoplados aos mesmos, aprimorando suas capacidades num dado aspecto. Para utiliza-los é
comumente incluído na programação alguma biblioteca específica que habilitam e facilitam as
funcionalidades da placa específica para uma dada atividade.
Mas adiante, alguns shields e módulos serão utilizados nos experimentos elaborados
para demonstrar aplicações do microcontrolador nesse livro.
Para informações acerca dos diversos shields existentes, consulte o Anexo II
Figura 3.5. Exemplos de alguns shields. Da esquerda para direita e de cima para baixo temos os
shields: GSM/GPRS, para motores, Ethernet e de relês.
28
3.4. Arduino IDE
Figura 3.6. Recorte da página de downloads. À direita, as opções de download do programa para
Windows, Mac e Linux.
29
ser de interesse a criação de uma instalação portátil que será explicada mais adiante. O
download pela Microsoft Store exigiria acesso e permissões à pasta referente aos seus
aplicativas que, inicialmente, já é ocultada pelo próprio sistema operacional. Tais contratempos
para acessar, adicionar, remover, editar etc, elementos da IDE são desnecessários sendo, por
isso, o “installer” a melhor opção.
Ao clicar em uma delas, seremos redirecionados para uma página de contribuição para
com o software. Aqui, devemos selecionar “just download”, caso não haja interesse em
contribuição financeira, ou em “contribute & download”, caso haja.
Figura 3.7. Recorte da página de solicitação de doação antes do download propriamente dito do
Arduino IDE.
30
Figura 3.8. Ícone do instalador do Arduino IDE após download.
Em seguida, uma janela aparecerá com os termos referente a licença do software e nela
devemos (após a leitura, caso seja de interesse) selecionar “I Agree” para seguir em frente.
31
Figura 3.10. Tela do acordo de licença do software do Arduino.
Feito isso será apresentada uma nova janela para seleção de instalação de componentes
na qual devemos clicar em “Next >” para prosseguir.
Por fim, a instalação será iniciada após a escolha do local de destino das pastas do
software, na qual podemos deixar a pasta escolhida por padrão e clicar em “Install”.
32
Figura 3.12. Janela de seleção da pasta de destino na qual os arquivos necessários para o
funcionamento da IDE serão instalados.
Figura 3.13. Ícone do atalho criado na área de trabalho referente ao Arduino IDE.
A instalação pela loja do Windows procede como a instalação dos demais aplicativos
provenientes da mesma, sendo gerado um ícone para o aplicativo, e com a utilização da interface
funcionando da mesma maneira. Como já dito, ela só não é a instalação mais recomendada
devido as dificuldades de acesso as pastas da raiz do Arduino IDE que, como veremos mais
adiante, podem ser importantes e tornar as coisas mais práticas.
33
Figura 3.14. Arquivo compactada e pasta após descompactação de uma versão do Arduino IDE 1.8.
34
Figura 3.15. Aplicativo já extraído após Download. Fonte:
https://www.arduino.cc/en/Guide/MacOSX. Acesso: ago/2018.
O arquivo de aplicação do Arduino deve então copiado para uma pasta de interesse da
máquina como, por exemplo, a de Aplications e o procedimento de instalação está finalizado.
35
IDE PORTÁTIL (WINDOWS E LINUX)
É um método utilizado e recomendado em situações onde o uso do IDE se faz num
ambiente onde o usuário não tem privilégios de administrador sobre a máquina que utiliza, como
acesso a pastas, instalação de pacotes, dentre outros. Dessa maneira, a melhor forma para se
proceder é possuir uma versão portátil da IDE.
Para tanto, é necessário realizar o download da pasta compactada (.ZIP) referente ao
sistema operacional utilizado e sua arquitetura específica. Feito isso, iremos descompacta-lo
numa pasta de destino ou pendrive.
Na pasta raiz criaremos um novo diretório denominado “portable”, junto das demais
pastas.
De agora em diante, ao iniciarmos o executável do Arduino, também contido na raiz, o
diretório “portable” será preenchido com bibliotecas, projetos, etc. pertinentes aos
desenvolvimentos realizados.
Figura 3.17. Raiz da IDE já com o novo diretório criado. Identificamos também, na raiz, o executável
do Arduino para iniciar o software.
36
ARDUINO WEB EDITOR
Além de todas as opções de download do IDE para a elaboração de códigos para o
Arduino existe também a possibilidade de acesso online ao ambiente. Podemos ver essa como
sendo a primeira opção na página do software: https://www.arduino.cc/en/Main/Software.
Figura 3.18. Página de Downloads do Arduino IDE. Acima das opções de download é apresentada
a opção de utilizar o Arduino Web Editor.
INTERFACE DO IDE
Ao iniciar o programa pelo seu atalho ou executável a interface do Arduino será
carregada e a mesma é como se segue na Fig. 3.19. Nela, temos:
1. o menu principal, cujas opções serão esclarecidas adiante;
2. uma barra de ferramentas com botões;
3. a região de abas e menu acerca das mesmas;
4. a área de trabalho onde o código será elaborado;
5. a área de mensagens de erros e notificações pertinentes ao código
desenvolvido;
6. informações sobre a porta de comunicação serial que está utilizando.
37
1
2
3
5
6
O menu de opções (1) agrega questões diversas gerais do arquivo do projeto e auxilio no
texto do código.
O menu “Arquivo” lida com as questões de salvamento do projeto, iniciação de um novo,
manipulação de preferências de layout da janela, visualização dos já criados em sketchbook,
além de exemplo disponibilizados pela própria plataforma de diversos projetos possíveis.
38
Figura 3.20. Menu "Arquivo" do IDE.
Figura 3.21. Exemplos do menu "Arquivo". Uma série de exemplos são disponibilizados facilitando
o entendimento sobre diversas funções do software.
39
Em “Editar” temos opções de desfazer ou refazer alterações enquanto estamos editando
o código, seleções e colagem do código, localização e substituição, identação, modificação do
texto para comentário e alteração do tamanho de fonte.
40
O menu “Ferramentas” envolve algumas questões primordiais como a seleção da placa
que estamos utilizando, a porta serial que a placa está utilizando para sua comunicação, bem
como um monitor serial do que está ocorrendo durante a comunicação, dentre outras questões.
Por fim, em “Ajuda” temos informações sobre o Arduino, seu ambiente, auxilio para
iniciantes dentre outras opções relacionadas.
41
No que diz respeito a barra de ferramentas (2) a mesma agrega, respectivamente,
questões relativas a checagem do código por erros, compilação e carregamento do código para
o Arduino, criação de novo Sketch (arquivo para escrita do código), abertura de aba mostrando
os projetos já salvos, salvamento do que está sendo escrito e, por fim, o monitor serial, onde
informações da comunicação entre máquina e Arduino podem ser mostrados.
Novo Abrir
Figura 3.26. Os botões, da esquerda para direira: verificar, carregar, novo, abrir, salvar e monitor
serial.
As demais áreas relevantes serão apresentadas mais adiante conforme convir e for
necessário.
Faremos, a seguir, uma breve leitura de questões importantes voltadas a programação,
para que tenhamos uma noção da forma de escrita e estruturas importantes para tanto.
3.5. Bibliotecas
42
cabeçalho (.h) referentes a pasta da mesma. A inclusão é feita através das declarações
“#include”.
Figura 3.27. Caminho para inclusão de bibliotecas já existentes no IDE. Selecionaremos a biblioteca
"Ethernet".
Podemos adicionar ao código apenas parte dos cabeçalhos de uma biblioteca, caso tenhamos a
certeza de que nem todas as inclusões feitas ao selecionarmos o item da lista de bibliotecas
serão necessárias. Isso diminui o consumo de memória quando o programa for compilado para
o Arduino.
Figura 3.28. Linhas de código acrescidas após seleção da biblioteca "Ethernet" para inclusão.
43
Pelo IDE podemos também utilizar o “Gerenciar Bibliotecas...” e, através dele, realizar o
download e instalação de uma biblioteca disponível.
Figura 3.29. Gerenciador de Biblioteca aberto após selecionar a opção, da lista de bibliotecas,
"Gerenciar biblioteca...".
Para isso, é necessário uma conexão com a internet que possibilite o download e, ao
localizar a biblioteca de interesse, basta escolher a versão desejada e clicar no botão “Instalar”.
Quando a instalação for finalizada, é possível verificar a palavra “INSTALLED” e a versão
instalada ao lado do nome da biblioteca e, assim, podemos fechar a janela do gerenciador.
Figura 3.30. A biblioteca cuja instalação foi solicitada apresenta a mensagem "INSTALLED" e a
versão, quando a instalação é finalizada, ao lado do nome da mesma.
44
o arquivo compactado devemos clicar em “Abrir” e a biblioteca será incluída no banco sendo
mostrada na lista.
Figura 3.31. Janela aberta para a seleção do .ZIP para inclusão na lista de bibliotecas.
Uma outra forma de inclusão seria realiza-la manualmente. Para tanto, precisamos extrair
a pasta compactada da biblioteca e encontrar um local no qual a biblioteca pode ser administrada
pelo Arduino IDE, como o Sketchbook onde cada sketch criado é armazenado por padrão.
A pasta descompactada contém todos os arquivos necessários para o funcionamento da
biblioteca e o local para instalação pode ser encontrado no menu “Arquivo” em “Preferências”.
Localizado o caminho que, por padrão, é “..\<nome do usuário>\Documents\Arduino” (no
Windows) devemos acessar a pasta “libraries” e copiar a pasta da biblioteca no local.
Figura 3.32. Janela de preferências do Arduino IDE, onde podemos verificar o local de
armazenamento dos projetos (Sketchbook).
45
Figura 3.33. Pasta copiada para "libraries", onde o Arduino IDE terá acesso para utiliza-la nos
projetos a serem desenvolvidos.
Devemos tomar atenção a alguns detalhes no que diz respeito as bibliotecas salvas no
sketchbook:
A versão da biblioteca utilizada num novo sketch será aquela salva em “libraries”
do sketchbook, mesmo que uma versão mais atualizada esteja presente na
distribuição do IDE ou nos arquivos principais do programa;
Quando o programa passa por uma atualização, todas os arquivos do local onde
a instalação do Arduino IDE foi realizada são deletados e substituídos. Dessa
forma, a preservação das bibliotecas instaladas e utilizadas por um dado usuário
dependem de o mesmo te-las devidamente colocadas em seu sketchbook, o que
evita que as mesmas sejam perdidas no processo.
– IF
Estrutura utilizada para realizar comparações e, caso a condição dada seja satisfeita, uma
ação será executada. Podemos utilizar o “if” de diferentes maneiras sendo essas variações
dependentes do que se deseja obter com as comparações.
A forma básica para utilizar o if é como se segue:
46
if (comparação a ser obedecida){
//ação a ser realizada
}
if (comparação 1){
//ação a ser realizada
}
else (comparação 2){
//ação a ser realizada
}
if (comparação 1){
//ação a ser realizada
}
else if (comparação 2){
//ação a ser realizada
}
...
else (comparação n){
//ação a ser realizada
}
Seria possível realizar uma sequência de condições utilizando apenas a estrutura “if”.
Porém, o uso do “else” torna o programa mais rápido quando as ações realizadas têm suas
condições interligadas.
Podemos utilizar o seguinte exemplo para compreender melhor: havendo uma ação a ser
realizada dependente de um valor numérico a ser recebido pelo programa, se uma comparação
entre o valor esperado e o valor recebido for satisfeita no primeiro “if” utilizado, “else” e os “else
if” em sequência (caso haja) não serão executados, pois são comparações que só ocorrem caso
uma anterior não tenha sido satisfeita. Sendo assim, satisfeita a comparação em algum ponto,
as demais não serão verificadas, pois não há necessidade para tanto.
Diferentemente do cenário observado no exemplo, usando apenas a estrutura “if”, todas
as comparações seriam feitas, mesmo que a condição de uma delas já tivesse sido satisfeita o
47
que, dependendo do tamanho e complexidade do projeto, pode não ser interessante e
desperdiçar recursos.
– FOR
Estrutura utilizada para realizar controle do fluxo do programa. O mesmo permite a
realização de repetições dum conjunto de instruções de acordo com alguns parâmetros pré-
estabelecidos. O que o diferencia de outras estruturas de loop (repetição) é uso de um contador
incremental ou de decremento, sendo recomendado quando a quantidade de repetições do loop
é sabida. Sua forma é como se segue:
– WHILE
Estrutura de controle de fluxo que realiza um loop, por tempo indefinido, das instruções
dentro do seu bloco de declaração. Quando a expressão de condição é verdadeira o programa
entrará naquela estrutura de repetição e apenas sairá quando a expressão for falsa. Sendo
assim, uma condição interna ou externa ao loop, como o incremento de uma variável, teste de
um sensor ou outra condição de parada.
É interessante notar que um for-loop pode ser passado como um while-loop e vice-versa,
sendo a diferença entre eles a questão de quantidade de repetições definida e indefinida de suas
instruções internas.
O “while” é construído como se segue:
– SWICTH/CASE
Realizam controle de fluxo de maneira análoga ao “if”. Trabalha com casos, os quais são
selecionadas de acordo com o valor de uma variável a ser testada. Assim, dado um valor
referente a variável de teste, o valor será comparado com sua resposta específica que é atribuída
a cada caso. Veja:
48
switch (variável){
case valor1:
//declaração de instruções
break;
case valor2:
//declaração de instruções
break;
default:
//instruções para caso nada mais se encaixe
}
No código, o comando break para o teste do switch e, caso não fosse utilizado ao final de
cada caso, a execução se perpetuaria até o final do fluxo. O comando pode ser utilizado nas
demais estruturas de repetição como uma condição de parada, interrompendo o loop.
49
analógico-digital. Isso permite uma leitura de 1024 valores (entre 0-1023), ou
seja, numa resolução de 0,49mV;
analogWrite() – escreve um valor analógico num pino;
Serial.begin() – estabelece a taxa de transferência de dados seriais, em bits
por segundo;
Serial.available() – pega o número de bytes disponível para leitura à partir
de uma porta serial;
delay() – para o programa por uma determinada quantidade de tempo que
deve ser especificada em milisegundos.
Variáveis são objetos que retêm uma expressão ou valor, o qual pode ser pré-
estabelecido ou vindos de alguma leitura ou retorno de resultado, por exemplo.
Existem diversos tipos de variáveis e as mesmas devem ser declaradas antes de serem
utilizadas, ou seja, terem um tipo definido e, caso seja de interesse, inicializada (estipulada com
um valor inicial). Algumas dos tipos de dados comumente utilizadas no Arduino são:
int – para declaração de números inteiros;
Float – para declaração de números de ponto flutuante;
Char – para declaração de um caractere ASCII a ser armazenado em um byte
de memória;
String – conjunto de zero ou mais caracteres;
Boolean – para declarar uma variável que pode ser atribuída de apenas dois
valores: true(verdadeiro) e false (falso).
Tendo em vista o que é uma variável booleana, um operador booleano são aqueles que
verificam uma condição como sendo verdadeira ou falsa. São empregados na programação do
Arduino em estruturas “if” para verificar a condição estabelecida.
Os operadores são:
&& – representa o “e” lógico, sendo verdadeiro apenas quando duas condições
são verdadeiras;
|| – representa o “ou” lógico, sendo verdadeiro se uma das condições for
verdadeira;
! – representa o “não” lógico, sendo verdadeiro se a condição apresentada for
falsa;
50
Os operadores aritméticos são aqueles aplicados em operações matemáticas envolvendo
variáveis. São eles:
Igualdade (=);
Adição (+);
Subtração (-);
Multiplicação (*);
Divisão (/);
Resto da divisão (%).
Por fim, os operadores de comparação fazem o que o nome sugere: comparam duas
variáveis, sendo bastante utilizados nas estruturas condicionais. São os que seguem:
Igual a (==);
Diferente (!=);
Menor que (<);
Maior que (>);
Menor ou igual a (<=);
Maior ou igual a (>=).
51
Figura 3.34. Interface com alguns comentários sobre as regiões de programação do IDE.
52
“Windows + x” (em máquinas com sistema operacional Windows) e selecione a opção
“Gerenciador de Dispositívos”, localize a opção de “Controladores USB”, clique com o botão
direito em “Verificar se há alterações de hardware” para tentar solucionar o problema e conecte
a placa novamente.
53
Figura 3.36. Lista de seleção de placas do menu em "Ferramentas" > "placa:". Abaixo da opção de
seleção, verifica-se que “Porta” está desabilitada.
Figura 3.37. Gerenciador de Dispositivos, onde "Controladores USB" pode ser localizado.
54
3.10. Corrigindo problemas de conexão
3 Empresa especializada em tecnologia que oferece, dá suporte e desenvolve produtos, muitos deles
voltados na conversão de algum sinal para sinais de USB. A sigla FTDI, significa “Future Technology
Devices International”
55
Figura 3.39. Recorte da página http://www.wch.cn/download/CH341SER_EXE.html. Clicando no
botão azul, destacado em vermelho, o driver para Windows do CH340 será baixado.
Figura 3.40. Localizado o arquivo baixado, dê um clique duplo com o botão esquerdo, aguarde o
carregamento e solicitação de permissão e, após fornecer permissões, clique em "INSTALL" e siga
com o procedimento de instalação.
56
Figura 3.41. Caminho do código exemplo que deve ser carregado na placa.
57
Arduino funcional
Figura 3.42. Esquema das conexões a serem feitas pra carregamento do bootloader.
Figura 3.43. Selecionamos "Gravar Bootloader" e, em seguida, devemos abrir o menu novamente
para verificar a opção "Programador" (opção acima de gravar).
58
3.11. Criando e executando um sketch
Partindo do que foi apresentado até o momento serão elaborados alguns projetos
envolvendo o microcontrolador Arduino Uno, os componentes eletrônicos que já foram discutidos
inicialmente (resistores, díodos, etc), além de alguns outros elementos que serão explicados
conforme seus casos de uso forem apresentados.
BLINK
Diferente do que acostumamos a fazer quando iniciamos nossos estudos numa nova
linguagem de programação, quando se trata do Arduino o projeto inicial equivalente ao “Hello,
World!” consiste em fazer um LED piscar (blink).
Um LED (Light Emitting Diode) é um diodo que emite luz quando é energizado. O mesmo
tem uma ordem correta de conexão (por ser um diódo), é polarizado, possuindo um de seus
pinos de conexão maior que o outro, normalmente, sendo o ânodo (lado positivo) a perna maior
e o cátodo (lado negativo), a menor. Dependendo do tamanho do LED é possível verificar com
uma certa facilidade os polos pelas partes internas dentro do componente sendo o positivo e o
negativo, respectivamente, o lado menor e o maior.
Na Fig. 3.44 também é mostrada mais à direita uma terceira forma de identificação dos
polos na qual, pelo invólucro de vidro, o pino referente a parte chanfrada (achatada) é o negativo.
Não existe uma função específica que faça um LED piscar e, sendo assim, é necessário
desenvolver um código que faça o trabalho utilizando das demais funções, estruturas, etc. que o
ambiente de desenvolvimento nos propicia. A imagem a seguir ilusta as necessidades do código.
59
Figura 3.45. Ciclo de ações necessárias para fazer um LED piscar.
O próprio IDE traz alguns exemplos de aplicações da placa, como falado anteriormente.
Então, nesse caso, não precisaremos escrever o código para testar a aplicação. Iremos iniciar o
programa e acessar o menu “Arquivo” > “Exemplos” > “01. Basics” > “Blink”. Será então aberta
uma nova janela com o código Blink carregado e comentado com um cabeçalho inicial e cada
linha do mesmo, informando sobre suas funções.
60
Figura 3.47. Nova janela do Arduino IDE, com o exemplo "Blink" aberto.
É importante, como mostrado em Blink, realizar comentários ao longo do código para que
informações importantes sobre o mesmo não sejam esquecidas e para que outras pessoas que
tiverem acesso ao mesmo possam melhor compreende-lo. Para tanto, utilizamos duas barras
(//), quando o comentário é feito em apenas uma linha e, para uma dada quantidade de linhas
ser comentada, podemos ou iniciar cada linha com as barras ou utilizar uma barra e asterisco ao
início da região e um asterisco e barra, ao final (/* */).
No programa teremos, em setup(), a inicialização de elementos relacionados a placa. No
caso fez-se uso da função pinMode, que toma como argumentos o pino desejado que, nesse
caso, foi o LED_BUILTIN, e como o pino será utilizado, para saída de dados (OUTPUT).
A maioria dos Arduinos possui um pino conectado a um LED da própria placa e ligada em
série a um resistor. Conforme já identificado na Fig. 3.2., o modelo Uno tem esse componente
próximo ao pino 13. Sendo assim, LED_BUILTIN é o nome dado ao pino que está associado a
esse LED.
As declarações realizadas com a função pinMode fazem, então, com que o pino 13 haja
como uma saída de sinal digital, entregando ao circuito conectado ao mesmo um nível lógico
alto, 5V (binário 1), ou baixo, 0V (binário 0), dependendo da solicitação realizada.
Em loop() foram colocadas as instruções que serão executadas em ciclos indefinidamente
que, nesse programa, seriam as funções digitalWrite e delay. A primeira recebe como
61
argumentos o pino e o nível lógico que será entregue a esse pino e a segunda, o tempo em que
o código ficará sem executar nenhuma ação antes de prosseguir seu ciclo. Por tanto, será
realizado o acionamento do LED da placa, entregando nível alto (HIGH) ao pino 13
(LED_BUILTIN), o mesmo permanecerá ligado por um segundo (1000 milisegundos) e será
então feito o desligamento do mesmo, entregando nível baixo (LOW) ao pino por um segundo.
Seguiremos então os passos já ensinados para ver o exemplo em ação: verificar o código,
selecionar a placa/porta de uso e carregar o código.
Está feito! O LED da placa deverá piscar.
1 4
2
3
‘
Figura 3.49. Sequênca dos passos para gravar código na placa microcontroladora. Fazemos a
verificação do código para identificar possíveis erros (1), selecionamos a placa (2) que estamos
utilizando e a porta (3) na qual ela está conectada via USB e, enfim, carregamos o código (4).
62
Podemos realizar o mesmo projeto utilizando outra porta digital qualquer do Arduino. Para
isso precisaremos de:
1 protoboard;
1 resistor 360Ω;
1 LED (5mm);
2 jumpers (fios conectores) macho-macho.
Figura 3.50. Protoboard. Trilhas laterais superior e inferior com ligação horizontal, normalmente
utilizadas para conectar polos de alimentação para demais componentes. Conexões verticais mais
ao centro, onde comumente são conectados os componentes.
Por fim, os jumpers são fios conectores e o circuito utilizando-os junto aos componentes
eletrônicos, microcontrolador e protoboard fica como se segue:
63
Figura 3.51. Projeto para piscar LED sem utilizar o componente da própria placa. Aqui, o pino
utilizado para realizar as ações sobre o LED é o 8.
O pino 8, utilizado no exemplo como saída digital, é ligado ao polo positivo do LED e o
negativo é ligado ao resistor que. por sua vez. fechará o circuito ligando-se ao terra (GND) do
Arduino. O resistor é necessário para que não haja problemas quanto a tensão e corrente do
sistema, não ultrapassando os limites do LED. E, para saber que estamos lidando com outro pino
para o acionamento de um outro LED, devemos substituir “LED_BUILTIN” por 8 em todas as
funções.
64
LEDS ALTERNADOS
É comum vermos mais de uma lâmpada piscando em situações onde uma sinalização de
alerta é necessária. Em garagens de prédios podemos, por exemplo, observar duas lâmpadas
piscando alternadamente.
Para fazer uma simulação semelhante utilizaremos a montagem feita para o uso de um
LED externo ao da placa (Fig. 3.51) e, para simplificar, o próprio LED da placa. O código é como
se segue:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(8, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(8, LOW);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(8, HIGH);
delay(1000);
}
No código, iremos primeiro declarar na função setup() os modos dos pinos 13 e 8 como
sendo de saída (OUTPUT). Em seguida, em loop(), colocaremos um dos LED’s com sinal de alta
(HIGH) e o outro de baixa (LOW). Essas declarações garantes que um será iniciado aceso e o
outro apagado e, após um atraso de 1 segundo (delay(1000)), invertemos os estados de cada
pino para que o LED aceso apague e o outro acenda.
SEMAFORO
O semáforo consiste no acionamento sequencial de 3 LED’s com o desligamento do
anterior assim que o seguinte é acionado sendo bem semelhante ao código anterior.
Para montagem do circuito do semáforo utilizaremos os mesmos elementos da montagem
anterior, alterando a quantidade de alguns deles e, dessa vez, não utilizaremos o LED interno do
microcontrolador. Assim, precisaremos de:
1 protoboard;
1 resistor 360Ω;
3 LED (5 mm);
7 jumpers macho-macho;
65
Cada LED será associado a um pino diferente e, por estarem funcionando
alternadamente, podemos utilizar um único resistor conectando o terminal negativo dos mesmos
para fechar o circuito junto ao GND da placa.
Cada pino funcionará como uma saída digital e realizará o acionamento e desligamento
sequencial de cada LED. A implementação do delay funcionará como um temporizador do
semáforo.
No código, como será mostrado em breve, será implementada a inicialização de variáveis
sendo dados nomes a cada um dos pinos. No projeto anterior, vimos que o próprio IDE tinha um
nome pré-estabelecido para o pino 13 e, tal como foi feito para esse pino, podemos atribuir nomes
a qualquer outro desde que inicializada uma variável adequadamente.
66
int t1 = 2000; //declaração de varável de tempo
int t2 = 500;
int verde = 8; //declaração do pino 8, 9 e 10
int amarelo = 9; //para os nomes das cores dum semáforo
int vermelho = 10;
void setup(){
//os 3 pinos funcionarão como saídas digitais
pinMode(verde, OUTPUT);
pinMode(amarelo, OUTPUT);
pinMode(vermelho, OUTPUT);
}
void loop(){
digitalWrite(verde,HIGH); //acende verde
delay(t1); //aguarda um tempo
digitalWrite(verde,LOW); //apaga verde e
digitalWrite(amarelo,HIGH); //acende amarelo
delay(t2);
digitalWrite(amarelo,LOW);
digitalWrite(vermelho,HIGH); //o vermelho será o último
delay(t1);
digitalWrite(vermelho,LOW); //o loop garante que, ao
} //apaga-lo, o verde acenderá
Como o tempo do delay e o número dos pinos são valores inteiros, foi feita a inicialização
das variáveis “t1”, “t2”, “vermelho”, “amarelo” e “verde” declarando-as como “int” (valor inteiro).
Os valores dados são referentes aos pinos utilizados e ao tempo de espera desejado entre as
ações do programa.
Até o exemplo anterior, ao escolher o pino que desejávamos utilizar, era necessário, a
cada linha onde sua ocorrência seria dada, escolher o número do pino. Assim, caso fossemos
mudar o pino utilizado, nós deveríamos procurar todos os seus campos e modifica-los com o
novo número. A declaração dos mesmos facilita com que, sendo necessária realizar alguma
alteração, uma modificação possa ser feita de forma mais simples, apenas em uma parte do
código, com menor ocorrência de erros.
Em programas de grande porte, por exemplo, pode não ser tão simples localizar todas as
vezes que o pino 8 foi utilizado, mas se o pino fosse declarado de início bastaria que, no local da
declaração, seu valor fosse alterado de 8 para outro desejado.
67
Outras medidas que podem ser adotadas para clarificar um código é o uso de uma função
própria. No exemplo do semáforo, podemos criar 3 funções, uma para cada cor, e estipular
quanto tempo eles ficarão naquele estado.
O novo código seria como se segue:
int t1 = 2000;
int t2 = 500;
int verde = 8;
int amarelo = 9;
int vermelho = 10;
void setup()
{
pinMode(verde, OUTPUT);
pinMode(amarelo, OUTPUT);
pinMode(vermelho, OUTPUT);
}
void loop()
{
luzverde(t1);
luzamarela(t2);
luzvermelha(t1);
}
68
Embora o código tenha ficado mais extenso nessa situação do que na anterior, se
observarmos o loop() podemos notar que o mesmo ficou bastante conciso.
Em algumas situações, para mantermos o código mais limpo e organizado, podemos
fazer, além da criação das funções como mostrado, sua compartimentação em uma nova aba de
código, separando-as de uma maneira ainda mais ordenada e específica tanto das estruturas
principais (setup() e loop()) quanto entre as próprias funções
Para fazer isso, clicaremos na seta para baixo no canto direito da região de abas do IDE
e selecionaremos “Nova Aba” (ou basta o comando Ctrl+Shift+N). Nomeada a nova aba,
podemos levar, por exemplo, as funções criadas para lá e isso não interferirá no funcionamento
do código principal que contém setup e loop, sendo eles mantidos na aba principal.
O salvamento do código criará dois arquivos com a extensão .ino dentro de uma mesma
pasta.
Figura 3.55. Escolha do nome da nova aba na parte inferior da janela do IDE.
69
Figura 3.56. Visão do código em duas abas.
SEMAFORO INTELIGENTE
Utilizando a mesma montagem do projeto anterior, com algumas mudanças na
programação, podemos fazer um semáforo inteligente. A consideração de “inteligente” diz
respeito ao piscar progressivamente mais rápido de um LED, previamente à transição para um
outro, como se avisasse que o seu tempo está acabando. Essa progressão ocorre comumente
nas luzes verde e vermelha do sinaleiro e para fazermos esse efeito com LED’s utilizaremos a
estrutura condicional “for”. Veja o programa:
70
int t = 1500;
int verde = 8;
int amarelo = 9;
int vermelho = 10;
void setup()
{
pinMode(verde, OUTPUT);
pinMode(amarelo, OUTPUT);
pinMode(vermelho, OUTPUT);
}
void loop()
{
for (int x=1000;x >20; x=x*0.75){ //reduz o delay para piscar
digitalWrite (verde,HIGH); //rapidamente
delay (x);
digitalWrite (verde,LOW);
delay (x);
}
digitalWrite (vermelho,HIGH);
delay (z);
digitalWrite (vermelho,LOW);
delay (z);
}
}
71
variável “x” como um inteiro de valor inicial 1000, com condição para que o loop4 prossiga de que
o valor de “x” seja maior que 20 e, ao início de cada nova repetição das instruções dentro da
estrutura, o novo valor da variável seria igual ao seu valor atual multiplicado por 0.75.
Assim sendo, quando a função loop() é iniciada, seguimos direto para o loop do “for” que
consiste em diminuir progressivamente o valor de “x” que, consequentemente, diminuirá o delay
da troca de estado de nível alto para nível baixo do pino “verde” até que a variável atinja um valor
inferior à 20, o que quebra o for-loop e prossegue o programa para as demais linhas do loop().
Passaremos para o LED “amarelo”, com delay simples, e finalizaremos o semáforo
inteligente com a mesma lógica do primeiro LED no pino “vermelho”.
4
Quando falamos no loop estamos nos referindo a repetição de instruções no interior de uma estrutura/função. Ao falarmos loop(),
queremos dizer da função do IDE, presente em todos os códigos, e que promove a repetição indefinida da parte de código alí escrita.
72
String ler; //string é um vetor de caracteres lido integralmente
boolean flag = false; //cria um booleano atribuindo valor inicial "falso"
int led = 13;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600); //inicia comunicaçao serial estabelecendo taxa de transmissão
//de dados
}
void loop() {
if(Serial.available()>0){ //verifica dado serial disponivel para leitura
ler = Serial.readString(); //havendo dado, o mesmo eh armazenado na variável "ler"
}
if(ler == "ligar"){ //se ligar for o valor da variável...
flag = true; //o booleano recebe valor verdadeiro
}
if(flag == true){ //sendo o booleano verdadeiro, led piscará
digitalWrite(13,HIGH);
delay(500);
digitalWrite(13,LOW);
delay(500);
}
if(ler=="desligar"){ //se a variavel tem valor "desligar"...
flag = false; //booelado eh falso e, consequentemente, LED para de piscar
}
}
Por comodidade, foi utilizado o pino 13 que, como já vimos, está conectado a um LED da
própria placa. Ao clicar no ícone do monitor serial (ultimo ícone da Fig. 3.26) teremos uma nova
janela com um campo para receber informações do teclado e fazer o envio para placa, e outro
para visualização dos dados que estão sendo enviados pelo Arduino.
A Fig. 3.58 ilustra o falado apontando os campos descritos e o seletor de taxa de
comunicação, necessário para que as mensagens sejam repassadas e lidas corretamente.
73
1 2
Figura 3.58. Serial monitor. Nele, podemos observar um campo para escrita (1) que será repassado
ao microcontrolador serialmente, ao pressionar a tecla Enter do teclado ou o botão "Enviar" (2).
Devemos ajustar a velocidade de comunicação (3) de acordo com a utilizada no código para que
as respostas, caso haja alguma, possam ser mostradas corretamente na tela (4).
Como não foi solicitado que os dados mandados pela placa fossem mostrados, nada
aparecerá e, por consequência, saberemos que um dado enviado para a placa foi devidamente
recebido através da mudança de estado do LED dessa placa.
O envio do texto “ligar” implica na mudança do valor da variável flag. Tal variável foi criada
para ser utilizada como auxiliar no código, de forma que sua mudança de valor sinalizasse
quando o LED deveria começar a piscar, entrando no if-loop e quando deveria parar, ao não ter
acesso a ele por não satisfazer a condição de entrada na estrutura do “if”.
A solicitação de um comando por parte do usuário do programa para que uma ação seja
realizada é de grande importância em projetos de controle nos quais o sistema deve atender a
solicitações de quem o utiliza, por exemplo.
Além disso, certas aplicações precisam ser verificáveis de que ocorreram para maior
segurança do sistema. Assim, introduzir mensagens para checar etapas pode e deve ser usado
nessas circunstancias.
74
Serial.println(“Comando para piscar em funcionamento!”);
Figura 3.59. Serial monitor referente ao código com acrescimo de resposta. Após inserir o
comando, a mensagem "Comando para piscar em funcionamento!" aparecerá toda vez que for
verificado o valor armazenado na variável flag como sendo "ligar".
75
A partir do que já foi apresentado até o momento, temos agora uma autonomia maior para
o desenvolvimento de alguns outros projetos.
76
4. APP INVENTOR: Programação mobile
Como já dito, a programação por blocos facilita o desenvolvimento uma vez que é mais
intuitiva que os modelos mais convencionais (tal como o utilizado para o Arduino). Outro
argumento significativo é a facilidade de desenvolvimento e testes em tempo real sem a
necessidade de instalação de uma IDE.
O processo de desenvolvimento e construção do aplicativo ocorre todo em nuvem e isso
torna sua execução prática, pois a aplicação funciona de modo inteiramente online, diretamente
do navegador e, para utilizar da plataforma, basta possuir uma conta de usuário Google.
Na educação, a utilização desse modelo de programação vem ganhando força.
Programadores e celebridades como Bill Gates (Microsoft) e Mark Zuckerberg (Facebook) se
77
juntaram à organização Code.org para incentivar crianças e jovens a aprender programação. A
Code.org é uma organização sem fins lucrativos que visa aumentar o ensino de programação de
computadores em escolas e direcionar pessoas através de ferramentas online.
4.2. Acessando
Para ter acesso5 à plataforma é necessário, inicialmente, que se tenha uma conta Google.
Assim, acesse a página http://appinventor.mit.edu/explore/ e clique em “Create app!”, botão
localizado na parte superior direita do site (ver Fig. 4.1).
Figura 4.1. Parte superior do site, onde devemos clicar no botão superior direito (laranja).
Ao clicar no botão, a ação irá redireciona-lo para uma página com solicitação de login
semelhante à da figura abaixo. Nela, realize os procedimentos necessários, seja para a criação
de nova conta (aqui, deve-se clicar em “Criar conta”) ou para acesso de uma já existente.
Após informar dados de login e senha pela primeira vez, seu dado de login ficará gravado,
facilitando acessos posteriores.
5 Para acesso e uso da plataforma devemos utilizar os navegadores Chrome ou Mozila Firefox.
78
Figura 4.2. Campo para realizar login na conta Google. Caso não possua conta, é necessário ir em
“Criar conta” primeiramente.
Figura 4.3. Tela de login com uma conta já salva para acesso.
79
Por fim, no primeiro acesso, serão apresentados os termos de serviço para uso do App
Inventor. Estando de acordo com os termos de serviço, clique em “I accept the terms of service!”
e poderemos prosseguir para o contato inicial e desenvolvimento de aplicativos.
80
1 2 3
Figura 4.6. Tela de boas-vindas. Ao clicar no botão “Continue” (canto inferior esquerdo). Partiremos
para uma tela de criação de projetos.
81
Outra forma de iniciar um novo projeto é selecionar a opção dentro do menu “Projects”,
conforme será apresentado num outro momento mais adiante.
Figura 4.7. Mensagem apresentada quando nenhum projeto ainda foi criado com informações de
sugestões a serem seguidas inicialmente.
Figura 4.8. Tela ao realizar primeiro acesso. Ao clicar em “Start new project” e dar um nome ao
novo projeto, a página será redirecionada para a edição do mesmo.
Figura 4.9. Janela que será mostrada para dar nome ao projeto que será criado.
82
o usuário irá interagir, estabelecer a criação de banco de dados, tipo de conexão de rede a ser
utilizada, dentre outros componentes disponíveis. Além de também ser possível realizar upload
de arquivos e todo o tratamento do que será apresentado ao usuário final do aplicativo
desenvolvido.
Já em Blocks, apresentado na Fig. 4.11, será construída a programação do aplicativo.
O App Inventor utiliza uma programação em blocos, sendo assim, as estruturas serão arrastadas
da sua fonte de origem, na aba Blocks, e soltas na área de construção do código, o Viewer, e
encaixadas umas às outras, gerando blocos maiores os quais conterão a formulação lógica e
sintática do programa.
83
Podemos realizar os mais diversos procedimentos conforme citado ao início do capítulo.
Dessa forma, iremos cobrir os diversos painéis pertinentes ao Designer a ao Blocks.
Elementos relativos ao salvamento do projeto, seu build, dentre outros, também serão
apresentados, porém, nem todos os elementos da plataforma serão abordados por fugirem do
escopo de maior interesse aqui proposto. Para tanto, sendo de interesse pessoal, é possível,
através do próprio site, explorar as mais diversas possibilidades e tutoriais para desenvolvimento
em outras áreas.
4.5. Designer
VIEWER
Os components que forem selecionados do Palette devem ser arrastados até a tela do
Viewer. Tal tela, semelhante a de um smartphone seria a representação de como o aplicativo
seria visualizado pelo usuário. Sendo assim, qualquer alteração de forma, posição, adição de
tela, acréscimo de informação realizados serão ali representados para que o desenvolvedor
tenha ciência de como tudo o que foi incorporado será visto assim que tudo for finalizado.
No Viewer também podemos tornar visíveis componentes selecionados como invisíveis
para ter noção de sua localização na tela como, por exemplo, uma caixa de texto que irá mostrar
informações de resposta a alguma ação na tela, mas que o usuário final não precisa
necessariamente saber sua localização ou clicar nela para digitação. Essa alteração é realizada
ao clicar na caixa de seleção na parte superior à tela do aplicativo em desenvolvimento, onde é
possível também selecionar uma visualização prévia de como o app ficaria na tela de um tablet.
Por fim, alguns componentes ao serem arrastados para a tela do aplicativo são lançados
automaticamente para uma posição abaixo da tela em “Non-visible components” (componentes
não visíveis). Esse caso em específico ocorre para componentes que representam elementos
que são utilizados pelo aplicativo de forma mais implícita ou interna. A exemplo disso temos a
conectividade com a rede wireless e o acelerômetro, elementos frequentemente utilizados,
porém, que não são manipulados diretamente pelo usuário ou necessários de serem monitorados
pelo mesmo explicitamente na tela do aplicativo.
84
Figura 4.12. Viewer, onde podemos vizualizar o aplicativo em desenvolvimento.
PALETTE
Conforme já citado previamente, é daqui que os componentes são arrastados para a tela
(viewer) do que, futuramente, será um aplicativo. Existe uma grande variedade de componentes,
os quais são divididos em grupos de acordo com uma característica comum e, conforme pode
ser visto na próxima figura, possuem um ícone de interrogação à direita o qual contém
informações gerais de sua funcionalidade.
Caso uma especificação mais detalhada seja desejada ou necessária, basta que o
usuário clique em “More information” (mais informações). Uma nova página será aberta e uma
informação completa sobre o elemento será repassada.
85
Figura 4.13. Palette com exemplo das interrogações ao lado dos componentes. Ao clicar, temos
informação do componente e a opção para mais informações (“More information”), que nos leva a
uma nova página com detalhes sobre o componente.
COMPONENTS E SCREENS
Feita a seleção de um elemento no Palette, arrastando-o para o Viewer, ele agora estará
disponível no painel de Components.
Quando damos início a um novo projeto é possível visualizar nessa área o componente
“Screen 1”, que nada mais é que a tela do aplicativo que será exibida ao usuário num dado
momento, e todos os demais componentes estarão em um nível interno ao mesmo.
Caso uma nova tela seja criada, em “Add Screen ...”, o que pode ser feito na parte superior
ao painel (ver Fig. 4.14), os componentes da tela anterior não estarão representados ali. Ou seja,
cada tela em Design mostrará apenas os componentes nela colocados.
Diferente da primeira tela, as demais podem receber um nome diferente do já proposto
pela plataforma e para alternar entre essas telas basta que cliquemos no botão à esquerda de
“Add Screen ...” e selecionarmos a desejada da lista.
Uma Screen adicionada também pode ser removida através de “Remove Screen”.
86
Figura 4.14. A clicarmos em "Add Screen" podemos dar um nome a nova tela como, por exemplo
"TelaTeste".
Figura 4.15. A nova tela, quando selecionada, apresenta apenas seus próprios componentes. Note
que "Screen1" não está representada em Components e que "Remove Screen" foi habilitado.
Ao final do painel existem dois botões: “Rename” e “Delete” para que os nomes dos
componentes possam ser alterados ou para que o componente possa ser deletado e sair da tela
de visão do projeto. Uma janela com um campo mostrando o nome antigo e um campo para que
o novo seja escolhido aparecerá ou uma confirmação de deleção, caso escolha excluir o
componente.
Figura 4.16. Components, onde os elementos selecionados do Palette para o Viewer são listados.
87
Figura 4.17. À esquerda a janela de renomear componentes e à direita, para deletá-lo.
PROPERTIES
Todos os elementos possuem propriedades atribuídas e que podem ser modificadas para
melhor se adequar ao pretendido pelo desenvolvedor no design de seu aplicativo. Assim, ao
selecionar um elemento em Components, é possível editar uma serie de suas características
para que ele melhor se adeque ao desejado.
Num botão, por exemplo, podemos alterar sua cor, forma, tamanho, texto em seu interior,
alinhamento da estrutura na tela, dentre outros.
Como cada componente possui suas propriedades específicas e o design é algo pessoal,
fica a critério do desenvolvedor verificar o que é desejável de se utilizar ou não. Futuramente,
em exemplos, algumas dessas funções serão demonstradas e fugiria ao pretendido através
desse material uma explicação detalhada de todas os campos de propriedade, bem como
também não foram detalhados a fundo os elementos do Palette.
88
Figura 4.18. Lista com algumas das propriedades de “Screen1” listados em Components.
MEDIA
Tanto DESIGNER quanto BLOCKS tem um campo destinado para o upload de arquivos.
Os arquivos subidos, sejam de áudio, imagem ou vídeo, podem ser empregados para finalidades
diversas. Podemos utilizar um alerta sonoro ou visual para avisar que uma ação deve ou não ser
tomada, um áudio que seja resposta a uma ação (emissão de som quando clicado na tela, por
exemplo) indo da necessidade do desenvolvedor em como utilizar dessa função.
Feito o upload do arquivo, seu uso se dá através das propriedades do elemento que pode
utilizado, sendo o mesmo selecionado em Properties.
Figura 4.19. Painel Media, por onde é possível realizar upload de imagens, áudios e vídeos.
89
4.6. Blocks
BLOCKS
Figura 4.20. Painel dos blocos de construção da programação por trás do aplicativo
90
VIEWER
91
Figura 4.22. Alertas de erros. Ao clicar em "Show Warnings" os erros serão discriminados em tela
e, ao clicar nos simbolos, informações serão apresentadas.
Independentemente da aba ou área que estiver utilizando sempre será possível verificar na
parte superior da página a logo do App Inventor e, na mesma faixa vertical, um menu com listas
de opções importantes para acesso, construção, teste e finalização dos projetos.
92
estivermos e clicarmos, essa opção nos direcionará para uma página limpa de montagem de
projeto na visão do Designer.
É importante frisar que o “AI Companion” exige que os dispositivos conectados, tanto o
computador quando o smartphone Android, estejam na mesma rede. Caso isso não seja
93
obedecido um erro ao tentar a conexão em tempo real será apresentado na tela e essa conexão
não será estabelecida.
Além disso, devido ao fato de algumas redes sem fio serem configuradas de modo a
proibir dois dispositivos dessa rede de se comunicaram (como redes de escolas e universidades),
o uso do “AI Companion” pode ser dificultado, mas ainda consiste numa melhor opção que o
“Emulator” ou o “USB”. Sendo assim, para que o pareamento seja feito seguiremos alguns
passos simples:
1. Conectar o smartphone à rede sem fio da instituição de ensino;
2. Conectar o smartphone ao computador via cabo USB;
3. Nas configurações do aparelho, buscar pelas opções de conexões do mesmo e
um menu que aborde “Ancoragem e Roteador Wi-Fi” ou similar para realizarmos
a ancoragem do mesmo via USB;
4. Selecionar a opção “Ancoragem via USB” ou similar;
5. Com o computador desconectado de qualquer rede, aguarde o reconhecimento
de uma nova rede à cabo e que sua conexão seja realizada (o processo pode
demandar algum tempo).
Feito isso, a conexão com a internet do Android estará sendo compartilhada com o
computador estando, dessa forma, os dois dispositivos numa única rede (como se fossem um
mesmo equipamento, digamos assim) possibilitando que o “AI Companion” funcione
normalmente.
Figura 4.26. Captura de tela da lista de ancoragem em Galaxy J5 Pro. No canto superior esquerdo,
na barra de notificações, um ícone com o símbolo de dispositivo USB é apresentado após a seleção
da opção via USB, sinalizando que a ancoragem está sendo feita.
Quando vamos para a Build estamos no momento final da construção do projeto. Aqui, o
aplicativo será compilado e preparado para que a extensão de aplicativo “.apk” seja criada. É
possível gerar um QR Code para a extensão, transferindo-a diretamente para o smartphone ou
salva-la no computador, para que seja enviado posteriormente para o smartphone.
94
Figura 4.27. Aba Build do menu.
As demais opções também sinalizam sua funcionalidade, e podem ser verificados pelo
desenvolvedor a qualquer momento, caso tenha interesse em aprender algo diferente ou mais a
fundo, para verificar aplicativos desenvolvidos por outras pessoas na galeria, verificar guias,
idioma6 (inglês por padrão) etc.
Visto tudo isso até o momento, um projeto a ser elaborado segue os seguintes passos:
1. Início do projeto ao selecionar “start new project” em “Projects”;
2. Elaboração do projeto, no que diz respeito ao seu design e programação e,
enquanto ele está sendo elaborado, é aconselhável o pareamento com um
smartphone para que possa ser verificado em tempo real o que está sendo
realizado (utilizando a mesma rede na qual o computador para edição do projeto
estiver).
3. Seleção de opção e realização de build para que o aplicativo possa ser compilado,
preparado e montado para a instalação no dispositivo Android ou download no
computador.
4. Instalação propriamente dita. Ela pode ocorrer diretamente após a build quando
do uso da transferência direta via QR code ou após sua transferência do
computador para o dispositivo Android, ao selecionar o arquivo do programa e
solicitar sua instalação.
Os smartphones são configurados para que apenas aplicativos advindos de uma loja
virtual registrada como confiável sejam instalados. Dessa forma, ao tentar instalar uma aplicação
de fonte desconhecida, um alerta semelhando ao da imagem abaixo será apresentado. É
necessário, então, ir até as configurações do smartphone para conceder essa permissão (que
pode ser dada apenas para a instalação em questão ou para todas as demais). A opção é
encontrada, normalmente, nas opções de segurança das configurações dos dispositivos.
6 Todos os termos utilizados correspondem aos termos em inglês e não aos em português brasileiro, pois a troca do idioma é aplicada
apenas enquanto a sessão está ativa na plataforma. Ao atualizar, logar novamente ou ser reconectado a pagina voltará ao idioma
de origem. Dessa forma, para evitar alguns equívocos ou confusão durante a elaboração dos projetos esse material utilizará os
termos no idioma padrões da plataforma.
95
Terminado todos esses procedimentos o aplicativo estará, finalmente, pronto para uso.
Figura 4.28. Do lado esquerdo, a primeira mensagem de segurança gerada ao tentar instalar o
aplicativo. Do lado direito, uma mensagem que é gerada após o gerenciamento das configurações
para que seja permitida a instalação do aplicativo (imagens referentes aos alertas do smartphone
Samsung Galaxy J5 Pro).
96
Figura 4.29. Tela do aplicativo de conexão com a plataforma do App Inventor.
O mesmo pode ser baixado e instalado através da Play Store, pesquisando-o pelo seu
nome.
97
facilitar o entendimento dos aplicativos e torna-los visualmente simples. Caso seja de interesse,
o leitor pode realizar suas próprias configurações nesses elementos não críticos à execução do
aplicativo. Fique à vontade para imaginar!
98
A tabela seguinte mostra os componentes que serão usados e as alterações a serem
feitas em cada elemento de algumas de suas propriedades. Em seguida, um detalhamento sobre
essas alterações será mostrado para facilitar a compreensão da tabela.
No painel Palette, selecione um botão (“Button”) na aba “User Interface” e arraste-o para
a tela. Em seguida, selecione o botão em Components, pois faremos algumas alterações no
painel Properties.
Podemos, por exemplo, alterar a “BackGroundColor” para “Orange”, “FontSize” para “20”
e “Text” para “Aperte o botão!”.
99
Figura 4.33. Alterando as propriedades do botão (ver setas vermelhas) e como as alterações
aparecem em "Viewer".
Como queremos que a frase seja reproduzida ao clicarmos, faremos uso do componente
“TextToSpeach”, encontrado na aba “Media” do Palette. Conforme citado anteriormente, alguns
componentes são postos como não visíveis (“non-visible”) durante a construção do projeto,
sendo esse um caso dessa ocorrência.
100
Figura 4.34. Componente "TextToSpeech" é arrastado normalmente para a tela, mas é posicionado
como um componente não visível, abaixo da tela do aplicativo, como marcaodo na figura.
101
As alterações realizadas no botão todas, de alguma forma, para atender o design
esteticamente e facilitar o entendimento do que devemos fazer no aplicativo pronto. Em
contrapartida, as mudanças realizadas no segundo componente já têm uma finalidade que
envolve os recursos a serem usados quando o programa por trás da tela do aplicativo for rodado.
Por isso, ao fazer alterações por conta própria em Design, atente-se a quais delas afetaram
somente a estética.
Iremos agora sair da aba Designer para montar a programação em Blocks.
No painel Blocks, iremos selecionar “Button1”, que é referente ao botão criado na aba
Designer. Uma aba será aberta com os blocos de programação pertinentes ao botão, conforme
mostra a figura abaixo, e onde iremos selecionar e arrastar para o viewer a primeira estrutura:
“when Button1.Click do”.
Figura 4.36. Estruturas de construção referentes ao Button1. A estrutura relacionada com a seta
deve ser posta na tela do Viewer para iniciarmos nossa programação.
Esse bloco é uma estrutura condicional na qual, quando (“when”) o botão for clicado, uma
ação será realizada (“do”). Aqui, queremos que uma frase seja reproduzida quando a ação de
clicar no botão for realizada e, sendo assim, devemos selecionar “TextToSpeach1”, o bloco “call
TextToSpeach1.Speak message”, encaixando-o no bloco anterior.
102
Figura 4.37. Bloco de interesse a ser arrastado para a tela de montagem do programa.
Por fim, é necessário selecionar qual será a mensagem que será dita e fazer sua conexão
na saída do bloco. Selecionamos “Text” em “Built-in”, onde blocos relacionados a textos e
caracteres estão agrupados, e arrastamos o primeiro bloco (vazio entre aspas). Nele, iremos
clicar no espaço vazio e digitar “Hello, World!”.
103
Figura 4.40. Bloco para inserção de texto a ser arrastado para a área de programação.
Ao final da escrita do texto podemos pressionar a tecla de return (“enter”) ou clicar numa
parte vazia do Viewer. Os blocos do programa ficarão como abaixo apresentado.
104
É importante lembrar que podemos realizar o pareamento de um smartphone e visualizar
no dispositivo cada passo que foi realizado e se o programa está funcionado. Após finalizado
todos os ajustes, realizaremos a Build do programa.
A build, caso seja selecionada a primeira opção do menu como na Fig. 4.44, gerará um
QR code o qual, através do MIT AI2 Companion, deve ser scaneado para que a instalação do
aplicativo ocorra.
105
Finalizada a instalação, basta procurar o ícone e nome do projeto no menu de aplicativos
do dispositivo móvel e seleciona-lo para que seja feito o teste.
Figura 4.46. Ícone gerado automáticamente. Após a instalação do aplicativo elaborado, devemos
buscar pelo ícone com o nome que demos ao aplicativo.
Tabela 4.2. Componentes do projeto para transformar qualquer texto em fala e seus atributos
modificados.
Components Onde encontrar Properties Valor
BackgroundColor orange
Button1 User Interface FontSize 20
Text Falar!
TextBox1 User Interface Hint Digite algo
Country USA
TextToSpeach1 Media
Language en
106
Figura 4.47. Dando o nome de "Qualquer_texto" ao novo app a ser desenvolvido.
Figura 4.48. Nova configuração do botão com propriedades modificadas indicadas pelas setas
vermelhas.
107
Figura 4.49. Arrastada e soltada, abaixo do botão, temos um campo de texto ("TextBox").
Figura 4.50. Campo alterado em "TextBox1" para que uma dica apareça ao usuário do que fazer
naquele campo.
108
Figura 4.51. Inserindo o componente que transforma texto em voz.
109
Figura 4.53. Aba Designer com o novo componente selecionado.
110
Faça agora o Build e veja o resultado! Digite uma frase no campo de texto e aperte o
botão.
Como mencionado, podemos criar novas telas e trocar entre os dois ambientes, tendo,
cada uma, seus componentes específicos.
Para o novo aplicativo, faremos uso de um botão que nos levará para uma outra tela.
Cada tela também terá um botão e uma imagem específica de uma lâmpada, simulando seu
acionamento e desligamento.
Ao iniciar um novo projeto (nomeado twoScreensLamp) iremos, primeiramente, no painel
Media e realizaremos o upload de duas imagens (a sua escolha) sinalizando uma lâmpada
apagada e uma acesa como as representadas na figura abaixo.
Figura 4.56.Imagens de uma lâmpada acesa e apagada, as quais serão enviadas para a plataforma
(upload) para serem utilizadas no projeto.
Para fazer isso, clicaremos em “Upload File ...” e, na janela que for aberta, em “Escolher
arquivo”. Selecione o primeiro arquivo de interesse após localiza-lo em seu computador, clique
em “Abrir” e, feito isso, clique em “OK” na janela de “Upload File ...” que foi aberta. Repita o
processo com a próxima imagem.
111
Figura 4.57. Janela aberta ao clicar em "Upload File ...". Devesse escolher o arquivo desejado em
“Escolher arquivo” e clicar em “OK” após seleção.
Figura 4.58. Janela após a seleção de um arquivo de imagem. Devemos, aqui, clicar em “OK” para
finalizar o carregamento do arquivo.
Figura 4.59. Exemplo de janela para procurar e selecionar os arquivos de imagem. No canto inferior
direito temos as imagens, já carregadas, no painel “Media”.
Conforme a Fig. 4.59 mostra, os nomes dados aos arquivos foram “lampc.jpg” e
“lampo.jpg”, e eles representam a lâmpada desligada e ligada, respectivamente.
112
Na tabela a seguir são mostrados os componentes utilizados e as propriedades alteradas.
Observe que a mudança de telas faz com que os componentes no painel “Components” reiniciem
suas numerações.
A nova tela criada tem o nome “apagarLuz” e para acessa-la após a criação, devemos
acessar o menu de telas.
113
Tabela 3. Componente do projeto de alternar imagens em telas diferentes e seus atributos
modificadas.
Components
Onde encontrar Properties Valor
(Screen1)
BackgroundColor Yellow
FontSize 20
Button1 User Interface Width Fill parente
Shape Rounded
Text Toque aqui para ligar
Height Fill parente
Width Fill parente
Image1 User Interface
Picture lampc.jpg*
ScalePictureToFit Marcar
Components
Onde encontrar Properties Valor
(apagarLuz)
BackgroundColor Red
FontSize 20
Button1 User Interface Width Fill parente
Shape Rounded
Text Toque aqui para desligar
Height Fill parente
Width Fill parente
Image1 User Interface
Picture lampc.jpg*
ScalePictureToFit Marcar
114
Figura 4.62. Imagens das telas projetadas para o aplicativo que alterna imagens em duas telas.
115
Como podem ter percebido, o bloco exige um encaixe. Devemos passar para o mesmo a
informação de qual nova tela será aberta e faremos isso a partir de um bloco de texto simples.
Veja a próxima figura.
Nosso primeiro pensamento seria o de prosseguir da mesma maneira para retornar para
a primeira tela, porém, ao solicitarmos a abertura da tela “Screen1” estaríamos, de fato, abrindo
uma nova “Screen1” e não retornando para a anterior.
O mesmo aconteceria ao mandarmos abrir “apagarLuz” em sequencia. Com o tempo uma
sobrecarga de memória ocorreria causando lentidão e outros problemas com o uso constante de
mudanças de telas até mesmo no aplicativo mais simples.
De fato, o que desejamos fazer é fechar a segunda tela aberta, automaticamente
retornando para a primeira. Assim, o bloco a ser usado para programar “apagarLuz” seria “close
screen”, também localizado em Control.
Figura 4.65. Bloco a ser elaborado em "apagarLuz" para retornar para a primeira tela.
Em situações onde desejamos apenas realizar a ação de retornar para uma tela anterior
podemos, alternativamente, utilizar da própria opção de retorno do celular. Para isso, devemos
selecionar um bloco do conjunto de blocos da própria tela “apagarLuz”.
116
Figura 4.66. Bloco que utiliza o botão do próprio dispositivo android para realizar uma ação.
Assim, como mostrado na figura acima, quando o botão de retorno do próprio dispositivo
Android for pressionado a tela será fechada, retornando para “Screen1”.
Por fim, feita a programação de “Screen1” (Fig. 4.64) e de “apagarLuz” (Fig. 4.65 e/ou
Fig. 4.66), podemos fazer o Build e testar o aplicativo.
117
Figura 4.67. Localização e insersão do componente com propriedade "visible" (canto inferior direito
da imagem) marcada.
118
Tabela 4.4. Componente do projeto de alternar imagens numa mesma tela e seus atributos
modificadas.
Onde
Components encontrar Properties Valor
Height Fill parente
VerticalArrangement1 Layout Width Fill parente
Desmarcar após inserir
Visible
Button1 e Image1
FontSize 20
Button1 Width Fill parente
User
(dentro de
Interface Shape Rounded
VerticalArrangement1)
Text Toque aqui para desligar
Height Fill parente
Image1 Width Fill parente
User
(dentro de
Interface Picture lampo.jpg*
VerticalArrangement1)
ScalePictureToFit Marcar
Height Fill parente
VerticalArrangement2 Layout
Width Fill parente
FontSize 20
Button2 Width Fill parente
User
(dentro de
Interface Shape Rounded
VerticalArrangement2)
Text Toque aqui para ligar
Height Fill parente
Image2 Width Fill parente
User
(dentro de
Interface Picture lampc.jpg*
VerticalArrangement2)
ScalePictureToFit Marcar
119
Figura 4.69. Viewer conforme montagem solicitada.
Figura 4.70. Viewer, ao colocarmos os dois layouts, que deveriam ser sobrepostos, quando
marcamos os dois como "visible".
120
Antes de partimos para Blocks, devemos deixar Design como na Fig. 4.69 e, para que
não fiquemos perdidos, iremos renomear “VerticalArrangement1” para “LayoutLigado” e
“VerticalArrangement2” para “LayoutDesligado”, bem como “Button1” para “Desligar” e “Button2”
para “Ligar”. Ilustramos abaixo, pare recordar, uma renomeação.
Figura 4.72. Para renomear um objeto devemos selecioná-lo (1), precionar "Rename" (2), dar um
nome de interesse e, por fim, precionar "OK".
121
Passaremos agora para a aba Blocks mostrando, logo abaixo, a programação por trás do
aplicativo e discutiremos os blocos utilizados na mesma.
Muitos aspectos de determinados elementos podem ser modificados não apenas na aba
Designer como, também, em Blocks.
O projeto utiliza os seguintes blocos:
When Ligar.click do – realiza uma ação ou evento quando o botão do aplicativo
é clicado.
Set <component>.<aspect> to – é utilizado de diferentes maneiras para
estabelecer uma característica de um componente.
o Ao acessa-lo, pelo bloco relativo ao componente, <component> já terá
um nome específico que, no caso desse projeto, podem ser:
LayoutDesligou ou LayoutLigado e, por serem do mesmo tipo, podem
ser alternados entre si ao clicar no campo de seu nome, onde surgirá
uma lista com os nomes dados a esses elementos.
o O campo <aspect> de cada componente também pode ser encontrado
nas várias formas específicas, mas também podemos abrir uma lista
dos mesmos ao clicar em seu campo.
Estrutura “true”/”false” do bloco Logic – é utilizado quando desejamos determinar
ou comparar algo como sendo verdadeiro ou falso (booleano).
122
Figura 4.75. Opções referentes a qual <component> será manipulado.
Figura 4.76. Opçoes referentes aos possíveis <aspects> que podem ser manipulados.
123
5. Integração Arduino e App Inventor
É notória em nosso cotidiano o uso de dispositivos móveis tal como o celular, que nos
acompanham já como parte de nós, armazenando compromissos, facilitando a comunicação e
nos interligando com novas pessoas, compartilhando informações e nosso cotidiano, facilitando
transações bancárias, pagamentos e compras. Por que, então, não utilizarmos do poder que um
microcontrolador pode nos oferecer para manipular ferramentas de nosso interesse?
Unindo aplicativos e as capacidades de um microcontrolador podemos realizar, à
distância, o controle de elementos muito mais interessantes que um LED. Podemos manipular e
automatizar todas as lâmpadas de uma casa, abrir ou fechar o portão de casa, dentre muitas
outras coisas.
Muito disse já é feito hoje em dia a partir de controles remotos, mas um microcontrolador
pode ser facilmente conectado a uma rede Wi-Fi, bem como um celular faz hoje em dia. Com
isso temos ganhos em distância, qualidade e segurança da resposta, tendo em vista que
podemos construir o sistema como desejarmos e solicitar dele confirmações e checagem de
informação.
Sendo assim, saber o básico de como é possível fazer isso e utilizando ferramentas
simples, mas de grande potencial é de grande importância para a elaboração de sistemas
modernos de controle.
124
5.2. Comunicação com realimentação efetiva em tempo real
Cada projeto a ser elaborado terá como função o envio de uma solicitação por parte do
aplicativo desenvolvido no App Inventor e o seu recebimento e ação consequente da solicitação
por parte do Arduino e o programa desenvolvido no IDE do mesmo. Além disso, o sistema trará
consigo uma comunicação com realimentação efetiva.
A realimentação efetiva trata-se de uma resposta dada ao que foi solicitado, ou seja, o
Arduino não apenas seria responsável por receber a solicitação e executar uma ação à partir da
solicitação recebida em seu sistema como, também, seria responsável pelo envio de uma
resposta sobre o que de fato ocorreu após a execução da ação pretendida.
É importante o entendimento sobre um sistema realimentado (com resposta) e um
sistema sem realimentação (sem resposta) para que possamos compreender como controlar de
forma efetiva um comando enviado relacionando o que existe no mercado e o que se espera de
um produto produzido por um profissional com nível superior de qualidade. Para isso, alguns
conceitos importantes são necessários.
MODELO CLIENTE-SERVIDOR
Sempre que se fala em cliente-servidor vem à mente redes de computadores. Isso não
está errado, mas é preciso ir mais fundo para entender o que realmente vem a ser um cliente e
um servidor.
A tecnologia cliente-servidor é uma arquitetura na qual o processamento da informação
é dividido em módulos ou processos distintos. Um processo é responsável pela manutenção da
informação (servidores) e outros responsáveis pela obtenção dos dados (os clientes).
Os processos cliente enviam pedidos para o processo servidor, e este por sua vez
processa e envia os resultados dos pedidos.
Dessa forma podemos utilizar uma analogia para entender o principio de cliente e
servidor. Imaginemos a ação de ligar um aparelho de TV pelo controle remoto. Ao se apertar o
botão no controle o televisor irá ligar ou não. Nesse contexto o controle se comporta como um
Servidor e o televisor se comporta com um Cliente.
125
Se ao pressionar o botão o televisor ligar teremos uma resposta áudio/visual da
situação, ou seja, o televisor emitiu som e imagem e neste caso saberemos por
outros meios que o televisor ligou.
Essa situação mostra que a comando não obtém resposta pelo mesmo meio de
transmissão. No controle não chega nenhuma informação de que o televisor ligou.
Para tornar o caso mais inteligível suponha-se que estivéssemos de olhos vendados e
ouvidos abafados e quiséssemos executar a mesma ação de ligar o televisor. Neste caso não é
sabido após se executar o comando se o televisor ligou ou não ligou. Com isso conclui que o
Cliente é sempre Cliente e o Servidor é sempre Servidor.
Para resolver esse problema pode-se desenvolver um controle com algum tipo de
dispositivo vibratório e a cada comando enviado ao televisor e executado com sucesso uma
vibração ocorra no controle e o usuário saberia se a ação foi concluída. Uma vez que isso ocorra
fica claro que o Cliente e Servidor invertem seus papéis mediante a necessidade.
Quando temos um sistema com realimentação efetiva, como os que serão apresentados
nos experimentos a seguir, temos um equivalente ao televisor que irá receber a solicitação para
ligar ou desligar e retornará ao controle do solicitante um evento informando sobre o resultado
da solicitação de modo a ser facilmente compreendida.
126
negativamente a resposta ou tornar o sistema completamente insatisfatório por
incompatibilidade com o ciclo de gestação, o qual deveria seguir.
Precisamos saber sobre a situação de alguém que mora distante. Podemos
escrever uma carta e aguardar a resposta que levará dias ou semanas,
dependendo da forma de envio escolhida junto aos Correios, ou podemos ligar e
saber as notícias desejadas. Pelos correios, o atraso na troca de cartas pode
aumentar nossa preocupação com a pessoa distante e, por telefone, uma
consequência de um atraso na resposta seria a difícil compreensão do que a outra
pessoa está dizendo e interpretarmos erroneamente.
No primeiro exemplo temos uma clara situação onde a palavra “instantânea” ou “rápida”
não condizem de uma maneira assertiva com o é “tempo real”. Da mesma forma, no segundo
exemplo, temos uma situação onde, mesmo que o meio mais utilizado hoje em dia sejam os
telefones para a comunicação com alguém distante, cartas podem nos dar igualmente um
sistema em tempo real, caso os dois cumpram seus prazos de entrega da mensagem.
Os danos dos atrasos vão depender de cada sistema e, para cada implementação em
tempo real, esse dano pode ser mais ou menos crítico.
O Bluetooth é uma rede sem fio utilizada para a conexão e troca de informações entre
dispositivos diversos (celulares, impressoras, videogames etc.). É um protocolo de comunicação
de baixo alcance, classificado como uma WPAN (do inglês: Wireless Personal Area Networks –
rede sem fio de área pessoal) e iremos utiliza-lo para comunicação próxima entre um smartphone
Android e um Arduino Uno.
A rede será utilizada para o controle a distância de uma lâmpada que será conectada ao
Arduino e terá realimentação de confirmação efetiva das ações às solicitações, repassadas do
smartphone para o Arduino, em quatro quadrantes.
Baseando-nos no que foi apresentado nos tópicos anteriores, a realimentação de
confirmação efetiva trata, então:
do envio de uma solicitação para o controle da lâmpada (acende-la ou apaga-la)
pelo smartphone;
execução dessa solicitação por parte do microcontrolador;
avaliação subsequente, realizada a partir de um sensor, enviando um resultado
ao microcontrolador de se a ação foi bem sucedida ou não;
127
entrega desse resultado da ação solicitada ao solicitante.
Assim, é possível observar que o microcontrolador altera sua função na arquitetura
cliente-servidor, ora responsável por manter informações e fornecer, ora pela sua aquisição.
Entendido isso, as respostas possíveis do sistema são as seguintes:
1. Acionamento solicitado: resposta positiva para a ação de acionar a lâmpada;
2. Acionamento solicitado: resposta negativa para a ação de acionar a lâmpada;
3. Desligamento solicitado: resposta positiva para a ação de desligar a lâmpada;
4. Desligamento solicitado: resposta negativa para a ação de desligar a
lâmpada.
128
O módulo possui 6 pinos, cujas indicações do mesmo podem ser encontrados no verso
da placa, sendo eles:
EN (ou KEY, pode variar de acordo com o fabricante): habilita (enable) o modo
de configuração via comandos AT, quando o pino recebe sinal de altas antes
da placa ser energizada;
VCC: refere-se a tensão de alimentação (5V ao conecta-lo ao arduino);
GND: é o terra do sistema (ou do próprio Arduino);
TXD: transmite dados seriais do módulo para o receptor serial do Arduino
(RX);
RXD: recebe dados seriais do transmissor serial do Arduino (TX);
STATE: informa se o módulo está conectado ou não.
DIVISOR DE TENSÃO
Um divisor de tensão nada mais é que uma técnica para gerar uma proporção entre duas
tensões utilizada em projetos quando é necessário, por exemplo, a manipulação de um sinal a
ser recebido por um dispositivo. No nosso caso, o dispositivo de interesse é o HC-05 e desejamos
um nível próximo de 3.3V, sendo o sinal de entrada de 5V.
129
𝑅2
𝑉𝑜𝑢𝑡 = 𝑅1 +𝑅2
× 𝑉𝑖𝑛 (1)
MÓDULO RELE
Como dito no início do material, utilizaremos o sistema para o controle à distância de uma
lâmpada. Uma lâmpada residencial comum funciona com uma tensão de 127V ou 220V, ambos
valores de carga que o Arduino não consegue administrar.
Para que possamos controlar uma lâmpada iremos então associa-la a rede elétrica local
de modo que o microcontrolador possa manipular seu funcionamento e, ao mesmo tempo, não
seja afetado pela corrente e tensão imensamente superior à que é capaz de suportar.
Para solucionarmos essa questão, falaremos novamento sobre o uso de um rele: um
dispositivo eletromecânico formado, basicamente, por uma bobina (nesse caso, um núcleo de
aço maciço envolto por um fio de cobre), armadura de ferro móvel, contatos fixos e um móvel e
seus terminais.
130
Quando uma corrente passa pela bobina do relé, é gerado um campo magnético que atrai
o contato da armadura, o que pode abrir e/ou fechar uma série de circuitos. Cessada a corrente,
os contatos voltaram para suas posições normais (originais).
Quanto aos contatos, podemos encontrar relés normais abertos (NO), os quais estão em
aberto quando não há energia na bobina, normais fechados (NC), abertos quando há, e ainda
temos aqueles com ambos os contatos, como é o caso do relé da Fig. 5.3. Nessa configuração,
o relé possui um contato comum (C), o responsável por estabelecer condução quando NO fecha
e contato com NC quando ele fecha.
Nos terminais da bobina teremos o Arduino energizando-a e ainda uma conexão a um
pino digital, pelo qual serão repassados comandos para acionar ou desligar o rele. Nos terminais
NO/NC e C, teremos a conexão com a rede de energia para que, dado o sinal do Arduino, haja
comutação dos contatos, sendo eles responsáveis pelo estado da lâmpada.
Como a comutação de estado é dado pela questão que envolve um campo
eletromagnético gerado, não há nenhuma necessidade de contato direto do circuito do Arduino
com o da lâmpada estão, assim, um isolado do outro. Porém, embora solucionadas as questões
que envolvem tensão elétrica, ainda são necessárias algumas precauções com a corrente no
sistema.
Como a corrente que transita no sistema ainda é superior a suportada pelo Arduino, um
transistor é adicionado ao circuito, tendo seu emissor ligado ao GND, a base à saída digital de
controle utilizada e o coletor ao relé. Assim, a corrente que poderia danificar o microcontrolador
quando o relé estiver ativado fluirá para o GND.
Temos agora o Arduino protegido, mas ainda assim, quando desenergizamos a bobina,
desfazendo o campo magnético, a indutância do relé tentará manter a corrente no circuito. Essa
corrente, que surge em sentido reverso, irá danificar o transistor e, em certo ponto, a proteção
que tentamos dar ao diodo terá sido em vão.
Para resolver mais esse problema, utilizamos um diodo conectado em paralelo, e em
sentido reverso, ao relé. Esse diodo é conhecido como freewheeling e promove um caminho para
a circulação de corrente até que a indutância do relé perca toda sua energia, evitando danos a
todo sistema.
Todos esses elementos unidos à um resistor, também para controle de corrente que irá
para o Arduino e àquela que fluirá para seu GND com o auxílio do transistor, formam o chamado
módulo relé. Encontramos módulos comercialmente distribuídos com especificações para
diversas aplicações e utilizaremos um na construção do nosso sistema, como será apresentado
mais adiante.
131
Figura 5.4. À esquerda, um módulo relé de 1 canal e, à direita, um diagrama dos componentes de
um módulo com transistor NPN. Q1 representa o transistor, D1, o diodo, R, o resistor e RLY, o relé.
MONTAGEM DO SISTEMA
Para elaborar o sistema de controle com módulo Bluetooth serão necessários os
seguintes componentes:
Arduino;
Módulo relé 5V, de um canal;
Módulo Bluetooth RS232 HC-05;
Um Resistor de 1.5kΩ, um de 2.4kΩ e um de 10kΩ;
Um LDR (Light Dependent Resistor – Resistor Dependente de Luz);
Jumpers (macho-macho e macho-fêmea);
Protoboard;
Bocal termoplástico adaptável com plug macho;
Plug macho de dois pinos/10A para tomada;
Tomada externa retangular 10A;
Lâmpada 127/220V (dependendo da rede em uso);
Fio flexível branco 1.5mm.
A conexão do relé será dada diretamente a rede elétrica pelo seu terminal comum (C) e
o normal aberto (NO) será utilizado para conectar um dos terminais da lâmpada e, em sequência,
conectar o outro terminal da lâmpada à rede.
O LDR fará parte de um novo divisor de tensão, sendo ligado em um pino analógico do
microcontrolador.
132
LDR
133
FUNCIONAMENTO DO SISTEMA
O sistema deverá, inicialmente, realizar um pareamento entre o módulo Bluetooth e o
dispositivo Android. Feito isso, o smartphone irá realizar uma solicitação ao Arduino, a qual será
enviada pela rede Bluetooth quando os dois estiverem conectados, e o microcontrolador, ao
receber tal solicitação, irá verifica-la e executar uma ação correspondente.
Até aqui temos o sistema funcionando de forma simples, com a solicitação para
acionamento ou desligamento sendo realizada, porém, como foi dito anteriormente, desejamos
um sistema com realimentação ativa, que possa não apenas realizar as ações, mas verifica-las.
É aqui que entra um componente que foi listado e mostrado no esquema do circuito, porém, não
foi explicado: o LDR.
O LDR é um componente resistor cuja resistência varia de acordo com a luminosidade do
ambiente, funcionando como um sensor prático e de baixo custo. Quanto maior a luminosidade
do ambiente, menor será sua resistência (podendo chegar à 8Ω), aumentando de acordo com a
diminuição da luz que o afeta (chegando à 1.0MΩ). Sendo assim, podemos utiliza-lo em uma
porta analógica do Arduino e atribuir um parâmetro de forma que, variado acima ou abaixo do
mesmo, tenhamos uma resposta sobre o acionamento da lâmpada.
No circuito, sua montagem é realizada como um divisor de tensão e seu sinal pode ser
representado digitalmente no Arduino numa variação de 1024 valores (0-1023) e, a partir dessa
faixa de valores e de questões do ambiente no qual o sistema for montado, decidiremos o valor
do parâmetro.
É importante estar atento quando o programa for carregado na placa para que o módulo
bluetooth esteja desconectado da mesma. Como o carregamento via USB utiliza as portas seriais
do Arduino, o Bluetooth pode causar interferência nesse procedimento impedindo a execução do
procedimento. Caso seja de interesse, existe uma função chamada SoftwareSerial, utilizada para
que diferentes portas digitais funcionem para a comunicação serial, podendo ser testada para o
funcionamento do bluetooth e modificações do código sem a necessidade de desconexão do
módulo a cada novo teste.
134
Figura 5.6. Recorte do circuito para melhor visualização das conexões e do LDR (circulado).
O divisor de tensão no qual o LDR está inserido pode ter duas configurações que
modificam a forma como a resposta deve ser trabalhada, consequentemente, como o código
deve ser trabalha.
Usando de base a Fig. 5.2., quando LDR assume a posição de R1, uma maior tensão de
saída será observada quanto maior for a luminosidade. A luminosidade diminui a resistência e,
135
consequentemente, mais tensão chegará na saída, ligada ao pino analógico. A conversão do
valor analógico para digital dará um valor inteiro maior, nessa situação.
Na configuração onde o LDR ocupa a posição de R2, a baixa luminosidade impede a
circulação para o GND fazendo com que uma maior tensão chegue ao pino analógico.
PROGRAMAÇÃO NO ARDUINO
Para esse projeto serão introduzidos alguns tipos diferentes de variáveis, funções e pinos
utilizados, esclarecendo seus detalhes anteriormente ou posteriormente ao código dependendo
da conveniência e de forma a tornarmos mais visual a situação de funcionamento.
Como já foi apresentado e mostrado na Fig. 5.5 e Fig. 5.6, para a realimentação ativa do
sistema utilizaremos como sensor diretamente associado a lâmpada o LDR ligado em um pino
analógico do Arduino. O pino analógico de interesse, conforme figuras, é A2 e pode ser declarado
como um inteiro com valor “A2” ou, simplesmente, “2”.
Sobre a detecção de luminosidade, podemos simplesmente atribuir um valor à uma
variável e uma detecção acima ou abaixo desse valor nos daria a resposta sobre o estado da
lâmpada após repassada a informação de ação. Porém, podemos tornar o sistema mais confiável
e prático, fazendo com que o Arduino meça a luminosidade do ambiente repassada pelo LDR e
tome o valor lido de base para saber se a carga foi ou não acionada. Veremos isso com mais
clareza após apresentado o código.
Faremos a declaração de alguns pinos (analógico e digitais) como const int, cujo valor
inteiro declarado não pode ser alterado no decorrer do código, apenas lido, acusando erro
durante a compilação se houver tentativa de atribuição de novo valor à variável. Esse tipo de
variável é uma melhor opção para declarações de pinos ou outros elementos que são fixos,
podendo ser usado também para tipos float, char, string etc.
Será introduzida, também, a função millis() do Arduino que realiza a medida de tempo,
em milissegundos, desde que o mesmo iniciou o programa recentemente em funcionamento.
Como essa contagem entra em overflow (retorna à zero) somente após 50 dias (caso o Arduino
funcione initerruptamente), utilizaremos a declaração unsigned long para variáveis que
manipulem esse tempo7.
No início do código foram estabelecidos os nomes das variáveis, seus tipos e valores
iniciais (em algumas delas).
7 O uso de outro tipo de declaração que não unsigned long para cálculos aritméticos que envolvem uma unsigned long, tal
como é utilizado pela função millis() pode acarretar em erros.
136
const int rele = 4; //pino de acionamento do rele
const int analogPin = 2; //pino de leitura analogica do LDR
void setup() {
pinMode(rele, OUTPUT); //pino ligado ao rele como saída de dados
Serial.begin(9600); //inicio da comunicação serial taxa de 9600
137
tenha uma maior autonomia, sem a necessidade de intervenção constante no código para
ajustes.
A mesma ideia é utilizada quando introduzimos a função DetectaLuzTempo(), que
permite ao sistema realizar uma auto calibração ao longo do tempo. Como conversado no
primeiro capítulo, utilizamos a função para deixar o loop() mais enxuto e, estando onde estiver
no programa, a mesma será chamada, executada suas instruções e voltará ao loop() na
sequência.
void loop() {
DetectaLuzTempo();
/* função para que, após a verificação inicial, a analise de luminosidade
seja feita a cada determinado periodo de tempo pré-determinado do millis().
OBSERVAÇÃO: essa função é interessante para, por exemplo, quando o
equipamento for utilizado num determinado intervalo de tempo em local onde
haja variação de iluminação (ex.: operação em céu aberto) */
if(Serial.available()){
leituraBT = Serial.read();
if(leituraBT = 'A') digitalWrite(rele, LOW);
if(leituraBT = 'D') digitalWrite(rele, HIGH);
}
//verifica se o q está sendo lido pelo LDR após a solicitação de
//ligar/desligar lampada
resposta = analogRead(analogPin);
139
Vale notar que, nesse sistema, essa mensagem independe da solicitação, sendo essa
uma montagem simples do mesmo. Caso seja de interesse, alterações podem ser realizadas de
acordo com suas habilidades adquiridas ou já existentes na linguagem.
Voltando para a função DetectaLuzTempo(), temos o uso do tipo unsigned long para
as manipulações do tempo com millis(). Aqui faremos a decisão do intervalo de tempo em
que a variável “ambiente” será atualizada com a luminosidade local, conforme dito anteriormente.
Assim, sendo a diferença de atualMillis e anteriorMillis maior que o valor de “tempo”, a
estrutura condicional que os compara será a responsável por verificar se o relé está acionado,
pois mudar o valor de “ambiente” nessa situação pode levar a uma informação errada sobre o
estado da lâmpada, e sendo a situação propícia, o valor de “ambiente” será reestabelecido para
condizer com a situação atual de luminosidade do local onde o sistema está posicionado.
140
void DetectaLuzTempo(){
//variaveis iniciadas para contagem de tempo
unsigned long atualMillis = millis();
unsigned long anteriorMillis = 0;
unsigned long tempo = 1800000;
Em resumo, temos:
Iniciação das variáveis necessárias;
Inicialização dos pinos utilizados e do while-loop para calibrar a luminosidade em
setup();
Verificação cíclica do tempo através da função DetectaLuzTempo() em loop()
com calibração da luminosidade após dado intervalo desse tempo;
Recebimento de dados via Bluetooth por parte do Android, armazenamento e
verificação do seu valor para que uma ação seja tomada por meio de um dos “if”
(acionar ou desligar lâmpada);
Envio de mensagem ao Android relativo ao estado da lâmpada.
141
DESENVOLVIMENTO DO APLICATIVO NO APP INVENTOR
O aplicativo utilizará a conectividade Bluetooth do dispositivo Android e para isso alguns
blocos de alerta também serão postos para que estejamos cientes da necessidade de conexão
e ativação de sua rede. Além disso, é necessário que, ligado o Bluetooth, seja feito um
pareamento entre as vias do sistema.
142
Tabela 5.1. Componentes para projeto de Comunicação via Bluetooth. (conclusão)
BackgroundColor Green
FontBold marcar
Ligar (Button) User Interface Width Fill parent
Shape Rounded
Text Ligar
BackgroundColor Red
FontBold marcar
Desligar (Button) User Interface Width Fill parent
Shape Rounded
Text Desligar
FontBold Marcar
FontSize 20.0
HasMargins desmarcar
STATUS (Label) User Interface
Text STATUS
TextAlignment Center : 1
TextColor Yellow
FontBold marcar
FontSize 20.0
AGUARDANDO... HasMargins desmarcar
(Label) User Interface Text AGUARDANDO...
TextAlignment Center : 1
TextColor Green
ListPicker1 User Interface Visible desmarcar
Notifier User Interface - -
BluetoothClient1 Connectivity - -
Clock Sensors - -
Na tabela acima, os componentes cujos nomes estão entre parênteses e um outro nome
é apresentado anteriormente sinalizam aqueles cujos nomes foram alterados pelo uso do
“Rename”, como já explicado ser possível no capítulo anterior.
Foram criados dois botões relativos a solicitação de conexão e desconexão com um
dispositivo Bluetooth. Ao clicar em “CONECTAR” será aberta uma lista, o “ListPicker1”, com
todas as redes Bluetooth pareadas disponíveis e “DESCONECTAR” finaliza o conexão realizado
com uma dessas redes.
Os outros dois botões, “Ligar” e “Desligar”, são os responsáveis pelo envio da solicitação
de acionamento (mensagem “A”) e desligamento (mensagem “D”), respectivamente, ao Arduino.
143
O texto “AGUARDANDO...” será substituído pelas mensagem “ligado ” ou “desligado
”, após a conexão, conforme o estado em que a lâmpada se encontra.
Os componentes não visíveis “Notifier1”, “BluetoothClient1” e “Clock1” são utilizados,
respectivamente, para exibir notificações no aplicativo conforme programado em Blocks, permitir
o funcionamento do cliente Bluetooth através do aplicativo, e para contagem de tempo, utilizada
para um loop de recebimento de mensagens através do Bluetooth, conforme veremos.
Em “Screen1” foram utilizadas duas imagens, cujo upload foi realizado em “Media”:
BT_icon.jpg, referente ao ícone do aplicativo no dispositivo Android, e bt.png, referente ao fundo
de tela do aplicativo.
Demais componentes foram utilizados para identificação de cada região do aplicativo e
ao que os botões se referem (labels), além daqueles com função de aperfeiçoamento do layout
do aplicativo (arrangements).
É interessante lembrar que, caso seja de interesse, é possível alterar o nome do aplicativo
que aparecerá no dispositivo Android após a intalação do apk fazendo a modificação do
“AppName” em “Screen1”.
Figura 5.7. À direita, imagem utilizada para fundo de tela do aplicativo e, à esquerda, ícone do
aplicativo. Fonte: pesquisa por imagens da palavra-chave “bluetooth”.
144
Figura 5.8. Layout no Viewer após montagem dos componentes.
Figura 5.9. Bloco responsável por notificação em tela em caso de indisponibilidade do Bluetooth.
A peça “when Screen1.Initialize do” é responsável por realizar uma ação ou evento
quando a tela em questão do aplicativo for inicializada seja ao abrir o aplicativo pela primeira vez
ou pela comutação entre telas.
145
Assim, inicializar o aplicativo é feita uma verificação de se o Bluetooth do celular está
habilitado. Caso ele não esteja, uma caixa de diálogo da notificação com opções de escolha
(Notifier1. ShowChooseDialog) aparecerá na tela informando a necessidade de que o mesmo
esteja ativo e dando dois botões possíveis de serem clicados. A mensagem pode ser cancelada
detectando-se a conexão entre o dispositivo Android e o Arduino.
Figura 5.10. Notificação apresentada em tela no caso de o Bluetooth do dispositivo Android não
estar conectado.
Como podemos observar, a verificação de conexão foi feita por uma peça condicional: “if-
then”. A estrutura, funciona de maneira análoga ao if apresentado no primeiro capítulo, ao
falarmos das estrtuturas condicionais, de modo a realizar um determinado evento verificada a
obediência de uma dada condição.
Nesse ponto já é possível entender que, para encontrarmos um bloco que seja mais
“geral” devemos verificar sua cor e procurá-lo em Built-in. O bloco de interesse no momento
pertence aos blocos de controle (control) e pode ser expandido para melhor desenvolvimento da
estrutura condicional de interesse.
146
Figura 5.12. Bloco "if-then" antes e depois da conexão do bloco "else if", selecionado no menu de
configuração (engrenagem).
Em “if” e “else if” devemos colocar as condições. A tradução desses termos seriam “se” e
“senão se” e, sendo assim, quando as condições impostas por uma das estruturas conectadas à
essas forem satisfeitas, a regra subsequente em “then” (“então”) será aplicada. Ao utilizarmos
“else” (“se não”), a condição a ser satisfeita é a de que nenhuma das anteriores obteve sucesso
nos restando apenas a aplicação de uma dada regra de interesse.
Quando uma das opções é selecionada entramos num novo bloco referente ao que pode
ocorrer depois da escolha (.AfterChossing) com duas saídas:
OK – mostra um alerta (Notifier1.ShowAlert) na tela com o aviso (notice): “Ative o
Bluetooth antes de usar o app”;
Sair – encerra o aplicativo.
Figura 5.13. Bloco com as ações possíveis dependendo de qual botão foi pressionado.
147
Figura 5.14. Alerta apresentado caso “Ok” fosse pressionado.
Passadas essas estruturas iremos agora para os blocos referentes aos botões, a começar
pelo “CONECTAR”.
Figura 5.16. Alerta quando não há conectividade Bluetooth e "CONECTAR" foi clicado.
148
Figura 5.17. Lista de seleção de dispositivos pareados após clicar em "CONECTAR", com Bluetooth
ligado.
A lista de seleção possui dois blocos especificados um para a ação anterior a seleção de
uma conexão (conforme figura acima) e outra com uma condição após a seleção, que nos dá
uma alerta de erro caso a conexão com o endereço tenha falhado por algum motivo.
Figura 5.18. Blocos referente a lista de seleção de antes e depois de ser selecionada uma opção.
Figura 5.19. Alerta de erro quando o item selecionado não estabelesse conexão.
149
Figura 5.20. Bloco responsável por desfazer a conexão com o Bluetooth.
Ao clicar no botão é feito, primeiramente, uma verificação da conexão. Caso ela exista, o
Bluetooth será desconectado e caso contrário, um alerta informará que não há uma conexão com
Bluetooth.
Figura 5.21. Notificação apresentada ao tentar desconectar quando não há conexão estabelecida.
150
Figura 5.22. Blocos para envio de solicitação para acionar ("A") e desligar ("D") a lâmpada.
Até aqui temos todo o mecanismo de funcionamento para que a conexão do Bluetooth e
entre os componentes do sistema seja estabelecida e para que as solicitações sejam enviadas
ao Arduino.
Para que tenhamos agora a questão da realimentação efetiva é necessário criarmos uma
função que seja responsável por receber os dados que o microcontrolador, que verifica
constantemente a resposta da ação que está sendo executada,de modo a apresenta-los em tela.
Isso será feito pelo próximo conjunto de dados que será mostrado.
Figura 5.23. Blocos responsáveis por verificar e receber informações, via Bluetooth, para seu
display na tela do aplicativo desenvolvido.
Nessa estrutura, a cada “Clock1” é feita uma verificação de se o Bluetooth está conectado
e, caso a condição seja atendida, o label “AGUARDANDO” terá seu texto em tela alterado de
“AGUARDANDO...” para aquele recebido via Bluetooth.
151
O valor de “Clock1” estava pré-estabelecido como 1000 (unidade em milisegundos), na
aba Designer em “TimerInterval”. A cada passagem desse tempo, verifica-se a conexão
Bluetooth e, estando conectado, faz-se uma busca por bytes disponíveis a serem recebidos via
Bluetooth. Esses bytes são representados pelas mensagens enviadas pelo Arduino: “Ligado “
e “Desligado “.
Montados todos esses blocos estamos prontos para realizar a build e utilizar o aplicativo
juntamente com o programa carregado na placa do microcontrolador finalizando nosso primeiro
método de integração entre Arduino e App Inventor!
SHIELD ETHERNET
A versão mais atual do shield (Ethernet Shield 2) é baseada no Wiznet W55009 e prove
uma rede capaz de utilizar os protocolos de comunicação UDP (mais rápido) e TCP (mais
confiável no que diz respeito a transmissão de dados).
8
O conteúdo e estudo sobre redes de computadores é bastante extenso e tomaria um tempo que é desnecessário no momento para
152
Para a conexão com a rede incluiremos na programação o cabeçalho “Ethernet.h” (ou
“Ethernet2.h, para a versão atual), da biblioteca “Ethernet” e utilizaremos funções associadas.
Além disso, incluiremos um cabeçalho chamado “SPI.h” devido a comunicação entre o shield e
o microcontrolador em si, que utiliza um barramento da placa denominado SPI (Serial Peripheral
Interface).
O SPI é um protocolo que permite a comunicação entre o microcontrolador e outros
componentes como, nesse caso, o shield Ethernet. O barramento ocupa os pinos de 10 a 13 do
Uno, não devendo os mesmos serem utilizados para outra finalidade nessa situação. Além disso,
o shield possui um slot para microSD, utilizando o pino 4 e compartilhando o barramento com o
Arduino sendo outro que não deve ser utilizado quando um estiver acoplado.
Figura 5.25. Esquema do shield Ethernet, indicando os pinos referentes ao SPI (10, 11, 12 e 13) e ao
cartão SD (microSD, em sua versão atual).
153
MONTAGEM DO SISTEMA
Os seguintes componentes são necessários para a montagem desse sistema:
Arduino Uno com cabo USB 2.0;
Fonte 12V chaveada 100-240VAC para Arduino;
Módulo relé 5V de um canal;
Ethernet Shield W5100/W5500;
Roteador Wireless N 5dbi 150mbps (por exemplo);
cabo UTP com plug RJ-45;
Um Resistor de 10kΩ;
Um LDR;
Jumpers (macho-macho);
Protoboard;
Bocal termoplástico adaptável com plug macho;
Plug macho de dois pinos/10A para tomada;
Tomada externa retangular 10A;
Lâmpada 127/220V (dependendo da rede em uso);
Fio flexível branco 1.5mm.
O Arduino acoplado ao shield pode ser conectado de duas maneiras ao roteador: pela
porta WAN ou por uma das portas LAN.
A porta WAN (Wide Area Network) diz respeito à configuração de uma rede externa
cobrindo um grande espaço físico. Normalmente é utilizada como referência à rede da internet,
por ser utilizada para conectar o cabo que permite acesso a mesma. Sendo assim, caso o
Arduino seja conectado nessa porta, teremos o fechamento de uma rede onde todos os
dispositivos que se conectem a ela estarão conectando-se ao microcontrolador e entre si.
Quando conectado à porta LAN (Local Area Network), os demais dispositivos que se
conectam pelas demais portas LAN ou pelo Wi-fi estarão conectados entre si e com a internet
(caso um cabo que permita esse acesso esteja conectado na porta WAN).
154
Porta WAN Portas LAN
Figura 5.26. Roteador com destaque eu suas portas LAN e porta WAN.
155
RJ-45
FUNCIONAMENTO DO SISTEMA
Para que o Arduino tenha acesso a rede e se comunique com outros dispositivos através
do shield Ethernet é necessário, também, que o microcontrolador também tenha um endereço
de IP (Internet Protocol) e um MAC (Media Access Control), que serão declarados em sua
programação.
Com relação ao IP, é necessário verificar um endereço que seja pertencente e esteja
disponível para uso na rede. Para podermos identificar um endereço disponível, podemos utilizar
um dispositivo já conectado à rede, verificar seu IPv4/6 (ip do dispositivo) e o gateway padrão (ip
do roteador) e, a partir disso, alterando-se o byte menos significativo do IP do dispositivo teremos
um novo endereço pertencente a rede.
Utilizando um computador macOS/OS X, devemos clicar no ícone da maçã e em
“Preferências do Sistema...”. Na sequência, na janela de configurações, devemos selecionar a
156
opção “Rede” e, na janela que se abrir, teremos a informação do ip da máquina. Ali, clicar em
Avançado nos dá a possibilidade de verificar o ip do roteador na aba de “TCP/IP”.
Através de um sistema Linux podemos utilizar, por exemplo, o comando “ifconfig”, em seu
terminal. No prompt de comando do Windows, que podemos acessar pressionando as teclas
“Windows+R” através do comando “cmd” (sem aspas), “ipconfig” é a palavra chave para ter
acesso as informações necessárias.
Figura 5.29. Resultado obtido a partir do uso do comando ipconfig no prompt de comando do
Windows.
157
PROGRAMAÇÃO NO ARDUINO
Além dos cabeçalhos “Ethernet.h” e “SPI.h”, utilizaremos “String.h”, devido as
manipulações que serão feitas com esse tipo de dado. Iniciaremos, também, o datatype (tipo de
dado) “byte” para iniciar os vetores das variáveis que representarão o IP e o MAC do dispositivo.
Como já foi apresentado, o Arduino está envolvido no processo de servidor. Assim, o
mesmo é responsável por fornecer os recursos de rede necessários para à comunicação com o
aplicativo. Será então necessário o uso da função EthernetServer(), pela qual é criado servidor
que escuta por conexões através de uma porta de serviço específica que é fornecida (como uma
porta aberta na qual os interessados podem entrar e interagir com o anfitrião).
#include <SPI.h> //cabeçalho devido ao uso do shield
#include <String.h> //cabeçalho para o uso de variáveis tipo string
#include <Ethernet.h> //para o shield ethernet primeira versão
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36 }; // Endereço Mac
byte ip[] = { 192, 168, 0, 178 }; //Endereço de Ip disponivel na Rede
EthernetServer server(8090); // Porta de serviço
Feitas essas configurações iniciais e a inicialização das demais variáveis, partimos para
o setup(), onde teremos uma nova linha iniciando a função Eterneth.begin(), que inicializa a
biblioteca Ethernet e configurações de rede pegando como argumentos os valores de MAC e IP
estipulados no início do código.
Demais estruturas e funções referentes ao Ethernet, encontradas em loop(), serão
rapidamente explicadas no código bem como a criação do web server, responsável por permitir
o Arduino a responder as requisições HTTP (Hypertext Transfer Protocol) recebidas do
dispositivo Android. Essas respostas são referentes aos quatro quadrantes, tal como na
comunicação via Bluetooth, porém, as respostas serão apenas repassadas após recebimento de
requisição e resposta à mesma (não faremos o envio intermitente de resposta). Veja:
158
void setup() {
Ethernet.begin(mac, ip); // Inicia o Ethernet
pinMode(rele, OUTPUT); // Define o pino como saída
Serial.begin(9600); // Inicia a comunicação Serial
digitalWrite(rele, HIGH); //mantem lampada inicialmente desligada
void loop() {
DetectaLuzTempo();
if (client){
while (client.connected()){ //conecta o cliente
if (client.available()){ //verifica dados disponiveis
char c = client.read(); //le os dados disponiveis
//caractere por caractere vindo do HTTP, ou seja,
//as mensagens transferidas pela porta especificada ao
//endereco do arduino
if (readString.length() < 30) //palavra menor do que maximo
{
// armazena os caracteres para string
readString += (c);
}
// Se o pedido HTTP terminou
if (c == '\n'){
// vamos verificar se a lampada deve ser ligado
// Se a string possui o texto LigarLampada
if(readString.indexOf("LigarLampada")>=0)
{
digitalWrite(rele, LOW); //comando de acionamento da
//lampada
159
status_lamp = true; //o pedido de acionamento foi
//realizado
delay(500);
}
// Se a string possui o texto DesligarLampada
if(readString.indexOf("DesligarLampada")>=0)
{
digitalWrite(rele, HIGH); //comando de desligar a lampada
status_lamp = false; //pedido de desligar foi realizado
delay(500);
}
/* dados HTML de saída começando com um cabeçalho padrão
* temos aqui a montagem de um web server simples
* que mostra as mesmas mensagens de resposta
* que são apresentadas no aplicativo desenvolvido */
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.print("<font size='20'>");
resposta = analogRead(analogPin );
160
Devido a estrutura de mensagem utilizada, verificaremos inicialmente o tamanho da string
lida através da função readString.length() e sendo esse tamanho dentro do estipulado
faremos a leitura dos dados recebidos por meio de readString armazenando-a em “c”.
Por padrão, um vetor de char será terminado com um caractere do tipo “\n”. Dessa
maneira, ao observar esse caractere, como feito na programação, saberemos que o dado
enviado foi totalmente recebido e podemos prosseguir com o programa.
A função “readString.indexOf” verifica se a solicitação HTTP enviada pelo aplicativo
contém o texto “LigarLampada” ou “DesligarLampada” e, sendo localizada uma delas, uma ação
será tomada e um booleano (status_lamp) terá seu valor de acordo com o que foi solicitado.
No programa, vemos o uso desse booleano na estrutura condicional de uma maneira
interessante (o mesmo ocorre mais ao início de loop() com “client”). No caso, quando desejamos
verificar se o valor é verdadeiro, podemos utilizar 3 formas diferentes que, utilizando a estrutura
no qual o booleano foi aplicado, são:
if(status_lamp == TRUE), if(status_lamp == 1) ou if(status_lamp).
Quando status_lamp é verdadeiro, ou seja, o comando enviado para o relé foi de
acionamento, entraremos em um if-loop que verifica os quadrantes voltados para essa condição
inicial:
Solicitação de acionamento, lâmpada ligada;
Solicitação de acionamento, lâmpada desligada.
E, no caso de status_lamp falso, vamos para a estrutura restantes para fechar os quatro
quadrantes do funcionamento em realimentação efetiva:
Solicitação de desligamento, lâmpada desligada;
Solicitação de desligamento, lâmpada ligada.
Daí, as mensagens utilizando “cliente.println” são aquelas enviadas como resposta ao
dispositivo Android como resposta.
A programação parece extensa, devido a introdução e uso da biblioteca Ethernet, mas
seu entendimento é relativamente simples, seguindo uma sequência de fácil explicação:
Fazemos a inclusão dos cabeçalhos necessários;
Estabelecemos o IP, MAC e porta de serviço;
Inicializamos as variáveis que serão utilizadas para os pinos, leitura de dados,
ações, realimentação e leitura do ambiente;
Iniciamos as comunicações serial, Ethernet e o pino digital e fazemos a verificação
inicial de luminosidade;
Verificamos o tempo para releitura de luminosidade;
161
Iniciamos a comunicação com os clientes, verificamos disponibilidade de dados
para leitura, lemos e armazenamos os mesmos;
Verificamos a mensagem de interesse recebida nesses dados
Realizamos ação de acordo com o recebido utilizando um web server
Encerra comunicação com cliente.
Para finalizar, não devemos nos esquecer da declaração da função e seu script.
void DetectaLuzTempo(){
if(digitalRead(rele) == LOW)
Serial.println("Lampada ainda acionada, verificação de luminosidade
ambiente não atualizada");
else{
ambiente=0;
while(millis()-anteriorMillis < 5000){
LDR = analogRead(analogPin);
if(LDR > ambiente) ambiente = LDR;
}
Serial.print("Luminosidade atualizada: ");
Serial.println(ambiente);
}
}
}
DESENVOLVIMENTO DO APLICATIVO
Para o Designer do aplicativo teremos uma apresentação mais simples. Os botões
utilizados são para o controle da lâmpada, sendo a conexão com a rede feita pelo próprio
dispositivo de Wi-Fi do celular. A tabela com os componentes utilizados e suas modificações será
apresentada a seguir.
162
Tabela 5.2. Componentes para o projeto de comunicação via Ethenet e roteador.
Components Onde encontrar Properties Valor
AlignHorizontal Center : 3
Inicia com BackgroundImage Network.jpg
Screen1
projeto Icon wificon.jpg
TitleVisible desmarcar
BackgroundColor None
HorizontalArrangement1 Layout
Width Fill parent
BackgroundColor Green
FontSize 25
FontBold marcar
LIGAR (Button) User Interface Width Fill parent
Shape Rounded
Text LIGAR
BackgroundColor Red
FontSize 25
FontBold marcar
DESLIGAR (Button) User Interface
Width Fill parent
Shape Rounded
Text DESLIGAR
BackgroundColor none
FontSize 25
HasMargins desmarcar
Label_status (Label) User Interface
Text STATUS
TextAlignment Center : 1
TextColor Yellow
BackgroundColor none
FontSize 25
HasMargins desmarcar
Label_resultado (Label) User Interface
Text Aguardando...
TextAlignment Center : 1
TextColor Cyan
Web1 Connectivity - -
Notifier1 User Interface - -
As imagens utilizadas para plano de fundo do aplicativo e ícone do mesmo (para quando
instalado no dispositivo Android) estão na figura a seguir.
163
Figura 5.31. Plano de fundo do aplicativo à esquerda e ícone do aplicativo, à direita.
164
Partindo agora para a aba Blocks faremos a revisão bloco a bloco.
Figura 5.33. Bloco com chamada de URL, utilizada para verificar conexão do sistema.
Figura 5.34. Bloco com dialogo de escolha para erro 1101, obtido quando não se obter resposta da
chamada da URL.
10 Se refere a um endereço de rede no qual algum recurso de interesse pode ser localizado, como um
arquivo texto, dispositivo de E/S, dentre outros. A representação completa de uma URL é da forma
“protocolo://domínio:porta/caminho/recurso?query_string#fragmento”. No aplicativo que está sendo criado,
temos URL’S que vão até a “porta” e, também, ao “caminho”.
165
A estrutura condicional é referente a um erro que ocorre e é mostrado na tela do
dispositivo, por isso à utilizamos em “Screen1”. Em seu interior, utilizamos a estrutura “if” para
verificar o número do erro obtindo e, sendo ele “1101”, chamamos um diálogo de notificação para
escolha de uma opção.
Figura 5.35. Caixa de dialogo de notificação quando o aplicativo não está conectado à rede do
Arduino.
166
Figura 5.37. Blocos relativos aos botões de solicitação de acionamento ("LIGAR") e desligamento
("DESLIGAR") da lâmpada.
Das requisições feitas, o Arduino enviará uma resposta e a mesma será apresentada na
tela do dispositivo Android quando recebido. Além disso, as solicitações e respostas podem ser
realizadas e visualizadas pelo browser, sabendo-se as URL’s para as solicitações (as mesmas
descritas pelos botões do aplicativo).
O aplicativo receberá os textos de resposta através do “Web1.GotText” e para a
interpretação dessas respostas recebidas temos a peça “contains text” que compara esse valor
com um dos esperados para que possa apresentar todas as respostas dos 4 quadrantes na tela.
Figura 5.38. Bloco com as interpretações das respostas recebidas para apresentação das mesmas
em tela.
167
Figura 5.39. Respostas possíveis apresentadas em tela.
Criado esses blocos, temos todo o necessário da programação para enviar as solicitações
e receber e tratar o texto de resposta.
168
controle através de comandos AT11 sendo capaz de trabalhar com SMS, fazer up/download de
dados para um servidor web e enviar sinais via alto-falante e fone de ouvido ou realizar gravação
de áudio, fazendo com que o Arduino tenha as funcionalidades de um telefone celular.
A troca de dados no sistema a ser montado será via SMS.
11 Comandos AT são utilizados para controlar MODEMs. AT é a abreviação de atenção. Estes comandos vem dos Hayes
commands. Dispositivos que envolvem comunicação entre maquinas precisam desses comando para interagir com um computador,
no caso, o arduino. Os mesmos, quando utilizados no shield podem ser usados para acessar informações e serviços do tipo SMS,
MMS, fax e de dados e voz ligados a uma rede móvel.
169
Figura 5.41. Visão superior do Shield GSM/GPRS SIM900.
Figura 5.42. Visão da parte inferior do Shield GSM mostrando o local (parte cinza) onde devemos
encaixar o cartão SIM.
MONTAGEM DO SISTEMA
O sistema semelhante ao da montagem do ultimo realizado utilizando Ethernet,
modificaremos apenas o shield nesse caso. Utilizaremos:
Arduino Uno com cabo USB 2.0;
Fonte 12V chaveada 100-240VAC para Arduino;
Módulo relé 5V de um canal;
GSM/GPRS Shield SIM900;
Cartão SIM desbloqueado para uso no shield;
170
Um Resistor de 10kΩ;
Um LDR;
Jumpers (macho-macho);
Protoboard;
Bocal termoplástico adaptável com plug macho;
Plug macho de dois pinos/10A para tomada;
Tomada externa retangular 10A;
Lâmpada 127/220V (dependendo da rede em uso);
Fio flexível branco 1.5mm.
As conexões são como se seguem e o shield não foi representado na imagem, mas os
jumpers devem ser ligados no mesmo.
171
FUNCIONAMENTO DO SISTEMA
Um problema que poderíamos nos deparar para o funcionamento do sistema seria com
relação ao bloqueio PIN (Personal Identification Number). Os cartões que usualmente
compramos de uma operadora qualquer não possuem bloqueio por PIN, mas caso se depare
com uma situação do tipo, onde o sistema não funcione mesmo que esteja tudo aparentemente
correto na montagem e códigos do Arduino e App Inventor, vale apena conectar o SIM do shield
num dispositivo Android e, nas opções de segurança, buscar por configurações de bloqueio do
mesmo e desbloquea-lo.
Estando agora nas condições de configuração do cartão SIM, montagem e programação
corretas o sistema funcionará de uma maneira simples. Informaremos ao aplicativo o número de
telefone referente ao Arduino e o salvaremos. Essa inicialização é feita para evitar que outras
pessoas que, por alguma razão, tenham acesso ao aplicativo, mas não estejam autorizadas a
utilizar o sistema tenham isso facilitado.
Informado o número, podemos agora fazer o envio de mensagens ao microcontrolador
que, ao recebe-la, verificará a solicitação enviando um comando ao relé. O LDR fará seu papel
verificando o status do comando para a questão da realimentação efetiva e uma mensagem de
resposta será repassada ao Arduino que, por sua vez, apresentará uma mensagem em tela sobre
a solicitação. O código das mensagens recebidas podem também ser verificados pela caixa de
mensagens do dispositivo Android, tendo em vista que a leitura das respostas é feita por ela.
PROGRAMAÇÃO NO ARDUINO
Precisamos fazer o download da biblioteca que envolve os usos e funcionalidades do
shield. A mesma pode sem localizada no site GitHub, disponibilizada por “MarcoMartins” em:
https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield.
172
Figura 5.44. Recorte da página web onde podemos localizar e fazer o download da biblioteca
necessária para uso do shield.
173
#include <SPI.h>
#include <String.h>
#include <SoftwareSerial.h> //para comunicacao serial do shield
#include "SIM900.h" //para utilizar o módulo GSM
int ambiente = 0;
int LDR = 0;
int resposta;
174
void setup() {
Serial.begin(9600);
gsm.begin(9600); //inicia a conexão GSM
pinMode(rele, OUTPUT);
digitalWrite(rele, HIGH);
Partindo agora para o loop(), temos a função para verificação periódica da luminosidade
e iniciamos o tratamento de mensagens a serem recebidas.
void loop() {
DetectaLuzTempo();
175
o byte que representa a posição da mensagem na memória do cartão SIM;
os caracteres para o número de telefone;
o valor máximo de caracteres que o número de telefone pode ter;
os caracteres que compõem a mensagem;
o valor máximo de caracteres que ela pode ter.
Acima, utilizamos dentro das estruturas condicionais a função de string “strcmp”, que
promove a comparação de um valor de variável com outro valor de interesse e, caso essa
comparação seja verdadeira, retorna o valor 0. No caso, a mensagem recebida e armazenada
em “sms_text” sera comparada com “ON” e com “OFF”, caso a comparação inicial não seja
atendida como verdadeira.
Atendida a condição um texto será enviado ao monitor serial informando a solicitação
(apenas por confirmação, a linha pode ser transformada em comentário) e um sinal de baixa ou
de alta enviado ao pino do relé para ligar ou desligar a lâmpada, respectivamente. Além disso,
teremos a atribuição de valor para “status_lamp” que, conforme no projeto de comunicação
Ethernet, será utilizado para a verificação dos quadrantes.
176
resposta = analogRead(analogPin);
if(status_lamp){
if(resposta > ambiente){
Serial.println("Acionamento realizado");
sms.SendSMS(phone_number,"ONACK"); //lampada acionada
}
else if(resposta <= ambiente){
Serial.println("Falha no acionamento");
sms.SendSMS(phone_number,"ONnotACK"); //lampada não acionada
}
}
del_sms();
Temos na sequência a leitura de dados do pino analógico no qual o LDR está conectado,
comparação do valor de resposta com o valor ambiente e verificado o obtido com “status_lamp”.
Através de “sms.SendSMS” será enviada uma resposta proporcional ao número que enviou a
solicitação de acionar ou desligar a lâmpada, número esse que foi armazenado em
“phone_number”.
Antes de finalizar o loop(), faremos uso de uma função nova chamada “del_sms()”,
responsável por deletar mensagens já lidas.
Na parte final do programa, temos as duas funções criadas por nós e utilizadas. Vamos
verificar a parte do código referente a função de deleção.
177
void DetectaLuzTempo(){
if(digitalRead(rele) == LOW)
Serial.println("Lampada ainda acionada, verificação de luminosidade
ambiente não atualizada");
else{
ambiente=0;
while(millis()-anteriorMillis < 5000){
LDR = analogRead(analogPin);
if(LDR > ambiente) ambiente = LDR;
}
Serial.print("Luminosidade atualizada: ");
Serial.println(ambiente);
}
}
}
void del_sms(){
Serial.println("deleting old sms");
for (int i=0; i<10; i++){ //verifica ateh 10 mensagens
int msg=sms.IsSMSPresent(SMS_READ); //busca mensagens lidas
if (msg!=0){ //encontrando mensagem lida…
Serial.println("Old SMS found ");
if (sms.DeleteSMS(msg)==1) //sendo a mensagem deletada
Serial.println("Old SMS deleted ");
}
else
Serial.println("No SMS to be deleted ");
}
}
Os comandos para envio de mensagens ao monitor serial são, mais uma vez para que
tenhamos uma melhor visão dos processos acontecendo. Como o cartão SIM tem um espaço
178
bastante limitado para armazenamento das mensagens que recebe e não libera esse espaço por
si só para o recebimento de novas, uma função que faça esse papel é importante para que o
sistema não para de responder.
Sendo assim, utilizamos um for-loop no qual verificaremos, por 10 vezes, a existência de
mensagens lidas utilizando “sms.IsSMSPresent(SMS_READ)”. Encontrada uma mensagem já
lida, aplicaremos “sms.DeleteSMS()” para apaga-la.
Temos agora todo o necessário para que o Arduino receba as mensagens advindas do
aplicativo e responda-as adequadamente.
DESENVOLVIMENTO DO APLICATIVO
Como cada cartão SIM possui um número diferente para discagem, uma maneira de
facilitar a comunicação, de modo que não seja necessária a compilação do código do Arduino a
cada montagem com SIM diferente, é a criação de um campo para que possamos digitar o
número de contato e salvar seu valor.
Faremos isso de um modo simples, de forma que cada inicialização do aplicativo solicite
o número de contato do Arduino. Mas é possível salvar de maneira que o aplicativo tenha valores
atribuídos à variável quando for inicializado novamente (explore as possibilidades!).
Alguns componentes de alinhamento foram utilizados para o layout visando estética
apenas e, dessa vez, apenas escolhemos um ícone para o aplicativo (sem upload de imagem de
fundo). A imagem do ícone pode ser vista na próxima figura.
179
Tabela 5.3. Componentes para o projeto de comunicação via GSM.
Components Onde encontrar Properties Valor
AlignHorizontal Center : 3
Inicia com BackgroundColor Dark Gray
Screen1
projeto Icon sms.png
TitleVisible desmarcar
VerticalArrangement1 Layout Height 10 pixels
FontBold marcar
DIGITE O NÚMERO
Label1 User Interface Text
DO ARDUINO
TextColor Cyan
VerticalArrangement2 Layout Height 10 pixels
TEXTNUMBER Width Fill parent
User Interface
(TextBox) NumbersOnly marcar
VerticalArrangement3 Layout Height 10 pixels
FontBold marcar
USARNUMERO (Button) User Interface Text USAR NÚMERO
TextAlignment Center : 1
VerticalArrangement4 Layout Height 20 pixels
BackgroundColor Green
FontBold marcar
Width Fill parent
LIGAR (Button) User Interface
Shape rouded
Text LIGAR
TextAlignment Center : 1
VerticalArrangement5 Layout Width 10 pixels
BackgroundColor Red
FontBold marcar
Width Fill parent
DESLIGAR (Button) User Interface
Shape rouded
Text DESLIGAR
TextAlignment Center : 1
VerticalArrangement6 Layout Height 30 pixels
FontSize 20
Label2 User Interface Text STATUS
TextColor yellow
VerticalArrangement7 Layout Height 10 pixels
Text AGUARDANDO...
STATUS (Label) User Interface
TextColor Cyan
Notifier1 User Interface - -
Texting1 Social - -
Texting2 Social - -
180
O aplicativo terá o seguinte aspecto no painel Viewer:
Prosseguiremos com um bloco que trate o que será escrito no campo de texto criado e o
que ocorrerá ao clicarmos no botão para “USAR NÚMERO”.
Como já mostrado na Tab. 3.3, marcamos uma opção do campo de texto que o configura
para que apenas um teclado numérico apareça quando clicarmos no mesmo para escrever uma
181
informação. Isso facilita a digitação quando apenas uma informação numérica é solicitada e evita
que o usuário clique em valores fora dos de interesse.
Além disso, um telefone celular tem um requisito mínimo de números. No código do
aplicativo, diferente do apresentado ao falarmos da programação do Arduino, apresentamos uma
estrutura de número sem o “+55”, considerando que o uso será dado dentro do país, facilitando
o entendimento dos usuários.
Caso um telefone não seja inserido no campo de texto ou o mesmo tenha uma quantidade
de números diferente da esperada um diálogo de escolha de notificação será apresentada em
tela (Notifier1.ShowChooseDialog) informando o formato correto a ser utilizado, que consiste no
digito “0”, associado ao código de área do cartão SIM arduino e seguido pelo seu número
propriamente dito, o que totaliza 12 dígitos (ex.: 0 11 9 12345678, sem os espaços).
Figura 5.48. Bloco referente às ações a serem executadas quando o botão "USARNUMERO" for
precionado dependendo da caixa de texto numérico.
No título (title) de Notifier1 foram utilizados diversos “\t”, artifício denominado escape
sequence12, para se distanciar da margem (tal como ao usar a tecla TAB) da caixa de notificação.
É uma estrutura com único intuito para o design da caixa.
12 Uma sequencia de escape (escape sequence) é uma combinação de caracteres utilizados para um dado tipo de controle que
permite o envio de caracteres de controle não gráficos – como um espaço ou salto de linha – para dispositivos de impressão tal como
a saída de tela em um computador ou celular.
182
Figura 5.49. Tela do aplicativo quando selecionado o campo de texto para digitação do telefone e
caixa de notificação quando o número não segue o padrão.
Após a escrita de um número válido e clicado no botão para uso do número, o mesmo
será armazenado na variável global “Telefone”. Além disso, foram utilizadas dos componentes
relativos a troca de mensagens: Texting1 e Texting2. O primeiro será utilizado para o envio de
mensagens enquanto o segundo para recebimento afim de deixar bem claro a divisão de envio
e recebimento onde o aplicativo enviará para o número de telefone armazenado as solicitações
e verificará as mensagens de resposta recebidas desse número.
Além disso, para que evitemos uma troca do número utilizado durante a sessão do
aplicativo podemos tornar invisível a caixa de texto e o botão para salvar o número de telefone
(esse item fica a critério do desenvolvedor). Podemos também criar um botão que torne os
elementos visíveis novamente para uma alteração do valor ou, como dito anteriormente, criar um
banco de dados que salve o número pertinente para as próximas inicializações do aplicativo
(temos noção suficiente da plataforma para explora-la a fundo e desenvolver mais!).
Feito esses procedimentos, também será exibido um alerta na tela informando que o
número foi salvo.
183
Com relação aos botões de escolha da caixa de diálogo quando o número está incorreto:
clicar em “Cancelar” apenas fechará a notificação (cancelable true) e clicar em “OK”, fará com
que o alerta “Tente novamente!” apareça.
Figura 5.50. Bloco para ação após a seleção do botão da caixa de notificação.
184
Figura 5.52. Bloco responsável pelo recebimento de mensagens e tratamento das mesmas para que
uma resposta seja apresentada na tela do aplicativo.
185
Sensores de corrente podem ser conectados diretamente ao circuito da lâmpada sem que
interfiram de maneira significante no mesmo. Dessa maneira, o circuito fechado da lâmpada tem
a passagem de corrente capitado pelo sensor gerando um sinal que pode ser utilizado para
informar ao Arduino e, consequentemente, ao usuário do sistema sobre o real estado do mesmo.
Como exemplo podemos citar o reed-switch e o sensor de efeito hall.
REED-SWITCH
Esse dispositivo é um interruptor de lâminas formado por duas lâminas flexíveis
ferromagnéticas num encapsulado de vidro preenchido por gás inerte. O mesmo pode ser
acionado na presença de um campo magnético produzido por um imã ou por uma bobina. O
mesmo pode funcionar tanto em corrente continua quanto em corrente alternada e, dessa
maneira, podemos, ao associa-lo com uma bonina, liga-lo ao circuito da lâmpada para realizar a
realimentação efetiva.
186
SENSOR DE CORRENTE POR EFEITO HALL
Um sensor de efeito Hall é aquele que, sob a aplicação de um dado campo magnético,
produz uma variação de tensão elétrica numa saída. Dessa maneira, utilizando um módulo de
sensor de corrente que utiliza do efeito Hall estamos detectando um campo magnético gerado
pela passagem de corrente, continua ou alternada, e gerando uma tensão proporcional na saída
desse módulo.
Figura 5.55. Visões de um módulo sensor de corrente que utiliza o efeito Hall.
187
6. Utilizando microcontroladores ARM STM32F1XX
MICROCONTROLADOR STM32F103C8T6
Uma placa de desenvolvimento que utiliza um processador ARM Cortex-M3, projetado
para fornecer uma plataforma de baixo custo para atender aos desenvolvedores mais exigentes.
Possui um regulador de tensão para 3.3V que suporta até 300mA14, um botão de reset e dois
jumpers, utilizados para ativar ou desativar seu modo de programação bootloader.
Também possui um extenso conjunto de pinos que envolvem entradas e saídas digitais
e analógicas, PWM’s, pinos para comunicação serial dentre outros diversos.
Comparado seu processador com o processador utilizado no Arduino Uno apresentado
nesse material (vide Fig. 3.3) temos uma arquitetura de 32-bits contra um de 8-bits do Arduino.
Lembrando também que, no microcontrolador utilizado para os projetos realizados aqui até o
momento, o pino analógico possui uma resolução de 10 bits, ou seja, é capaz de interpretar 1024
(ou 210) valores no intervalo de 0 à 1023 para conversão analógica-digital (pino ADC) do seu
nível de operação de 5V. Por sua vez, o ARM se mostra, novamente, uma ferramenta mais
poderosa e que agrega mais precisão tendo uma resolução de 12 bits (0 - 4095) com operação
em 3.3V.
13 RISC (acrônimo de Reduced Instruction Set Computer; em português, "Computador com um conjunto reduzido de instruções") é
uma linha de arquitetura de processadores que favorece um conjunto simples e pequeno de instruções que levam aproximadamente
a mesma quantidade de tempo para serem executadas.
14 É recomendável que não seja drenado da placa mais do que 100 mA.O regulador não possui proteção térmica e, dessa forma,
expô-lo a altas temperaturas (o que pode ser ocasionado por uma corrente elevada para o circuito do mesmo) pode facilmente
danificá-lo.
188
Além disso, o STM32F10C8T6 possui uma memória flash e SRAM maiores e uma maior
velocidade de seu processador e um preço em torno de R$15,00 sendo uma escolha mais
potente e mais barata que o Arduino.
Ao comparar os dois microcontroladores, conforme apresentada na tabela abaixo,
podemos observar os diversos aspectos onde o STM32F103 é potencialmente superior ao
modelo UNO. Além disso, o seu tamanho reduzido impressiona: um pouco maior que um Arduino
Nano!
189
Figura 6.2. Pinagem de microcontrolador da série STM32F103. Fonte:
http://wiki.stm32duino.com/images/a/ae/Bluepillpinout.gif. Acesso em novembro, 2017.
BOOT MODES
Ao iniciar a placa, utilizamos os pinos de boot para selecionar uma de suas três opções
possíveis, conforme tabela abaixo.
190
Figura 6.3. Jumpers do microcontrolador em destaque. Os mesmos conectam os pinos 2 à 2. Fonte:
< https://www.davidpilling.com/wiki/files/STM/STM_board_DP0.jpg >. Acesso em novembro, 2017.
Do lado direito temos o esquema de sua pinagem retirados da Fig. 6.2.
ST-LINK
Para a programação e depuração utilizando a série STM32 é necessário o uso de
ferramentas auxiliares. Aqui, essa ferramenta será o ST-LINK15 um circuito capaz de realizar
essas funções. Ao desenvolver um código utilizaremos o hardware e software ST-LINK para
transmitir o programa corretamente ao microcontrolador, comunicação essa realizada com o
STM32 através da interface USB da ferramenta.
Figura 6.4. Versão do ST-LINK V2 que será referenciada nesse material. Fonte:
http://artofcircuits.com/product/st-link-v2-mini-stm8-stm32-programmer-debugger-with-metallic-
case. Acessado em novembro, 2017.
191
Na Fig. 6.4 temos o ST-LINK V2, ferramenta que utilizaremos e que possui 10 pinos de
conexão, demarcados em sua cobertura, cuja ordem é como dada na figura a seguir.
Temos na ferramenta pinos de alimentação (3.3V e 5.0V) e terra (GND), pino de reset
(RST) e os pinos interface (SWIM – Single Wire Interface Module) e de depuração (SWDIO –
Single Wire Debugging in/out; e SWCLK, para sinal de clock ).
192
PREPARANDO O ARDUINO IDE
Iremos abrir o IDE e acessar o Gerenciador de Placas, por onde localizaremos e faremos
a instalação do “Arduino SAM Boards” que seja compatível com o núcleo de processamento do
microcontrolador que estamos utilizando que, no caso, é o ARM STM32 Cortex-M3.
O Gerenciador de Placas é localizado no menu “Ferramentas”, onde devemos clicar na
opção “Placa: ‘Arduino//Genuino Uno‘” (nome da placa é referente à ultima utilizada) e, por fim,
em “Gerenciador de Placas...”. Uma janela semelhante ao do Gerenciador de Biblioteca.
Figura 6.7. Gerenciador de Placas com software localizado para sua instalação.
193
A instalação do software a aquisição para o Arduino IDE de um compilador otimizado
(GCC) para um microcontrolador ARM, tal como temos os vários para as diversas versões do
Arduino (Uno, Mega, Nano, Mini etc).
Finalizado esse passo, finalizaremos os arquivos necessários ao Arduino IDE por meio
do download e instalação do software Arduino STM32 baixando-o através da plataforma Github
pelo link <https://github.com/rogerclarkmelbourne/Arduino_STM32>.
O download será feito semelhante ao da biblioteca GSM clicando em “Clone or download”.
Figura 6.8. Recorte da página de download do software para uso do STM32 no Arduino IDE.
Destacado em vermelho temos o local para download.
Os arquivos para suporte das placas STM32 é compatível com versões 1.8.x do IDE,
mas, conforme o próprio repositor do próprio software informa, o programa ainda é experimental
e no caso de termos ideias de seu uso para sistemas críticos, estaremos assumindo os riscos de
uso desses arquivos.
Localizado o arquivo baixado, devemos descompacta-lo e copia-lo para a pasta
“hardware” do Arduino (normalmente localizada em C:\Arquivos de Programas (x86)\Arduino).
Ao tentar copiar os arquivos para a pasta, é possível que o acesso à mesma seja negado
e uma permissão de administrado seja dada, por se tratar da transferência de arquivos para uma
pasta do disco C. Forneça a permissão clicando em “Continuar”.
194
Figura 6.9. Solicitação de acesso ao transferir pasta descompactada para uma pasta do sistema.
Ao clicar em "Continuar" a transferencia é permitida.
Figura 6.10. Pasta "hardware" com arquivos STM32 instalados após permissão consedida.
Finalizado esse procedimento teremos novas opções de placas para serem utilizadas
com o Arduino IDE. Dentre essas opções, teremos “Generic STM32F103C series” a qual
utilizaremos para nosso microcontrolador.
195
Figura 6.11. Recorte da lista de placas do menu ferramentas com algumas das novas opções.
Figura 6.12. Recorte do final da página para download do driver para o ST-LINK/V2. O botão em
destaque desse ser clicado.
196
Figura 6.13. Final da tela com opção de aceite (“ACCEPT”).
É possível também, sendo de interesse, salvar como arquivo PDF o acordo de licença ao
clicar em “Save as PDF” antes de aceita-lo. Após o aceite, caso não tenha efetuado login ou não
possua um login para o site da ST, uma nova tela será apresentada.
Nela, temos a opção de nos registrar ou acessar a conta, clicando em “Login/Register”, e
a opção de apenas fornecer o nome (primeiro e último) e um endereço de e-mail (sendo de
interesse podemos marcar a caixa abaixo do e-mail para receber novidades no endereço
informado). Finalizado essa etapa devemos ainda realizar uma validação do e-mail informado.
Figura 6.14. Tela de registro/login para que o download possa ser iniciado. Podemos também
apenas repassar informações de nome e e-mail para inicia-lo.
197
Figura 6.15. Tela informando o registro e solicitando validação do e-mail após terem sido
informados nome e e-mail para liberação do download.
Arquivos de
instalação
Arquivo a ser
descompactado
Em alguns casos podemos não ter certeza de qual sistema operacional possuímos em
nosso computador. Nesse caso, podemos utilizar o comando “Windows+X” e escolher a opção
“Sistema” e, na janela que será aberta, poderemos verificar tal informação.
198
Figura 6.17. Recorte da janela de informações do sistema com destaque na informação sobre o
sistema operacional.
Ao iniciar a execução do programa para instalação podemos ser informados que o arquivo
é de uma fonte desconhecida, sendo solicitada autorização. Permita o prosseguimento.
O assistente de instalação tem duas janelas: na primeira clicaremos em “Avançar>” e, na
segunda, iremos clicar em “Concluir” para finalizar o procedimento. É possível, também, que uma
janela com solicitação intermediária apareça pedindo permissão para a instalação do software
de dispositivo. Nesse caso, marcaremos a caixa “Sempre confiar em software...”, para que um
novo questionamento para programas envolvendo STM não seja feito, e em “Instalar”.
199
Figura 6.19. Possível janela intermediária, solicitando permissão para instalaçao do software.
Figura 6.20. Configuração na placa dos jumpers para o boot mode "PROGRAM".
200
void setup(){
pinMode (PC13 , OUTPUT) ;
}
void loop(){
for(int i = 1000; i >= 0 ; i = i-100){
digitalWrite(PC13, HIGH);
delay(i);
digitalWrite(PC13, LOW);
delay(i);
}
}
Outros códigos de teste podem ser utilizados, caso seja de interesse. O uso do pino PC13
foi escolhido devido a comodidade de não ser necessário montar um circuito para o teste de
funcionamento do microcontrolar.
Escrito o programa, vamos agora configurar o IDE para a compilação do mesmo
determinando o modelo da placa, sua variante específica, velocidade de operação, meio de
upload e a otimização, conforme imagem à seguir, no menu “Ferramentas”. A cada seleção da
configuração, na sequência, as demais opções vão sendo apresentadas no menu.
201
Podemos agora carregar o código e caso tudo ocorra bem verificaremos no campo de
notificações um texto final semelhante ao seguinte:
Programming Complete.
MCU Reset.
Application started.
Figura 6.22. Configuração na placa dos jumpers para o boot mode "RUN".
É possível, por meio de programação, fazer com que não haja necessidade da conexão
com o ST-LINK para o funcionamento do microcontrolador de modo que possamos conecta-lo
diretamente ao computador. Assim, a placa pode funcionar por si só sem a necessidade de um
intermediador o que pode reduzir erros advindos da conexão entre os dois elementos e também
simplifica a montagem de circuitos de um sistema que o utilize.
Para isso, colocaremos um bootloader na placa o qual será responsável por “ensinar” ao
microcontrolador como receber outros programas e realizar as funções que normalmente seriam
feitas pelo ST-LINK diretamente pela porta USB.
Sendo assim, o bootloader nada mais é do que um programa cuja a principal função é
carregar códigos (programas do computador) para a memória do microcontrolador.
202
Para melhor entendimento do que faremos devemos esclarecer e recapitular alguns
pontos:
Por padrão o microcontrolador já possui um bootloader, o qual é ativado pelo boot
mode que apelidamos de “PROGRAM”, mas o mesmo não é configurado para
receber programas diretamente pela porta USB;
Quando ativamos o boot mode apelidado de “RUN”, o microcontrolador roda o que
é encontrado em sua memória, começando por um endereço inicial da memória
que, no caso, é o 0x08000000.
Um programa ocupa pode ocupar parte ou toda a memória do microcontrolador
iniciando esse programa sempre em um endereço e terminando noutro
determinado (dependendo do espaço ocupado).
203
Figura 6.23. Janelas iniciais do Assistente de Instalação. License Agreement à direita.
Figura 6.24. Janela para seleção da pasta de destino dos arquivos e prosseguimento da instalação.
204
Figura 6.25. Nova janela de Assistente de Instalação. Nela, clicamos em "Avançar >".
Figura 6.26. Janela em sequencia solicitando autorização para instalação de driver Portas (COM e
LPT).
205
Figura 6.27. Conclusão da instalação do driver de portas.
206
Figura 6.29. Imagem com sequência para abrir o arquivo .bin indicado.
207
Figura 6.30. Conexão e BOOT MODE ajustado para PROGRAM.
Feito isso, iremos conectar o programa à placa ao clicar em “Target” na barra de menus
e, em seguida, “Connect” ou no botão em formato de tomada com os pinos voltados para cima.
Figura 6.31. Janela do programa após abertura do arquivo " generic_boot20_pc13.bin ". Em
destaque temos o botão que conecta o software ao VT-LINK/V2.
208
Em caso de algum erro ser apresentado na área inferior branca da janela do software
devemos verificar se a conexão com o microcontrolador foi efetuada corretamente e/ou se a porta
USB do computador está funcionando corretamente (tente conectar outro periférico nela). Caso
tudo funcione corretamente, teremos algo parecido com a janela da figura à seguir.
Figura 6.32. Janela do software após conexão com ST-LINK/V2 efetuada com sucesso.
Os quadros em destaque tem as seguintes informações:
Azul – informações da placa.
Amarelo – dispositivo conectado.
Verde – arquivo carregado.
Laranja – informação da memória.
Roxo – buffer.
209
Figura 6.33. Limpando a memória do dispositivo. Para isso selecionamos a aba "Device Memory"
e podemos clicar no ícone da borracha.
Figura 6.34. Alerta apresentado em tela ao tentarmos apagar a memória. Devemos clicar em "OK".
Figura 6.35. Conteúdo apresentado na aba Device Memory quando a memória está limpa.
210
Figura 6.36. Em destaque temos os passos para repassar o bootloader desejado à placa.
Uma nova janela será aberta para que possamos configurar algumas questões sobre a
gravação que iremos fazer:
Start adress – endereço inicial de memória onde colocaremos o programa do
bootloader. Como dito anteriormente, o primeiro endereço da memória é
0x8000000 e é neles onde iniciaremos a gravação.
File path – local do arquivo que vamos carregar. No caso, esse caminho é onde
“generic_boot20_pc13.bin” está localizado e se o caminho não for dado, podemos
localizar o mesmo clicando em “Browse” para que ele seja automaticamente salvo
no campo quando localizado.
Extra options – aqui temos dois campos que, para o nosso caso, não marcaremos.
Quando marcados, o primeiro pula a limpeza da memória flash e o segundo pula
uma verificação de proteção que é feita também em flash.
Verification – traz duas opções de verificação do código que será carregado: a
primeira, e selecionada, enquanto o microcontrolador está sendo programado pelo
software e a segunda, após.
After programming – temos ações possíveis após a programação do
microcontrolador realizada pelo software. A primeira, e única selecionada,
realizará um reset após a ação e a segunda realiza um checksum completa da
memória flash (verifica a integridade dos dados transmitidos).
211
As opções selecionadas podem ser visualizadas na figura abaixo. Ao clicarmos em “Start”
para iniciar o a programação no microcontrolador o progresso pode ser observado na barra
abaixo do texto “Click ‘Start’ to program target.”.
Em seguida poderemos notar que as abas “Device Memory” e “File” estão iguais, com as
informações semelhantes em cada endereço da memória. O que significa que o código agora
presente na memória do microcontrolador é exatamente igual ao do arquivo
“generic_boot20_pc13.bin”.
Figura 6.38. À esquerda temos a aba "Device Memory" e, à direita, "File". Podemos notas que as
posições de memória guardam as mesmas informações.
212
como já temos feito, à partir dos ícones do software clicando na tomada com um “X” desenhado
em vermelho.
Figura 6.40. A seleção de "Executar como adminstrador" deve ser feita para que a execução de
"install_drivers.bat" seja permitida.
213
Figura 6.41. Tela de execuação do arquivo "install_drivers.bat". Ao finalizar as instalações
necessárias, devemos clicar em alguma tecla.
214
Figura 6.42. Microcontrolador localizado como um componente de entrada USB.
Figura 6.43. Página de download do arm-gcc. Em destaque, o arquivo executável instalador para
Windows.
215
PROGRAMANDO O MICROCONTROLADOR DIRETAMENTE NA PORTA USB
Terminados todos os procedimentos anteriores iremos, finalmente, desconectar o ST-
LINK/V2 do nosso STM32F1XX e colocaremos seus jumpers no boot mode RUN, no qual ele
ficará permanentemente agora tendo em vista que utilizávamos PROGRAM para rodar o
bootloader padrão da placa juntamente ao ST-LINK para que pudéssemos carregar os
programas na placa.
Ao ligar o microncontrolador a um cabo USB conectado ao computador, o LED do pino
PC13 irá piscar, o que indica que o indica que nosso bootloader instalado está em funcionamento
e poderemos carregar nossos programas na placa sem a necessidade do ST-LINK e de alteração
do boot mode para PROGRAM.
Utilizando o mesmo programa que fizemos anteriormente para rodar na placa, ou um de
sua escolha, iremos configurar o Arduino IDE para funcionar com o microcontrolador conforme
já fizemos, porém, com algumas alterações. Veja a figura:
Além disso, em “Porta”, deveremos informar em qual porta o microcontrolador ARM está
conectado. Caso desconheça essa informação ou a mesma não esteja clara, podemos verificar
216
essa questão através do Gerenciador de Dispositivos, selecionando-o na lista de opções aberta
pelo comando “Windows+X” (em máquinas Windows).
No Gerenciador de Dispositivos, o identificador da porta onde o ARM está conectado tem
a denominação “Maple Serial”.
Sendo o mesmo reconhecido como uma COM e sendo a porta selecionada corretamente
no IDE do Arduino temos todas as configurações necessárias para realizar o carregamento do
código na placa.
Figura 6.45. Identificação da porta serial onde o microcontrolador está conectado. No caso da
figura: COM8.
Todos os projetos realizados com o Arduino podem, também, serem realizados utilizando o
STM32F103C8T6. Porém, algumas diferenças básicas como a já citada nomenclatura dos pinos
devem ser levadas em conta caso queiramos portar um código de uma base para a outra, mesmo
que utilizando o mesmo IDE para escreve-los.
Além disso, devemos nos atentar em algumas conexões de hardware para uso dos módulos
e Shields. Algumas dessas diferenças de hardware também podem afetar a análise via software,
como exemplo já citado da resolução dos pinos ADC.
217
Para que possamos ter uma correlação mais precisa sobre as funções e suas diferenças com
relação as das placas Arduinos, além de questões de portabilidade os seguintes materiais de
apoio são recomendados:
Fórum sobre o uso de placas STM32 pelo Arduino IDE:
https://www.stm32duino.com/;
Documentação completa sobre códigos do STM32F1:
https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/4021c32fdb809f16a
61c073d04e1d8c2c487a767/STM32F1;
Documentação Maple, a começar pelo index da linguagem:
http://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-
docs/0.0.12/language-index.html. Embora não seja atualizado a muitos anos,
informações básicas sobre a programação são uteis e podem ser buscadas no
site.
Para mostrar algumas das diferenças quando utilizamos esse microcontrolador, iremos
refazer o projeto de comunicação via bluetooth e ethernet, portáveis para a placa.
MONTAGEM DO SISTEMA
No projeto em questão isso significa que não precisaremos do divisor de tensão utilizado
para a conexão com o RX do módulo Bluetooth. Assim, a montagem ficaria como se segue na
Fig. 6.53 (mostrada algumas paginas adiante, após um breve embasamento para chegarmos at),
já seguindo nosso padrão da realimentação efetiva.
Porém, embora a montagem pareça simples, o módulo relé que viemos utilizando até o
momento nos projetos com Arduino Uno é inviável para uso junto ao Blue Pill e algumas questões
218
devem ser previamente apresentadas e compreendidas antes de fazermos a montagem
sugerida.
A incompatibilidade está relacionada às características de corrente de saída dos pinos de
I/O dos dois microcontroladores: a placa foi desenvolvida para o Arduino, cuja saída é de 40mA,
enquanto a saída do Blue Pill é de 20mA.
Essa diferença faz com que o chaveamento do relé no módulo não funcione propriamente
e, desse modo, o indicado é que montemos nosso próprio módulo. Precisaremos então aprender
a selecionar cada um de seus componentes.
Devemos começar pelo relé, nos baseando nas características de alimentação que serão
fornecidas e a carga que será controlada. Para isso, utilizaremos um relé de 5V que suporte a
carga da rede elétrica de 220V como, por exemplo, o modelo SRD-05VDC-SL-C.
Embora esse seja um relé para alimentação em 5V, sua escolha foi tida para que uma
montagem futura fosse compatível tanto para Arduino, quanto para os demais
microcontroladores16, dispensando o uso do módulo pré-projetado e economizando recursos
financeiros, alterando apenas componentes mais baratos para adaptação do uso. Além disso,
entendendo os princípios de escolha dos componentes e a ideia de montagem, seremos capazes
selecionar e montar diferentes módulos por conta própria.
Vcc/GND
NA
Comum
NO
GND/Vcc
Figura 6.46. Relé para 5V, em corrente continua, para uso em tensão de rede 127/220V (corrente
alternada). Modelo: SRD-05VDC-SL-C.
Em seguida, devemos examinar a corrente exigida pelo relé para o funcionamento de sua
bobina. Para isso, precisamos do datasheet (folha de dados) do componente, onde podemos
encontrar essa informação.
Para informações acerca dos datasheets a serem utilizados consulte o Anexo III
16Os microcontroladores apresentados nesse material possuem pelo menos um pino que pode prover 5V,
caso o circuito do microcontrolador seja alimentado com uma fonte que permita esse fornecimento.
219
Em primeiro lugar, devemos entender sobre a sigla do modelo, para saber se a bobina do
relé é do tipo high sensibility ou standard, informação relevante para verificação da corrente
correta.
Da Fig. 6.47, temos que o modelo do nosso relé tem a bobina (coil) do tipo “L:0.36W”.
Buscando essa informação na Fig. 6.48, temos que a bobina tem high sensibility e a corrente
necessária para o seu funcionamento é de 71.4mA.
O valor exigido de corrente é superior ao que o Blue Pill (e, também, o Arduino Uno) é
capaz de oferecer. Assim, como proteção para o sistema, utilizamos um transistor para
intermediar o chaveamento.
O transistor de escolha deve suportar o valor de aproximadamente 72mA exigido pela
bobina como, por exemplo, o BC237.
Figura 6.49. Transistor BC237 com indicação dos pinos coletor(C), base (B) e emissor (E).
220
No coletor do transistor será conectado o Vcc do microcontrolador, fornecendo 5V. No
emissor, ligaremos o GND e, na base, conectaremos um pino digital que será o responsável por
saturar o BC237 e ativar o relé quando solicitado.
O papel do resistor entre o pino digital e o transistor tem o papel de limitar a corrente que
chega até a base de forma a não causar danos ao componente e ao microcontrolador ao fechar
um circuito fluindo da base ao emissor (GND).
O cálculo do valor do resistor a ser utilizado faz referência a esse circuito, como
apresentado na Fig. 6.50.
Ib Rb
V = 5V
VQ1 = 0,7V
𝑈
𝑅=
𝐼
𝑉 − 𝑉𝑄1
𝑅𝑏 =
𝐼𝑏
Onde:
Rb é a resistência na base;
V é a tensão entregue pelo pino digital;
VQ1 é a queda de tensão que ocorre quando a corrente passa pelo resistor;
221
Ib é a corrente que passa pela base.
Nos transistors, há uma relação entre a corrente do coletor e a corrente da base chamada
ganho (β ou ℎ𝐹𝐸 ). O ganho ℎ𝐹𝐸 representa a quantidade de vezes em que uma corrente é
amplificada baseando-se na quantidade de corrente aplicada na base do transistor. Assim:
𝐼𝑐
𝐼𝑏 =
ℎ𝐹𝐸
A corrente no coletor é dada pela corrente necessária para ativar o relé e, nesse caso,
usaremos o valor aproximado de 72mA, para uma pequena margem de segurança.
Pelo datasheet do BC237, temos ℎ𝐹𝐸 = 120. Desse modo:
72
𝐼𝑏 = = 0,6 𝑚𝐴
120
Com isso, da relação da Primeira Lei de Ohm, podemos encontrar o valor do resistor que
precisamos. Teremos, então, que:
5 − 0,7 4,3
𝑅𝑏 = −3
=
0,6 ∗ 10 0,6 ∗ 10−3
𝑅𝑏 = 7,17 ∗ 103 Ω
Como se tem que garantir pelo menos esta corrente 𝐼𝑏 para que a corrente no relé não
seja menor que a especificada. O valor calculado para 𝑅𝑏 é o valor máximo.
Assim, comercialmente, o valor mais próximo e inferior ao calculado é de 6800Ω (ou 6K8,
em terminologia mais comercial).
222
Por fim, temos o diodo de freewheeling. O mesmo deve ser capaz de suportar a corrente
de 71,4mA e a tensão de 5V relativas ao circuito do relé.
Analisando essas características, o diodo 1N4001 é capaz, segundo seu datasheet, de
atender as necessidades do circuito e teremos, por fim, todos os componentes para a montagem
do nosso módulo conforme Fig. 6.52.
NO
NA
RLY1
Pino
de I/O
GND
Figura 6.52. Esquema de montagem do módulo relé. Vcc e GND devem ser conectados à uma
alimentação de 5V do microcontrolador e pino GND.
223
Módulo Relé
Alimentação
e lâmpada
via microUSB
17 O pino 5V pode ser utilizado tanto para o fornecimento de tensão à componentes conectados ao microcontrolador quanto para
alimentação da placa por uma fonte externa, desde que não seja usado, simultaneamente, a alimentação via microUSB (como já
comentado).
224
Por outro lado, a programação no IDE tem algumas adaptações, reflexos das
particularidades do STM32F103.
A declaração de pinos, por exemplo, não é feita com o número GPIO que representa, mas
segue o padrão “P” + “nome do pino”. Assim, o pino B1 e A4, que terão a função de enviar o sinal
de controle ao relé e a verificação dos valores do LDR no código a ser mostrado,
respectivamente, foram declarados como PB1 e PA4. A Fig. 6.2 indica os nomes dos pinos para
conferencia.
Cada pino pode executar diversas funções e, diferente do Arduino onde os pinos
analógicos tinham como função primária o input de informações, no ARM é necessário declarar
que um dado pino será usado como entrada analógica para que não ocorram erros ou algum
possível dado à placa.
A declaração é feita pela função pinMode(), como será mostrado no início do setup()
do código.
A parte mais diferente vem agora: a inicialização de duas comunicações seriais. Diferente
do visto até o momento, por existirem diversos pinos para comunicação serial, ao utilizarmos
uma das comunicações RX/TX devemos especifica-la para iniciar a comunicação por “serial1”,
”serial2” ou ”serial3”. E para fins de utilizar o Serial Monitor, utilizaremos apenas a palavra “serial”
para referência. Assim, ao utilizarmos os Serial Monitor e o Bluetooth, ou qualquer outro
componente que utilize uma porta de comunicação serial, os dois devem ser declarados.
Veremos a seguir o código, para verificação do que foi exposto no momento e, em
seguida, podemos testar seu funcionamento normalmente, como temos feito até agora.
225
const int rele = PB1; //pino de acionamento do rele
const int analogPin = PA4; //pino de leitura analogica do LDR
int ambiente = 0;
int LDR = 0;
char leituraBT;
int resposta;
void setup() {
pinMode(rele, OUTPUT);
pinMode(analogPin, INPUT_ANALOG);
Serial.begin(9600); //para uso do Serial Monitor
Serial2.begin(9600); //Para comunicacao bluetooth
void loop() {
DetectaLuzTempo();
if(Serial2.available()){
leituraBT = Serial2.read(); //leitura do recebido via bluetooth
Serial.println(leituraBT); //avalia para print no Serial Monitor
if(leituraBT == 'L'){
Serial.println("LIGOU");
digitalWrite(rele, HIGH);
}
if(leituraBT == 'D'){
Serial.println("DESLIGOU");
digitalWrite(rele, LOW);
}
}
226
resposta = analogRead(analogPin);
void DetectaLuzTempo(){
if(digitalRead(rele) == HIGH)
Serial.println("Lampada ainda acionada, verificação de luminosidade
ambiente não atualizada");
else{
//leitura feita conforme em setup()
ambiente=0;
while(millis()-anteriorMillis < 5000){
LDR = analogRead(analogPin);
if(LDR > ambiente) ambiente = LDR;
}
Serial.print("Luminosidade atualizada: ");
Serial.println(ambiente);
}
}
}
227
6.6. Comunicação via Ethernet
Para esse projeto as mudanças em hardware são dadas pela diferente forma de conexão
entre o microcontrolador e o shield Ethernet.
Quando fizemos a conexão com o Arduino Uno tudo foi bem simples: bastava encaixar uma
em cima do outro. Mas quando se trata da conexão com o STM32F1, devemos nos atentar em
quais são os pinos corretos a serem ligados no shield ou módulo ethernet18 de interesse.
Sabendo a ordem e o nome dos pinos, a ligação entre os dois componentes é bastante
simples. Veja:
Tabela 3. Relação entre nomes dos pinos que devem ser conectados entre o microcontrolador e a
placa que irá possibilitar a comunicação Ethernet.
STM32F103C8T6 Shield/Módulo com W5x00
PA4 SS
PA5 SCK
PA6 MISO
PA7 MOSI
Nessa relação, PA4 à PA7 nada mais são do que os pinos que possuim em uma de suas
funções as mesmas expressas na segunda parte da tabela 10 e tensão de 3.3V.
18Como o importante para a comunicação é o componente de interface WIZnet W5x00 (W5100, W5200
ou W5500) a montagem do circuito pode ser realizada com um módulo que contenha o chip ou pelo shield,
como fizemos anteriormente ao utilizar o Arduino.
228
MONTAGEM DO SISTEMA
A única modificação que teremos será com relação a conexão do microcontrolador e do
módulo/shield a este. Além disso, embora tenha sido representado o módulo relé do Arduino na
Fig. 6.55, o módulo é meramente ilustrativo.
O fio amarelo conecta-se ao transistor (passando pelo resistor) e os fios vermelho e preto
fazem as conexões com Vcc e GND, respectivamente (rever Fig. 6.52).
Circuito
lâmpada
Módulo/
Shield
Ethernet
Alimentação
via microUSB
Figura 6.55. Esquema de montagem para uso do microcontrolador ARM com um módulo/shield
Ethernet para controle de lâmpada. O módulo relé mostrado na imagem deve ser propriamente
elaborado para uso com o microcontrolador em questão.
O Módulo deve ser alimentado em 5V, podendo essa tensão ser fornecida pelo próprio
microcontrolador pelo pino 5V (já conectado ao protoboard) quando a placa é alimentada pela
porta microUSB, como no caso da Figura 4.48. Como exemplo para conexão das duas placas,
considere a relação dos pinos apresentados na figura à seguir.
A conexão no shield também poderia ter sido feita nos pinos 10 (SS), 11(MOSI), 12(MISO)
e 13 (SCK). Os mesmos são espelhos do cabeçalho ICSP (In-Circuit Serial Programming), que
é o protocolo de comunicação que, simploriamente falando, é utilizado entre o microcontrolador
e a placa para utilizarmos as propriedades do Ethernet.
É importante também ressaltar que os pinos de GND devem estar numa mesma
referência. Embora não citado nas imagens de montagens anteriores, perceba que todos os
circuitos possuem um ponto de aterramento em comum interligando os pinos GND. É importante
229
sempre observarmos isso, pois sendo a tensão uma grandeza dependente de seu referencial,
referencias diferentes causariam um funcionamento inesperado do circuito e valores
inconsistentes de tensão, caso fosse possível medi-los.
PA4
PA6
5V
PA7
GND*
PA5
Figura 6.56. Indicações dos pinos da placa com Wiznet W5100 a serem usados e respectivos pinos
do microcontrolador onde devem ser ligados. A montagem é semelhante no Wiznet W5500.
230
Figura 6.57. Módulo Wiznet W5100 com indicações das conexões a serem feitas entre esse e o
microcontrolador. Fonte:
https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/4021c32fdb809f16a61c073d04e1d8c
2c487a767/STM32F1/libraries/Ethernet_STM. Acesso em: outubro, 2018.
Figura 6.58. Imagem com possível caminho da raiz até a pasta que contem o arquivo "w5100.h" a
ser editado.
Ao abrir o arquivo, será possível localizar nas linhas inicias as definições do chip que será
utilizado:
//#define W5100_ETHERNET_SHIELD // Arduino Ethenret Shield and Compatibles ...
//#define W5200_ETHERNET_SHIELD // WIZ820io, W5200 Ethernet Shield
#define W5500_ETHERNET_SHIELD // WIZ550io, ioShield series of WIZnet
231
Temos por padrão, como já foi dito, o uso do W5500. Aqui, devemos deixar
descomentado apenas a linha que será utilizada e, sendo ela a referente ao chip W5100,
teremos:
#define W5100_ETHERNET_SHIELD // Arduino Ethenret Shield and Compatibles ...
//#define W5200_ETHERNET_SHIELD // WIZ820io, W5200 Ethernet Shield
//#define W5500_ETHERNET_SHIELD // WIZ550io, ioShield series of WIZnet
Feito a alteração, devemos salvá-lo e recompilar nosso sketch para que as mudanças
sejam efetuadas no nosso código.
Passando, então, para o código as alterações a serem feitas são apenas para a correta
declaração dos pinos e biblioteca referente ao protocolo Ethernet para o STM32F1. Veja:
#include <SPI.h>
#include <String.h>
#include <Ethernet_STM.h> //biblioteca Ethernet para o STM32F103C8T6
const int rele = PB10; // Pino onde o modulo de rele estah ligado
const int analogPin = PA1; //pino de leitura analogica do LDR
boolean status_lamp = false;
String readString = String(30);
int ambiente = 0;
int LDR = 0;
int resposta;
Nessa primeira parte, de declarações e cabeçalhos, temos todas as mudanças que são
necessárias para o funcionamento do código já elaborado para Arduino no capitulo anterior:
nome da biblioteca, pino do rele e pino de leitura analógica. Ademais, seguimos com as mesmas
linhas de código:
232
void setup() {
Ethernet.begin(mac, ip);
pinMode(rele, OUTPUT);
Serial.begin(9600);
digitalWrite(rele, HIGH);
void loop() {
DetectaLuzTempo();
if (client){
while (client.connected()){
if (client.available()){
char c = client.read();
233
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.print("<font size='20'>");
resposta = analogRead(analogPin );
if (status_lamp){
if (resposta > ambiente)
client.println("ComandoLigar LuzLigada");
else
client.println("ComandoLigar LuzDesligada");
}
234
7. O microcontrolador NodeMCU ESP8266
Tabela 4.
Especificações Técnicas ESP8266 STM32F103C8T6 Arduino UNO
Arquitetura 32 Bit 32 Bit 8 Bit
Velocidade processador 80MHz 72 MHz 16 MHz
Memória Flash 16 MB 64 kB 32 Kb
RAM 160 kB 20 kB 2 Kb
235
7.1. Por que utilizar o ESP8266?
Uma das principais vantagens do microcontrolador consiste em possuir rede sem fio
integrada, o que a torna ideal para projetos em robótica e automação inicial. Diferentemente
de placas concorrentes (apresentados nesse livro ou não) que necessitam de complementos,
os módulos ou Shields, para conseguirem conectividade com uma rede com fio ou sem fio, o
ESP8266 traz nativamente capacidade de conectar-se com qualquer rede e,
consequentemente, com a Internet sem deixar de lado um porte compacto comparável ao
dos outros microcontroladores.
Além disso, ele já possui uma interface Micro USB deixando simples sua conexão com o
computador, podendo utilizar da mesma IDE que temos utilizado até o momento para a
programação e sem a necessidade de instalação de um grande número de softwares ou
modificações em seu bootloader para o funcionamento.
Tudo bastante simples e propício para a criação de novas aplicações com montagens
que já temos familiaridade, facilidade de acesso a uma rede de computadores e Internet,
ótima para associação à dispositivos móveis, além de sua programação específica para
criação de páginas web e troca de dados não necessitar de um entendimento profundo sobre
linguagens como o HTML.
Por fim, com todas esses facilidades de montagem e programação em rede, transmitir e
controlar ações via internet, de onde você estiver, não importando a distância, apenas
assegurando a existência de conectividade à rede global torna tudo mais interessante para
nós e para um possível negócio.
236
Figura 7.1. LoLin visto tanto de sua parte inerior, quanto de sua parte superior. Na parte inferior,
podemos identificar algumas informações iniciais básicas e necessárias para seu uso: instalar o
driver CH340, configurar a taxa de transmissão de dados e conectar-se a uma rede WiFi. Fonte:
http://projectshopbd.com/product/nodemcu-wifi-esp8266-development-board/, acesso em:
outubro, 2018.
Os protoboards mais comuns à venda possuem regiões de encaixe, tornando simples sua
associação para montagens de protótipos mais complexos ou, como no caso, para que
possamos encaixar facilmente o NodeMCU LoLin.
Figura 7.2. Regiões de encaixe entre protoboards. Ao encaixar dois protoboards, não temos
nenhuma ligação de seus conectores internos, apenas externamente, tornando mais simples e
estável o uso de multiplos elementos do mesmo.
237
Figura 7.3. Microcontrolador ESP8266 encaixado entre dois protoboards. Fonte:
https://42bots.com/esp8266/nodemcu-esp8266-iot-development-board-overview/. Acesso em:
outubro, 2018.
Figura 7.4. Base adaptadora própria para uso do NodeMCU LoLin. Fonte:
http://blogmasterwalkershop.com.br/embarcados/nodemcu/base-adaptador-para-o-nodemcu-v3-
da-lolin/. Acesso em: outubro/2018.
238
Figura 7.5. Esquema de pinagem do NodeMCU LoLin ESP8266.
Agora que já estamos um pouco mais familiarizados com as questões mais básicas sobre o
visual e pinagem do microcontrolador, partiremos para os passos necessários para realmente
podermos utilizá-lo.
Em primeiro lugar, temos a instalação do driver CH340, o qual permite a comunicação USB
para serial. Como já discutido, caso ainda não tenha instalado, retorne ao tópico 1.10 do material
para explicações de como baixar e instalar o driver de seu site de origem ou de um site
alternativo.
Em seguida devemos abrir o IDE do Arduino, acessar o menu “arquivo” > ”preferencias” e
colar a seguinte URL em “URLs adicionais de Gerenciadores de Placas”:
http://arduino.esp8266.com/stable/package_esp8266com_index.json.
239
Figura 7.6. Devemos colar a URL e, em seguida, clicar em "OK" para finalizar a ação.
240
Figura 7.7. Localizando o esp8266, no Gerenciador de Placas, o qual devemos instalar para poder
utilizar os microcontroladores da familía.
A instalação do elemento permite o uso de módulos da família ESP8266, o que inclui o nosso
microcontrolador.
Voltando agora ao menu “Ferramentas” devemos selecionar a placa que permite o uso do
NodeMCU ESP8266. Como mencionamos, no início do capítulo, o microcontrolador é baseado
no módulo ESP8266-12E e, desse forma, devemos procurar esse módulo ao pesquisarmos a
placa que deve ser escolhida. Veja:
Figura 7.8. Módulo a ser selecionado para uso do nosso microcontrolador no Arduino IDE.
241
Finalmente temos tudo pronto utilizar, de fato, o Arduino IDE e construirmos algumas linhas
de código utilizando nosso microcontrolador.
O foco do LoLin NodeMCU é sua comunicação WiFi, como temos dito até aqui. Desse modo,
para ilustrar sua aplicação, a transferência de dados pela rede e como fazer o controle de uma
lâmpada faremos dois projetos: no primeiro, o microcontrolador será um WEB server
administrando uma rede local via WiFi; na segunda teremos um WEB client comunicando-se com
um servidor via Wi-Fi pela internet.
MONTAGEM DO SISTEMA
Para os dois projetos que serão mostrados, a montagem do sistema será a mesma. Porém
existem duas modos de energizar o microcontrolador e o relé que podem ser utilizadas e que
são importantes de serem mencionadas.
A primeira a ser apresentada é a mais simples, utilizando apenas do microcontrolador. Nela,
a placa é energizada via microUSB e o relé será diretamente associado à mesma.
Circuito
lâmpada
via microUSB
Alimentação
Figura 7.9. Montagem do circuito de controle de lâmpada utilizando NodeMCU LoLin. Aqui, a
alimentação deve ser feita através do conector microUSB.
242
A segunda forma utiliza uma fonte de energia externa que converte o sinal para 5V ou
3,3V e pode ser utilizada de acordo com as necessidades do microcontrolador e relé utilizado.
Circuito
lâmpada
Alimentação
Figura 7.11. Montagem do circuito de controle de lâmpada utilizando NodeMCU LoLin. Aqui, a
alimentação deve ser feita através de um dos conectores (USB conector DC) do YwRobot.
243
WEB SERVER EM REDE LOCAL
Para a construção de um web server utilizaremos algumas funções básicas em HTML
para a criação da página web. Nessa página teremos 2 botões para podermos selecionar o
acionamento ou desligamento da lâmpada associada ao microcontrolador.
O microcontrolador será o responsável pela página e por atendem as requisições feitas
pela web sendo, portanto, o servidor (por isso a denominação de web server).
Ao microcontrolador devemos oferecer informações de nome (o SSID19) e senha para
acesso à uma rede WiFi, porta de comunicação (por onde e que tipo de comunicação será feita).
Após a inicialização da conexão à rede sem fio, será iniciado o servidor que, por sua vez, irá
atribuir dinamicamente um IP20 ao microcontrolador.
Feito isso, ao código fica a competência de verificar a existência de informações a serem
lidas (solicitações para o controle da lâmpada), identificar o que está sendo solicitado através da
leitura e identificação da informação recebida e apresentar respostas na página além de realizar
uma ação sobre o solicitado.
Dentro desse processo, o código também verifica se a solicitação foi realizada com
sucesso ou não, produzindo uma resposta dentro dos quatro quadrantes, como temos feito nos
outros projetos.
#include <ESP8266WiFi.h> //cabeçalho para uso do WiFi do NodeMCU LoLin
19 Service Set IDentifier (em português: identificação do conjunto de serviço) é uma string de até 32
caracteres que identifica uma rede sem fio.
20 Internet Protocol é um rótulo numérico utilizado para identificar um dado dispositivo em uma rede.
244
void setup() {
pinMode(rele, OUTPUT);
digitalWrite(rele, HIGH);
//inicia a comunicação
WiFi.begin(ssid, password);
// Inicia o servidor
server.begin();
Serial.println("Server started");
// Printa o endereço de IP
Serial.print("URL: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
245
void loop() {
DetectaLuzTempo();
if (leituraWifi.indexOf("/LED=ON") != -1) {
digitalWrite(rele, LOW);
status_lamp = true;
delay(50);
}
if (leituraWifi.indexOf("/LED=OFF") != -1) {
digitalWrite(rele, HIGH);
status_lamp = false;
delay(50);
}
resposta = analogRead(analogPin);
246
client.print("Status da lampada: ");
client.println("<br><br>");
client.println("<a href=\"/LED=ON\"\"><button>Turn On </button></a>");
client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br
/>");
client.println("</html>");
client.flush();
void DetectaLuzTempo(){
247
if(digitalRead(rele) == LOW) //se a lampada estiver ligada, a atualização
//é um fator que pode perturbar a resposta real
Serial.println("Lampada ainda acionada, verificação de luminosidade
ambiente não atualizada");
else{
//leitura feita conforme em setup()
ambiente=0;
while(millis()-anteriorMillis < 5000){
LDR = analogRead(analogPin);
if(LDR > ambiente) ambiente = LDR;
}
Serial.print("Luminosidade atualizada: ");
Serial.println(ambiente);
}
}
}
Não entraremos em detalhes acerca de códigos HTML, mas para que fique claro como
ele foi utilizado no nosso programa para o Blue Pill suas linhas serão destacadas sem o uso da
função client.println(), a qual é responsável por direcionar cada linha do código para a página
que será vista pelo cliente que solicita as ações a serem tomadas.
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE HTML>
<html>
Status da lampada:
<br><br>
<a href=\"/LED=ON\"\"><button>Turn On </button></a>
<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br />
</html>
248
um botão for pressionado, a URL será complementada com “LED=ON” ou “LED=OFF” indicando
seu uso.
A nova URL também serve de base para obtenção de respostas e também como modo
de realizar a requisição, tendo em vista que escrevê-la em sua totalidade com uma das duas
respostas tem o mesmo efeito que clicar no botão.
Supondo que, ao iniciar o sistema, o IP do microcontrolador seja “192.168.43.196”, digitar
esse valor num browser conectado à mesma rede fará com que a página seja mostrada.
249
Nesse projeto, mostraremos como realizar a captação dos dados de um LDR e como
acionar ou desligar uma lâmpada. O funcionamento conjunto ficará por sua conta para praticar o
que temos visto até aqui e para que possa aplicar seus conhecimentos.
Sendo o microcontrolador o cliente, ele encaminhará solicitações ao servidor e esse, por
sua vez, disponibilizará para o cliente uma resposta.
O servidor conta com uma página web em HTML com um código simples em PHP, uma
linguagem interpretada que será utilizada em um simples processamento de dados. Existem
várias linguagens que são passíveis de serem inseridas dentro de um documento HTML e são
uteis para a comunicação e tratamento de dados recebidos de um cliente.
Embora o intuito do material não seja detalhar as diversas formas de programação, é
importante saber de pelo menos dois métodos muito importantes na hora de desenvolver uma
página web, por mais simples que seja: GET e POST.
Posteriormente, seguiremos com a apresentação da página HTML utilizando PHP para,
então, continuarmos com a apresentação do código elaborado no arduino IDE.
Como já devem ter percebido, o HTTP foi desenvolvido de forma a possibilitar a
comunicação entre clientes e servidores sendo um tipo de protocolo que fornecesse respostas
atendendo às requisições feitas. Os métodos relacionados a esse protocolo são, assim,
referentes a forma em que essa comunicação ocorrerá.
O método GET é utilizado para solicitar algum dado de recurso específico e, ao
utilizarmos, os dados que solicitamos são atribuídos ao cabeçalho da requisição. Isso significa
que estes estarão visíveis na URL.
Sendo assim, ao criarmos uma página chamada “read.php” num dado servidor solicitando
que seja exibido nessa página um valor de leitura do LDR e sendo esse valor igual a “500”, uma
solicitação utilizando HTTP GET teria, por exemplo, o formato:
../read.php?valor=500
250
O método POST é mais indicado quando desejamos enviar informações que desejamos
processar para, por exemplo, criar ou atualizar um recurso. Por meio dele, os dados com as
solicitações que forem enviados ao servidor são armazenados no corpo da requisição HTTP:
POST /read.php?valor=500 HTTP/1.1
Host: siteHospedeiro.com
Valor=500
A página do servidor é como se segue abaixo. Os textos entre “<!-- -->” e entre “/* */”
são comentários, sendo as formas entre aspas uma maneira de realizar comentários em HTML
e em PHP. Tudo mais representa o código.
<!--Iniciando html-->
<html>
<!--TITULO-->
<h1>STATUS:</h1>
<?php /*Iniciando codigo em php*/
/*Se for true muda status para true, para ligar a lâmpada*/
if($pedido == "true") file_put_contents("status.txt","<p>true</p>");
/*se for false mude status para false, para deligar a lâmpada*/
if($pedido == "false") file_put_contents("status.txt","<p>false</p>");
$ver = file("value.txt");
echo("<h2>Valor: </h2>");
/*fim do php*/
?>
Numa primeira execução do sistema, a pagina irá criar dois arquivos de texto
denominados “status.txt” e “value.txt” onde ficaram armazenados o status da lâmpada, que pode
ser “true” ou “false” e o valor de leitura do LDR. Nas solicitações subsequentes, esses arquivos
serão atualizados.
252
Os valores armazenados serão apresentados na página abaixo de seus respectivos
cabeçalhos (h1 e h2). A Fig. 7. Ilustra uma resposta para lâmpada desligada (“false”) e o valor
lido no LDR de “231”.
Figura 7.13. Página web com status para lampada desligada e leitura do LDR.
Note que, na imagem apresentada da página web, os dois parâmetros podem ser
passados ao mesmo tempo e o “&” é usado como um separador. No código do Arduino IDE, eles
serão repassados um à um, mas a forma mostrada agora pode servir de base para seu projeto
final de atuação em quatro quadrantes.
O código foi dividido em abas no ambiente de desenvolvimento e discutiremos
separadamente as partes secundárias para depois esclarecermos o corpo principal (contendo
“setup()“e o “loop()”).
253
void conectar(){
Serial.begin(115200); /*na conexao WiFi, a taxa de transmissao de dados
eh diferente*/
delay(10);
// Inicio da conexao WiFi com prints no Serial Monitor
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); /*funçao que realmente inicia a comunicaçao
WiFi*/
A aba da função “conectar()” contem nada mais que os passos que envolvem a conexão
serial (para verificar alguma informação desejada) e com uma rede sem fio.
254
void verificar_status(){
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
}
}
255
A função “verificar_status()” será utilizada para fazer a verificação na página web do
servidor. Nessa página, uma busca será feita para a string “true” ou “false” que representam a
solicitação de acionamento ou desligamento. O valor é armazenado na variável “stat”, declarada
na aba principal do código e onde, também, será tratada para realizar a ação solicitada.
Para isso, um cliente é criado para se conectar ao host21 através de uma porta de
comunicação. Isso é feita pela função “cliente.connect()” cujos argumentos são o IP ou nome no
DNS22 do servidor hospedeiro da página e a porta de comunicação.
Foi elaborada também uma rotina para liberar o acesso utilizado pelo cliente caso não
seja dada uma resposta após cinco segundos. A requisição é feita utilizando HTTP GET.
A terceira aba criada contém a função “GET(int valor)”, muito semelhante à anterior por
verificar o conteúdo de uma página web, porém, com algumas modificações.
Enquanto “verificar status()” complementa com “/pedro/read.php” a URL do host, essa
outra função também solicita que seja apresentado na página o valor lido referente ao LDR.
Assim, a URL com “/pedro/read.php?valor=” tem, na sequencia, o valor de leitura.
21 Também chamado de hospedeiro é aquele que pode oferecer informações recursos, serviços e
aplicações para um cliente ou outros servidores. No caso, o host que será utilizado é um site de domínio
criado e sustentado por um dos autores do livro (por tempo indeterminado).
22 Domain Name System (ou Sistemas de Nomes de Domínios) são responsáveis por listar, localizar e
traduzir para números de IP os nomes de domínios. A transformação dos IP’s em URL’s mais facilmente
memorizáveis facilita o acesso do usuário a um dado domínio.
256
Serial.print("Requesting URL: ");
Serial.print(url);
Serial.println(valor);
//Verifica timeout
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
Por fim, temos a seguir a parte principal que une todo o código para seu funcionamento.
Isso trará clareza no papel de cada função.
257
#include <ESP8266WiFi.h> /*Inclusão do cabeçalho para biblioteca de wifi
do microcontrolador*/
void setup() {
pinMode(15,OUTPUT); /*pino digital D7 (GPIO_15) -> podemos trocar o
valor do GPIO pelo nome do pino: (pinMode(D7, OUTPUT)) */
void loop() {
/*se não estivermos testando LDR, será feita uma verificação constante
do que está sendo carregado na página do Web Server */
else{
verificar_status();
}
258
O funcionamento completo do sistema é como se segue:
Informamos o nome da rede, sua senha e o host no qual desejamos nos conectar;
Caso tudo seja bem sucedido, a conexão com a rede sem fio é estabelecida;
Verifica-se o interesse na informação de leitura do LDR;
Sendo de interesse, “GET(int valor)” é iniciado e a URL é criada e encaminhada
pela porta de comunicação sendo o valor lido apresentado na tela. Também é
verificado se, nesse meio tempo, também foi solicitado uma ação para controle da
lâmpada;
Caso não seja de interesse, entraremos na função “verificar_status()”;
Por fim, é a variável responsável pelo controle da lâmpada é tratada afim de saber
qual ação deve ser tomada;
O controle da lâmpada é feito por meio do browser através de duas URL’s, as
quais foram apresentadas no código do sistema (um aplicativo pode ser elaborado
no AppInventor2).
259
7.4. Comunicação pela nuvem utilizando aREST
A plataforma aREST foi desenvolvida para fornecer soluções de IoT que se baseiam em
Arduino e Raspberry Pi. Ela utiliza um estilo de arquitetura denominada REST (Representational
State Transfer) o qual é baseado em HTTP.
Um serviço de web RESTful (que tem arquitetura REST), além de possibilidade operações
entre sistemas através da internet, tem características conceituais que vão de encontro com o
que vemos apresentado até aqui: o uso de protocolo cliente-servidor e o uso de operações para
a manutenção de recursos, tais como GET e POST.
Na aREST temos a possibilidade de uso gratuito, que fornece todo o conteúdo de uso
suficiente para a montagem dos nossos projetos, mas também podemos realizar um pagamento
mensal aumentando a capacidade de uso dos recursos conforme a necessidade do conteúdo for
ampliada.
260
Figura 7.15. Biblioteca aREST a ser instalada.
Além disso, precisamos adicionar uma biblioteca para uso do protocolo de comunicação
MQTT (Message Queuing Telemetry Transport), o qual está implementado no servidor em nuvem
do aReset.
O MQTT é um protocolo de mensagens leves e, embora simples, contempla aspectos de
segurança e qualidade de serviço, sendo facilmente implementado em um sistema e o tornando
ideal para muitos projetos IoT. Dessa forma, se é possível que o servidor utilizado tenha tal
protocolo como base, a comunicação será eficiente para o uso de sistemas embarcados.
No Gerenciador de Bilbiotecas, devemos procurar por “PubSubClient”, de Nick O’Leary,
e instalar a biblioteca.
261
Para garantir o funcionamento das bibliotecas instaladas, reinicie o IDE após a conclusão
dos procedimentos. Feito isso, iremos utilizar um dos exemplos de aplicação em nuvem
acessando “Arquivo>Exemplos>aREST>ESP8266_cloud”.
Figura 7.17. Caminho para exemplo de uso de um sistema NodeMCU LoLin em nuvem.
262
// Unique ID to identify the device for cloud.arest.io
char* device_id = "unique_device_id";
O uso de variáveis e de funções não será explorado no momento. O exemplo que será
passado nesse tópico será o do simples acionamento de um relé, porém, você pode acessar à
plataforma onde todas as informações sobre a biblioteca da aREST pode ser encontrada
(https://github.com/marcoschwartz/aREST), inclusive com algumas informações de uso (em
README). Faça isso e exercite suas capacidades para o desenvolvimento do sistema utilizando
os quatro quadrantes.
UTILIZANDO A AREST
Ao acessar o site da aREST (https://arest.io/), o primeiro passo é clicarmos em “Get
Started”.
Figura 7.18. Recorte da página inicial do site aREST. Aqui, devemos clicar em "Get Started" ao fazer
o primeiro acesso.
cloud.arest.io/my_device/digital/6/1
263
Figura 7.19. Recorte da página "get started" com algumas informações sobre mudança de estado
do pino e o botão do tutorial personalizado.
264
Figura 7.21. Segunda pergunta para acessar tutorial personalizado.
265
Figura 7.23. Parte superior do site da Arest. Devemos clicar em "Pricing" para prosseguir com a
aquisição de acesso.
Figura 7.24. Recorte da pagina de criação de contas. Devemos escolher "Free Plain", para utilizar a
versão gratuita.
Figura 7.25. Informações solicitadas para criação de conta. Após preencher os campos, devemos
clicar em "Sign Up".
266
Caso tudo tenha sido corretamente preenchido, após a assinatura, a seguinte tela
aparecerá (Fig. 7.26) e um e-mail será enviado com um recibo de pagamento (mesmo para o
acesso gratuito).
Num outro e-mail, seremos informados do site para acesso ao painel de controle
(https://dashboard.arest.io/) no qual devemos realizar nosso acesso.
Figura 7.27. Parte superior do site do painel de controle (dashboard) aREST. Devemos clicar em
"Login" no canto superior direito.
267
Figura 7.28. Dados solicitados para acesso ao dashboard.
Estamos, finalmente, na área onde criaremos nossos painéis para o controle do nosso
sistema.
Como faremos um acionamento simples, tudo que precisamos é repassar as informações
do pino que desejamos manipular. Assim, considerando nossa última montagem, utilizaremos o
pino digital 2 (GPIO_02), ou seja, o pino D4.
Devemos clicar em “Add a New Dashboard” e, na sequência, fornecer um nome.
Figura 7.29. Pagina inicial do dashboard. Devemos clicar em "Add a New Dashboard".
Figura 7.30. Janela aberta para escolha de um título a ser dado ao dashboard.
268
Como precisaremos de apenas um, clicaremos no “x” no canto superior direito para que
possamos acessar o dashboard criado.
Figura 7.32. Recorte do canto superior direito, onde devemos clicar em "Show Edit Mode" para
iniciar a edição da página.
269
Figura 7.34. Recorte do dashboard ao clicarmos em "Add Row". Devemos clicar no botão de mesmo
nome para adicionar uma linha na pagina e, em seguida, fecharmos a janela.
Figura 7.35. Adicionada a linha um botão dentro da linha será apresentado para adicionarmos uma
coluna (“Add Column”).
Figura 7.36. Podemos escolher o tamanho da coluna entre os valores de 25, 50, 75 e 100%.
Selecionado, devemos clicar em "Add Column" e fechar a janela.
Adicionada a linha e a coluna, um novo botão aparecerá para que possamos adicionar
um elemento (“Add Element”). Ao clicamos nele, uma janela será aberta e, nela, poderemos
escolher o tipo de elemento que desejamos adicionar à página, dar um nome ao mesmo e
informar o identificador de dispositivo, que associará o elemento com o dispositivo que
desejamos controlar.
270
Figura 7.37. Recorte da página com visão após adição de uma linha e uma coluna. Podemos agora
adicionar um elemento ("Add Element").
Figura 7.38. Ao clicarmos para adicionar um elemento, devemos escolher seu tipo ("Type"), seu
nome "Name" e o ID do dispositivo a ser controlado ("Device ID").
271
Ao clicarmos em “Submit”, a configuração será adicionada e, ao fecharmos a janela,
teremos terminado as configurações de uso necessárias.
Figura 7.39. Recorte com visão do elemento criado. Devemos agora editá-lo ("Edit Component")
para adicionar a informação do pino que tal elemento representará.
Figura 7.40. Visão da janela de edição do elemento. Uma nova opção foi criada e, nela, devemos
selecionar o pino que utilizaremos para o controle do sistema.
272
Figura 7.41. Recorte do canto superior direito da tela, onde é encontrado o botão "Hide Edit Mode".
O botão ocultará os elementos de edição, deixando apenas os botões criados.
273
Basta agora clicarmos em “On” e em “Off”, para realizar o acionamento e desligamento
do relé23. Com isso, finalizamos os testes utilizando a plataforma aREST e deixamos aos leitores
o exercício de aplicação dos quatro quadrantes, como discutido anteriormente.
23Há um limite de uso da nuvem para algumas operações de acordo com o plano escolhido. Verifique sua
cota em “Account”, no canto superior esquerdo do dashboard.
274
8. Microcontroladores nos dias de hoje
275
9. ANEXOS
Anexo I – Tabela de Modelos de Arduino e suas Especificações
Microcontroller ATmega328
Operating Voltage 5V
UNO Input Voltage (recommended) 7-12V
Input Voltage (limits) 6-20V
14 (of which 6 provide PWM
Digital I/O Pins
output)
Analog Input Pins 6
DC Current per I/O Pin 40 mA
DC Current for 3.3V Pin 50 mA
32 KB (ATmega328) of which
Flash Memory
0.5 KB used by bootloader
SRAM 2 KB (ATmega328)
EEPROM 1 KB (ATmega328)
Clock Speed 16 MHz
Microcontroller ATmega32u4
Operating Voltage 5V
Input Voltage
LEONARDO 7-12V
(recommended)
Input Voltage (limits) 6-20V
Digital I/O Pins 20
PWM Channels 7
Analog Input
12
Channels
DC Current per I/O
40 mA
Pin
DC Current for 3.3V
50 mA
Pin
32 KB (ATmega32u4) of which 4 KB
Flash Memory
used by bootloader
SRAM 2.5 KB (ATmega32u4)
EEPROM 1 KB (ATmega32u4)
Clock Speed 16 MHz
276
Arduino Especificações Técnicas
Microcontroller AT91SAM3X8E
Operating Voltage 3.3V
Input Voltage
7-12V
(recommended)
DUE Input Voltage (limits) 6-16V
54 (of which 12 provide PWM
Digital I/O Pins
output)
Analog Input Pins 12
Analog Outputs Pins 2 (DAC)
Total DC Output
130 mA
Current
on all I/O lines
DC Current for 3.3V
800 mA
Pin
DC Current for 5V Pin 800 mA
512 KB all available for the user
Flash Memory
applications
SRAM 96 KB (two banks: 64KB and 32KB)
Clock Speed 84 MHz
Length 101.52 mm
Width 53.3 mm
Weight 36 g
Microcontroller ATmega32u4
Operating Voltage 5V
Input Voltage 5V
Digital I/O Pins 20
PWM Channels 7
Analog Input
12
Channels
DC Current per I/O
40 mA
YUN Pin
DC Current for 3.3V
50 mA
Pin
32 KB (of which 4 KB used by
Flash Memory
bootloader)
SRAM 2.5 KB
EEPROM 1 KB
Clock Speed 16 MHz
Linux microprocessor
Processor Atheros AR9331
Architecture MIPS @400MHz
Operating Voltage 3.3V
Ethernet IEEE 802.3 10/100Mbit/s
WiFi IEEE 802.11b/g/n
USB Type-A 2.0 Host
Card Reader Micro-SD only
RAM 64 MB DDR2
Flash Memory 16 MB
PoE compatible
802.3af card support
Length 73 mm
Width 53 mm
Weight 32 g
277
Arduino Especificações Técnicas
ZERO
ATSAMD21G18, 48pins
Microcontroller
LQFP
Operating Voltage 3.3V
14, with 12 PWM and
Digital I/O Pins
UART
Analog Input Pins 6, 12-bit ADC channels
Analog Output
1, 10-bit DAC
Pins
DC Current per I/O
7 mA
Pin
Flash Memory 256 KB
SRAM 32 KB
EEPROM up to 16KB by emulation
Clock Speed 48 MHz
278
Arduino Especificações Técnicas
Microcontroller ATmega32u4
Operating Voltage 5V
Input Voltage
7-12V
(recommended)
Input Voltage (limits) 6-20V
Digital I/O Pins 20
MICRO PWM Channels 7
Analog Input Channels 12
DC Current per I/O Pin 40 mA
DC Current for 3.3V Pin 50 mA
32 KB (ATmega32u4) of
Flash Memory which 4 KB used by
bootloader
SRAM 2.5 KB (ATmega32u4)
EEPROM 1 KB (ATmega32u4)
Clock Speed 16 MHz
Length 48 mm
Width 18 mm
Weight 13 g
Microcontroller ATmega2560
Operating Voltage 5V
Input Voltage
7-12V
(recommended)
MEGA ADK Input Voltage (limits) 6-20V
54 (of which 15 provide
Digital I/O Pins
PWM output)
Analog Input Pins 16
DC Current per I/O Pin 40 mA
DC Current for 3.3V Pin 50 mA
256 KB of which 8 KB used
Flash Memory
by bootloader
SRAM 8 KB
EEPROM 4 KB
Clock Speed 16 MHz
USB Host Chip MAX3421E
279
Arduino Especificações Técnicas
Microcontroller ATmega328
Operating Voltage 5V
Input Voltage Plug
7-12V
(recommended)
Input Voltage Plug (limits) 6-20V
Input Voltage PoE (limits) 36-57V
14 (of which 4 provide PWM
Digital I/O Pins
output)
ETHERNET 10 to 13 used for SPI
4 used for SD card
Arduino Pins reserved:
2 W5100 interrupt (when
bridged)
Analog Input Pins 6
DC Current per I/O Pin 40 mA
DC Current for 3.3V Pin 50 mA
32 KB (ATmega328) of
Flash Memory which 0.5 KB used by
bootloader
SRAM 2 KB (ATmega328)
EEPROM 1 KB (ATmega328)
Clock Speed 16 MHz
W5100 TCP/IP Embedded
Ethernet Controller
Power Over Ethernet
ready Magnetic Jack
Micro SD card, with active
voltage translators
Microcontroller ATmega2560
Operating Voltage 5V
Input Voltage 7-12V
(recommended)
MEGA 2560 Input Voltage (limits) 6-20V
Digital I/O Pins 54 (of which 15 provide PWM
output)
Analog Input Pins 16
DC Current per I/O Pin 40 mA
DC Current for 3.3V Pin 50 mA
Flash Memory 256 KB of which 8 KB used
by bootloader
SRAM 8 KB
EEPROM 4 KB
Clock Speed 16 MHz
280
Arduino Especificações Técnicas
Microcontroller Atmega32u4
Operating Voltage 5V
Input Voltage 5V through flat cable
Digital I/O Pins 5
PWM Channels 6
Analog Input Channels 4 (of the Digital I/O pins)
Analog Input Channels
8
(multiplexed)
ROBOT DC Current per I/O Pin 40 mA
32 KB (Atmega32u4) of
Flash Memory which 4 KB used by
bootloader
SRAM 2.5 KB (Atmega32u4)
EEPROM (internal) 1 KB (Atmega32u4)
EEPROM (external) 512 Kbit (I2C)
Clock Speed 16 MHz
Keypad 5 keys
potentiomenter attached to
Knob
analog pin
Full color LCD over SPI communication
SD card reader for FAT16 formatted cards
Speaker 8 Ohm
provides deviation from the
Digital Compass geographical north in
degrees
I2C soldering ports 3
Prototyping areas 4
Microcontroller ATmega328
Operating Voltage 5V
Input Voltage 7-9 V
MINI Digital I/O Pins 14 (of which 6 provide PWM
output)
Analog Input Pins 8 (of which 4 are broken out
onto pins)
DC Current per I/O Pin 40 mA
Flash Memory 32 KB (of which 2 KB used
by bootloader)
SRAM 2 KB
EEPROM 1 KB
Clock Speed 16 MHz
Length 30 mm
Width 18 mm
281
Arduino Especificações Técnicas
LILYPAD SIMPLES
Microcontroller ATmega328
Operating Voltage 2.7-5.5 V
Input Voltage 2.7-5.5 V
9 (of which 5 provide PWM
Digital I/O Pins
output)
Analog Input Pins 4
DC Current per I/O Pin 40 mA
32 KB (of which 2 KB used
Flash Memory
by bootloader)
SRAM 2 KB
EEPROM 1 KB
Clock Speed 8 MHz
282
Arduino Especificações Técnicas
LILYPAD SIMPLES SNAP
Microcontroller ATmega328
Operating Voltage 2.7-5.5 V
Input Voltage 2.7-5.5 V
9 (of which 5 provide PWM
Digital I/O Pins
output)
Analog Input Pins 4
DC Current per I/O Pin 40 mA
32 KB (of which 2 KB used
Flash Memory
by bootloader)
SRAM 2 KB
EEPROM 1 KB
Clock Speed 8 MHz
Radius
18 mm
LILYPAD
ATmega168V or
Microcontroller
ATmega328V
Operating Voltage 2.7-5.5 V
Input Voltage 2.7-5.5 V
14 (of which 6 provide
Digital I/O Pins
PWM output)
Analog Input Pins 6
DC Current per I/O Pin 40 mA
16 KB (of which 2 KB used
Flash Memory
by bootloader)
SRAM 1 KB
EEPROM 512 bytes
Clock Speed 8 MHz
LILYPAD USB
Microcontroller ATmega32u4
Operating Voltage 3.3V
Input Voltage 3.8V to 5V
Digital I/O Pins 9
PWM Channels 4
Analog Input Channels 4
DC Current per I/O Pin 40 mA
32 KB (ATmega32u4) of
Flash Memory which 4 KB used by
bootloader
SRAM 2.5 KB (ATmega32u4)
EEPROM 1 KB (ATmega32u4)
Clock Speed 8 MHz
283
Arduino Especificações Técnicas
Microcontroller ATmega168
3.3V or 5V (depending on
Operating Voltage
PRO MINI model)
3.35 -12 V (3.3V model) or 5 -
Input Voltage 12
V (5V model)
14 (of which 6 provide PWM
Digital I/O Pins
output)
Analog Input Pins 8
DC Current per I/O Pin 40 mA
16 KB (of which 2 KB used by
Flash Memory
bootloader)
SRAM 1 KB
EEPROM 512 bytes
8 MHz (3.3V model) or 16 MHz
Clock Speed
(5V model)
Microcontroller ATmega328P
Operating Voltage 3.3V
Input Voltage 3.35 -12 V
FIO Input Voltage for Charge 3.7 - 7 V
14 (of which 6 provide
Digital I/O Pins
PWM output)
Analog Input Pins 8
DC Current per I/O Pin 40 mA
32 KB (of which 2 KB used
Flash Memory
by bootloader)
SRAM 2 KB
EEPROM 1 KB
Clock Speed 8 MHz
ATmega168 or
PRO Microcontroller
ATmega328
Operating Voltage 3.3V or 5V
3.35 -12 V (3.3V versions)
Input Voltage
or 5 - 12 V (5V versions)
14 (of which 6 provide PWM
Digital I/O Pins
output)
Analog Input Pins 6
DC Current per I/O Pin 40 mA
16 KB (ATmega168) or
32KB
Flash Memory
(ATmega328) of which 2 KB
used by bootloader
1 KB (ATmega168) or 2 KB
SRAM
(ATmega328)
512 bytes (ATmega168) or
EEPROM
1 KB (ATmega328)
8 MHz (3.3V versions) or 16
Clock Speed
MHz (5V versions)
284
Anexo II – Modelos de Shields para Arduino
GSM Ethernet
Wireless SD
WiFi Shield
285
Motor Proto
286
Anexo III – Datasheets relevantes
287
288
289
290
291
292
293
294
295
296
297
298
299
Anexo IV – Exemplo de Automação Residencial utilizando ESP8266 e aREST Cloud
I love to build Internet of Things projects, especially with the amazing ESP8266 WiFi chip.
However, it can be a bit tricky to get started, as you might feel lost in front of all the options that
are available to you when choosing a platform/framework to control your projects from the cloud.
This is why I created the aREST platform: to give everyone a free, easy to use, no registration
required platform that can be used for all your Internet of Things projects. And in this guide, I will
show you exactly how to use the aREST platform to control your ESP8266 projects from
anywhere in the world.
This is a list of all the components that will be used in this project:
On the software side, you will need the latest version of the Arduino IDE that you can get from:
http://www.arduino.cc/en/Main/Software
300
Then, follow this procedure to add the ESP8266 board to the Arduino IDE:
You will also need the PubSub library that you can get from the Arduino library manager.
Hardware Configuration
Simply start by placing the ESP8266 board on your breadboard.
For the LED, simply connect it in series with the resistor, with the longest pin of the LED
connected to the resistor. Then, connect the remaining pin of the resistor to pin 5 of the
ESP8266 board, and the remaining pin of the LED to the GND pin.
// Clients
WiFiClient espClient;
PubSubClient client(espClient);
// WiFi parameters
const char* ssid = "wifi-name";
const char* password = "wifi-password";
// Functions
void callback(char* topic, byte* payload, unsigned int length);
void setup(void)
{
301
// Start Serial
Serial.begin(115200);
// Set callback
client.setCallback(callback);
// Give name and ID to device
rest.set_id(device_id);
rest.set_name("esp8266");
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
void loop() {
This is a basic aREST sketch for the ESP8266, but you need to modify some parameters. What
you need to change first is the device ID, which identifies the device on the network:
Then, modify the WiFi network name and password in the code:
You can now open the Arduino IDE, and grab the code, and save the sketch somewhere. Make
sure to modify the WiFi name & password inside the sketch. Also give an unique ID to your
board. Then, upload the sketch to the ESP8266 board. Go to your favourite web browser, and
type:
cloud.arest.io/9u2co4/id
302
You should immediately get the answer in JSON format:
{
"id": "9u2co4",
"name": "esp8266",
"connected": true
}
You can now actually completely control your board from the cloud. First, type the following
command to set pin number 5 as an output:
cloud.arest.io/9u2co4/mode/5/o
After that, type the following command to put the LED on:
cloud.arest.io/9u2co4/digital/5/1
{
"return_value": 1,
"id": "9u2co4",
"name": "esp8266",
"connected": true
}
You can now control your ESP8266 boards from anywhere! As they only cost around $5, it
makes it the perfect solution for your Internet of Things projects.
This is already the end of this guide about how to use the ESP8266 WiFi chip with aREST! I hope
this simple project gave you an idea of what you can do with the ESP8266 along with the aREST
cloud platform, in order to build exciting IoT projects.
If that’s not done yet, you can of course follow my website on Facebook& on Twitter.
Thanks again, and all the best for your IoT projects using aREST!
Marco Schwartz
contact@arest.io
303