#include <LiquidCrystal.h>
// Configuração do display LCD (pinos RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
// Pinos do driver A4988
const int stepPin = 9;
const int dirPin = 8;
// Pino do botão
const int buttonPin = 10;
// Variáveis de controle
bool doorOpen = false; // Estado da porta
unsigned long doorTimer = 0; // Temporizador para fechamento automático
const unsigned long closeDelay = 10000; // 10 segundos
void setup() {
// Configuração do botão
pinMode(buttonPin, INPUT_PULLUP);
// Configuração do motor de passo
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
// Configuração do display LCD
lcd.begin(16, 2);
lcd.print("Porta Fechada");
}
void loop() {
// Verifica se o botão foi pressionado
if (digitalRead(buttonPin) == LOW && !doorOpen) {
openDoor(); // Abre a porta
}
// Verifica se a porta deve ser fechada automaticamente
if (doorOpen && millis() - doorTimer >= closeDelay) {
closeDoor(); // Fecha a porta
}
}
// Função para abrir a porta
void openDoor() {
doorOpen = true;
doorTimer = millis(); // Inicia o temporizador
// Atualiza o display LCD
lcd.clear();
lcd.print("Porta Aberta");
// Gira o motor para abrir a porta
digitalWrite(dirPin, HIGH); // Sentido horário
for (int i = 0; i < 200; i++) { // Ajuste o valor para controlar o ângulo
digitalWrite(stepPin, HIGH);
delayMicroseconds(800); // Controle de velocidade
digitalWrite(stepPin, LOW);
delayMicroseconds(800);
}
}
// Função para fechar a porta
void closeDoor() {
doorOpen = false;
// Atualiza o display LCD
lcd.clear();
lcd.print("Porta Fechada");
// Gira o motor para fechar a porta
digitalWrite(dirPin, LOW); // Sentido anti-horário
for (int i = 0; i < 200; i++) { // Ajuste o valor para controlar o ângulo
digitalWrite(stepPin, HIGH);
delayMicroseconds(800); // Controle de velocidade
digitalWrite(stepPin, LOW);
delayMicroseconds(800);
}
}