// Definição dos pinos para botões e sensores
const int pinBotaoTerreo = 8;
const int pinBotaoSegundo = 9;
const int pinBotaoTerceiro = 10;
const int pinBotaoQuarto = 11;
const int pinSensorTerreo = 4;
const int pinSensorSegundo = 5;
const int pinSensorTerceiro = 6;
const int pinSensorQuarto = 7;
// Definição dos pinos do módulo relé
const int pinRelayIN1 = 0;
const int pinRelayIN2 = 2;
const int pinRelayIN3 = 3;
const int pinRelayIN4 = 1;
// Variáveis para controlar o estado do elevador
int andarAtual = 0; // 0 = térreo, 1 = segundo, 2 = terceiro, 3 = quarto
void setup() {
// Configuração dos pinos como entrada/saída
pinMode(pinBotaoTerreo, INPUT_PULLUP);
pinMode(pinBotaoSegundo, INPUT_PULLUP);
pinMode(pinBotaoTerceiro, INPUT_PULLUP);
pinMode(pinBotaoQuarto, INPUT_PULLUP);
pinMode(pinSensorTerreo, INPUT_PULLUP);
pinMode(pinSensorSegundo, INPUT_PULLUP);
pinMode(pinSensorTerceiro, INPUT_PULLUP);
pinMode(pinSensorQuarto, INPUT_PULLUP);
pinMode(pinRelayIN1, OUTPUT);
pinMode(pinRelayIN2, OUTPUT);
pinMode(pinRelayIN3, OUTPUT);
pinMode(pinRelayIN4, OUTPUT);
}
void loop() {
// Verifica se algum botão foi pressionado
if (digitalRead(pinBotaoTerreo) == LOW) {
chamaElevador(0); // Chama o elevador para o térreo
} else if (digitalRead(pinBotaoSegundo) == LOW) {
chamaElevador(1); // Chama o elevador para o segundo andar
} else if (digitalRead(pinBotaoTerceiro) == LOW) {
chamaElevador(2); // Chama o elevador para o terceiro andar
} else if (digitalRead(pinBotaoQuarto) == LOW) {
chamaElevador(3); // Chama o elevador para o quarto andar
}
// Verifica se o elevador está em um andar específico
verificaSensores();
// Lógica do movimento do elevador
void chamaElevador(int destino) {
// Verifica se o destino é válido
if (destino < 0 || destino > 3 || destino == andarAtual) {
return;
}
// Decide a direção do movimento
if (destino > andarAtual) {
// Mover para cima
digitalWrite(pinRelayIN1, HIGH);
digitalWrite(pinRelayIN2, LOW);
digitalWrite(pinRelayIN3, LOW);
digitalWrite(pinRelayIN4, LOW);
} else {
// Mover para baixo
digitalWrite(pinRelayIN1, LOW);
digitalWrite(pinRelayIN2, LOW);
digitalWrite(pinRelayIN3, HIGH);
digitalWrite(pinRelayIN4, LOW);
}
// Aguarda até que o elevador chegue ao destino
while (digitalRead(getPinSensor(destino)) == HIGH) {
delay(10); // Pequeno delay para evitar leituras muito rápidas
}
// Para o motor do elevador
digitalWrite(pinRelayIN1, LOW);
digitalWrite(pinRelayIN2, LOW);
digitalWrite(pinRelayIN3, LOW);
digitalWrite(pinRelayIN4, LOW);
// Atualiza o andar atual
andarAtual = destino;
}
void verificaSensores() {
// Verifica cada sensor de andar e atualiza o andarAtual se necessário
for (int i = 0; i < 4; i++) {
if (digitalRead(getPinSensor(i)) == LOW) {
andarAtual = i;
break; // Sai do loop ao encontrar o andar atual
}
}
}
int getPinSensor(int andar) {
switch (andar) {
case 0: return pinSensorTerreo;
case 1: return pinSensorSegundo;
case 2: return pinSensorTerceiro;
case 3: return pinSensorQuarto;
default: return -1; // Valor inválido
}
}