Olá pessoal bom dia

estou fazendo um projeto de um semáforo bem simples para apresentar no final do meu curso, só que estou tendo algumas dificuldades com o compilador arduino, apesar de trabalhar com eletrônica à um bom tempo nunca mexi com programação anteriormente.

O escopo do projeto é o seguinte, são duas vias de mão unica onde tem a travessia de pedestres.

   Quando um pedestre pressionar a botoeira e enviar um sinal de nível alto em um pino que ja foi definido como INPUT, ele deve executar um grupo de instruções onde os semáforos das vias fecham e abre para os pedestres. 

Estou usando a função "if" para este grupo de instruções, mas ele ignora o "if" e executa o grupo dentro do loop. alguem poderia me ajudar neste caso?

PS.: estou usando o proteus para simulação.

Segue código

/*
SafeWalk versão 2.0
Sistema de controle de trafego que visa maior segurança de travessia para pedestres.

*/
// Luzes Semaforos vias
int red_1 = 2;
int yel_1 = 3;
int gre_1 = 4;

int red_2 = 7;
int yel_2 = 6;
int gre_2 = 5;

//Luzes semaforo pedestres
int redp_1 = 8;
int grep_1 = 9;

// Botoeiras
int but_1 = 10;
int BOT = digitalRead(but_1);


void setup() {

pinMode(red_1, OUTPUT);
pinMode(yel_1, OUTPUT);
pinMode(gre_1, OUTPUT);

pinMode(red_2, OUTPUT);
pinMode(yel_2, OUTPUT);
pinMode(gre_2, OUTPUT);

pinMode(redp_1, OUTPUT);
pinMode(grep_1, OUTPUT);

pinMode(but_1, INPUT);




}

void loop () {

if (BOT, HIGH); {

digitalWrite(red_1, HIGH);
digitalWrite(red_2, HIGH);
digitalWrite(yel_1, LOW);
digitalWrite(yel_2, LOW);
digitalWrite(gre_1, LOW);
digitalWrite(gre_2, LOW);
delay(500);

digitalWrite(redp_1, LOW);
digitalWrite(grep_1, HIGH);
delay(2000);

digitalWrite(redp_1, HIGH);
digitalWrite(grep_1, LOW);
delay(2000);


}
{
//semaforização


digitalWrite(red_2, HIGH);
digitalWrite(yel_1, LOW);
digitalWrite(red_1, HIGH);
delay(1500);
digitalWrite(red_2, LOW);
digitalWrite(gre_2, HIGH);
delay(5000);
digitalWrite(gre_2, LOW);
digitalWrite(yel_2, HIGH);
delay(1000);
digitalWrite(yel_2, LOW);
digitalWrite(red_2, HIGH);
delay(1000);
digitalWrite(red_1, LOW);
digitalWrite(gre_1, HIGH);
delay(5000);
digitalWrite(gre_1, LOW);
digitalWrite(yel_1, HIGH);
delay(1000);


}
}

Exibições: 3076

Anexos

Responder esta

Respostas a este tópico

Dentro do loop que vc deve colocar o digitalRead(but_1), só assim ele vai verificar se foi pressionado. E os delays serão um problema nesse caso. Melhor usar sem delay (http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay). Acho que é só.

Abraços!

www.efeitonerd.com.br

Felipe obrigado por sua resposta

mas para esperar o tempo de travessia não é correto usar o delay?

Cara, estou sem o compilador aqui.. então não sei se compila.. mas eu faria assim:

Se não entender pergunta ai.. é que estou no meio do serviço hehe..

Mas se não enteder ou precisar de mais ajuda fala ae! ;)

/*
SafeWalk versão 2.0
Sistema de controle de trafego que visa maior segurança de travessia para pedestres.

*/
// Luzes Semaforos vias
int red_1 = 2;
int yel_1 = 3;
int gre_1 = 4;

int red_2 = 7;
int yel_2 = 6;
int gre_2 = 5;

//Luzes semaforo pedestres
int redp_1 = 8;
int grep_1 = 9;

// Botoeiras
int but_1 = 10;


void setup() {

    pinMode(red_1, OUTPUT);
    pinMode(yel_1, OUTPUT);
    pinMode(gre_1, OUTPUT);

    pinMode(red_2, OUTPUT);
    pinMode(yel_2, OUTPUT);
    pinMode(gre_2, OUTPUT);

    pinMode(redp_1, OUTPUT);
    pinMode(grep_1, OUTPUT);

    pinMode(but_1, INPUT);
    
    //Inicialização do semaforo do pedestre + Semaforo do carro verde
    digitalWrite(redp_1, HIGH);
    digitalWrite(grep_1, LOW);
    digitalWrite(gre_1, HIGH);
    digitalWrite(gre_2, HIGH);
}

void loop () {

    if (digitalRead(but_1) == HIGH){
        permiteTravessia();
    } else{
        semaforoCarroVerde();
    }
}

void permiteTravessia(){

    //Amarelo
    digitalWrite(red_1, LOW);
    digitalWrite(red_2, LOW);
    digitalWrite(yel_1, HIGH);
    digitalWrite(yel_2, HIGH);
    digitalWrite(gre_1, LOW);
    digitalWrite(gre_2, LOW);
    delay(1000);
    
    //Vermelho + Passagem do pedestre
    digitalWrite(redp_1, LOW);
    digitalWrite(grep_1, HIGH);
    digitalWrite(red_1, HIGH);
    digitalWrite(red_2, HIGH);
    digitalWrite(yel_1, LOW);
    digitalWrite(yel_2, LOW);
    digitalWrite(gre_1, LOW);
    digitalWrite(gre_2, LOW);
    delay(2000);
}

void semaforoCarroVerde(){

    //Verde + Não permite passagem de pedestre
    digitalWrite(redp_1, HIGH);
    digitalWrite(grep_1, LOW);
    digitalWrite(red_1, LOW);
    digitalWrite(red_2, LOW);
    digitalWrite(yel_1, LOW);
    digitalWrite(yel_2, LOW);
    digitalWrite(gre_1, HIGH);
    digitalWrite(gre_2, HIGH);
}

e ae Igor blz?

seu código funcionou, tirando alguns acidentes de transito que você causou rsrsrs,
modifiquei algumas coisas e funcionou blz, mas surgiu outro problema, quando pressionada but_1 o sistema mantem a informação da entrada, mas entra na "void loop" e não sai mais, tem como resetar a função

 

if (digitalRead(but_1) == HIGH){
permiteTravessia();

 

após o primeiro ciclo de

 

void permiteTravessia(){

//Vermelho + Passagem do pedestre
digitalWrite(redp_1, LOW);
digitalWrite(grep_1, HIGH);
digitalWrite(red_1, HIGH);
digitalWrite(red_2, HIGH);
digitalWrite(yel_1, LOW);
digitalWrite(yel_2, LOW);
digitalWrite(gre_1, LOW);
digitalWrite(gre_2, LOW);
delay(2000);

 

 

segue cód da versão 3.0 =P

 

 

/*
SafeWalk versão 3.0
Sistema de controle de trafego que visa maior segurança de travessia para pedestres.

*/
// Luzes Semaforos vias
int red_1 = 2;
int yel_1 = 3;
int gre_1 = 4;

int red_2 = 7;
int yel_2 = 6;
int gre_2 = 5;

//Luzes semaforo pedestres
int redp_1 = 8;
int grep_1 = 9;

// Botoeiras
int but_1 = 10;

void setup() {

pinMode(red_1, OUTPUT);
pinMode(yel_1, OUTPUT);
pinMode(gre_1, OUTPUT);

pinMode(red_2, OUTPUT);
pinMode(yel_2, OUTPUT);
pinMode(gre_2, OUTPUT);

pinMode(redp_1, OUTPUT);
pinMode(grep_1, OUTPUT);

pinMode(but_1, INPUT);

//Inicialização do semaforo do pedestre + Semaforo do carro verde
digitalWrite(redp_1, HIGH);
digitalWrite(grep_1, LOW);

}

void loop () {

if (digitalRead(but_1) == HIGH){
permiteTravessia();
} else{
semaforoCarroVerde();
}
}

void permiteTravessia(){

//Vermelho + Passagem do pedestre
digitalWrite(redp_1, LOW);
digitalWrite(grep_1, HIGH);
digitalWrite(red_1, HIGH);
digitalWrite(red_2, HIGH);
digitalWrite(yel_1, LOW);
digitalWrite(yel_2, LOW);
digitalWrite(gre_1, LOW);
digitalWrite(gre_2, LOW);
delay(2000);
}

void semaforoCarroVerde(){

//Verde + Não permite passagem de pedestre
digitalWrite(red_2, HIGH);
digitalWrite(yel_1, LOW);
digitalWrite(red_1, HIGH);
delay(1500);
digitalWrite(red_2, LOW);
digitalWrite(gre_2, HIGH);
delay(5000);
digitalWrite(gre_2, LOW);
digitalWrite(yel_2, HIGH);
delay(1000);
digitalWrite(yel_2, LOW);
digitalWrite(red_2, HIGH);
delay(1000);
digitalWrite(red_1, LOW);
digitalWrite(gre_1, HIGH);
delay(5000);
digitalWrite(gre_1, LOW);
digitalWrite(yel_1, HIGH);
delay(1000);

}

Beleza! eai?

hahaha acontece...

Nem engenheiros de trânsito acertam na primeira!! haha

Entra no void loop() e não sai mais? Ainda bem!! É essa a idéia do Arduino, certo? hahaha

Bom, você quer dizer que mesmo com o botão não pressionado mostra como HIGH?

Qual tipo de botão vc ta usando? Tem como tirar uma foto? Fica melhor de entender!

Tira uma foto do circuito completo e uma do botão, por favor! (mostrando também como o botão está ligado!)

Vlw!

estou usando um "push button" simples, mas sempre que pressionado ele fica com status HIGH e não zera na input, (apenas no estado lógico, pois no fisico o botão ja voltou ao normal (NA)).

estou fazendo no simulador proteus, esta em anexo no primeiro tópico, mas vou colocar um print da tela pra vc ter uma melhor noção.

vlw pela força.

Cara, assim que eu chegar em casa (depois da facul.. lá pra umas 23h) eu faço um circuito simulado no meu arduino e tento entender melhor o que está acontecendo, beleza?

blz Igor, valeu, vou colocar seu nome nos créditos do trabalho.... rsrs

Fabricio, desculpa a demora!
Então, eu fiz uma pequena simulação aqui e percebi algo curioso!
Troque o botão por um curto no +5V. Tipo, o fio que liga a porta 10 no botão, desconecte do botão e de um toque onde tem +5V e veja qual será a reação do circuito.

de boa, Igor o problema é o seguinte, 

quando inicio a simulação o semáforo funciona belezinha, voce pode perceber que na entrada "but_1" não tem nenhum sinal

depois de pressionado ele faz a leitura do sinal e não sai mais deste estado como se a entrada "but_1" estivesse o tempo todo com nivel alto "HIGH"

depois da leitura de "but_1" o circuito fica estático e não sai mais disso.

Putz

Isso é realmente muito estranho..

Vou simular aqui mais uma vez.

Cara, foi mal a demora, eu estava em semana de prova na facul haha.

Vou simular novamente e já posto aqui!

de boa mano, fica sussa..

acho q teria que ser criado um laço no loop pra funcionar..

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço