Senhores muito bom dia!

Preciso de ajuda para o caso abaixo:

Tenho 03 sensores com 03 semáforos distintos. 

Preciso estabelecer uma prioridade na programação, sendo:

Condição inicial: Semáforo 01 acesso e semáforo 02 e 03 ficam vermelhos.

O semáforo 01 tem prioridade, logo se um carro chegar ao mesmo tempo no sensor 01, 02, e 03 sempre a prioridade é do sensor 01 enviar informação para o semáforo 01 ficar verde.

No caso, preciso que o semáforo 02 e 03 respeitem uma ordem sendo, Se chegar dois carros ao mesmo tempo no 02 e 03, primeiro 02, em seguida 03 e assim por diante.

Se chegar três carros no 02, um carro no 03 e um carro no 01 ao mesmo tempo, o programa deveria ser capaz de dar prioridade para o 01 (deixando o semáforo 01 verde) e ir fazendo uma fila de prioridade à media que os carros fossem chegando nos demais semáforos.

Alguém tem alguma ideia de como eu posso fazer isso?

Muito obrigado 

Exibições: 875

Responder esta

Respostas a este tópico

Obrigado pelas ajudas!

Estudarei os links para ver até onde consigo evoluir no assunto!

Abs

A dica do Teodoro Oliveira se encaixa muito bem nessa situação. O mapa de Karnaugh para o seu caso resultado nas seguintes equações.

SEMAFARO1 = SENSOR1

SEMAFARO2 = not(SENSOR1) * SENSOR2

SEMAFARO3 = not(SENSOR1) * not(SENSOR2) * SENSOR3

Utilizando IF`s o código seria algo assim

if(sensor1==HIGH){

     semafaro1=HIGH;

     semafaro2=LOW;

     semafaro3=LOW;

}else if(sensor2==HIGH){

     semafaro1=LOW;

     semafaro2=HIGH;

     semafaro3=LOW;

}else if(sensor3==HIGH){

     semafaro1=LOW;

     semafaro2=LOW;

     semafaro3=HIGH;

}else{

     semafaro1=LOW;

     semafaro2=LOW;

     semafaro3=LOW;

}

OBS.: isso representa a luz verde do semáforo, para implementar a luz vermelha basta utilizar o inverso da saída para luz verde.

Muito bom meu caro!

Assim que fechar todos os testes e acrescentar o restante do projeto todo, tentarei postar aqui!

Obrigado pelas ajudas!

Senhores, primeiramente muito obrigado pelas ajudas. Evolui muito no projeto com suas orientações.

Parei em uma outra parte que não consigo solução:

Bom,o esquema enviado acima pelo nosso amigo João Arhur funcionou bem.

Irei resumir o que acrescentei e posteriormente mostrar o problema:

Implementei um sensor LeituraA, LeituraB e LeituraC (que seria um sensor de validação que o carro se encontra na posição para o sistema saber que existe um carro ali).

Implementei um sensor S2 que seria portão aberto ou portão fechado (Este sensor lê o estado do portão)

Meu programa ficou mais ou menos assim:

Se LeituraA for positiva, e o portão estiver fechado (S2==HIGH) execute: SinalA abre, os outros ficam fechados... assim que LeituraA for para LOW todos os sinais ficam fechados (para evitar que algum carro atrás passe junto com o carro da frente).

Quando o portão abrir (S2==LOW) e fechar (S2==HIGH) habilita a próxima leitura e assim por diante.

Ou seja, cada leitura só poderia ser possível assim que o S2 abrir e depois que o S2 fechar (LOW e HIGH) para evitar que sinais fiquem abertos aleatoriamente antes que o portão abra por completo, passe o carro e depois o portão feche por completo. (neste intervalo todos os semaforos ficam vermelhos)

O problema é que seguindo a estrutura acima, (mesmo colocando um delay) quando o S2 == HIGH e dois carros chegam ao mesmo tempo em sensores diferentes (LeituraA e LeituraB por exemplo) o sistema abre A espera o tempo do delay e abre B mesmo eu forçando um digitalRead (S2).

Precisava de alguma estrutura para o programa fazer:

Se Leitura A e Leitura B forem HIGH, e S2 ESTIVER HIGH (FECHADO) > execute o A, (portão irá abrir (S2==LOW), ESPERE O PORTÃO FECHAR (este é o ponto que não consigo... S2==HIGH) e SOMENTE DEPOIS DO S2  == HIGH execute o B...Não consigo fazer a instrução B aguardar S2 abrir e fechar... o programa joga o sinal de A para alto, espera e já joga o sinal de B para alto uma vez que entendeu que as condições foram verdadeiras (S2 inicialmente era High e chegou dois carros ao mesmo tempo)

Bom dia!

No desenvolvimento do programa eu coloquei alguns if's e alguns for'.

Para simplificar ou colocar de uma maneira genérica abaixo para validar se estou fazendo algo de errado:

if (condição){

(execute xxx)

//acontece que eu coloquei alguns for's abaixo para irem executados em sequencia.

for (condiçãoA){

(execute comandoA)

}

for (CondiçãoB){

(execute comandoB)

}

}

//Acontece que está me dando o erro 

exit status 1
expected ';' before ')' token

Não entendi uma vez que o comando for eu utilizo a estrutura:

"for (condição){

(executa)

}

Abaixo segue parte do programa para entender melhor: Podem me ajudar?

 ...

if (LeituraA1 == LOW && LeituraA2 == HIGH && LeituraA3 == HIGH) {
for (leituraA3==HIGH){
digitalWrite (SemaforoVM_A1, HIGH);
digitalWrite (SemaforoVD_A1, LOW);
digitalWrite (SemaforoVM_A2, HIGH);
digitalWrite (SemaforoVD_A2, LOW);
digitalWrite (SemaforoVM_A3, LOW);
digitalWrite (SemaforoVD_A3, HIGH);
delay (1000);}
//IMPLEMENTAR POSTERIORMENTE: Mandar comando de abertura do portão, simulando soltando a tecla S1 (sensor abre)
// Sem S1 pressionado o programa deve levar ao Else final, deixando todos os sinais vermelhos
//Quando fechar S1 (fechar portão), as condições If devem ser verificadas novamente
for (S2 == LOW){
digitalWrite (SemaforoVD_A1, LOW);
digitalWrite (SemaforoVD_A2, LOW);
digitalWrite (SemaforoVD_A3, LOW);
digitalWrite (SemaforoVM_A1, HIGH);
digitalWrite (SemaforoVM_A2, HIGH);
digitalWrite (SemaforoVM_A3, HIGH);
// IMPLEMENTAR POSTERIORMENTE:LER INFORMAÇÃO DO SENSOR S1
// ENVIAR COMANDO PARA FECHAR PORTÃO

}
for (LeituraA2==HIGH){
digitalWrite (SemaforoVD_A1, LOW);
digitalWrite (SemaforoVD_A2, HIGH);
digitalWrite (SemaforoVD_A3, LOW);
digitalWrite (SemaforoVM_A1, HIGH);
digitalWrite (SemaforoVM_A2, LOW);
digitalWrite (SemaforoVM_A3, HIGH);

}
// IMPLEMENTAR POSTERIORMENTE:Manda comando de abertura do portão, simulando soltando a tecla S1 (sensor abre)
// Sem S1 pressionado o programa deve levar ao Else final, deixando todos os sinais vermelhos
//Quando fechar S1 (fechar portão), as condições If devem ser verificadas novamente

for (S2 == LOW)
{
digitalWrite (SemaforoVD_A1, LOW);
digitalWrite (SemaforoVD_A2, LOW);
digitalWrite (SemaforoVD_A3, LOW);
digitalWrite (SemaforoVM_A1, HIGH);
digitalWrite (SemaforoVM_A2, HIGH);
digitalWrite (SemaforoVM_A3, HIGH);

}
//IMPLEMENTAR POSTERIORMENTE: LER INFORMAÇÃO DO SENSOR S1
// ENVIAR COMANDO PARA FECHAR PORTÃO
}

HTESL, bom dia.
Sugestão. Não cole code na área de texto.
Remova o code postado e anexe um arquivo.
Depois, se estiver usando arduino, verifique como é o uso correto do "for".

https://www.arduino.cc/en/reference/for
Rui

Obrigado pela ajuda e sugestão sobre anexar o código!!!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço