Arduino semáforo com cancela

Projeto Semáforo com Cancela

#include <Servo.h>
#define TRIG_PIN A5  // Pino Trigger do HC-SR04
#define ECHO_PIN A4   // Pino Echo do HC-SR04
#define SERVO_PIN 10 // Pino de Sinal do Servo (ATENCAO: Conflito com led_red)

Servo meuServo;      // Cria objeto servo para controlar o servo motor

// Pinos originais para os LEDs (CONFLITO COM SERVO E SENSOR NO DIAGRAMA)
int led_red = 13;    // ATENCAO: Será usado pelo Servo e pelo LED!
int led_yellow = 12; // ATENCAO: Será usado pelo Sensor no diagrama!
int led_green = 11;  // ATENCAO: Será usado pelo Sensor no diagrama!

boolean ligaPonto = false;

// Variaveis liga e desliga p/ display 7 segmentos
const int l = 1, d = 0; // Display 7 segmentos (catodo comum)
//const int l = 0, d = 1; // Display 7 segmentos (anodo comum)

byte displaySeteSeg[10][7] = {
   { l,l,l,d,d,l,l },  //DIGITO 9
   { l,l,l,l,l,l,l },  //DIGITO 8
   { l,l,l,d,d,d,d },  //DIGITO 7
   { l,d,l,l,l,l,l },  //DIGITO 6
   { l,d,l,l,d,l,l },  //DIGITO 5
   { d,l,l,d,d,l,l },  //DIGITO 4
   { l,l,l,l,d,d,l },  //DIGITO 3
   { l,l,d,l,l,d,l },  //DIGITO 2
   { d,l,l,d,d,d,d },  //DIGITO 1
   { l,l,l,l,l,l,d }   //DIGITO 0
};

  // Funcao para medir a distancia usando o HC-SR04
  long medirDistancia() {
  // Limpa o pino TRIG, garantindo que ele esteja em LOW
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  
  // Define o pino TRIG para HIGH por 10 microssegundos.
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  
  // Lê o tempo de duração do pulso no pino ECHO (em microssegundos)
  long duracao = pulseIn(ECHO_PIN, HIGH);
  
  // Converte o tempo para distância em cm (velocidade do som / 2)
  // Distância (cm) = Duração (µs) / 58
  long dist_cm = duracao / 58;
  return dist_cm;
}

void setup(){
  
  // Configuração dos Pinos do Sensor Ultrassônico
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  
  // Configuração do Servo Motor
  meuServo.attach(SERVO_PIN);
  meuServo.write(0); // Inicia o servo na posição zero
  
  // Configuração original dos LEDs como OUTPUT
  pinMode(led_red, OUTPUT);
  pinMode(led_yellow, OUTPUT);
  pinMode(led_green, OUTPUT);
  
  // Configuração original dos pinos do display (2 a 9)
  for (int i = 2; i < 10; i++)
  {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  // O restante do codigo original do display e LEDs e mantido
  // turn the green LED on and the other LEDs off
  digitalWrite(led_red, LOW);  
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, HIGH);
  
  for (byte contador = 0; contador < 10; contador++){ //faz a contagem de 0 a 9
    ligaSegmentosDisplay(contador); // chama a função para acionar o display 
    delay(900);  
    long distancia = medirDistancia(); // Le a distancia
  
    // LOGICA DO SERVO MOTOR (Adicionado)
    if (distancia < 100 && distancia > 0) {
      meuServo.write(90);
    } else {
      meuServo.write(0);
    }
  }
  
  // turn the yellow LED on and the other LEDs off
  digitalWrite(led_red, LOW);    
  digitalWrite(led_yellow, HIGH);
  digitalWrite(led_green, LOW);
  delay(2000);
  
    // turn the red LED on and the other LEDs off
  digitalWrite(led_red, HIGH);  
  digitalWrite(led_yellow, LOW);
  digitalWrite(led_green, LOW);
  for (byte contador = 3; contador < 10; contador++){ //faz a contagem de 0 a 9
    ligaSegmentosDisplay(contador); // chama a função para acionar o display 
    delay(900);   
    long distancia = medirDistancia(); // Le a distancia
  
    // LOGICA DO SERVO MOTOR (Adicionado)
    if (distancia < 100 && distancia > 0) {
      meuServo.write(90);
    } else {
      meuServo.write(0);
    }
 }  
  delay(900);    
}

void ligaSegmentosDisplay(byte digito){ //função para acionar o display com o digito correspondente
  byte pino = 2;
  for (byte contadorSegmentos = 0; contadorSegmentos < 7; ++contadorSegmentos){  
    digitalWrite(pino, displaySeteSeg[digito][contadorSegmentos]); //percorre o array e liga (l) e desliga (d) segmentos do display
    ++pino; //incrementa o valor do pino (vai de 2 a 8)
  }
}

https://www.tinkercad.com/things/g4LQdVe5ZBc-semaforo-temporizador-cancela-automatica

Publicar comentário