Ir ao conteúdo
  • Cadastre-se
Wesley Guntzel

RESOLVIDO Ativar comando somente se o botão for pressionado

Posts recomendados

Boa noite. 

Estou fazendo um projeto de um semáforo diferenciado, acessível para cegos. Ele funcionará de modo que quando todos os sinais de carros estiverem vermelhos, o sinal do pedestre abre e o pedestre passa.

image.thumb.png.690991534df9978dcbe0fa28d8d2c1e9.png

 

Caso o pedestre for cego, o mesmo deverá apertar um botão localizado em uma altura acessível do chão, ao lado do poste do semáforo e aguardar um aviso sonoro que é acionado quando o semáforo de pedestre ficar verde. Por enquanto estou usando um buzzer como emissor de som. 

Entretanto, não estou conseguindo adaptar ao meu projeto o pressionar do botão para ativar o som do buzzer, pois quando o sinal de pedestre abre, o buzzer toca toda vez, e não é isso que eu quero... somente se o botão for pressionado previamente. 

 

Eis o código Arduíno que estou usando:  

 

/*
Modos:
1- Normal
2- Amarelo Piscante
3- Manual 

Estados:
1- 1Vd - 2Vm
2- 1Am - 2Vm
3- 1Vm - 2Vd
4- 1Vm - 2Am

Velocidades:
1-Rápido
2-Normal
3-Lento
*/

#include <EEPROM.h>

#define pin1Vm 10
#define pin1Am 9
#define pin1Vd 7

#define pin2Vm 6
#define pin2Am 5
#define pin2Vd 4

#define pinpedver 11
#define pinpedvm 13

#define botao 3
#define buzzer 8  
#define pressionado 0
#define ligado 0

#define delayV1 5;
#define delayV1Am 1;
#define delayV2 20;
#define delayV2Am 6;
#define delayV3 80;
#define delayV3Am 12;

byte modo;
byte estado;
byte velocidade;

byte modoAnt;
byte estadoAnt;

byte startMode;
byte startVelo;
byte pisca;
int delayControl;
int cicloSemaforo;

String comando;
char serialBuff;


void setup() {
  
  pinMode(pin1Vm, OUTPUT); //Pino Vermelho  - Semaforo 1
  pinMode(pin1Am, OUTPUT); //Pino Amarelo   - Semaforo 1
  pinMode(pin1Vd, OUTPUT); //Pino Verde     - Semaforo 1

  pinMode(pin2Vm, OUTPUT); //Pino Vermelho - Semaforo 2
  pinMode(pin2Am, OUTPUT); //Pino Amarelo  - Semaforo 2
  pinMode(pin2Vd, OUTPUT); //Pino Verde    - Semaforo 2

  pinMode(pinpedver, OUTPUT); //Pino Verde    - Semaforo pedestre
  pinMode(pinpedvm, OUTPUT); //Pino Vermelho    - Semaforo pedestre
  
  pinMode(buzzer, OUTPUT); //Buzzer
  pinMode(pressionado, OUTPUT); //botão pressionado
  pinMode(botao, OUTPUT); //botão pressionado

  //Lê modo de inicio e grava o próximo modo de inicio na EEPROM
  startMode = EEPROM.read(0);
  if (startMode == 0){
     EEPROM.write(0, 1);
  } else { 
     EEPROM.write(0, 0);
  }

  //Lê modo de inicio e grava o próximo modo de inicio na EEPROM
  startVelo = EEPROM.read(1);
  if ((startVelo < 1) || (startVelo > 3)) { 
     startVelo = 2; //Velocidade Inicial = Normal
     EEPROM.write(1, 2);
  } 

  //Inicia as variaveis
  modo   = startMode + 1;
  estado = 1; 
  velocidade = startVelo; 
  pisca  = 0;
  delayControl = 0;
  cicloSemaforo = 0;

  modoAnt = 99; //Força a primeira execução
  estadoAnt = 99; //Força a primeira execução

  comando = "";
  
  Serial.begin(9600);
}

void loop() {
  
  if (delayControl < 49) {  //Executa 49 ciclos sem atividade, porém recebendo comandos. As atividades são executadas apenas no ciclo 50.
    
    while (Serial.available() > 0) {
       serialBuff = Serial.read();
       comando = comando + serialBuff;
    }

    if (comando != "") {

       if ((comando.substring(0,1) == "V") || (comando.substring(0,1) == "v")) {  //Velocidade
           if (comando.substring(1,2) == "1") { velocidade = 1; }  //Rápido
           if (comando.substring(1,2) == "2") { velocidade = 2; }  //Normal
           if (comando.substring(1,2) == "3") { velocidade = 3; }  //Lento            
           cicloSemaforo = 0;
           EEPROM.write(1, velocidade);
        }
        
        if ((comando.substring(0,1) == "M") || (comando.substring(0,1) == "m")) {  //Modo
           if (comando.substring(1,2) == "1") { modo = 1; }  //Normal
           if (comando.substring(1,2) == "2") { modo = 2; }  //Amarelo Piscante
           if (comando.substring(1,2) == "3") { modo = 3; }  //Manual  

           cicloSemaforo = 0;
           delayControl = 50;
           estadoAnt = 99; //Força a execução
        }

        if (comando.substring(0,1) == "*") {  //Muda o estado do semáforo
           estado++;
           if (estado > 6) { estado = 1; }        

           delayControl = 50; //Força a execução imediata
        }

        comando = "";
    }

    delayControl++;
  } else {

    if ((modo == 1) || (modo == 3)) { //Modo Automático ou Manual

        if (modo != modoAnt) { //Inicia o estado para quando o modo for alterado para normal (também é executado quando iniciado)
           estado = 1;
           cicloSemaforo = 0;
        } 

        if (cicloSemaforo > 0) { //Conta os ciclos para mudar de fase
           cicloSemaforo--;
        } else { 

           if (modo == modoAnt) { //Inicia o estado para quando o modo for alterado para normal (também é executado quando iniciado)
              if (modo == 1) { //Se for modo Automático
                 estado++;
                 if (estado > 6) { estado = 1; }          
              }   
           }
          
           //Atualiza o tempo do ciclo
           if ((estado == 1) || (estado == 3)) {
               switch (velocidade) {
                  case 1: //Rápido
                       cicloSemaforo = delayV1;   
                       break;
                  case 2: //Normal
                       cicloSemaforo = delayV2; 
                       break;
                  default: //Lento
                       cicloSemaforo = delayV3;
                       break;
               }
            
           } else {
               switch (velocidade) {
                  case 1: //Rápido
                       cicloSemaforo = delayV1Am;   
                       break;
                  case 2: //Normal
                       cicloSemaforo = delayV2Am; 
                       break;
                  default: //Lento
                       cicloSemaforo = delayV3Am;
                       break;
               }   
           }
        }

        //Processa o Estado
        if (estado != estadoAnt) {
            switch (estado) {
               case 1: //1Vd - 2Vm // Primeira Mudança - 1: verde, 2: vermelho
                    digitalWrite(pin1Vm, LOW);
                    digitalWrite(pin1Am, LOW);
                    digitalWrite(pin2Vd, LOW);
                    digitalWrite(pin2Am, LOW);
                     
                  
                    digitalWrite(pin1Vd, HIGH);                 
                    digitalWrite(pin2Vm, HIGH);  
                     digitalWrite(pinpedvm, HIGH);
                    break;
               case 2: //1Am - 2Vm // Segundo sinal, 1: amarelo, 2:vermelho
                    digitalWrite(pin1Vm, LOW);
                    digitalWrite(pin1Vd, LOW);
                    digitalWrite(pin2Vd, LOW);
                    digitalWrite(pin2Am, LOW);
      
                    digitalWrite(pin1Am, HIGH);                 
                    digitalWrite(pin2Vm, HIGH);     
                    digitalWrite(pinpedvm, HIGH);            
                    break;
               case 3: //1Vm - 2Vd// Terceiro sinal, 1: vermelho, 2:verde
                    digitalWrite(pin1Vd, LOW);
                    digitalWrite(pin1Am, LOW);
                    digitalWrite(pin2Am, LOW);
                    digitalWrite(pin2Vm, LOW);
      
                    digitalWrite(pin1Vm, HIGH);                 
                    digitalWrite(pin2Vd, HIGH);   
                    digitalWrite(pinpedvm, HIGH);              
                    break;
               case 4: //1Vm - 2Am// Quarto sinal, 1: vermelho, 2: amarelo
                    digitalWrite(pin1Vd, LOW);
                    digitalWrite(pin1Am, LOW);
                    digitalWrite(pin2Vd, LOW);
                    digitalWrite(pin2Vm, LOW);
      
                    digitalWrite(pin1Vm, HIGH);                 
                    digitalWrite(pin2Am, HIGH);  
                    digitalWrite(pinpedvm, HIGH);               
                    break;
                    
                case 5: //1Vm - 2Vm // Quinto sinal, 1: vermelho, 2: vermelho, semáforo pedestre verde e buzina ligada
                 digitalWrite(pin1Vd, LOW);
                    digitalWrite(pin1Am, LOW);
                    digitalWrite(pin2Vd, LOW);
                    digitalWrite(pin2Vm, HIGH);
      
                    digitalWrite(pin1Vm, HIGH);                 
                    digitalWrite(pin2Am, LOW);  
                    digitalWrite(pinpedvm, LOW);  
                    digitalWrite(pinpedver, HIGH); 
               tone(buzzer, 440, 300); // play tone 57 (A4 = 440 Hz)
  digitalWrite(11, LOW);
  delay(1000); // Wait for 1000 millisecond(s
    tone(buzzer, 494, 300); // play tone 59 (B4 = 494 Hz)
  digitalWrite(11, LOW);
  delay(buzzer); // Wait for 1000 millisecond(s
    tone(8, 523, 300); // play tone 60 (C5 = 523 Hz)

                    break;

                 case 6: //1Vm - 2Vm // Quinto sinal, 1: amarelo, 2: vermelho, semáforo pedestre vermelho e buzzer tocando
                 digitalWrite(pin1Vd, LOW);
                    digitalWrite(pin1Am, HIGH);
                    digitalWrite(pin2Vd, LOW);
                    digitalWrite(pin2Vm, HIGH);
      
                    digitalWrite(pin1Vm, LOW);                 
                    digitalWrite(pin2Am, LOW);  
                    digitalWrite(pinpedvm, HIGH);  
                    digitalWrite(pinpedver, LOW);          
                    break;
                    
            }
  
            estadoAnt = estado;
        }      
    }


    if (modo == 2) { //Modo Piscante
  
       digitalWrite(pin1Vm, LOW);
       digitalWrite(pin1Vd, LOW);
       digitalWrite(pin2Vm, LOW);
       digitalWrite(pin2Vd, LOW);

       if (pisca == 0) {
          digitalWrite(pin1Am, LOW);
          digitalWrite(pin2Am, LOW);
          pisca = 1;
       } else {
          digitalWrite(pin1Am, HIGH);
          digitalWrite(pin2Am, HIGH);
          pisca = 0;        
       }
        
    }     

    delayControl = 0;
    modoAnt = modo;    
  }

  delay(10);
}

 

 

Alguém pode me auxiliar a adaptar ao botão?

Preciso para um projeto escolar

É muito importante pra mim

Fico grato. 

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 horas atrás, Wesley Guntzel disse:

para um projeto escolar

não (me) motiva muito

10 horas atrás, Wesley Guntzel disse:

muito importante pra mim

.. quase...

 

10 horas atrás, Wesley Guntzel disse:

acessível para cegos

ok.. melhorou um  pouco

 

Obs: não vi seu programa. Só li isso...

10 horas atrás, Wesley Guntzel disse:

um botão localizado em uma altura acessível do chão, ao lado do poste do semáforo e aguardar um aviso sonoro que é acionado quando o semáforo de pedestre ficar verde

Portanto...

 

Faça um fluxograma ou imagine um pseudo código algo como...

boolean flag_botao;
if (botao) flag_botao=on; \\o macete é o sistema armazenar a informação que alguém apertou o botao
if (sinal_verde && flag_botao) aviso_sonoro=on;
if (sinal_amarelo || sinal_vermelho || !sinal_verde) aviso_sonoro=off;

O desafio é achar o momento e maneira certos pra zerar o flag_botao. Ele é seu...

Dica: aproveitando a transição de sinais

 

abç

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado @Isadora Ferraz. Porém ainda não encontrei um complemento de código correto para meu caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!