DOCUMENTAÇÃO SISTEMA DE INFORMAÇÃO
Por: lje_lezao • 15/11/2018 • Monografia • 4.788 Palavras (20 Páginas) • 196 Visualizações
CENTRO ESTADUAL DE EDUCAÇÃO TECNOLÓGICA PAULA SOUZA FACULDADE DE TECNOLOGIA DE TAQUARITINGA
ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
TÓPICOS ESPECIAIS EM INFORMÁTICA
SINAL TRÂNSITO INTELIGENTE
FELIPE BOTELHO RODRIGUES
LUCAS MICHELONI ANTEVERE
BRUNO VILELA
TAQUARITINGA
2016
ESCOPO
O ambiente é composto por duas vias: uma rua e uma avenida. Elas são perpendiculares e possuem mão única. Em seu cruzamento, há dois semáforos, um para cada via.
Cada semáforo possui tempos padrões distintos para adequar ao tráfego da via.
O tempo padrão do semáforo da avenida é de 30 segundos, sendo distribuídos em 26 segundos com acesso livre e 4 segundos em atenção.
O tempo padrão do semáforo da rua é de 20 segundos, sendo distribuídos em 16 segundos para acesso livre e 4 segundos em atenção.
Há fatores do ambiente que influenciam no tempo do semáforo: tŕafego, horários de pico e precipitação.
Os horários de picos são das 7:00 às 9:00 e 17:30 às 20:30. Nesses períodos há um acréscimo de 5 segundos no tempo de acesso livre da avenida.
Quando há precipitação, há um acréscimo de 5 segundos no tempo de acesso livre da avenida.
Em relação ao volume de tráfego, as vias possuem diferentes tempos e limites de carro.
Deve-se inserir um acréscimo de 5 segundos no tempo de acesso livre da avenida quando o volume de tráfego for superior a 40 veículos entre os sensores distribuídos na via, e 5 segundos no tempo de acesso livre da rua quando o volume de tráfego for superior a 25 veículos entre os sensores distribuídos na rua.
Ambas as vias possuem o limite de acréscimo de 10 segundos.
Variáveis de acréscimos de tempo no acesso livre das vias
Rua | Avenida | |
Horários de Pico | 7:00 às 9:00 e 17:30 às 20:30 | 7:00 às 9:00 e 17:30 às 20:30 |
Volume de Tráfego | maior que 25 | maior que 40 |
Precipitação | qualquer volume | qualquer volume |
Acréscimos de tempo no acesso livre das vias
Rua | Avenida | |
Horários de Pico | - | 5s |
Volume de Tráfego | 5s | 5s |
Precipitação | - | 5s |
Limite acréscimo | 10s | 10s |
OBJETIVO
Criar um sistema que gerencie os tempos dos semáforos em duas vias dados as condições variantes do ambiente: precipitação, volume de tráfego e horários de pico
JUSTIFICATIVA
O transito é um fator de muita variação nas cidades, sendo necessário um bom gerenciamento de tráfego urbano para garantir a fluidez no volume de carros.
O tráfego lento, além de causar irritação nos motoristas, pode acarretar em acidentes de trânsito, problemas na circulação de veículos de urgência (ambulâncias e viaturas policiais) e atrasos nos trabalhos e escolas.
O uso de semáforos inteligentes é uma forma de diminuir a lentidão das vias, gerenciando o fluxo de veículos baseados em variáveis do ambiente, como feriados, climas, horários de picos e outros fatores.
Considerando esses fatos, o Sinal de Trânsito Inteligente gerenciará os tempos dos semáforos a fim de diminuir a lentidão no trânsito e evitar os problemas citados.
CODIFICAÇÃO
O Sinal Inteligente de Trânsito foi desenvolvido utilizando a linguagem JavaScript.
Disponível em: https://goo.gl/rsrbQ0.
window.onload = function(){ var ambiente = new Ambiente(); }; /* Representa o ambiente e suas características onde as vias estão. */ function Ambiente(){ /* Tempo está chuvoso? */ this.chuva = true; /* Lista de horários de picos */ this.picos = []; /* Novo pico das 7:00h às 9:00h */ this.inserePico( new Date(2016, 01, 01, 7, 0, 0), new Date(2016, 01, 01, 9, 0, 0) ); /* Novo pica das 17:30h às 20:30h */ this.inserePico( new Date(2016, 01, 01, 17, 30, 0), new Date(2016, 01, 01, 20, 30, 0) ); /* Lista de semáforos. */ this.semaforos = []; /* Semáforo Rua: - 20 segundos tempo padrão; - 2 = inicia verde. - 25 carros limite de tráfego - FALSE não recebe influência do horário de pico - FALSE não recebe influência da chuva */ this.insereSemaforo("RUA", 20, 2, 25, false, false); /* Semáforo Avenida: - 30 segundos tempo padrão; - 3 = inicia vermelho. - 40 carros limite de tráfego - TRUE = recebe influência do horário de pico - TRUE = recebe influência da chuva */ this.insereSemaforo("AVE", 30, 3, 40, true, true);
/* Atualiza semáforos a cada 1 segundo. */ setInterval(this.atualiza.bind(this), 1000); } /* As ações do ambiente. */ Ambiente.prototype = { atualiza: function(){ /* Iteração nos semáforos existentes para realizar a atualização. */ for(var i = 0; i < this.semaforos.length; i++){ /* Atualiza o semáforo e verifica se já fechou (retorna false). */ if(!this.semaforos[i].atualizaTempo()){ /* Abre o outro semáforo. */ this.abrirOutro(this.semaforos[i]); return; } }
}, /* Abre o outro semáforo. */ abrirOutro: function(semaforo){ for(var i = 0; i < this.semaforos.length; i++){ if(this.semaforos[i].nome != semaforo.nome){ this.abrirSemaforo(this.semaforos[i]); return; } } }, /* Verifica se a hora atual está em algum horário de pico. */ estaEmHorarioDePico: function(){ for(var i = 0; i < this.picos.length; i++){ if(this.picos[i].estaEmPico(new Date())){ return true; } } return false; }, /* Insere um novo horário de pico. */ inserePico: function(inicio, fim){ this.picos.push( new HorarioPico(inicio, fim) ); }, /* Configura o semáforo como verde. */ abrirSemaforo: function(s){ s.setVerde(); s.abrir(this.chuva, this.estaEmHorarioDePico()); }, /* Insere um novo semáforo. */ insereSemaforo: function(nome, tempoPadrao, status, limiteTrafego, recebeHorario, recebeChuva){ var s = new Semaforo(nome, tempoPadrao, limiteTrafego, recebeHorario, recebeChuva); if(status == 1){ s.setAmarelo(); }else if(status == 2){ this.abrirSemaforo(s); } else{ s.setVermelho(); } this.semaforos.push(s); } }; /* Representa um semaforo. */ function Semaforo(nome, tempoPadrao, limiteTrafego, recebeHorario, recebeChuva){ this.nome = nome; /* Identifica se o semáforo está AMARELO (1), VERDE (2) ou VERMELHO (3) */ this.status = null; /* Tempo do sinal amarelo. */ this.tempoAmarelo = 4; /* Representa o tempo padrão no semáforo. */ this.tempoPadrao = tempoPadrao; /* Armazena o tempo para fechar o semáforo quando abre-se o mesmo. */ this.tempoParaFechar = null; /* Representa a quantidade de veículos na via. */ this.trafegoAtual = 0; /* Representa o limite de veículos na via para acrescentar o acréscimo. */ this.limiteTrafego = limiteTrafego; /* Diz se a via recebe acréscimo de tempo reference ao horário de pico. */ this.recebeHorario = recebeHorario; /* Diz se a via recebe acréscimo de tempo referente à chuva */ this.recebeChuva = recebeChuva; /* Armazena a informação se está chovendo no momento. */ this.estaChovendo = null; /* Armazena a informação se está em um horário de pico. */ this.estaHorarioPico = null; /* Representa o limite máximo dos acréscimos. */ this.limiteAcrescimo = 10; } /* Representa as ações de um semaforo. */ Semaforo.prototype = { estaAmarelo: function(){ return this.status == 1; }, estaVerde: function(){ return this.status == 2; }, estaVermelho: function(){ return this.status == 3; }, setAmarelo: function(){ this.status = 1; }, setVerde: function(){ this.status = 2; }, setVermelho: function(){ this.status = 3; }, /* Retorna o tempo que o sinal deve ficar VERDE com os ACRÉSCIMOS. */ getTempoVerde: function(){ var tempo = this.tempoPadrao - this.tempoAmarelo; var acrescimo = 0; if(this.estaComTrafegoAlto()){ this.write("TRAFEGO +5s | LIMITE CARROS: " + this.limiteTrafego); acrescimo += 5; }else{ this.write("TRAFEGO +0s | LIMITE CARROS:" + this.limiteTrafego); } if(this.estaChovendo && this.recebeChuva){ this.write("CHUVA +5s"); acrescimo += 5; } if(this.estaHorarioPico && this.recebeHorario){ this.write("HORARIO PICO: +5s"); acrescimo += 5; } if(acrescimo > this.limiteAcrescimo) acrescimo = this.limiteAcrescimo; var total = tempo + acrescimo; this.write("TEMPO " + tempo + "s | ACRESCIMO " + acrescimo + "s | TOTAL " + total + "s"); return total; }, /* Configura o sinal como VERDE. */ abrir: function(chuva, horarioPico){ this.estaChovendo = chuva; this.estaHorarioPico = horarioPico; if(!this.estaVerde()){ this.write("NAO PODE SER ABERTO."); return; } this.tempoParaFechar = this.getTempoVerde(); this.setVerde(); }, /* Atualiza o tempo do sinal. */ atualizaTempo: function(){ /* Se ele está vermelho, inserir tráfego na via. */ if(this.estaVermelho()){ this.inserirTrafego(); return true; } /* Se o tempo para fechar não acabou, liberar carros da via. */ if(this.tempoParaFechar > 0){ this.liberarCarro(); this.tempoParaFechar--; this.write("VERDE | TEMPO " + this.tempoParaFechar + "s "); return true; } /* Se o tempo para fechar acabou e está dentro do tempo do sinal AMARELO, liberar carro. */ if(this.tempoParaFechar <= 0 && this.tempoParaFechar > (this.tempoAmarelo * -1)){ this.liberarCarro(); this.tempoParaFechar--; this.setAmarelo(); this.write("AMARELO | TEMPO " + this.tempoParaFechar + "s "); return true; }
/* Se o tempo de VERDE e AMARELO acabou, fechar o semáforo. */ this.write("VERMELHO"); this.setVermelho(); return false; }, /* Libera carro da via. */ liberarCarro: function(){ if(this.trafegoAtual <= 0){ this.trafegoAtual = 0; return; } if(this.trafegoAtual % 2 == 0) this.trafegoAtual -= 1; else this.trafegoAtual -= 2; }, /* Insere carros na via. */ inserirTrafego: function(){ this.trafegoAtual += 1; }, /* Verifica se o limite de tráfego foi ultrapassado. */ estaComTrafegoAlto: function(){ return this.trafegoAtual > this.limiteTrafego; }, write: function(m){ var l = "SINAL " + this.nome + " | " + m + " | TRÁFEGO: " + this.trafegoAtual + " carros |"; console.debug(l); var log = document.getElementById("log"); log.innerHTML += " } }; /* Representa um horário de pico. */ function HorarioPico(inicio, fim){ /* Representa a hora de início do horário de pico. */ this.inicio = inicio; /* Representa a hora de fim do horário de pico. */ this.fim = fim; } /* Representa as ações de um horário de pico. */ HorarioPico.prototype = { /* Verifica se a hora passada está no horário de pico. */ estaEmPico: function(data){ this.inicio = this.zerarData(this.inicio); this.fim = this.zerarData(this.fim); data = this.zerarData(data); return this.inicio <= data && this.fim >= data; }, /* Desconsidera a data para verificação do horário. */ zerarData: function(data){ return new Date(2016, 0, 1, data.getHours(), data.getMinutes(), 0); } }; |
...