Ativar comando somente se o botão for pressionado

1. Ativar comando somente se o botão for pressionado

Wesley
wesleyadryel

(usa Outra)

Enviado em 16/07/2019 - 22:48h


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.


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:


Código:
/*
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.


  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts