#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Definição dos pinos
const int portaFreio = 2;
const int movimentoDescer = 1;
const int movimentoSubir = 13;
const int sensorAndar1 = A0;
const int sensorAndar2 = A0;
const int sensorAndar3 = A0;
const int sensorAndar4 = A0;
const int fimDeCursoAndar1 = 2;
const int fimDeCursoAndar2 = 3;
const int fimDeCursoAndar3 = 11;
const int fimDeCursoAndar4 = 12;
const int sensorPortaAberta = 13;
// Variáveis de controle
int andarSelecionado = 0;
bool portaFechada = true;
bool movimentoAtivo = false;
bool freioAcionado = false;
void setup() {
// Configuração dos pinos
pinMode(portaFreio, OUTPUT);
pinMode(movimentoDescer, OUTPUT);
pinMode(movimentoSubir, OUTPUT);
pinMode(fimDeCursoAndar1, INPUT);
pinMode(fimDeCursoAndar2, INPUT);
pinMode(fimDeCursoAndar3, INPUT);
pinMode(fimDeCursoAndar4, INPUT);
pinMode(sensorPortaAberta, INPUT);
// Inicialização do elevador no primeiro andar
andarSelecionado = 1;
}
void loop()
{
lcd.setCursor(0, 1);
lcd.print("Set: ");
lcd.print(andarSelecionado);
lcd.print(" Ligado");
// Verificar se a porta está fechada
if (!portaFechada) {
return;
}
// Verificar se há um andar selecionado
if (andarSelecionado == 0) {
return;
}
// Aguardar 2 segundos antes de iniciar o movimento
delay(2000);
// Verificar o sentido do movimento
if (andarSelecionado < 1) {
// Descer
digitalWrite(movimentoDescer, HIGH);
digitalWrite(movimentoSubir, LOW);
} else {
// Subir
digitalWrite(movimentoDescer, LOW);
digitalWrite(movimentoSubir, HIGH);
}
// Ativar o movimento
movimentoAtivo = true;
// Verificar se chegou ao andar de destino
while (movimentoAtivo) {
// Verificar o fim de curso correspondente ao andar de destino
bool fimDeCursoAcionado = false;
if (andarSelecionado == 1) {
fimDeCursoAcionado = digitalRead(fimDeCursoAndar1);
} else if (andarSelecionado == 2) {
fimDeCursoAcionado = digitalRead(fimDeCursoAndar2);
} else if (andarSelecionado == 3) {
fimDeCursoAcionado = digitalRead(fimDeCursoAndar3);
} else if (andarSelecionado == 4) {
fimDeCursoAcionado = digitalRead(fimDeCursoAndar4);
}
// Verificar se o fim de curso foi acionado
if (fimDeCursoAcionado) {
// Desligar o motor após 1 segundo
delay(1000);
digitalWrite(movimentoDescer, LOW);
digitalWrite(movimentoSubir, LOW);
movimentoAtivo = false;
// Acionar o freio
digitalWrite(portaFreio, HIGH);
freioAcionado = true;
}
// Verificar se a porta foi aberta durante o movimento
if (digitalRead(sensorPortaAberta)) {
// Parar o movimento instantaneamente
digitalWrite(movimentoDescer, LOW);
digitalWrite(movimentoSubir, LOW);
movimentoAtivo = false;
// Desativar o freio
digitalWrite(portaFreio, LOW);
freioAcionado = false;
}
}
// Aguardar 5 segundos no andar de destino
delay(5000);
// Verificar se a porta não foi aberta
if (!digitalRead(sensorPortaAberta)) {
// Seguir para o próximo andar
andarSelecionado++;
// Verificar se não há mais andares selecionados
if (andarSelecionado > 4) {
andarSelecionado = 1;
}
}
}