Este tópico contém respostas, possui 3 vozes e foi atualizado pela última vez por  Diogo Zimmermann 2 semanas .

Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #106088

    wesleyadryel
    Participante

    Olá!

    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:

     

     

     

     

    *
    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.</b></span>

    0
    #106132

    André
    Participante

    Olá,

    eu não sei programar nesta linguagem, mas se você atribuir um valor ao botão quando for pressionado e atribuir este mesmo valor como uma das condições  para soar o beep ele só ira bipar se esta condição quando o botão for pressionado.

    algo do tipo:

    se fosse em VB:

    variavel botaopressionado = 0

    if botton1.value = 1 then
    botaopressionado = 1
    mudacor
    end if

    mudarcor
    if semafaro = verde and botaopressionado = 1 then
    soabeep
    botaopressionado = 0
    end if

     

    0
    #144744

    Olá, wesleyadryel,

     

    Pelo que pude perceber no seu código, quando o pedestre pode atravessar, o buzzer já começa a tocar. Para evitar isso, você poderia fazer o seguinte para testar:

     

    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);

    if (pressionado == 0) {
    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)

    }

    if (pressionado == 1) {
    digitalWrite(11, LOW);
    delay(1000); // Wait for 1000 millisecond(s
    digitalWrite(11, LOW);
    delay(buzzer); // Wait for 1000 millisecond(s

    }

    break;

     

    No caso, você teria que adicionar alguma situação em que o usuário aperte o botão, ou seja, monitore o estado do botão para que, ao ser pressionado, troque o valor da variável pressionado, assim deve funcionar ao dar um if como descrito acima.

     

    Abraços!

    Diogo – Equipe FilipeFlop

    0
Visualizando 3 posts - 1 até 3 (de 3 do total)

Você deve fazer login para responder a este tópico.