Olá pessoal! tudo bem? Encontrei o blog e estou publicando aqui afim de encontrar uma solução pro problema que esta dando no nosso projeto de TCC, espero que se possível consigam ajudar meu grupo..
O projeto:
Estamos fazendo um projeto de um semáforo inteligente para deficientes visuais. O semáforo funcionaria normalmente como conhecemos, mas no tempo de verde para pedestres ele notificaria atraves de um dispositivo sonoro, no caso o buzzer, que estamos utilizando. Usaremos também uma pulseira RFID para servir como a simulção de solicitação de travessia, ao invés do oush button o deficiente usaria a pulseira RFID para solicitar.
O problema:
Estamos com as duas programações praticamente finalizadas, a do semaforo e a do RFID e funcionando perfeitamente separadas... Todas funções e condicionais funcionam quando as funções são executadas individualmente, por exemplo: quando eu executo só a função do rfid ele faz tudo perfeitamente como programamos, mas quando tentamos executar a programação do rfid + semaforo elas nao funcionam... só funciona apenas o semaforo, e o rfid n faz a leitura da pulseira e não realiza as condicionais programadas.... O que voces acham que pode ser? poderiam nos ajudar, por favor?
Vou colar a programação logo abaixo pra analisarem
//Bibliotecas
#include <SPI.h>
#include <MFRC522.h>
// Variaveis
int azul = 8;
#define SS_PIN 53
#define RST_PIN 5
#define BUZZER 9
int VMC = 4; //vermelho carro
int AMC = 3; //amarelo carro
int VDC = 2; //verde carro
int VMP = 7; //vermelho pedestres
int VDP = 6; //verde pedestres
String IDtag = ""; //Variável que armazenará o ID da Tag
bool Permitido = false; //Variável que verifica a permissão
//Vetor responsável por armazenar os ID's das Tag's cadastradas
String TagsCadastradas[] = {"70 73 C7 A6",
"ID_2",
"ID_3"};
MFRC522 LeitorRFID(SS_PIN, RST_PIN); // Cria uma nova instância para o leitor e passa os pinos como parâmetro
void setup() {
pinMode(BUZZER, OUTPUT);
pinMode(VMC, OUTPUT);
pinMode(AMC, OUTPUT);
pinMode(VDC, OUTPUT);
pinMode(VDP, OUTPUT);
pinMode(VMP, OUTPUT);
pinMode(azul, OUTPUT);
Serial.begin(9600); // Inicializa a comunicação Serial
SPI.begin(); // Inicializa comunicacao SPI
LeitorRFID.PCD_Init(); //
}
void loop() {
semaforo();
leitura();
}
//Função Semaforos
void semaforo(){
digitalWrite(VDC,HIGH);
digitalWrite(VDP,LOW);
delay(5000);
digitalWrite(VDC,LOW);
digitalWrite(AMC,HIGH);
delay(2000);
digitalWrite(AMC,LOW);
digitalWrite(VMC,HIGH);
digitalWrite(VDP,HIGH);
digitalWrite(VMP,LOW);
delay(3000);
digitalWrite(VDP,LOW);
//Alerta para o pedestre!
for(int j=0; j<=3; j++)
{
digitalWrite(VMP,LOW);
delay(500);
digitalWrite(VMP,HIGH);
delay(500);
}
digitalWrite(VMC,LOW);
}
// função responsável por fazer a leitura das Tag's
void leitura(){
IDtag = ""; //Inicialmente IDtag deve estar vazia.
if ( !LeitorRFID.PICC_IsNewCardPresent() || !LeitorRFID.PICC_ReadCardSerial() ) {
delay(50);
return;
}
// Estrutura de repetição padrão para coleta dos valores das tags pela função uid
for (byte i = 0; i < LeitorRFID.uid.size; i++) {
IDtag.concat(String(LeitorRFID.uid.uidByte[i], HEX));
}
// Estrutura de repetição para comparação com as tags que permitimos no vetor
for (int i = 0; i < (sizeof(TagsCadastradas)/sizeof(String)); i++) {
if( IDtag.equalsIgnoreCase(TagsCadastradas[i]) ){
Permitido = true; //Libera tag
}
if(Permitido == true) {
for(int q = 0; q<5; q++){
digitalWrite(azul, HIGH);
delay(100);
digitalWrite(azul, LOW);
delay(100);
}
}
else{
Serial.println("Tag NAO Cadastrada: " + IDtag);
digitalWrite(azul, HIGH);
delay(500);
digitalWrite (azul, LOW);
delay(500); //Se não será chamada a função acessoNegado()
}
//aguarda 2 segundos para efetuar uma nova leitura
}
}
bem, é esse a programação, ela ainda necessita de alguns ajustes finais, e como falei, executando as duas individualmente, elas funcionam perfeitamente, mas quando colocamos ambas em uma mesma execução ele não funciona..., temos duas partes de 50% funcionando, mas não conseguimos os 100% ao juntarmos elas
agradeço a compreensão e espero que possam me ajudas, por favor...
Tags:
Olá.
Se entendi o que está acontecendo é que vc colocou delays enormes. Delay() é uma função que para o processamento. Enquanto ele acontece nada mais acontece... obviamente nem a leitura dos tags.
A solução seria mudar isso.
A ideia é fazer um loop unico, que atualize o semaforo e leia a tag (pode ser cada um em sua subfunção), mas nunca com delays() enormes.
Existem ao menos 3 caminhos simples, diga qual mais agrada:
1) use um contador e um delay pequeno. Acione o semaforo conforme o numero do contador.
Por ex, com delay de 100 = 0,1 s vc usa ifs para mudar o farol com 0, 300 (3s) e 400 (4segundos), depois disso zera novamente. Isso funciona, só não é ideal pq gera uma parada tb e gera uma forma imprecisa de contagem de tempo uma vez que o tempo fora do delay() não será computado.
2) use mills(). mills() é uma função que retorna o tempo decorrido desde que o programa começou a rodar. Com ele vc pode anotar o momento em que algo aconteceu (por ex quando vc mudou para verde) e usando a anotação desse momento pode saber quando deve mudar para vermelho.
Funciona super bem, eu (é pessoal) não gosto muito pq prefiro o metodo 3), mas veja mais sobre isso em:
https://labdegaragem.com/profiles/blogs/tutorial-sobre-timer-no-ard...
Tranquilamente esse (o do mills()) é o método mais amplamente usado.
3) use uma interrupção de tempo para gerar uma variável que incrementa a cada 0,1s de forma precisa (por exemplo) e usa esse numero no if() para trocar a cor do leds.
Como é um trabalho para apresentação (vai ser mais bem visto se for usado um método mais cientifico, imagino), sugiro o uso da opção 3.
Veja se dá pra encarar:
https://labdegaragem.com/profiles/blogs/tutorial-executando-fun-es-...
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por