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);
}
}
Tags:
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?
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por