//Proyecto para incubadora
//Incluyo las bibliotecas sensor de temperatura y humedad y del servo
#include <dht_nonblocking.h>
#include <Servo.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
//defino el tipo de sensor y su pin de control
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
//Incluyo la biblioteca de la pantalla LCD y los pines que utiliza
#include <LiquidCrystal.h>
int tempPin = 0;
// BS E D4 D5 D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// Declaro variables
int daysCounter = 0;
unsigned long lastDayIncrementTime = 0; // Variable para almacenar el último tiempo en que se incrementó el contador de días
unsigned long lastHumidityControlTime = 0; // Variable para almacenar el último tiempo en que se controló la humedad
unsigned long lastServoControlTime = 0; // Último tiempo en que se movió el servo
unsigned long lastServoMovementTime = 0; // Último tiempo en que el servo cambió de posición
Servo myservo; // Objeto para controlar el servo
int servoPosition = 0; // Posición inicial del servo
// Duración del movimiento del servo en milisegundos
const unsigned long servoMovementDuration = 4000;
unsigned long servoMovementStartTime = 0; // Tiempo de inicio del movimiento del servo
// Día a partir del cual el servo dejará de funcionar
const int dayToDisableServo = 19;
//setup del programa, es la configuración inicial
void setup( )
{
Serial.begin( 9600); //Inicia el puerto serie
lcd.begin(16, 2); //Inicia la pantalla lcd
pinMode(3, OUTPUT); // Configura el pin 3 como salida
pinMode(4, OUTPUT); // Configura el pin 4 como salida
myservo.attach(5); // Conecta el servo al pin 5
myservo.write(servoPosition); // Establece la posición inicial del servo
}
//Comprueba las lecturas de temperatura y humedad para ver si es correcto
static bool measure_environment( float *temperature, float *humidity )
{
static unsigned long measurement_timestamp = millis( );
//mide temperatura y humedad cada 3 segundos
if( millis( ) - measurement_timestamp > 3000ul )
{
if( dht_sensor.measure( temperature, humidity ) == true )
{
measurement_timestamp = millis( );
return( true );
}
}
return( false );
}
//Bucle del código
void loop( )
{
float temperature;
float humidity;
// Mide temperatura y humedad. Si la función devuelve true, entonces hay medición disponible
if( measure_environment( &temperature, &humidity ) == true )
{
lcd.setCursor(0, 0);
lcd.print( "T = " );
lcd.print( temperature, 1 );
lcd.print( "C" );
lcd.setCursor(0, 1);
lcd.print("H = ");
lcd.print( humidity, 1 );
lcd.print("%");
}
// Mostrar el contador de días en la pantalla LCD
lcd.setCursor(10, 1);
lcd.print("Dia:");
lcd.print(daysCounter);
// Verificar si ha pasado un día completo
unsigned long currentTime = millis();
if (currentTime - lastDayIncrementTime >= 86400000ul) // 86400000 milisegundos = 24 horas
{
daysCounter++;
lastDayIncrementTime = currentTime;
}
// Control de humedad cada 3 horas
if (currentTime - lastHumidityControlTime >= 10800000ul) // 10800000 milisegundos = 3 horas
{
if (humidity < 65)
{
digitalWrite(4, HIGH); // Activa el pin 4
delay(3000); // Mantiene el pin 4 activo durante 3 segundos
digitalWrite(4, LOW); // Desactiva el pin 4
lastHumidityControlTime = currentTime;
}
}
// Control de servo cada 6 horas, pero solo si no ha pasado el día 19
if (daysCounter < dayToDisableServo && currentTime - lastServoControlTime >= 21600000ul) // 21600000 milisegundos = 6 horas
{
if (currentTime - servoMovementStartTime >= servoMovementDuration)
{
servoPosition = (servoPosition == 0) ? 90 : 0;
myservo.write(servoPosition);
servoMovementStartTime = currentTime;
}
lastServoControlTime = currentTime;
}
// Control de la temperatura
if (temperature < 37.7) {
digitalWrite(3, HIGH);
} else if (temperature > 38.0) {
digitalWrite(3, LOW);
}
}
No hay comentarios:
Publicar un comentario