Protótipo de sistema de rastreamento de ônibus: TranspORT

Page 1

INSTITUTO DE TECNOLOGIA ORT INFORMÁTICA/PROGRAMAÇÃO     LUIZ CARLOS AGUIAR CARRIÓN E THIAGO DE OLIVEIRA NASCIMENTO JUNIOR

PROTÓTIPO DE SISTEMA DE RASTREAMENTO DE ÔNIBUS -TRANSPORT-

RIO DE JANEIRO – RJ 2018


2

LUIZ CARLOS AGUIAR CARRIÓN E THIAGO DE OLIVEIRA NASCIMENTO JUNIOR

PROTÓTIPO DE SISTEMA DE RASTREAMENTO DE ÔNIBUS -TRANSPORT-

Trabalho apresentado ao Instituto de Tecnologia ORT, como requisito parcial para obtenção do diploma na área técnica de Programação.

Professor, Ronnie Paskin, (Engenheiro Eletricista)

RIO DE JANEIRO – RJ 2018


Sumário 1.

INTRODUÇÃO....................................................................................... 4

2.

OBJETIVOS .......................................................................................... 4

3.

CRONOGRAMA .................................................................................... 9

4.

GASTOS .............................................................................................. 12

5.

DESENVOLVIMENTO DO PROJETO ................................................ 13

6.

TESTES ............................................................................................... 19

7.

CÓDIGOS ............................................................................................ 21

8.

LAYOUT DO PROJETO ...................................................................... 30

9.

PUBLICAÇÃO ..................................................................................... 38

10.

FEIRA DE CIÊNCIAS .......................................................................... 39

11.

REFERÊNCIAS ................................................................................... 42


4 1. INTRODUÇÃO Um dos meios de transporte mais utilizados hoje em dia em nossa cidade é o ônibus. Este traz muitas facilidades como conectar diversos pontos da cidade e preços mais acessíveis. Porém, a espera em pontos de ônibus pode ser longa e cansativa, e para aqueles que estão com pressa pode significar perder um compromisso importante. Com isso em mente decidimos realizar uma pesquisa sobre sistemas de rastreamento de ônibus. Nela encontramos inúmeros aplicativos, porém, a maioria é pouco utilizada. Então em nosso projeto decidimos montar um aplicativo que indica o último ponto no qual certo ônibus esteve, a fim de contornar os problemas dos outros sistemas de rastreamento de ônibus, que serão abordados nos próximos tópicos. Ele funcionará com um banco de dados que contém informações referentes ao ônibus e o seu posicionamento em sua rota. Para ilustrar a ideia de uma forma mais didática, iremos montar uma maquete, em colaboração com o aluno de Eletrônica Gabriel Elkind Hoory, que servirá como um protótipo voltado para a apresentação na feira de ciências. Devido a ineficiência do GPS para escalas pequenas, utilizaremos uma outra forma para indicar posicionamento. Ela consiste em colocar QR Codes nos diferentes pontos de ônibus dispostos a maquete que serão lidos pelos leitores acoplados em cada ônibus assim indicando o ponto pelo qual cada um passou. A parte do aluno de Eletrônica será montar seguidores de linha para representarem os ônibus, deixando o projeto mais realista e interessante. Caso ele falhe em sua tarefa, iremos dispor de um sistema não automático. 2. OBJETIVOS Um estudo feito pelo o IPEA (Instituto de Pesquisa Econômica Aplicada) mostra que os transportes públicos eram os principais meios de locomoção nas capitais brasileiras em 2011, visto que 65% da população destes locais os utilizavam diariamente. Durante a pesquisa, os entrevistados que não costumam utilizar transportes públicos foram questionados sobre o motivo disto.


5 De acordo com as pessoas que preferem andar em vez de utilizar esses transportes, a falta de uso se deve à falta de rapidez e os preços altos. Já os ciclistas ressaltam questões relacionadas a saúde e, assim como os pedestres, a falta de praticidade. Muitos depoimentos apontaram pontos similares: ficar esperando horas por um ônibus e quando este chega está muito lotado. Outros reclamaram que o tempo de espera no ponto é tão grande que caso tivessem optado por um outro meio, como por exemplo o transporte privado, teriam chegado no destino antes mesmo do transporte público ter chegado para buscá-los no ponto. Para a era em que vivemos a falta de velocidade pode ser fatal. Hoje em dia tudo está muito dinamizado, e muitas vezes devemos fazer deslocamentos de longas distâncias em um período de tempo tão curto que esperar por um ônibus por horas no ponto acaba sendo inviável. Pensando nisso decidimos iniciar uma pesquisa sobre meios de facilitar a vida das pessoas em relação ao uso de transporte público. Apesar de transportes públicos hoje em dia ainda serem muito utilizados, o uso deles vem decaindo. Isso é um reflexo dos problemas listados a cima. Caso isso continue, a tendência é que mais pessoas comecem a utilizar transportes privados, o que irá acarretar num maior número de veículos nas ruas. Com isso, o trânsito ficará cada vez pior e a emissão de gases poluentes como o dióxido de carbono, um dos principais agravadores do efeito estufa, ou o monóxido de carbono, que pode provocar dores de cabeça e prejudicar a respiração. Então, o nosso projeto visa resolver tais problemas, incentivando o uso do transporte público. Para que possamos ter uma ideia melhor de como podemos atingir a maior parte da população, decidimos fazer uma pesquisa relacionada ao uso de transportes no dia-a-dia. Após um tempo coletando respostas, finalmente chegamos a alguns resultados e decidimos separa-los em três categorias: Estudante, Universitário e Trabalhador, para podermos visualizar melhor como cada um desses grupos se relacionam com os meios de transporte. Estes foram os nossos resultados: (Gráficos referentes a: meio de transporte mais utilizado, frequência com a qual você utiliza o meio, satisfação com ele, e se já utilizou um sistema de rastreamento de ônibus.


6 Estudantes:


7 Universitรกrios:


8 Trabalhadores:


9 Tais análises nos proporcionou uma melhor ideia de qual será o nosso público alvo, tendo em vista que aqueles que estão cursando alguma faculdade (por volta dos 18 até os 24 anos) são os que demonstram a maior necessidade de utilizar transportes públicos com uma maior frequência. A pesquisa contou com a participação de 150 pessoas e 8 perguntas acerca do grupo em que a pessoa está inserida e o uso dos meios de transporte no dia-a-dia dela. Mais detalhes da pesquisa podem ser encontrados no link no capítulo 11: Referências. Além disso, por meio desse projeto, estamos procurando provar o conceito de que o nosso sistema de rastreamento pode ser tão, ou até mais eficiente que sistemas já existentes. Será levado em conta dados de rota do ônibus, último ponto visitado e o próximo ponto a ser visitado. O alvo é tentar entender o porquê de aplicativos com propostas similares não serem tão eficientes e propor uma solução baseado no que achamos que será mais eficiente. Outro objetivo inclui garantir a facilidade de acesso do sistema, por isso o mesmo será feito como utilizando o Android Studio para que assim possa alcançar boa parte da população através dos smartphones. Iremos utilizar layouts simples e mecânicas de fácil entendimento para que a tarefa de achar o ônibus seja rápida e prática. Após alguns estudos, não iremos desenvolver uma versão para dispositivos que possuam o sistema operacional iOS. Isso se deve ao fato de não dispormos de ferramentas necessárias para o desenvolvimento do mesmo e, adquiri-las iria aumentar muito o custo do projeto, indo contra a ideia de fazer algo que não demande uma taxa monetária alta. 3. CRONOGRAMA O cronograma foi definido com uma meta de 120 pontos, porém, como o projeto começou a andar mais rápido do que esperado e o mesmo mostrou avanços significativos em suas primeiras semanas, ele passou por um processo de constante ampliação com o objetivo de otimizar ao máximo o aplicativo final. Segue a legenda: Azul = A fazer Laranja = Em adamento Amarelo = Testar


10 Verde = Esperado Roxo = Concluído Burnup:

O sistema de pontuação tem como o objetivo de demonstrar a complexidade de cada tarefa. Ela se baseia no sistema de pontuação de peças de xadrez, no qual as tarefas mais urgentes e complexas recebem o valor 9 (equivalente a rainha no jogo). A complexidade varia entre 1 (peões: tarefas simples ou de menor importância), 3 (bispos e cavalos: tarefas de complexidade moderada ou de pouca importância para o cronograma), 5 (torres: tarefas mais complexas ou que são essências pro projeto), 9 (rainha: tarefas muito complexas ou urgentes para o funcionamento do projeto) e uma última que será utilizada se, e somente se, quando uma story nova for adicionada pouco tempo antes da data limite e esta seja vital para o funcionamento do projeto. O valor atribuído seria incalculável (assim como o rei, visto que sem está peça, o jogo acaba). Para representar tal situação, usaremos a letra “K”. Vale ressaltar que durante o processo de produção do aplicativo, a quantidade total de pontos necessários para chegar no final variou bastante com o tempo. No início, ela começou em 120 pontos. Ao final das 30 semanas, esse valor chegou a 250 pontos necessários. Segue a divisão das colunas e as legendas: Colunas: A Fazer | Em Andamento| Testar | Concluído Laranja: Tarefa para todos os membros do grupo


11 Roxo: Tarefa para o aluno de Eletrônica Azul: Tarefa para os alunos de Programação Stories:

O projeto começou num bom ritmo, e em pouco tempo a maior parte dele já estava funcionando. Devido a velocidade com que o projeto estava chegando na sua meta, decidimos expandi-lo ainda mais, adicionando novas “stories” no Trello com tarefas mais desafiadoras ou aquelas que eram consideradas mais secundárias no plano original. Com isso, o limite de pontos foi aumentando gradativamente, até chegar na marca final de 250 pontos como meta. Durante o período da quarta semana, devido a fatores externos, decidimos desacelerar o processo de desenvolvimento para que pudéssemos nos reorganizar com as tarefas e analisando quais eram as que precisavam estarem prontas o mais cedo quanto o possível. Nesta sequência de semanas, que se estendeu por 1 mês, demos um maior suporte nas fases de teste das versões inicias do carrinho. A meta inicial de 120 pontos acabou sendo batida na semana 13, quando o projeto chegou a marca de 126 pontos. Neste ponto, decidimos dificultar mais o projeto para que ele possa alcançar um público maior.


12 Na semana 24, já estávamos na marca de 213 pontos. Essa data representa um dia importante pro projeto, visto que a parte dos carrinhos feitos pelo aluno de Eletrônica terminou com uma margem de 6 semanas para otimizações. Com seis semanas faltando para a feira e ainda restando 37 pontos, a parte principal se tornou lidar com a parte de design, visto que toda a programação estava encaminhada para os estágios finais. Faltando 1 semana para a entrega do projeto, o aluno de eletrônica declarou ter atingindo todos os pontos exclusivos para eletrônica. Com isso, restava somente terminar o aplicativo, calcular o tempo que um ônibus leva para completar o percurso e publicar o TranspORT no Google Play Store. Entretanto, após alguns novos testes, chegou-se a conclusão que os carrinhos eram ineficientes e, portanto, o motor deveria ser trocado. Assim, de forma a podermos nos encaixar no cronograma novamente, surgiu uma tarefa com o símbolo K: terminar ao menos um carrinho. Ao final, o projeto funcionou corretamente e o aplicativo ficou disponível para download na play store e o carrinho operou corretamente no dia da feira de ciências. 4. GASTOS

Na parte de gastos, tentamos garantir que o mínimo de dinheiro fosse gasto, pois um dos objetivos de nosso projeto é testar o nosso conceito de rastreamento de ônibus, e como vimos em nossa pesquisa de métricas, as passagens caras afastam as pessoas dos transportes públicos. Logo, se o sistema ficasse muito caro, isso iria influenciar no aumento das passagens.


13 Alguns pontos são importantes de se destacar: 1) A tabela acima representa somente gastos relacionados aos carrinhos, desconsiderando as outras partes.; 2) Devido a algumas exigências, gastos referentes a cartazes tiveram de ser adicionados.; 3) Além dos pontos anteriores, o gasto pela maquete não foi calculado ainda. Por isso, foi criada uma nova tabela que engloba todos os gastos anteriores (sendo representados pelo nome carrinho e o preço sendo o total), os gastos dos cartazes e o preço de todos os itens necessários para montar a maquete. Como a divisão dos carrinhos será feita de forma que o aluno de Eletrônica fique com os dois, o valor que cada um terá de pagar será diferente. Dessa forma, o aluno de Eletrônica ficou responsável pela metade do preço enquanto ambos os alunos de Programação pagaram somente um quarto cada um. Para o dia da feira, foi requisitado o preparo de cartazes para chamar a atenção para o projeto, o que acabou aumentando os gastos com o projeto (os cartazes podem ser vistos no capítulo 8: Layout do Projeto). Assim, de maneira a garantir uma divisão justa de preços ficou estabelecido o seguinte: no que diz respeito a parte dos cartazes, os custos serão divididos igualmente entre os três membros do grupo. O restante continuará seguindo o padrão definido anteriormente. No final, todas as peças que foram encomendadas chegaram e os cartazes e os plotter ficaram prontos no prazo certo. 5. DESENVOLVIMENTO DO PROJETO Para o nosso desenvolvimento decidimos começar definindo como funcionaria nosso sistema de rastreamento. Após estudar com cuidado outros concorrentes, reparamos que muitos deles não ofereciam acompanhamento em tempo real, somente as rotas. Aqueles que ofereciam o rastreamento possuíam uma avaliação baixa, muitas vezes relacionadas a interfaces muito complexas e pouco práticas e a faltas de precisão. Com isso em mente e sabendo de nossas limitações, descartamos o sistema de GPS, visto que o sinal de GPS acaba por não ser 100% preciso, e como estudamos, a praticidade é o que as pessoas buscam hoje em dia. Portanto tentamos uma abordagem diferente.


14 Consideramos duas possibilidades, a tecnologia RFID e QR Codes. Apesar do primeiro sistema possuir muitos usos, ele acabaria sendo muito caro, e como visto nas pesquisas, o preço dos ônibus é um fator que afasta as pessoas dos transportes públicos, logo este sistema acataria num aumento do preço das passagens. Então começamos a estudar o sistema de rastreamento baseado em QR Codes. O sistema em si não é tão caro quanto o RFID logo este se torna mais viável para nossa realidade. Com o sistema decidido nós começamos a pensar em como ilustrar nossa ideia para o mundo. Foi então que decidimos que iríamos nos juntar a um aluno do curso técnico de Eletrônica para que este nos ajudasse a elaborar uma maquete para representar o sistema numa escala menor. Ele seria responsável por criar uma representação automatizada, em escala reduzida, dos ônibus, enquanto nós ficamos responsáveis pelo sistema de rastreamento em si. O desenvolvimento do sistema começou por uma fase de testes que será melhor detalhada no próximo tópico. Neste teste começamos pensando em como funcionaria o sistema na prática. A primeira parte foi desenvolver um aplicativo capaz de ler qualquer QR. O sistema ficou pronto bem rápido em sem muitos problemas. Agora nós já éramos capazes de ler informações, o desafio era o que fazer com ela. Então começamos a incrementar mais o sistema. Primeiro formalizamos a nossa ideia: o leitor, preso ao “ônibus X”, irá ler o código do “ponto Y” e informação de que o “ônibus X” chegou ao “ponto Y” será enviada para o aplicativo que está em posse do usuário. A partir desse ponto, tínhamos basicamente 2 tarefas: desenvolver o sistema que enviasse as informações e um que as recebesse. Para que isso fosse possível decidimos utilizar o Android Studio em conjunto com o sistema de banco de dados Firebase. A escolha desse banco de dados externo é devido a sua facilidade de uso e integração simples com o Android. Por ser muito conhecido, existem muitos guias que ajudam a entender melhor certas peculiaridades do sistema. Outro ponto é o fato de que utilizar o sistema SQL é mais complexo, se tratando de um banco externo (caso


15 fosse interno, o próprio Android oferece essa opção). Assim, o Firebase foi selecionado para o projeto como o local que guardaria todos os dados do nosso projeto. Antes de continuar a desenvolver o sistema que envia e o que recebe informações, começamos a modelar o banco de dados. O Firebase utiliza um sistema hierárquico, como o modelo abaixo:

Foi decidido que o sistema iria ser dividido em duas superclasses: Onibus1 e Onibus2. Após muitos testes e correções de bugs, ficou definido que elas receberiam somente um parâmetro que ficou nomeado como QR. Este por sua vez possuía dois parâmetros: Hora e Valor. O “Valor” é referente a informação obtida na hora da leitura do QR, enquanto “Hora” recebe o horário que esta informação foi lida. Com a estrutura de banco de dados montada era hora de voltar a desenvolver o sistema de enviar informações para poder alterar os dados do banco. Não foram necessárias muitas modificações para enviar as informações, porém devido a alguns bugs que acabamos encontrando durante o desenvolvimento, a estrutura de banco de dados foi mudando bastante antes de chegar na versão final que citamos nos dois parágrafos anteriores. A parte de leitura das informações do banco de dados se mostrou um pouco mais trabalhosa. Para poder montar o sistema de leitura começamos com aplicativos de teste antes de montar o definitivo. Após garantir que o sistema estava funcionando corretamente e sem bugs, começamos a elaborar o protótipo da versão final do aplicativo.


16 Nessa primeira versão, decidimos priorizar a facilidade de acesso aos dados, tornando o aplicativo prático. Portanto, decidimos começar a trabalhar mais a parte de design e layout do aplicativo. Enquanto começamos a desenvolver testes de uso de usuários, a equipe de Eletrônica terminou os seguidores de linhas. Devido ao andamento do projeto e o tempo restante, decidimos aumentar a complexidade a fim de ter um resultado melhor no final. Os itens adicionados eram referentes a questões de login para gerar mais opções para o usuário, como a possibilidade de ter uma lista de ônibus mais utilizados. Depois de uma pausa devido a semana de provas, questões pendentes do projeto, que estavam sendo feitas aos poucos, começaram a ficar prontas, principalmente na parte dos carrinhos, nos quais a maioria dos testes funcionaram o que proporcionou o avanço para o desenvolvimento das novas funcionalidades referentes a diferentes rotas. A partir do segundo trimestre foi decidido que iríamos focar mais na parte de polir o aplicativo para garantir o melhor acesso ao usuário baseado nos resultados da pesquisa de métricas feitas durante o primeiro trimestre (resultados podem ser conferidos na seção de testes). Assim, partes do projeto que construímos para propósitos de testes começaram a ser adaptadas para se aproximarem cada vez mais de um cenário mais realista. A principal mudança que está sendo trabalhada é referente ao sistema em que se escolhe o ônibus que será rastreado. O sistema antigo era baseado num menu no qual era selecionado o ônibus para rastrear. O novo sistema irá pedir duas entradas, o ponto de partida e o de chegada. E então, ele irá disponibilizar os melhores ônibus para chegar no destino mais rapidamente. Em conjunto com essa parte do desenvolvimento, está sendo estudada a possibilidade de o aplicativo deixar de ser restrito para celulares que possuam somente Android, e indo para os iPhones. Neste ponto do projeto, foi decidido que ele iria seguir dois modelos de rastreamento já testados por nós anteriormente. O baseado em ônibus e o baseado em rota.


17 No primeiro sistema o usuário recebe os dados de um ônibus específico, enquanto no segundo ele recebe os dados de uma rota. O sistema a base de rotas estava tendo muitos bugs, entretanto, apesar de terem dado um trabalho considerável na hora de corrigi-los, não eram tão complexos. A ideia é evoluir mais ainda este sistema para que fique mais atrativo para os usuários. Após algumas semanas aplicando o novo sistema, a versão final tomou forma. Nessa, decidimos criar uma nova ramificação no Firebase, chamada de Pontos, com todos os pontos de ônibus. Cada parada possui, por sua vez, dois filhos que representam os dois carrinhos-ônibus. Tal sistema utiliza o número “0” para indicar que o carrinho não passa por determinado ponto ou “1” para indicar que o carrinho passa.

Paralelamente a esta parte do projeto, foi criado o primeiro esboço do mapa, indicando onde cada ponto irá ficar quando a maquete for montada. Após alguns cálculos em relação a área disponível para a apresentação, decidimos qual seria o esqueleto final. Antes, é preciso tomar nota de que o esboço tem como objetivo criar maiores desafios para testar as funções do carrinho do aluno de Eletrônica, para que assim ele possa testar seu projeto. Dessa maneira, o carrinho poderá cumprir a função de simular um ônibus real. O mapa é uma representação gráfica do percurso que o carrinho irá realizar durante o dia da feira (o percurso pode ser visto no capítulo 10: Feira de Ciências). A ideia é disponibilizar esse mapa com as rotas para os usuários do aplicativo (o resultado final do mapa pode ser visto no capítulo 8: Layout do Projeto).


18 Com essa ideia em mente, decidimos adicionar uma página extra no aplicativo na qual os usuários poderiam ver as rotas de ambos os ônibus no mapa. A ideia é que essa funcionalidade possa ser utilizada a partir da página de rastreamento por ônibus (após selecionar um ônibus específico) e pela página de rastreamento por rota (podendo mostrar a rota de todos os ônibus através de um único clique).

O último passo foi começar a definir as ligações entre as páginas. Como citado anteriormente, a funcionalidade de visualização já foi interligada com outras duas páginas. Com isso, ficou faltando somente decidir as páginas inicias. Assim, terminamos nesse esquema:


19

Página inicial

Rastrear por rota Rota do ônibus

Rastrear por ônibus

