#define BOTON_PIN PC13
#define SERVO_PIN PA8
#define LCD_RS PB0
#define LCD_E PB1
#define LCD_D4 PB2
#define LCD_D5 PB3
#define LCD_D6 PB4
#define LCD_D7 PB5
bool puertaAbierta = false;
bool estadoBoton = HIGH;
void setup() {
pinMode(BOTON_PIN, INPUT_PULLUP);
pinMode(SERVO_PIN, OUTPUT);
pinMode(LCD_RS, OUTPUT);
pinMode(LCD_E, OUTPUT);
pinMode(LCD_D4, OUTPUT);
pinMode(LCD_D5, OUTPUT);
pinMode(LCD_D6, OUTPUT);
pinMode(LCD_D7, OUTPUT);
delay(50);
lcdCmd(0x33);
lcdCmd(0x32);
lcdCmd(0x28);
lcdCmd(0x0C);
lcdCmd(0x06);
lcdCmd(0x01);
delay(5);
lcdPrint("Puerta Cerrada");
moverServo(0);
}
void loop() {
bool lectura = digitalRead(BOTON_PIN);
if (lectura == LOW && estadoBoton == HIGH) {
delay(50);
if (digitalRead(BOTON_PIN) == LOW) {
puertaAbierta = !puertaAbierta;
if (puertaAbierta) {
lcdClear();
lcdPrint("Puerta Abierta");
moverServo(90);
} else {
lcdClear();
lcdPrint("Puerta Cerrada");
moverServo(0);
}
}
}
estadoBoton = lectura;
delay(10);
}
void moverServo(int angulo) {
angulo = constrain(angulo, 0, 180);
int pulso = map(angulo, 0, 180, 1000, 2000);
for(int i = 0; i < 15; i++) {
digitalWrite(SERVO_PIN, HIGH);
delayMicroseconds(pulso);
digitalWrite(SERVO_PIN, LOW);
delayMicroseconds(20000 - pulso);
}
}
void lcdCmd(uint8_t cmd) {
digitalWrite(LCD_RS, LOW);
digitalWrite(LCD_D4, cmd & 0x10);
digitalWrite(LCD_D5, cmd & 0x20);
digitalWrite(LCD_D6, cmd & 0x40);
digitalWrite(LCD_D7, cmd & 0x80);
pulsoE();
digitalWrite(LCD_D4, cmd & 0x01);
digitalWrite(LCD_D5, cmd & 0x02);
digitalWrite(LCD_D6, cmd & 0x04);
digitalWrite(LCD_D7, cmd & 0x08);
pulsoE();
delay(2);
}
void lcdPrint(const char* texto) {
digitalWrite(LCD_RS, HIGH);
while(*texto) {
uint8_t dato = *texto++;
digitalWrite(LCD_D4, dato & 0x10);
digitalWrite(LCD_D5, dato & 0x20);
digitalWrite(LCD_D6, dato & 0x40);
digitalWrite(LCD_D7, dato & 0x80);
pulsoE();
digitalWrite(LCD_D4, dato & 0x01);
digitalWrite(LCD_D5, dato & 0x02);
digitalWrite(LCD_D6, dato & 0x04);
digitalWrite(LCD_D7, dato & 0x08);
pulsoE();
}
delay(2);
}
void pulsoE() {
digitalWrite(LCD_E, HIGH);
delayMicroseconds(1);
digitalWrite(LCD_E, LOW);
delayMicroseconds(1);
}
void lcdClear() {
lcdCmd(0x01);
delay(2);
}