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