Ônibus selecionado (status)

6. TESTES Nossos primeiros testes foram referentes ao sistema de leitura dos QR. Em nossas pesquisas e observações nós percebemos que o modelo que estávamos propondo para os QR dificultava mais a leitura se comparado ao modelo padrão (Figura 1: modelo proposto; Figura 2: modelo padrão).

Figura 1

Figura 2


20 Os testes indicaram que o tempo de leitura em diferentes celulares no primeiro modelo variavam entre um segundo e dez segundos, enquanto o segundo modelo demorava entre 1 segundo e 3 segundos, como observado no gráfico abaixo: Outros testes que fizemos foram os relacionados ao sistema de rastreamento por ônibus. Nele testamos diferentes hipóteses e, por fim, chegamos ao resultado final. Este resultado foi baseado nas respostas recebidas nos formulários e as críticas a outros aplicativos similares. Quanto aos testes do sistema de rastreamento por rota, estes foram focados em garantir que o código não ficasse tão complexo de forma a consumir muito da memória. Durante os testes, encontramos um bug no botão de rastrear, visto que ele só estava funcionando após o duplo clique. Este problema, apesar de ter sido um pouco complexo, foi consertado.

Após esses testes, verificamos eventuais bugs que poderiam ocorrer. Um deles foi o caso de o celular não estar conectado a internet. Nesse caso, o aplicativo enviará uma mensagem para o usuário, avisando-o que para utilizar o TranspORT, ele precisa ativar seu 4g ou se conectar a uma rede wi-fi. Outros testes relevantes foram os da parte de eletrônica. Por meio deles, foi possível descobrir problemas em alguns motores a tempo, possibilitando a troca por alguns mais eficientes. Além disso, testamos os sensores de cor para que, assim, o aluno de Eletrônica pudesse calibrar corretamente os sensores. Os últimos testes feitos foram focados em encontrar eventuais falhas e bugs no aplicativo. Para que isso fosse possível, lançamos a primeira versão do aplicativo


21 e coletamos o feedback de alguns colegas. Então, descobrimos alguns problemas em certos tipos de telas. E assim, conseguimos acabar a fase de testes. 7. CÓDIGOS Primeiramente, vale reafirmar a ideia do projeto de criar um sistema de rastreamento de ônibus ideal através de meios que visem economizar dinheiro. Outro ponto importante que gostaremos de adicionar a proposta de deixa-lo como um projeto “Open Source”, permitindo que qualquer programador interessado possa cooperar no desenvolvimento do código durante estágios após a feira de ciências. Por esse motivo, será deixado, na parte de referências, um link para acesso dos arquivos no GitHub.

Por fim, iremos deixar alguns exemplos de pontos chaves do código que achamos que são importantes de se destacar, visto que eles são o diferencial do projeto para qualquer outro aplicativo. Dando início a essa seção, iremos começar com a parte do leitor de QR. Esse é o código mais simples do projeto, tendo sido necessário somente poucas linhas. Ele consiste de duas partes importantes: ler o QR Code e manda-lo para o banco de dados externo (Firebase). package com.ort.luiz.leitordeqrcode; import import import import import import import import

android.app.Activity; android.content.Intent; android.net.wifi.ScanResult; android.support.v7.app.AppCompatActivity; android.os.Bundle; android.view.View; android.widget.Button; android.widget.Toast;

import import import import import

com.google.firebase.database.DataSnapshot; com.google.firebase.database.DatabaseError; com.google.firebase.database.DatabaseReference; com.google.firebase.database.FirebaseDatabase; com.google.firebase.database.ValueEventListener;


22 import import import import

com.google.zxing.integration.android.IntentIntegrator; com.google.zxing.integration.android.IntentResult; java.text.SimpleDateFormat; java.util.Date;

import static java.lang.String.valueOf; public class MainActivity extends AppCompatActivity { Button btnScan; private String qr; FirebaseDatabase database; DatabaseReference onibus1Ref; SimpleDateFormat formatData; Date hora; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); database = FirebaseDatabase.getInstance(); btnScan = findViewById(R.id.btnScan); final Activity activity = this; //Cria referencia para o onibus1 onibus1Ref = database.getReference("Onibus1"); //Le do banco de dados onibus1Ref.child("QR").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { qr = dataSnapshot.getValue().toString(); } @Override public void onCancelled(DatabaseError databaseError) { } }); btnScan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { IntentIntegrator integrator = new IntentIntegrator(activity); integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES); integrator.setPrompt("Camera Scan"); integrator.setCameraId(0); integrator.initiateScan(); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {


23 IntentResult result = IntentIntegrator.parseActivityResult(requestCode,resultCode,data); if(result != null){ if(result.getContents() != null) { onibus1Ref.child("QR").child("Valor").setValue(result.getContents()); formatData = new SimpleDateFormat("HH:mm"); hora = new Date(); String dataFormatada = formatData.format(hora); onibus1Ref.child("QR").child("Hora").setValue(dataFormatada); } else{ alert("Scan cancelado"); } } else { super.onActivityResult(requestCode, resultCode, data); } } private void alert(String msg){ Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show(); } }

Nesse segmento, o principal se encontra na variável onibus1Ref. Essa variável faz referência ao elemento Onibus1 no banco de dados (a arquitetura do banco de dados pode ser consultada no “Capítulo 5 – Desenvolvimento do Projeto”). Dessa forma, toda vez que um novo valor de QR for lido pela câmera do aplicativo, essa variável irá enviar seu novo valor para o child QR (do Onibus1). O sistema usado para o ônibus 2 foi o mesmo. Para a próxima parte, iremos analisar o aplicativo que o usuário pode baixar na Play Store. Tal aplicativo possuí somente permissão de leitura de dados, fazendo com que nenhum usuário possa modificar os dados relacionados aos ônibus. Daremos início pelo método de rastreamento de ônibus específicos. package com.ort.luiz.transpORT; import import import import

android.content.Intent; android.os.Bundle; android.widget.Button; android.widget.TextView;

import import import import import

com.google.firebase.database.DataSnapshot; com.google.firebase.database.DatabaseError; com.google.firebase.database.DatabaseReference; com.google.firebase.database.FirebaseDatabase; com.google.firebase.database.ValueEventListener;

import android.app.Activity; import android.widget.Toast;


24 public class Onibus1Activity extends Activity { FirebaseDatabase database; DatabaseReference onibus1Ref; Button btnVoltar, btnVerRota; String acState; @Override protected void onStart() { super.onStart(); } @Override protected void onRestart() { super.onRestart(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_onibus1); database = FirebaseDatabase.getInstance(); onibus1Ref = database.getReference("Onibus1"); //Botao voltar btnVoltar = findViewById(R.id.btnVoltarID); btnVoltar.setOnClickListener((V)->{ //Abre a pagina inicial startActivity(new Intent(this, SelectOnibusActivity.class)); btnVoltar.setBackgroundResource(R.color.aqua); }); //Botao ver rota btnVerRota = findViewById(R.id.btnVerRotaOnibus1ID); btnVerRota.setOnClickListener((V)->{ //Abre a activity da rota do Ă´nibus 1 startActivity(new Intent(this,RotaOnibus1Activity.class)); btnVerRota.setBackgroundResource(R.color.aqua); }); //Le o QR banco de dados onibus1Ref.child("QR").addValueEventListener(new ValueEventListener() {


25 @Override public void onDataChange(DataSnapshot dataSnapshot) { TextView textView = findViewById(R.id.textPartidaID); String valor = dataSnapshot.child("Valor").getValue().toString(); String hora = dataSnapshot.child("Hora").getValue().toString(); onibus1Ref.child("AcState").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(Integer.parseInt(dataSnapshot.getValue().toString()) == 0){ acState = "Desligado"; } else { acState = "Ligado"; } textView.setText("Ponto atual: " + valor + " \nChegou às: " + hora + "\nAr Condicionado: " + acState); } @Override public void onCancelled(DatabaseError databaseError) { } }); } @Override public void onCancelled(DatabaseError databaseError) { } }); } private void alert(String msg){ Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show(); } }

Após o usuário escolher o Ônibus que deseja ter conhecimento, ele irá abrir a página com o status dele (todas as páginas podem ser vistas com mais detalhes no “Capítulo 8 – Layout do Projeto”). Caso o usuário não possua alguma conexão com a internet, irá aparecer uma mensagem pedindo para ele se conectar. O mais relevante dessa parte é o método de leitura, no qual, mais uma vez, a variável onibus1Ref serve como referência ao elemento do banco de dados externo. A ideia é: a variável valor irá receber o ponto atual enquanto a variável hora recebe o tempo que o ônibus chegou. Assim que o banco de dados muda, essas variáveis, automaticamente, definem seus novos valores, fazendo com que esse seja um processo dinâmico.


26 Existe, também, a possibilidade de ver mais detalhes sobre a rota específica do ônibus, podendo ver o percurso feito pelo mesmo e os pontos nos quais ele irá parar. package com.ort.luiz.transpORT; import import import import import import import import import import import import import

android.content.Context; android.content.Intent; android.graphics.Color; android.net.ConnectivityManager; android.os.Bundle; android.app.Activity; android.view.View; android.widget.AdapterView; android.widget.ArrayAdapter; android.widget.Button; android.widget.Spinner; android.widget.TextView; android.widget.Toast;

import import import import import

com.google.firebase.database.DataSnapshot; com.google.firebase.database.DatabaseError; com.google.firebase.database.DatabaseReference; com.google.firebase.database.FirebaseDatabase; com.google.firebase.database.ValueEventListener;

public class SelectRotaActivity extends Activity { Button btnRastrear, btnVoltar; TextView textOnibus1, textOnibus2; Spinner pontoInicial, pontoFinal; String[] pontosValues = {"Cidade Z", "Disboard", "Grand Line", "Konoha", "Magnolia", "Namekusei", "Toutsuki", "UA"}, onibus1Pontos = {"Disboard", "Grand Line", "Konoha", "Toutsuki", "UA"}, onibus2Pontos = {"Cidade Z", "Disboard", "Konoha", "Magnolia", "Namekusei"}; String pontoInicialSelected, pontoFinalSelected; int atOnibus1, atOnibus2; ArrayAdapter<String>arrayAdapterPontoInicial; ArrayAdapter<String>arrayAdapterPontoFinal; FirebaseDatabase database; DatabaseReference pontoRef; @Override protected void onStart() { super.onStart(); } @Override protected void onRestart() { super.onRestart(); } @Override protected void onResume() { super.onResume(); }


27 @Override protected void onPause() { super.onPause(); } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_rota); //Referência do banco de dados database = FirebaseDatabase.getInstance(); pontoRef = database.getReference("Pontos"); //Instanciando as variáveis pontoInicial = findViewById(R.id.partidaID); pontoFinal = findViewById(R.id.finalID); btnVoltar = findViewById(R.id.btnVerRotaOnibus1ID); btnRastrear = findViewById(R.id.btnRastrearID); textOnibus1 = findViewById(R.id.onibus1TextID); textOnibus2 = findViewById(R.id.onibus2TextID); //Cria o menu suspenso arrayAdapterPontoInicial = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, pontosValues); arrayAdapterPontoFinal = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, pontosValues); pontoInicial.setAdapter(arrayAdapterPontoInicial); pontoFinal.setAdapter(arrayAdapterPontoFinal); //alert(String.valueOf(verificaConexao())); //Le o item selecionado no menu ponto inicial pontoInicial.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int i, long id) { //alert("Your selection is: " + pontosValues[i]); pontoInicialSelected = pontosValues[i]; //alert("mudou"); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); //Le o item selecionado no menu ponto final pontoFinal.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int i, long id) { pontoFinalSelected = pontosValues[i]; }


