Bom dia Pessoal, estou precisando de uma ajuda (Mais um projeto de semaforo rs)

Bom, estou tentando fazer um projeto de um controle de um cruzamento com dois semáforos de veiculos (3 leds cada) e 2 de pedestre(2 leds cada)

Como existem várias ideias eu acabei mesclando algumas e adicionando algumas, o diferencial desse semáforo  são os sinalizadores azuis para deficientes 1 em cada semáforo de veiculo.

A ideia eu peguei de um tópico daqui:

http://labdegaragem.com/forum/topics/sem-foro-inteligente-arduino?c...

aos trancos e barrancos consegui fazer do meu modo ( sou iniciante no arduino ou programação em geral)

O problema foi quando tentei adicionar um sensor( na verdade um botão que simula um sensor) que fará a contagem de veículos em cada sinal e adicionará maior tempo ao sinal verde da rua com maior fluxo ( nada complicado, só a contagem, a que tiver mais que 9 veiculos e maior quantidade que a rua oposta recebe mais tempo no sinal verde) 

Por nada consigo fazer isso, tentei diversas formas...

Eu tentei não usar o comando "delay" nos ciclos do semáforo, mas admito que não entendi muito bem a lógica usando o "millis" e intervalo ( a pesar de eu ter usado um pouco)

enfim se alguém puder me ajudar, agradeço

meu sketch:

pastebin

OBS: não cheguei a adicionar o Sensor 2, porque não consegui fazer o primeiro funcionar

OBS²: Estou utilizando o Arduino Mega 2560

Exibições: 297

Responder esta

Respostas a este tópico

Boa tarde DSB, 

De mais informações sobre seu projeto.

Por exemplo qual deve ser a sequencia de acendimento dos LEDs, qual arduino está usando, etc etc.

analisei seu código e vi que bastante coisa pode ser melhorada.

O que senti muita falta foi de comentários nas linhas de código.

Esta é uma prática (comentar linhas) muito salutar e no futuro ajuda a você que escreveu o código  lembrar 

pra que escreveu aquela linha e pra quem vai te ajudar, o que vc pensava qdo escreveu a linha.

Agora em termos de funcionamento, acho que vc pode melhorar muita coisa.

Por exemplo:

Não precisa de port independente para os LEDs de pedestres, já que eles são sincronizados com os de carros. 

Não precisa de port para os LEDs de um lado e o outro da rua, pois eles também são sincronizados.

Só o amarelo precisa de um port para cada um.

Não entendi bem o uso do LED azul.

RV

A sequencia que vi do seu projeto é assim:

1

    Carros             Lado 1           Lado 2       Pedestres 1       Pedestres 2  

   Vermelho       Apagado          Aceso          Apagado <--<     Apagado     <--< igual vermelho 1            

   Amarelo         Apagado          Apagado                                                          

    Verde            Aceso              Apagado      Aceso        <--<      Aceso       <--<  igual vermelho 2

2

delay

  Carros             Lado 1           Lado 2       Pedestres 1       Pedestres 2  

   Vermelho       Apagado          Aceso          Apagado    <--<   Apagado         <--< igual vermelho 1    

   Amarelo        Aceso               Apagado     

    Verde            Apagado          Apagado     Aceso      <--<       Aceso           <--< igual vermelho 2

3

delay

  Carros             Lado 1           Lado 2       Pedestres 1       Pedestres 2  

   Vermelho      Aceso                Apagado    Aceso      <--<    Aceso               <--< igual vermelho 1   

   Amarelo         Apagado           Apagado     

    Verde            Apagado          Aceso          Apagado    <--<   Apagado         <--< igual vermelho 2

4

delay

  Carros             Lado 1           Lado 2       Pedestres 1       Pedestres 2  

   Vermelho      Aceso                Apagado    Aceso  <--<       Aceso             <--< igual vermelho 1   

   Amarelo         Apagado          Aceso         

    Verde            Apagado          Apagado    Apagado  <--<  Apagado       <--< igual vermelho 2

5

delay

  Carros             Lado 1           Lado 2       Pedestres 1       Pedestres 2  

   Vermelho      Apagado            Aceso          Apagado  <--< Apagado       <--< igual vermelho 1    

   Amarelo        Apagado            Apagado   

    Verde            Aceso                Apagado      Aceso  <--<   Aceso           <--< igual vermelho 2

   RV

Bom, vamos lá.

Primeiramente, muito obrigado por me responder.

 

1- O funcionamento básico deve ser idêntico a um semáforo convencional, assim ele possui os três sinalizadores, verde, amarelo e vermelho, os sinalizadores dos pedestres; verde e vermelho. Estes sinalizadores possuem um tempo pré-determinado para que os Leds se apaguem e acendam.

 

2- O led azul é para quando o botão que fica junto ao semáforo for acionado

A ideia é que luz azul sirva para que os motoristas saibam que que alguém com necessidades especiais irá atravessar, então teoricamente ele irá ficar junto aos 3 sinalizadores padrões para veículos.

3- Quando o botão for pressionado o led azul só acenderá junto ao led vermelho, ou seja, quando o sinal estiver fechado para os veículos.

Também serão acrescidos alguns segundos extras para travessia do pedestre com deficiência.

Como serão 2 semáforos de veículos e 2 de pedestre, que estarão fazendo o controle de um cruzamento, então acho que a lógica deveria ser a seguinte:

 

1ª situação

Semáforo 1 Veículo – Verde     >>>>>>>>>>>>>> Semáforo 2 Veículo - Vermelho

Semáforo 1 Pedestre – Vermelho >>>>>>>>>>> Semáforo 2 Pedestre – Verde

 

2ª situação

