#include <DHT.h> //librerias del sensor DHT11
#include <ESP32Servo.h>// para arduino nano #include <Servo.h>
#define DHTPIN 15
#define DHTTYPE DHT22 //cambiar a DHT11
// Programacion para el sensor
DHT sensordht(DHTPIN, DHTTYPE);
//programacion del servoMotor
Servo miServo; // Crea una instancia del servo motor con el nombre miServo
int pindelservo = 18;
int posicion = 90;
//programacion del bombillo
int bombillo = 2;
bool parpadeo = false;
// Programacion para los ventiladores
int IN1 = 12; // PWM
int IN2 = 13; // PWM
int modu1 = 21; //VENTILADORE DERECHO
int modu2 = 23; //VENTILADORE DERECHO
int mder = 25; // VENTILADORE IZQUIERDO
int mder2 = 33; // VENTILADORE IZQUIERDO
// temporizado para el sensor dht
unsigned long tiempoDHT = 2000;
unsigned long tiempoAnteriorDHT = 0;
unsigned long tiempoBombi = 150;
unsigned long tiempoAnteriorBombi = 0;
// temporizador de activacion del servo
unsigned long tiempoAnterior = 0;
const unsigned long intervaloActivacion = 10 * 1000; // 8 * 60 * 60 * 1000; para que se active cada 8 horas
const unsigned long duracionActivacion = 10 * 1000; // Duración de la activación por 10 minutos
bool activado = false;
//temporizador de movimiento del servo
unsigned long movimiento = 0;
unsigned long tiempoMovimiento = 20; //movimiento en milisegundos
bool subiendo = true; // este valor booleano establece la direccion del servo
void setup() {
Serial.begin(9600);
sensordht.begin();
Serial.println ("Leyendo el sensor DHT11");
miServo.attach(pindelservo, 500, 2500);//se define el pin del microcontrolador
pinMode(bombillo, OUTPUT); // control bombillo
//control de los ventiladores
pinMode(modu1, OUTPUT);
pinMode(modu2, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(mder, OUTPUT);
pinMode(mder2, OUTPUT);
pinMode(IN2, OUTPUT);
}
void loop() {
unsigned long tiempoActual = millis();// cambiar tiempoActual por temporizador
if (tiempoActual - tiempoAnteriorDHT >= tiempoDHT){
float humedad = sensordht.readHumidity();
float temperatura = sensordht.readTemperature ();
if (isnan(humedad) || isnan (temperatura)) {
Serial.println("No hay señal en el sensor DHT11 XD");
parpadeo = true;
tiempoAnteriorDHT = tiempoActual;// pq esta aqui y no afuera?
return;
}
// Solo se establece parpadeo a false si las lecturas son válidas
parpadeo = false;
Serial.print("humedad: ");
Serial.print(humedad);
Serial.print("%\t");
Serial.print("temperatura: ");
Serial.print(temperatura);
Serial.println("°C");
if (temperatura > 40 ){
digitalWrite(modu1, LOW);
digitalWrite(modu2, HIGH);
digitalWrite(mder, LOW); //asi funsiona
digitalWrite(mder2, HIGH); //asi funsiona, al contrario no
analogWrite(IN1, 255);
analogWrite(IN2, 255);
}
else if (temperatura > 37.5 ){ //if para el control del bombillo
digitalWrite(bombillo, LOW);
digitalWrite(modu1, LOW);
digitalWrite(modu2, HIGH);
digitalWrite(mder, LOW); //asi funsiona
digitalWrite(mder2, HIGH); //asi funsiona, al contrario no
analogWrite(IN1, 127);
analogWrite(IN2, 127);
}
else {
digitalWrite(bombillo, HIGH);
digitalWrite(modu1, LOW);
digitalWrite(modu2, LOW);
digitalWrite(mder, LOW);
digitalWrite(mder2, LOW);
analogWrite(IN1, 0);
analogWrite(IN2, 0);
}
tiempoAnteriorDHT = tiempoActual;
}
// como esto es otro tiempo, tengo que dacarlo del tiempo de lectura del dht
if (parpadeo && (tiempoActual - tiempoAnteriorBombi >= tiempoBombi)){
tiempoAnteriorBombi = tiempoActual; // Actualizar el tiempo previo al actual
static bool estadoBombillo = false;
estadoBombillo = !estadoBombillo;
digitalWrite(bombillo, estadoBombillo ? HIGH : LOW);
}
// Verificar si ha pasado el intervalo para activar el servo
if (tiempoActual - tiempoAnterior >= intervaloActivacion) {
if (!activado) { // el avtivado hace una negacion logica con el ! pq arriba esta desactivado con false
Serial.println("El servo se ha activado");
activado = true;
tiempoAnterior = tiempoActual;
movimiento = tiempoActual;// inicia el timepo de movimiento cuando se activa el servo, se activa el movimiento
}
}
// Si el servo está activado, ejecutar el movimiento y la lógica de tiempo
if (activado) {
if (tiempoActual - movimiento >= tiempoMovimiento) {
movimiento = tiempoActual; // Actualizar el tiempo de movimiento
// Mover el servo
if (subiendo){
posicion++;
if (posicion >= 135){
subiendo = false;
}
}
else {
posicion--;
if (posicion <= 45){
subiendo = true;
}
}
miServo.write(posicion);
}
// Verificar si ha pasado el tiempo de activación
if (tiempoActual - tiempoAnterior >= duracionActivacion) {
Serial.println("El servo se ha desactivado");
activado = false;
tiempoAnterior = tiempoActual;
miServo.write(90);//detener el servo en 90°
}
}
}