28 @Override public void onNothingSelected(AdapterView<?> parent) { } }); //Botao para rastrear o ônibus btnRastrear.setOnClickListener((View V) ->{ btnRastrear.setBackgroundResource(R.color.aqua); if(verificaConexao() == true) { if(pontoInicialSelected != pontoFinalSelected){ //Verifica se o ônibus2 passa pelo ponto inicial pontoRef.child(pontoInicialSelected).child("Onibus2").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(Integer.parseInt(dataSnapshot.getValue().toString()) == 1){ pontoRef.child(pontoFinalSelected).child("Onibus2").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(Integer.parseInt(dataSnapshot.getValue().toString()) == 1){ atOnibus2 = 1; } else { atOnibus2 = 0; } if(atOnibus2 == 0){ textOnibus2.setText("Onibus2: Não passa"); } else { textOnibus2.setText("Onibus2: Passa | Mostrar Rota"); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } else { atOnibus2 = 0; textOnibus2.setText("Onibus2: Não passa"); } } @Override public void onCancelled(DatabaseError databaseError) { } }); //Verifica se o ônibus1 passa pelo ponto inicial pontoRef.child(pontoInicialSelected).child("Onibus1").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(Integer.parseInt(dataSnapshot.getValue().toString()) == 1){


29 pontoRef.child(pontoFinalSelected).child("Onibus1").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(Integer.parseInt(dataSnapshot.getValue().toString()) == 1){ atOnibus1 = 1; //alert("Aqui"); } else { atOnibus1 = 0; //alert("Aqui"); } if(atOnibus1 == 0){ textOnibus1.setText("Onibus1: Não passa"); } else { textOnibus1.setText("Onibus1: Passa | Mostrar Rota"); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } else { atOnibus1 = 0; textOnibus1.setText("Onibus1: Não passa"); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } else { alert("Escolha pontos diferentes!"); textOnibus1.setText("Onibus1:"); textOnibus2.setText("Onibus2:"); } } else{ alert("Não há conexão com a internet, por favor tente novamente"); } }); textOnibus1.setOnClickListener(v -> { //alert("Clicou"); startActivity(new Intent(this, RotaOnibus1Activity.class)); }); textOnibus2.setOnClickListener(v -> { //alert(clicou); startActivity(new Intent(this, RotaOnibus2Activity.class)); }); btnVoltar. setOnClickListener(v -> { startActivity(new Intent(this, SelectActivity.class)); btnVoltar.setBackgroundResource(R.color.aqua); }); } //Verifica a conexão com a internet


30 public boolean verificaConexao() { boolean conectado; ConnectivityManager conectivtyManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (conectivtyManager.getActiveNetworkInfo() != null && conectivtyManager.getActiveNetworkInfo().isAvailable() && conectivtyManager.getActiveNetworkInfo().isConnected()) { conectado = true; } else { conectado = false; } return conectado; } private void alert(String msg){ Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show(); } }

Esse último código é responsável por fazer uma pesquisa. Em primeira instância, o usuário deverá informar o ponto de partida e o ponto final. Com essas informações em mãos, o aplicativo irá buscar, em seu banco de dados, os ônibus que passem por ambos os pontos. Caso algum ônibus satisfaça essa condição, será informado que o mesmo passa por esses pontos. 8. LAYOUT DO PROJETO Quanto o layout do projeto, foram feitos alguns estudos para podermos chegar na melhor opção para o aplicativo. Primeiro, começamos observando logos de outras aplicações que possuem funções similares ao Transport. Depois de termos feito esta análise, começamos a criar nossa própria logo. O resultado foi esse: Figura 1: Logo

Além disso, foram criadas variantes da logo para atender as necessidades de uso em diferentes situações. Dessa forma, foram criados: um logotipo, um símbolo e dois ícones para a playstore (um quadrado e o outro circular). Os resultados de cada uma dessas variações da logo foram:


31 Figura 2: Logotipo

Figura 3: Símbolo

Figura 4: ícone play store

Figura 5: ícone play store circular

Outro ponto importante no nosso estudo foi quanto as telas do aplicativo. Para essa parte específica do projeto, decidimos nos basear em aplicativos como o Uber, visto que ele apresenta um sistema de rastreamento para saber a posição atual do motorista e, principalmente, por possuir um layout simples, objetivo e eficiente. A primeira página de nosso aplicativo é uma Splash Screen. Essa é uma tela que apresenta a logo de nosso projeto. Essa é a folha de rosto de nosso produto e serve para dar tempo para as outras páginas irem carregando em segundo plano. O tempo que ela fica visível é de aproximadamente três segundos.


32 Logo após a Splash Screen, a primeira página é referente ao tipo de rastreamento que a pessoa deseja utilizar. Logo, ela pode decidir utilizar o método de rastreamento por rotas ou por ônibus (as diferenças entre ambos foram explicadas no capítulo 5: Desenvolvimento do Projeto). Para servir de guia para os usuários, decidimos colocar o mapa em sua versão final (o esquema do mapa pode ser visto pela primeira vez no capítulo 5: Desenvolvimento do Projeto).

Após decidir o método de rastreamento, o usuário será redirecionado para uma dessas duas páginas:


33 Seguiremos,agora, pela sequência da página de rastreamento por ônibus (a sequência pode ser vista no capítulo 5: Desenvolvimento do Projeto). Logo depois do processo de selecionar o ônibus desejado, a pessoa será redirecionada para essa página com os status do ônibus:

Nessa página, o usuário recebe todas as atualizações do ônibus que ele escolheu (ponto no qual o ônibus se encontra, o horário que ele chegou e o status do ar condicionado). Além disso, ela permite o acesso á página de ver rota que


34 disponibiliza o mapa, citado no capítulo 5: Desenvolvimento do Projeto, em sua forma final e com o percurso do ônibus marcado: Para possibilitar uma melhor visão, esses são os mapas utilizados na página inicial e nas páginas de rotas dos ônibus:

Além disso, como dito no capítulo 4: Gastos, foi necessário elaborar alguns cartazes para a feira de ciências. Assim, decidimos que iríamos fazer, além de 1 plotter explicativo, 5 cartazes para divulgar o projeto, 1 banner para divulgar o aplicativo, e 1 aviso, dando instruções de proíbido tocar no projeto. Esse último foi criado pois muitas crianças visitam a feira, portanto, é necessário tomar algumas medidas para que o projeto não seja danificado.


35 Banner:


36 Plotter:


37 Cartaz:

Aviso:


38 9. Publicação Após termos terminado todas as funções do aplicativo, aplicado o layout desenvolvido e testado tudo, decidimos que era a hora de publicá-lo na loja do android. Para que isso fosse possível, era necessário gerar o APK. Depois, utilizamos uma conta com acesso ao play console (plataforma utilizada para publicar os aplicativos na play store). Para que o aplicativo fosse aceito na loja, tivemos que seguir alguns passos. Primeiro, tivemos que responder um questionário para determinar a classificação do aplicativo. Ao final, ele foi classificado como: livre para todos os públicos na classificação do Entertainment Software Rating Board (ESRB) e o Sistema de Classificação Indicativa Brasileiro.

O aplicativo ficou na classificação Apps, na categoria de Veículos. Fornecemos algumas capturas de tela para servirem de exemplo na loja (as telas podem ser vistas no capítulo 8: Layout do Projeto). O título, na loja, ficou como TranspORT App.


39 10. Feira de Ciências No dia da feira, chegamos bem cedo para garantir que tudo estivesse funcionado e, principalmente, arrumar os últimos detalhes. A rota, representada pelo mapa (a estrutura pode ser vista no capítulo 5: Desenvolvimento do Projeto e o resultado final pode ser visto no capítulo 9: Layout do Projeto), ficou dessa forma: Percurso:


40 Utilizamos suportes de papelão para permitir o posicionamento dos QR Codes, garantido que, quando o ônibus passasse, o código pudesse ser lido. Os QR Codes impressos ficaram assim (comparação feita com Rubik Cube):


41 E a estrela do projeto, o carrinho, ficou assim:


42 A apresentação do projeto começou às 11 horas do dia 21 de outubro de 2018 e terminou por volta das 17 horas do mesmo dia. Durante esse período, muitas pessoas visitaram o local e, de forma geral, o aplicativo fez bastante sucesso. Recebemos muitas sugestões de como melhorar o projeto, de forma a torna-lo utilizável para os moradores do Rio de Janeiro. A avaliação final do aplicativo na play store ficou com 5 estrelas.

11. Referências Link para o download do aplicativo na Play Store: <https://play.google.com/store/apps/details?id=com.ort.luiz.mybus>; Acesso em: 19 out. 2018. Link para o projeto no GitHub: <https://github.com/IKuuhakuI/projeto_final_bus>; Acesso em: 30 mar. 2018. Link para o quadro do Trello: <https://trello.com/b/nzqfx4mK/tarefas>; Acesso em: 05 mar. 2018.


43 Estudo do Ipea mostra que 65% da população usam transporte público nas capitais disponível em:<http://www.brasil.gov.br/governo/2011/05/estudo-do-ipeamostra-que-65-da-populacao-usam-transporte-publico-nas-capitais>; Acesso em: 07 abr. 2018. 5 aplicativos para acompanhar ônibus em tempo real (por Redação) disponível em:<https://canaltech.com.br/apps/5-aplicativos-para-acompanhar-onibus-emtempo-real/>; Acesso em: 05 jul. 2018. Moovit: página de download do aplicativo na play store, disponível em: <https://play.google.com/store/apps/details?id=com.tranzmate&hl=pt_BR>;

Acesso

em: 10 jul. 2018. Uber: página de download do aplicativo na play store, disponível em: <https://play.google.com/store/apps/details?id=com.ubercab&hl=pt_BR>; Acesso em: 02 set. 2018. Link da pesquisa sobre os ônibus e público alvo do projeto: <https://docs.google.com/forms/d/e/1FAIpQLSf1qJfQCTbrAsislpMmtGjMYDiA6zr4XSq_osZ7a0PRNKvUA/viewform?usp=sf_link>; Acesso em: 07 abr. 2018.


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.