Semáforo 1 Veiculo – Amarelo >>>>>>>>>>>> Semáforo 2 Veiculo – Vermelho

Semáforo 1 Pedestre – Vermelho >>>>>>>>>>> Semáforo 2 Pedestre – Verde

 

3ª situação

Semáforo 1 Veiculo – Vermelho >>>>>>>>>>>> Semáforo 2 Veiculo – Verde

Semáforo 1 Pedestre – verde >>>>>>>>>>> Semáforo 2 Pedestre – Vermelho

 

4ª situação

Semáforo 1 Veiculo – Vermelho >>>>>>>>>>>> Semáforo 2 Veiculo – Amarelo

Semáforo 1 Pedestre – Verde >>>>>>>>>>> Semáforo 2 Pedestre – Verde

 

Aí tem a situação após o botão pressionado que eu não tenho certeza se entram como situações a parte.

 

5ª situação

Semáforo 1 Veiculo – Vermelho + Azul >>>>>>>> Semáforo 2 Veiculo – Verde

Semáforo 1 Pedestre – Verde >>>>>>>>>>> Semáforo 2 Pedestre – Vermelho

 

6ª situação

Semáforo 1 Veiculo – Verde >>>>>>>>>>> Semáforo 2 Veiculo – Vermelho + Azul

Semáforo 1 Pedestre – Vermelho >>>>>>>>>>> Semáforo 2 Pedestre – Verde

 

A outra parte do projeto é o “sensor”, no caso vai ser um botão (push button) que simula a leitura do volume de trânsito.

São 2 botões, cada um simulando sensores que fariam a leitura e cada lado do cruzamento.

  • A minha ideia é que os “sensores” fariam a leitura por 15 segundos.
  • Ao final fariam a comparação de qual estaria com a maior contagem
  • Se o sensor com a maior contagem tiver o dobro de contagem em comparação ao outro, será acrescido 5 segundos ao seu intervalo do led verde
  • Também será acrescido 5s caso o outro sensor não tiver leitura dentro dos 15s

 

No código que postei não coloquei todas essas coisas porque não consegui, então tentei fazer o mais básico primeiro e depois ir modificando.

 

Entendo a observação que fez sobre o código que fiz, até porque fui improvisando muita coisa pra compensar o que eu não conseguia ou não sabia fazer... Então acabou virando uma salada.

 

Mas enfim, se puder me orientar eu agradeço muito.

Boa tarde DSB,

fiz aqui a montagem do seu projeto para entender o que vc já fez.

O funcionamento básico dos sinais estão funcionando corretamente.

Agora vamos às minhas dúvidas:

1: sobre o LED Azul:

    Ao apertar o botão ( e segurar apertado) vc quer que o tempo  do sinal verde de pedestre

    qdo abrir, fique x segundos maior do que o tempo normal. É isto?

2. Não entendi bem a questão da quantidade de veículos.

    Qdo o sinal está verde vão passando veículos, se a qtde for maior do que a contagem anterior do outro 

   sinal, acrescenta x segundos no verde. É isto?

RV

Boa noite 

1: exatamente isso... 

2:Correto também, é que da forma que escrevi fez parecer que os dois fariam a contagem ao mesmo tempo...

Faz a contagem, guarda o valor para ser comparado com o outro contador, após a comparação se um dos contadores tiver o dobro de contagem será acrescido a este 5s no sinal verde.

Basicamente é uma simulação controle de fluxo de transito, faz a leitura e acrescenta mais tempo ao sinal aberto(verde) para a via com maior volume de transito.

Bom dia DSB,

veja se este sketch te ajuda.

É um pouco complexo, mas qq dúvida pode perguntar.

Não usei delays, para poder atender as rotinas de especiais e contagem.

RV

semaforo_arduino_V04.ino

Boa noite.

Não entendi muito bem a lógica envolvendo as variáveis; "bool", "unsigned long intervalo" e "byte"

eu sei que a intervaloVD, por exemplo é o tempo para fazer o ciclo dos leds, mas não entendo a lógica de ativação usando "bool flag_1" por exemplo...  e a não entendi porque usou o byte... Se puder me ajudar a entender

tirando isso, achei bastante interessante a forma que montou, porque estou acostumado a ver codigos onde a maior parte da lógica está dentro do loop, e você criou varias funções e depois só chamou no loop

Boa tarde DSB,

para organizar um código é sem bom separar as atividades (funções).

Isto ajuda "visualizar" o código com mais facilidade,

e diminui o uso de repetições desnecessárias.

Sobre  bool (booleana) vou explicar aqui.

bool é um tipo de variável que só admite 2 situações  ou é verdadeira( True) ou falsa( false).

O uso de bool estabelece alguns bloqueios necessários à alguma lógica de fluxo de um programa

de uma forma simples.

Vou mostra no caso do seu programa:

Ao pressionar o botão 1 eu digo para uma variável bool, que dei o nome, "flag_1" que ela terá 

o valor de "true".

No fluxo do programa (void controleTempo() ) eu testo se "flag_1" = "true".

Se for, eu então defino que qdo acender o vermelho o azul tb tem que ser acendido.

E para criar esta situação e informar através da variável bool "espec_1 ".

Antes de acender o vermelho, vou verificar se o botão foi pressionado. Se "espec_1 " = "true",

se for, acende o azul tb.

QQ dúvida ainda, pode perguntar.

Sobre o uso de byte.  É uma forma reduzida de usar um só valor para todas situações.

Como um byte tem 8 bits, e eles podem ser ligados (bitSet() 1) e desligados(bitSet() 0) ou bitClear(),

individualmente, fica um código mais limpo.

Espero ter ajudado.

RV

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço