aplicativo para estacionamentomonografias.poli.ufrj.br/monografias/monopoli10030027.pdf1 aplicativo...
TRANSCRIPT
1
APLICATIVO PARA ESTACIONAMENTO
Dhiego José da Silva
Projeto de Graduação apresentado ao Curso de
Engenharia Eletrônica e de Computação da Escola
Politécnica, Universidade Federal do Rio de
Janeiro, como parte dos requisitos necessários à
obtenção do título de Engenheiro.
Orientador: Carlos José Ribas D'Ávila
Rio de Janeiro
Setembro de 2018
2
3
4
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
Escola Politécnica – Departamento de Eletrônica e de Computação
Centro de Tecnologia, bloco H, sala H-217, Cidade Universitária
Rio de Janeiro – RJ CEP 21949-900
Este exemplar é de propriedade da Universidade Federal do Rio de Janeiro, que
poderá incluí-lo em base de dados, armazenar em computador, microfilmar ou adotar
qualquer forma de arquivamento.
É permitida a menção, reprodução parcial ou integral e a transmissão entre
bibliotecas deste trabalho, sem modificação de seu texto, em qualquer meio que esteja
ou venha a ser fixado, para pesquisa acadêmica, comentários e citações, desde que sem
finalidade comercial e que seja feita a referência bibliográfica completa.
Os conceitos expressos neste trabalho são de responsabilidade do(s) autor(es).
5
DEDICATÓRIA
Dedico este momento a todos os amigos que me deram força para continuar
mesmo com as dificuldades que aconteceram ao longo do trabalho e, em especial, a
Raphael Menezes de Macedo, Sergio Tadeu de Souza Sampaio e Thiago Salustiano
Jesus Santos.
Dedico também à minha mãe, Genova Amancio da Silva, que sempre esteve
junto comigo, e ao meu irmão, Adriano José da Silva, por sempre acreditarem em mim e
me apoiarem.
6
AGRADECIMENTO
Agradeço ao meu pai, Joaquim José da Silva, que apesar de não estar aqui
comigo neste momento, sempre foi uma inspiração para que eu conseguisse vencer todos
os momentos difíceis pelos quais passei ao longo desses anos na faculdade e para que eu
não desistisse nunca desse sonho, que é concluir o curso de Engenharia. Este trabalho é
apenas o ponto final de um longa caminhada, que foi o curso de Engenharia Eletrônica e
de Computação.
7
RESUMO
Este trabalho apresenta uma solução integrada de software e hardware para
auxiliar motoristas na escolha de um estacionamento para onde levar um veículo. O
número crescente de carros em circulação, associado à deficiência de transportes
públicos de qualidade, torna esse problema cada vez mais grave nas grandes metrópoles.
O suporte é realizado por meio de um aplicativo em que se encontram os
estacionamentos cadastrados e as informações de vagas disponíveis em cada um deles,
orientando o motorista quanto à escolha do local mais adequado.
8
SIGLAS
UFRJ – Universidade Federal do Rio de Janeiro
PWM – Pulse Width Modulation (Modulação de Largura de Pulso)
CT – Centro de Tecnologia
HTTP – Hypertext Transfer Protocol (Protocolo de Transferência de Hipertexto)
HTML – Hypertext Markup Language (Linguagem de Marcação de Texto)
JSON – JavaScript Object Notation (Notação de Objetos JavaScript)
IoT – Internet of Things (Internet das Coisas)
9
Sumário
1 Introdução 13
1.1 – Tema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2 – Delimitação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3 – Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4 – Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5 – Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.6 – Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2 Capítulo 2 — Arduino 16
2.1 – Arduino . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.1 – IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.2 – Arduino Mega . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2 – Sensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.1 – Sensor Ultrassônico .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.2 – ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3 – Estacionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.1 – Arduino + Sensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.2 – Código do ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3 Capítulo 3 — Android
31
3.1 – Android Códigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 – Android Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
10
4 Capítulo 4 — PHP 40
4.1 – Código PHP . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5 Capítulo 5 — Resultados
42
6 Capítulo 6 — Conclusões
44
Referências Bibliográficas
45
Apêndice A — Modos de Operação do ESP8266 46
Apêndice B — Site Thingspeak.com 47
Apêndice C — Banco de Dados Online 000webhost.com 48
Apêndice D — Arduino Mega com ESP8266 embutido 49
11
Lista de Figuras
1 – Diagrama do Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2 – Arduino UNO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 – Funcionamento Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4 – IDE Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5 – Arduino Mega . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6 – Sensor Ultrassônico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
7 – Sensor Ultrassônico em funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
8 – ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
9 – ESP8266 e funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
10 – Parâmetros para cada estacionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
11 – Portas Sensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
12 – Definição de variáveis de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
13 – Inicializando Circuito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
14 – Função para verificar se há veículo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
15 – Controle de veículos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
16 – Atualização de dados Wi-Fi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
17 – Função loop Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
18 – Inclusão de Bibliotecas Wi-Fi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
19 – Constantes e variáveis Wi-Fi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
20 – Inicializando ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
21 – Função auxiliar ESP8266 Verificacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
22 – Função auxiliar ESP8266 AtualizarBD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
23 – Função principal ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
24 – Android e funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
12
25 – onCreate MainActivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
26 – BackgroundTask onPreExecute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
27 – BackgroundTask doInBackground . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
28 – BackgoundTask onProgressUpdate e onPostExecute . . . . . . . . . . . . . . . . . . 33
29 – MainActivity parseJSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
30 – DisplayListView parte 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
31 – DisplayListView parte 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
32 – ContactAdapter parte 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
33 – ContactAdapter parte 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
34 – Classe Contacts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
35 – Página inicial do aplicativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
36 – Row_layout.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
37 – Content_layout.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
38 – Display_listview_layout.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
39 – Row_layout.xml código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
40 – Código init.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
41 – Código update.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
42 – Código get_json_data.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
43 – Velocidade do aplicativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
44 – Gráficos de desempenho do aplicativo Galaxy S9+ . . . . . . . . . . . . . . . . . . 41
45 – Gráficos de desempenho do aplicativo LG K3 . . . . . . . . . . . . . . . . . . . . . . . 43
46 – Telas do aplicativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
47 – Arduino Mega com ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
48 – Chaves seletoras do Arduino Mega . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
49 – Tabela chave seletora Arduino Mega . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
13
Capítulo 1
Introdução
1.1 – Tema
O projeto foi desenvolvido em duas partes: na primeira, utilizou-se o
microcontrolador Arduino para atualizar o banco de dados do estacionamento e, na
segunda, utilizou-se a tecnologia Android para realizar a comunicação entre o usuário
do aplicativo e os estacionamentos cadastrados.
A ideia do projeto é diminuir o tempo gasto na busca de vagas, possibilitando ao
usuário procurar um estacionamento, remotamente, por meio do aplicativo, antes
mesmo de sair de casa.
1.2 – Delimitação
O objeto do estudo é a criação de um banco de dados, em nuvem, que será
atualizado, automaticamente, pelos microcontroladores Arduino instalados nos
estacionamentos. Um aplicativo Android acessará essas informações no banco de dados
e as apresentará ao usuário.
1.3 – Justificativa
A quantidade de carros nas ruas e a disponibilidade reduzida de vagas faz com
que, frequentemente, os motoristas percam muito tempo circulando à procura de um
local para estacionar.
A utilização de um aplicativo que informe antecipadamente a situação de oferta
de vagas para estacionamento é um facilitador importante na rotina diária dos motoristas.
14
1.4 – Objetivos
O objetivo do trabalho é o desenvolvimento de uma plataforma de hardware e
software, que integra os microcontroladores Arduino instalados nos estacionamentos, o
aplicativo de celular acessado pelo usuário e o banco de dados, em nuvem, na Web.
1.5 – Metodologia
Este trabalho terá como foco: a) a comunicação entre sistemas Android e o
banco de dados online e b) a comunicação entre o Arduino e o banco de dados.
O sistema Android entrará em contato com o banco de dados, que informará a
quantidade de vagas nos estacionamentos cadastrados no momento da consulta. O
sistema Arduino atualizará esses dados.
1.6 – Descrição do projeto
A Figura 1, a seguir, mostra o diagrama do projeto. O sistema proposto possui
duas entradas de dados: a) a primeira, via microcontrolador Arduino, é obtida quando
um automóvel passa pelo sensor ultrassônico, ao entrar no estacionamento; b) a segunda,
via dispositivo Android, é obtida por meio do aplicativo desenvolvido. As duas entradas
são processadas por um código PHP que fará a atualização ou aquisição dos dados no
banco, conforme o caso.
Figura 1- Diagrama do Projeto
15
Na estrutura em que será apresentado o trabalho, o Capítulo 2 trata do hardware
com o microcontrolador Arduino, do sensor de ultrassom e da comunicação Wi-Fi.
O Capítulo 3 descreve como são realizadas as trocas de mensagens e a
comunicação com o sistema Android.
A codificação em PHP é apresentada no Capítulo 4.
Os resultados do projeto são apresentados no Capítulo 5 e as conclusões, no
Capítulo 6.
16
Capítulo 2
Arduino
2.1 – Arduino
O Arduino é uma plataforma formada por dois componentes. São eles: a placa –
o hardware utilizado para construir os projetos – e a IDE Arduino – o software em que
são escritos os códigos que indicam sua funcionalidade. Sua maior vantagem sobre as
demais plataformas de desenvolvimento é a facilidade de uso, pois pessoas que não são
da área técnica podem aprender o básico e criar seus próprios projetos num intervalo de
tempo relativamente curto.
Figura 2- Arduino UNO
O Arduino tem entradas e saídas de sinal digital, analógico, PWM e do tipo
serial. As suas portas trabalham sob uma tensão de até 5V, enquanto sua alimentação
pode ser de até 12VDC.
Outra vantagem do Arduino são os vários módulos que podem ser adicionados à
placa principal e podem conter sensores ou adicionar funções ao hardware.
Neste projeto, o Arduino foi utilizado para receber as informações adquiridas
pelo sensor ultrassônico, verificar se elas estão dentro de um padrão requerido para
17
classificar o objeto como um veículo e informar ao módulo Wi-Fi as alterações na
quantidade de vagas do estacionamento.
Figura 3 - Funcionamento Arduino
2.1.1 – IDE
A IDE é o ambiente de desenvolvimento do Arduino. Neste ambiente realiza-se
a programação do código que será gravado no microcontrolador. A linguagem de
programação utilizada para isto é a C++.
Figura 4 - IDE Arduino
18
A programação do Arduino possui dois blocos principais: a Setup() e a Loop().
Ambas funções são do tipo void, ou seja, não há a necessidade de fazer um retorno de
valor ao final do código.
A função Setup() é chamada no começo programa. Tem como objetivo fazer a
inicialização das variáveis e definir os modos a partir dos quais os pinos trabalharão.
Esta função só é chamada uma vez ao longo do programa.
A função Loop() roda indefinidamente no código do Arduino. Nela, realiza-se a
programação da placa, permitindo que o programa funcione dinamicamente. Esta
função controla ativamente os eventos do Arduino.
2.1.2 – Arduino Mega
O Arduino Mega é um tipo de Arduino desenvolvido para projetos mais
complexos, que exigem mais espaço de memória ou mais portas para conexão. Sua
memória flash é de 256KB enquanto a do Arduino Uno é de 32KB. Contém 56 portas
digitais, 16 portas analógicas, além de 3 pares de portas do tipo serial.
Figura 5 - Arduino Mega
2.2 – Sensores
Os sensores do Arduino são módulos desenvolvidos com a finalidade de facilitar
os projetos de circuitos automatizados.
19
2.2.1 – Sensor Ultrassônico
O Sensor Ultrassônico é um dispositivo que utiliza um pulso de alta frequência
para medir a distância entre a fonte e um ponto determinado, semelhante a um sonar.
Enquanto o sonar é utilizado principalmente debaixo d’água, o sensor ultrassônico pode
ser utilizado no ambiente terrestre, tendo o ar como meio de transmissão.
Este sensor consiste de uma unidade de transceptor único, capaz de emitir e
detectar o som – cria um pulso sonoro que está além da faixa auditiva do ouvido
humano. Quando este pulso encontra um objeto sólido, ocorre uma reflexão e o sensor
faz a detecção do sinal através de um temporizador. Determina, assim, a distância entre
o objeto e o sensor.
Figura 6 - Sensor Ultrassônico
Os objetos refletem as ondas sonoras de diferentes maneiras. Alguns materiais,
como por exemplo o metal, refletem o som de forma muito satisfatória, enquanto outros
materiais macios, como tecidos de pelúcia, absorvem as ondas sonoras. A precisão do
sensor pode ser influenciada pelo tipo de objeto a ser detectado. Como no projeto o
objetivo é capturar a que distância um carro – objeto metálico – estará do sensor, sua
precisão acaba por ser muito boa.
No projeto, foi utilizado um sensor ultrassônico na entrada e outro na saída do
estacionamento para fazer a captura da imagem dos veículos. Foram escolhidas as
distâncias mínima e máxima de localização do veículo em relação ao sensor, para que
ele seja contabilizado. Posicionando-se nesta faixa, o veículo deve permanecer em seu
alcance por cinco segundos para que seja validado como um automóvel, em vez de um
objeto estranho qualquer.
20
Figura 7 - Sensor Ultrassônico em funcionamento
O sensor ultrassônico pode apresentar pequenas variações em suas medições,
podendo não reconhecer o veículo. Para que isso não ocorra, foi estipulado um desvio
padrão do valor capturado anteriormente pelo sensor para que a contagem de cinco
segundos não seja zerada toda vez em que uma pequena variação ocorra.
2.2.2 – ESP8266
O ESP8266 é um microcontrolador da Espressif System. Lançado em 2014, tem
a capacidade de fazer uma comunicação via Wi-Fi por meio de um conjunto de
comandos.
O surgimento deste módulo foi uma revolução, já que, inicialmente, havia sido
criado para tablets e celulares. No entanto, com o desenvolvimento do firmware para
Arduino pela empresa Espressif System, ele virou uma febre entre os amantes de
eletrônica.
Existem várias maneiras de se programar o ESP8266. Caso seja utilizado como
ponte serial, o mais indicado é o comando AT, muito semelhante aos comandos de
modem. Outra maneira de programar o módulo é utilizar a linguagem Lua Script que
vem no firmware. Entretanto, ela é pouco utilizada, porque geralmente este módulo está
acoplado ao microcontrolador Arduino, programado na linguagem C. A terceira forma
de programar um ESP é utilizar MicroPython mas, assim como o Lua Script, ele é
pouco utilizado.
21
Figura 8 - ESP8266
Entre as vantagens de utilizar o ESP8266 estão a portabilidade da linguagem do
Arduino para o ESP e a grande quantidade de bibliotecas disponíveis para a sua
programação.
No projeto, o ESP8266 tem a função de receber os dados coletados pelo Arduino
e utilizá-los para atualização do banco de dados através de um código PHP, que está na
Internet.
Figura 9 - ESP8266 e funcionamento
2.3 – Estacionamento
Nesta parte, explica-se como o Arduino foi utilizado para automatizar os
estacionamentos, como funciona o código que faz a verificação da entrada ou saída de
um veículo e como o microcontrolador se conecta ao banco de dados on-line para sua
atualização.
2.3.1 – Arduino + Sensores
Para a aquisição dos dados faz-se necessário definir alguns parâmetros. Estes
parâmetros são configurados para cada estacionamento, atendendo as especificidades de
cada ambiente.
22
Figura 10 - Parâmetros de cada estacionamento
Os parâmetros DISTANCIAMAXIMA e DISTANCIAMINIMA representam a
que distância, em centímetros, que o carro deve estar dos sensores, para que a
informação de entrada ou saída do veículo seja registrada.
O DESVIOPADRAO é a distância, em centímetros, em que o carro pode se
movimentar após a primeira tomada de dados ter sido feita.
O TEMPOMINIMO é o tempo mínimo, em segundos, que um veículo leva para
entrar no estacionamento. Neste exemplo, foi adotado o tempo de cinco segundos.
Por fim, o MAXIMOVAGAS representa a quantidade máxima de vagas que há
no estacionamento.
Após a definição dos parâmetros, definem-se as portas do Arduino a serem
utilizadas pelos sensores ultrassônicos.
Figura 11 - Portas Sensores
Depois de determinar as portas que serão utilizadas pelos sensores, definem-se
algumas variáveis globais para controle e aquisição de dados dos sensores.
23
Figura 12 - Definição de variáveis de controle
As variáveis distancia1 e distancia2 são as que calcularão a que distância o
veículo está do sensor ultrassônico, enquanto vagas, distancia11, distancia21, controle1
e controle2 são utilizadas para o controle do sistema.
Com todas as variáveis já definidas, o programa é inicializado por meio da
função Setup().
Figura 13 - Inicializando o circuito
Foram definidos na função Setup() quais os pinos do microcontrolador serão de
entrada ou de saída de dados e também quais portas terão o valor Vcc ou Gnd.
As portas seriais foram inicializadas para que haja comunicação entre
dispositivos fora do Hardware do Arduino. A Serial3 faz a comunicação com o módulo
24
Wi-Fi e a porta Serial é utilizada para depuração de dados, caso seja necessário. Ao
final, criou-se um delay de dez segundos para aguardar a conexão do ESP8266 com o
Wi-Fi.
Três funções auxiliares foram implementadas no programa. São elas: a) a função
Sensores(), que faz a aquisição de dados do sensor ultrassônico e a atualização das
variáveis de distância do sensor; b) a VerificarDistancias(), que faz a checagem da
constante DESVIOPADRAO; e c) a função AtualizarWiFi(), que faz a passagem de
dados do Arduino para o ESP8266.
Figura 14 - Função para verificar se há um veículo
Na função ilustrada pela Figura 14, verifica-se o sensor ultrassônico para checar
se há um veículo entrando ou saindo do estacionamento.
Os valores colocados em trigPin1 e trigPin2 fazem a inicialização do sensor
ultrassônico. Os valores de duracao1 e duracao2 são adquiridos pelos pinos “echo” do
sensor. Após adquiri-los, é feita a conversão para centímetros e, então, são armazenados
em distancia1 e distancia2.
25
Figura 15 - Controle de veículos
O código da Figura 15 faz o controle de um dos sensores e é repetido para
controlar o segundo sensor.
Depois de medida a que distância o veículo se encontra do sensor, passa-se para
a variável distancia11 o valor contido em distancia1, com o objetivo de limpar o lixo
que poderia estar contido nela. Isto feito, a variável controle1 faz a contagem dos cinco
segundos.
Para que esta variável continue a aumentar seu valor, representando assim que
um veículo está prestes a entrar no estacionamento, é necessário que o automóvel fique
dentro de uma faixa delimitada por DISTANCIAMINIMA e DISTANCIAMAXIMA.
Caso ele não se encontre nesta faixa, isso indica que poderia não ser um carro querendo
entrar. Poderia ser, por exemplo, uma pessoa que passou na frente do sensor. Sendo
assim, a variável controle1 é reinicializada com o valor igual a 0.
Na função AtualizarWi-Fi(), foram criadas mais duas variáveis de controle,
controle11 e controle21. Elas verificam se o veículo passou ou não da cancela. No caso
do automóvel não ter passado, o contador de tempo fica constante para que não haja o
registro de um novo carro apto a entrar no estacionamento.
Caso a quantidade de vagas do estacionamento zere, ou seja, o estacionamento
fique lotado, o Arduino enviará para o ESP8266, por meio da porta Serial3, a
quantidade de vagas igual a 0. Isso permite que o banco de dados fique sempre
atualizado com o horário mais próximo do atual.
26
Figura 16 - Atualização de dados Wi-Fi
Sempre que a informação contendo a quantidade de vagas for enviada ao
ESP8266, realiza-se o reset das variáveis de controle.
Tanto a função VerificarDistancias() quanto a AtualizarWi-Fi() são repetidas
para todos sensores ultrassônicos instalados no estacionamento.
A função Loop() no Arduino faz a chamada das funções auxiliares e deixa um
delay de um segundo para voltar a fazer a aquisição de dados.
Figura 17 - Função loop Arduino
27
2.3.2 – Código do ESP8266
O módulo ESP8266 faz a atualização do banco de dados ao receber, via
comunicação serial, os dados coletados pelo Arduino. Para a programação deste módulo
foram utilizadas duas bibliotecas que fazem conexão com o Wi-Fi.
Figura 18 - Inclusão Bibliotecas Wi-Fi
Neste exemplo, usaremos um estacionamento fictício com o nome de
“Estacionamento CT”. Para tornar possível a comunicação do estacionamento com o
banco de dados, foi necessária a criação de um host no site “thingspeak.com” (Apêndice
B): nesse servidor, há um link para o script PHP que faz a atualização do banco de
dados.
Figura 19 - Constantes e Variáveis Wi-Fi
As constantes ssid e password são nome e senha da rede Wi-Fi que deseja fazer
a conexão.
Vagas e vagas1 são variáveis para a depuração dos valores recebidos da conexão
com o Arduino; a vagasmaximo é a quantidade máxima de vagas que o estacionamento
suporta e a variável cliente, que é do tipo WiFiclient, faz a comunicação entre o
ESP8266 e o banco de dados on-line.
Na função Setup(), inicializa-se a porta serial que fará a comunicação com o
Arduino, seleciona-se o modo de operação do ESP8266 (Apêndice A) e faz-se a
tentativa de conexão do módulo com a rede Wi-Fi. Caso a conexão seja bem-sucedida,
28
cria-se um delay de cinco segundos para que o Arduino possa adquirir os dados pelo
sensor e, em caso de falha na conexão, o módulo fica em loop tentando se conectar à
rede.
Figura 20 - Inicializando o ESP8266
Duas funções auxiliares foram utilizadas, Verificacao() e AtualizarBD(). A
função Verificacao() checa se a informação recebida pelo ESP8266, por meio da porta
Serial, é compatível com os dados esperados ou se foi recebido lixo. Caso seja lixo,
atribui-se o último valor válido a vagas.
Figura 21 - Função auxiliar ESP8266 Verificacao
A função AtualizarBD() atualiza o banco de dados on-line. Para isso, conecta-se
ao servidor do thingspeak.com pela porta 80 e, caso a conexão seja bem-sucedida, o
estacionamento a ser atualizado é informado com a nova quantidade de vagas
disponíveis neste estabelecimento. Caso não seja possível fazer a conexão, o código
aguarda dez segundos e tenta novamente.
29
Figura 22 - Função auxiliar ESP8266 AtualizarBD
A função principal do ESP8266 verifica se há informação na porta Serial para
chamar a função Verificacao() e, em seguida, a função AtualizarBD().
Figura 23 - Função principal ESP8266
30
Capítulo 3
Android
3.1 – Android Códigos
O Android foi o sistema operacional escolhido para o desenvolvimento inicial do
projeto, considerando que é o mais utilizado no mundo. Sua linguagem de programação
é o Java.
No projeto, o Android tem a função de tomar os dados contidos no banco on-line,
por meio de um código PHP que está na Internet, e exibi-los ao usuário do aplicativo,
como ilustrado na Figura 24 a seguir.
Figura 24 - Android e funcionamento
O programa foi dividido em quatro classes: MainActivity, DisplayListView,
ContactAdapter e Contacts. A principal é a MainActivity, encarregada de baixar os
dados contidos no banco; a DisplayListView faz a apresentação dos dados para usuários
do aplicativo; a ContactAdapter transforma os dados coletados no tipo TextView e a
Contacts armazena os dados que foram baixados do banco.
A MainActivity foi colocada como uma extensão da classe AppCompatActivity,
porque o programa fará a utilização de uma ActionBar – uma funcionalidade do
Android que chama uma ação.
31
Figura 25- onCreate MainActivity
A função onCreate(), no código ilustrado pela Figura 25, chama o layout
activity_main e apresenta-o ao usuário. É neste layout que está contida a tela inicial do
aplicativo.
No projeto, foi utilizada a classe BackgroundTask, que faz com que tarefas
possam ser trabalhadas em plano de fundo, sem atrapalhar a experiência do usuário que
está navegando pelo aplicativo. Neste caso, ela se conectará ao banco de dados e baixará
as informações contidas nele.
Figura 26 - BackgroundTask onPreExecute
Na função onPreExecute, informa-se como será feito o acesso ao banco de dados:
por meio do código PHP que está localizado em uma página html.
Em doInBackgroung, realiza-se a captação dos dados que estão no banco. Para
isso, é aberta uma conexão HTTP e cria-se um buffer que passará as informações da
página para a string JSON_STRING.
32
Figura 27 - BackgroundTask doInBackground
Em onPostExecute, o valor adquirido em doInBackground é recebido e realiza-
se o retorno deste valor por meio da variável json_string.
Figura 28 - BackgoundTask onProgressUpdate e onPostExecute
A função parseJSON é chamada quando o botão “VAGAS DISPONIVEIS” é
pressionado na tela inicial do aplicativo. Esta função tem como objetivo executar a
classe BackgroundTask e passar o conteúdo baixado do banco de dados para a classe
DisplayListView.
Figura 29 - MainActivity parseJSON
33
A classe DisplayListView tem como papel principal receber os dados da
MainActivity e exibi-los ao usuário. Para apresentá-los no formato de lista encadeada,
criou-se a classe ContactAdapter, que fará a organização dos dados em uma linha.
Figura 30 - DisplayListView parte 1
Figura 31 - DisplayListView parte 2
Ao receber as informações extraídas do banco de dados, o programa as separa
em linhas, cada uma contendo a data, o nome do estacionamento e a quantidade de
vagas. Essas linhas são enviadas para o ContactAdapter.
34
A classe ContactAdapter transforma os dados recebidos de DisplayListView do
tipo string para o tipo TextView, que é como os dados são apresentados na tela do
celular.
Figura 32 - ContactAdapter parte 1
Figura 33 - ContactAdapter parte 2
A classe Contacts guarda as informações baixadas do banco de dados de forma
segura e simples para que não haja perda de dados. Nela estão os “getters” e “setters”
para o armazenamento dos dados.
35
Figura 34 - Classe Contacts
3.2 – Android Layouts
Os layouts são as telas que aparecerão para o usuário. Neste aplicativo, há quatro
layouts: content_main.xml, onde se encontra o botão de busca de estacionamentos;
display_listview_layout.xml, que faz a apresentação dos dados em forma de lista;
activity_main.xml, que tem como objetivo informar o contato do criador do aplicativo;
e row_layout.xml, que diz como está montada cada linha da lista.
O aplicativo possui duas telas que são apresentadas ao usuário: a) tela contendo
o botão de busca de estacionamentos e o botão para o contato do desenvolvedor. b) tela
informando o último horário em que o estacionamento foi atualizado, os
estacionamentos cadastrados e a quantidade de vagas. Ambas as telas estão
representadas nas figuras, a seguir.
36
Figura 35 - Página inicial do aplicativo Figura 306 - Row_layout.xml
O código para fazer o botão “VAGAS DISPONIVEIS” encontra-se na Figura 37.
Este código indica a posição na qual o botão deve ficar na tela do dispositivo e informa
que a função parseJSON deve ser chamada quando o botão for acionado.
Figura 37 - Content_layout.xml
Os layouts apresentados nas Figuras 38 e 39, informam como aparecerá para o
usuário a lista e cada uma de suas linhas, respectivamente.
37
Figura 38 - Display_listview_layout.xml
Figura 39 - Row_layout.xml código
38
Capítulo 4
PHP
4.1 – Código PHP
PHP foi a linguagem escolhida para criar um código simples que pudesse
estabelecer uma conexão com o banco de dados on-line. Para isso, foram feitos três
scripts diferentes: um para se conectar, um para fazer a atualização e outro para fazer
download dos dados contidos no banco de dados.
O PHP abaixo encontra-se no site 000webhost.com e faz a conexão com o banco
de dados. Para que haja a conexão, é necessário informar os dados do dono do banco.
Como tanto o banco quanto o código estão no mesmo servidor, o host para acesso é o
localhost.
Figura 40 - Código init.php
Depois que os dados do usuário são informados, o código tenta fazer a conexão
através da função mysqli_connect. Ela recebe como argumentos o servidor, o usuário, a
senha e o banco de dados, informando ao usuário se foi possível ou não se conectar ao
banco de dados e o porquê.
Para fazer a atualização do banco de dados é necessário que a função anterior de
conexão tenha acontecido com sucesso. Os valores a serem atualizados estão nas
39
variáveis $estacionamento e $vagas. Foi utilizado o método POST para fazer a
passagem de dados para o banco. Assim como na função anterior, informa-se ao usuário
se foi possível ou não se conectar ao banco de dados e o porquê.
Figura 41 - Código update.php
Por fim, temos a função que envia os dados na forma de JSON para o usuário.
Esta não requer função específica destinada à conexão com o banco de dados porque
não será necessário mostrar ao usuário se foi possível se conectar – função exclusiva do
dispositivo Android.
Figura 312 - Código get_json_data.php
Após fazer a conexão, os dados são armazenados numa matriz que é codificada
como JSON pela função json_encode para, então, ser enviada por meio da função echo.
40
Capítulo 5
Resultados
O site Firebase.google.com foi utilizado para a análise de desempenho do código
Android. O site também oferece diferentes testes, incluindo verificações de
funcionalidade. No caso deste trabalho, testou-se a eficiência do tempo de inicialização
e a quantidade de processamento, memória e internet utilizados pelo aplicativo. Os
resultados estão apresentados nas duas Figuras abaixo.
Figura 43 - Velocidade do aplicativo
Figura 44 - Gráficos de desempenho do aplicativo Galaxy S9+
Pode-se ver pelo gráfico que o consumo de memória do aplicativo é muito baixo,
chegando a 60MB ao longo de aproximadamente 0.04s, assim como o consumo de
internet, com um pico de 2.3KB/s num intervalo menor que 0.02s. Ou seja, o aplicativo
41
pode ser instalado em qualquer celular com sistema operacional Android e acesso à
Internet.
Os testes anteriormente mencionados foram feitos em um celular de modelo
Galaxy S9+. A seguir, apresentamos testes realizados no modelo LG K3. Os gráficos
abaixo mostram que, no caso deste dispositivo, o consumo de processamento e memória
foram maiores, ainda que continuem muito baixos.
Figura 325 - Gráficos de desempenho do aplicativo LG K3
As telas do aplicativo com o código finalizado estão ilustradas na Figura abaixo.
Figura 46 - Telas do aplicativo
42
Capítulo 6
Conclusões
Ao longo do projeto houve algumas dificuldades na definição de um método
para a construção de sua parte física, a partir da qual se realizaria a contagem de carros
no estacionamento. Primeiramente, cogitou-se a utilização de um sensor de
infravermelho, que faria a verificação da existência ou não de um carro em cada vaga.
No entanto, muitos sensores teriam de ser empregados para tal finalidade.
Optou-se, assim, pela utilização de dois sensores, um na entrada e outro na saída,
cada qual com seu receptor. Para tornar simples e barata a instalação de ambos os
sensores no estacionamento, utilizou-se o sensor ultrassônico, que faz tanto a emissão
quanto a recepção do sinal, no mesmo módulo.
Há um problema em fazer o projeto utilizando apenas dois sensores, um de
entrada e outro de saída. Sempre existe a possibilidade de, por má intenção ou descuido,
o sensor ser enganado, fazendo parecer que há a captura da imagem de um carro
presente. Um aprimoramento disso seria a utilização de quatro sensores, dois para
entrada e dois para saída, o que minimizaria este tipo de ocorrência.
Foram encontradas, ainda, no projeto, dificuldades para fazer a comunicação
entre os módulos do ESP8266 e o Arduino, porque o hardware que contém o ESP8266,
embutido no Arduino e desenvolvido recentemente, dispõe de pouca documentação.
Configurar o módulo ESP8266 para enviar informações para o banco de dados
foi um dos desafios superados no projeto, já que a maioria das aplicações documentadas
deste dispositivo são para sua utilização como servidor.
O escopo do trabalho foi dirigido para usuários com o sistema operacional
Android, porém há possibilidade de expansão do aplicativo para outros sistemas
operacionais como IOS e Windows no futuro.
43
Referências bibliográficas
[1] Sunny Kumar Aditya & Vikash Kumar Karn, Android SQLite Essentials. Packt
Publishing Ltd, 2014.
[2] IVAN GROKHOTKOV, “Esp8266WiFi library” https://arduino-
esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html, 2017, (Acesso em 12
Agosto 2018)
[3] FERNANDO K TECNOLOGIA, “Arduino Mega com WiFi Embutido ESP8266”,
https://www.fernandok.com/2017/11/arduino-mega-com-wifi-embutido-
esp8266.html, 2017, (Acesso em 10 Agosto 2018)
[4] PRABEESH R. K., “Android JSON Parsing – Read Data from MySQL Database
Using JSON”, https://www.youtube.com/watch?v=uFbwW4ERUN0, 2015,
(Acesso em 05 Junho de 2018)
[5] FLAVIO ALEXANDRE, “O método POST”, http://www.devfuria.com.br/php/o-
metodo-post/, 2012, (Acesso em 7 Junho 18)
[6] PRABEESH R. K., “Android JSON Parsing – Perform parsing & display result in a
ListView”, https://www.youtube.com/watch?v=KSX4zIhiZlM, 2015, (Acesso em
05 Junho de 2018)
44
Apêndice A
Modos de Operação do ESP8266
O módulo ESP8266 tem quatro modos de operação – o WIFI_AP, WIFI_STA,
WIFI_AP_STA e WIFI_OFF – cada um deles com uma funcionalidade que será
explicada logo abaixo.
WIFI_AP – Este modo de operação faz referência ao AP (Acess Point), um
termo utilizado na área de redes. No caso do ESP8266, o modo AP é chamado também
de “soft-AP”, porque ele é uma etapa intermediária antes de conectar o ESP8266 ao Wi-
Fi. Isso acontece quando o SSID e a senha da rede não são previamente conhecidos.
Neste caso, o ESP inicializa como soft-AP para ser possível a conexão à Internet,
utilizando-se um laptop ou celular, de modo a prover as credenciais de uma rede Wi-Fi.
WIFI_STA – A sigla STA significa Station. Neste modo de operação, o
dispositivo atuará como uma estação de Wi-Fi, ou seja, o ESP8266 conectar-se-á a um
Acess Point para assim conseguir uma conexão à Internet.
O modo WIFI_AP_STA é a junção dos dois modos de operação do ESP8266.
Ele funciona tanto como um dispositivo de Acess Point, com acesso a ele para fazer a
modificação dos dados, assim como uma Station, fazendo acesso a redes diretamente.
O modo WIFI_OFF foi feito para diminuir o consumo de energia do ESP8266.
Para ativar este modo é recomendado o uso da função WiFi.forceSleepBegin(10). Deste
modo, o rádio do Wi-Fi é desabilitado e para poder reabilitá-lo é utilizada a função
WiFi.forceSleepWake().
45
Apêndice B
Site Thingspeak.com
ThingSpeak é uma plataforma analítica de serviços para IoT que permite
visualizar e analisar informações na nuvem, facilitando a visualização instantânea dos
dados enviados pelos dispositivos. Este site geralmente é utilizado para prototipagem e
teste de conceito sobre sistemas de IoT que venham a requerer análise.
No ThingSpeak, é possível a criação de canais onde os dados de sistemas de IoT
podem ser armazenados. Este site contém diversas aplicações analíticas e ativas.
As aplicações analíticas são “Matlab Analysis” que analisa e transforma os
dados; “Matlab Visualizations” que faz a visualização dos dados e gráficos gerados por
Matlab e “Plugins” que permite o usuário criar arquivos HTML, JavaScript ou CSS
personalizados que podem ser usados para processar ou mostrar dados.
As aplicações ativas são “TimeControl”, onde é possível deixar ações agendadas;
“React”, que faz ações condicionais nos dados contidos nos canais; “TalkBack” faz o
alinhamento de comandos numa pilha e o “ThingHTTP”, que é o utilizado no projeto.
Ele faz a criação de POSTs e GETs personalizados para outros webservices.
46
Apêndice C
Banco de Dados Online 000webhost.com
O 000webhost.com é um site grátis que permite ao usuário criar um website,
gerenciar bancos de dados, e-mails e arquivos.
No projeto, foram utilizados o gerenciador de banco de dados para criar o banco
onde ficam armazenadas as informações sobre os estacionamentos e o gerenciador de
arquivos, onde estão os códigos PHP desenvolvidos.
47
Apêndice D
Arduino Mega com ESP8266 embutido
Este é o dispositivo que foi utilizado para fazer o projeto: um Arduino Mega
embutido com ESP8266. Por se tratar de uma única placa contendo ambos os
Hardwares, torna-se mais simples, diminuindo a quantidade de fios do circuito.
Figura 47 - Arduino Mega com ESP8266
Esta placa é muito útil, porque nela você pode fazer tanto a utilização dos
módulos separadamente, como em conjunto. Para que isso seja possível, a placa tem
uma chave seletora contendo: a) sete switches que fazem a modificação dos modos de
operação do dispositivo; b) uma chave para modificar a porta serial do Arduino, que
estará em contato com o ESP8266, e c) um botão para quando for ser feito upload de
código para um dos módulos. A Figura abaixo mostra onde estão localizadas essas
chaves.
Figura 48 - Chaves seletoras do Arduino Mega
48
As posições da chave seletora para escolha do modo de operação do circuito são
apresentadas na Figura 49, abaixo.
Figura 49 - Tabela chave seletora Arduino Mega