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

Cara, eu acho que entendi..

Pelo menos comigo, o erro que tava dando era com a leitura do botão.. ele tava louco.. haha

Faça esse teste:

/*
DigitalReadSerial
Reads a digital input on pin 2, prints the result to the serial monitor

This example code is in the public domain.
*/

// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 2;

// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// make the pushbutton's pin an input:
pinMode(pushButton, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
// read the input pin:
int buttonState = digitalRead(pushButton);
// print out the state of the button:
Serial.println(buttonState);
delay(1); // delay in between reads for stability
}

Veja se o valor fica oscilando sozinho entre 0 e 1.

Se sim, era o mesmo problema que aconteceu comigo..

Monte o circuito do botão como na imagem:

http://www.acroname.com/howto/button/button.html

Eu usei a primeira imagem!

Á proposito, eu fiz uma nova versão do software.

Eu não consigo testar pq eu nao tenho led suficiente haha

Testa ae!!

//Semaforos Via 1
int semaforoVerdeVia1 = 2;
int semaforoAmareloVia1 = 3;
int semaforoVermelhoVia1 = 4;

//Semaforos Via 2
int semaforoVerdeVia2 = 2;
int semaforoAmareloVia2 = 3;
int semaforoVermelhoVia2 = 4;

//Semaforos Pedestre
int semaforoVerdePedestre = 5;
int semaforoVermelhoPedestre = 6;

//Botão Semaforo
int botaoSemaforo = 7;

//Valor do botão
int valorLidoBotao = 0;

void setup() {

//Definições iniciais

//Semaforos Via 1
pinMode(semaforoVerdeVia1, OUTPUT);
pinMode(semaforoAmareloVia1, OUTPUT);
pinMode(semaforoVermelhoVia1, OUTPUT);

//Semaforos Via 2
pinMode(semaforoVerdeVia2, OUTPUT);
pinMode(semaforoAmareloVia2, OUTPUT);
pinMode(semaforoVermelhoVia2, OUTPUT);

//Semaforos Pedestre
pinMode(semaforoVerdePedestre, OUTPUT);
pinMode(semaforoVermelhoPedestre, OUTPUT);

//Botão Semaforo
pinMode(botaoSemaforo, INPUT);

iniciaStatusSemaforo();

//Serial
Serial.begin(9600);
}

void loop () {

valorLidoBotao = digitalRead(botaoSemaforo);

if(valorLidoBotao == 1){
botaPressionado();
}
}

void botaPressionado(){

//Amarela os semaforos e espera 1 segundo
semaforosAmarelos();
delay(1000);

//Vermelha os semaforos das vias e esverdeia o do pedestre
semaforosVermelhos();
semaforosPedestreVerde();
delay(5000);

semaforosPedestreVermelho();
semaforosVerdes();
}

void semaforosVerdes(){

//Semaforos Via 1
digitalWrite(semaforoVerdeVia1, HIGH);
digitalWrite(semaforoAmareloVia1, LOW);
digitalWrite(semaforoVermelhoVia1, LOW);

//Semaforos Via 2
digitalWrite(semaforoVerdeVia2, HIGH);
digitalWrite(semaforoAmareloVia2, LOW);
digitalWrite(semaforoVermelhoVia2, LOW);
}

void semaforosAmarelos(){

//Semaforos Via 1
digitalWrite(semaforoVerdeVia1, LOW);
digitalWrite(semaforoAmareloVia1, HIGH);
digitalWrite(semaforoVermelhoVia1, LOW);

//Semaforos Via 2
digitalWrite(semaforoVerdeVia2, LOW);
digitalWrite(semaforoAmareloVia2, HIGH);
digitalWrite(semaforoVermelhoVia2, LOW);
}

void semaforosVermelhos(){

//Semaforos Via 1
digitalWrite(semaforoVerdeVia1, LOW);
digitalWrite(semaforoAmareloVia1, LOW);
digitalWrite(semaforoVermelhoVia1, HIGH);

//Semaforos Via 2
digitalWrite(semaforoVerdeVia2, LOW);
digitalWrite(semaforoAmareloVia2, LOW);
digitalWrite(semaforoVermelhoVia2, HIGH);
}

void semaforosPedestreVerde(){

digitalWrite(semaforoVerdePedestre, HIGH);
digitalWrite(semaforoVermelhoPedestre, LOW);
}

void semaforosPedestreVermelho(){

digitalWrite(semaforoVerdePedestre, LOW);
digitalWrite(semaforoVermelhoPedestre, HIGH);
}

void iniciaStatusSemaforo(){

semaforosVerdes();
semaforosPedestreVermelho();
}

Não entendi o que esse video tem a ver com um semáforo.

Nesse programa o problema é o ";" a mais em:

if (BOT, HIGH); {    

Não é isso ?

Não sei se é, mas faz sentido!

se eu usar a função "tempo()" em vez de "delay()" terá uma leitura constante da função "digitalRead()"??

eu preciso implementar no "loop()" a leitura do botão mesmo que ele não tenha concluido as demais funções, assim incrementar o valor do botão e no fim do ciclo ele autorizar a travessia.

acabei de fazer o teste substituindo "delay()" por "tempo()" e excedeu a capacidade da CPU.

vc fez rodou o codigo que eu postei ontem?

sim, mas ele executou uma vez e parou

rodou esse exemplo também?

/*
DigitalReadSerial
Reads a digital input on pin 2, prints the result to the serial monitor

This example code is in the public domain.
*/

// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 2;

// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// make the pushbutton's pin an input:
pinMode(pushButton, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
// read the input pin:
int buttonState = digitalRead(pushButton);
// print out the state of the button:
Serial.println(buttonState);
delay(1); // delay in between reads for stability
}

o botão funcionou corretamente?

quando vc aperta fica 1 e quando nao aperta fica 0?

o problema do botão foi estabilizado com o resistor do primeiro exemplo do link anterior

alguem sabe como resolver?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço