#include <DHT.h>
// -------------------------
// SENSOR DHT11
// -------------------------
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// -------------------------
// FINALES DE CARRERA
// -------------------------
#define FINAL_CERRADO 3
#define FINAL_ABIERTO 4
// -------------------------
// DRIVER L298N
// -------------------------
#define ENA 5
#define IN1 7
#define IN2 8
// Velocidad del motor
// 0 = detenido
// 255 = velocidad máxima
int velocidadMotor = 200;
// Temperaturas
float temperaturaAbrir = 30.0;
float temperaturaCerrar = 28.0;
void setup() {
Serial.begin(9600);
// Iniciar DHT11
dht.begin();
// Finales de carrera
pinMode(FINAL_CERRADO, INPUT_PULLUP);
pinMode(FINAL_ABIERTO, INPUT_PULLUP);
// Motor
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
detenerMotor();
Serial.println("Sistema de techo automatico iniciado");
}
void loop() {
// Leer temperatura
float temperatura = dht.readTemperature();
// Comprobar lectura
if (isnan(temperatura)) {
Serial.println("Error leyendo el DHT11");
detenerMotor();
delay(2000);
return;
}
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" C");
// Leer finales de carrera
bool techoAbierto = digitalRead(FINAL_ABIERTO) == LOW;
bool techoCerrado = digitalRead(FINAL_CERRADO) == LOW;
// =================================
// TEMPERATURA ALTA -> ABRIR TECHO
// =================================
if (temperatura >= temperaturaAbrir) {
if (!techoAbierto) {
Serial.println("Temperatura alta -> ABRIENDO techo");
abrirTecho();
} else {
Serial.println("Techo completamente ABIERTO");
detenerMotor();
}
}
// =================================
// TEMPERATURA BAJA -> CERRAR TECHO
// =================================
else if (temperatura <= temperaturaCerrar) {
if (!techoCerrado) {
Serial.println("Temperatura baja -> CERRANDO techo");
cerrarTecho();
} else {
Serial.println("Techo completamente CERRADO");
detenerMotor();
}
}
// =================================
// ENTRE 28 Y 30 °C
// =================================
else {
Serial.println("Temperatura normal -> techo sin movimiento");
detenerMotor();
}
delay(1000);
}
// =================================
// ABRIR TECHO
// =================================
void abrirTecho() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, velocidadMotor);
}
// =================================
// CERRAR TECHO
// =================================
void cerrarTecho() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, velocidadMotor);
}
// =================================
// DETENER MOTOR
// =================================
void detenerMotor() {
analogWrite(ENA, 0);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}