// 13:38 29/08/2022
// Ventilador_ON_OFF
const int umbral_de_temperatura = 20; // 30 para ts y para tb - son las decimas de grado que se han de superar para activar o desactivar el ventilador
/*
Enciende o apaga el ventilador cuando detecta una temperatura por encima o por debajo de ciertos grados recolectados automaticamente
el led del arduino marca los grados.
lo hace en dos trenes de impulsos separados por unos segundos.
el primero las decenas y el segundo las unidades.
Ahora en verano, el compresor dura unos 10 minutos y se inicia cada 15 minutos
a 40 grados se debe activar el ventilador siempre
a 25 grados se debe desactivar el ventilador siempre
umbral = 30 para ts y 10 para tb - ya que si hace mucho calor vd no sucedera manteniendo frio el compresor y si hace mucho frio vd sera rapido
para vd ti se debe alcanzar SOLO con tb
la temperatura sube rapido si vd y ca - pero sube por debajo del umbral si va y ca
si se usa el simulador hay que ALTERNAR lo matado con lo no matado que este delimitado con la palabra WOKWI
*/
// --------------------------------------------- con simulador WOKWI arduino ---------------
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 2 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT_Unified dht(DHTPIN, DHTTYPE);
// ---------------------------------------------------------------------WOKWI--------------------
/* // --------------------------------------------- sin simulador WOKWI arduino ---------------
// --------------------------------------------- de otros -------------------------------
// Incluimos librería
#include <DHT.h>
// Definimos el pin digital donde se conecta el sensor
#define DHTPIN 2
// Dependiendo del tipo de sensor
#define DHTTYPE DHT11
// Inicializamos el sensor DHT11
DHT dht(DHTPIN, DHTTYPE);
// -----------------------------------------------------------------------WOKWI------------------
*/
//int LED_BUILTIN=13; // al LED_BUILTIN no hay que definirlo pues ya esta por defecto definido en el arduino.
int variacionenlatemperatura;
int la_temperatura_del_compresor, la_temperatura_del_compresor_old, los60;
bool sw_ventilador = false; // true cuando el ventilador esta activo
bool sw_tb = false;
bool sw_beep = true;
bool sw_ti = true; // Si es true es que ocurrio la ti despues de tb o reset arduino
int rele = 8;
int miled_a = 9;
int miled_k = 10;
int mialtavoz_a = 11;
int mialtavoz_k = 12;
void setup()
{
Serial.begin(9600);
// --------------------------------------------- de otros ------------------------------
// Comenzamos el sensor DHT
dht.begin();
// -------------------------------------------------------------------------------------
// --------------------------------------------- con simulador WOKWI arduino ---------------
sensor_t sensor;
dht.temperature().getSensor(&sensor);
// ---------------------------------------------------WOKWI--------------------------------------
pinMode(LED_BUILTIN, OUTPUT);
pinMode(rele, OUTPUT);
digitalWrite(rele, LOW); // desactivamos el rele
pinMode(miled_a, OUTPUT);
digitalWrite(miled_a, LOW); // damos (-) al led
pinMode(miled_k, OUTPUT);
digitalWrite(miled_k, LOW); // desactivamos el led
pinMode(mialtavoz_a, OUTPUT);
digitalWrite(mialtavoz_a, LOW); // damos (-) al altavoz
pinMode(mialtavoz_k, OUTPUT);
digitalWrite(mialtavoz_k, HIGH); // desactivamos el altavoz
delay(100); // Necesario por encima de 50 milisegundos o falla el programa. (Posiblemente debido a que millis() toma un valor gigantesco si no hay un delay() previo al arrancar arduino.)
recoger_datos_del_sensor();
beep(70);
}
void loop()
{
ver_si_sube_baja_o_no_cambia_la_temperatura();
visor_de_temperatura_y_serial_print();
}
void ver_si_sube_baja_o_no_cambia_la_temperatura()
{
la_temperatura_del_compresor_old = la_temperatura_del_compresor;
recoger_datos_del_sensor();
// si t sube por encima de 20 grados o si t supera los 40 grados
if ((variacionenlatemperatura >= umbral_de_temperatura & la_temperatura_del_compresor >= 2000) | la_temperatura_del_compresor > 4000)
{
digitalWrite(rele, HIGH); // activamos el rele del ventilador
if (sw_ventilador == false)sw_beep = true; // solo activo el beep si vd
sw_ventilador = true;
sw_tb = false; // sin poner a false el sw_tb ocurre que al subir y activarse el ventilador, si ya no cambia la t ¡se desactiva el ventilador!
los60 = la_temperatura_del_compresor;
for (int tmpn1 = 10; tmpn1 > 0; tmpn1 = tmpn1 - 1)
{
beep(20);
}
}
// si (la temperatura esta estable habiendo bajado mas de 2.00 grados desde la ultima vez que subio y sigue bajando) o si baja mas de los 20 grados
if ((variacionenlatemperatura == 0 & sw_tb == true & sw_ti == true) | la_temperatura_del_compresor < 2000)
{
digitalWrite(rele, LOW); // desactivamos el rele del ventilador cuando ya no baja mas la temperatura
if (sw_ventilador == true)sw_beep = true; // solo activo el beep si va
sw_ventilador = false;
sw_tb = false;
beep(600);
beep(600);
beep(600);
}
if (variacionenlatemperatura <= -(umbral_de_temperatura))beep(600);
// si t bajando igual o mas que umbral-20 y si bajo 0.60 o mas grados desde que subio y si ventilador activo
if (variacionenlatemperatura <= -(umbral_de_temperatura) & los60 - la_temperatura_del_compresor >= 60 & sw_ventilador == true)
{
sw_tb = true;
}
else
{
if (variacionenlatemperatura > 0)sw_ti = false;
if (variacionenlatemperatura < 0)sw_ti = true;
}
}
void visor_de_temperatura_y_serial_print()
{
// visor de temperatura. parpadea decenas y luego unidades.
Serial.print(F("Ventilador "));
Serial.print(sw_ventilador);
Serial.print(F(", Temperatura "));
Serial.print(la_temperatura_del_compresor);
Serial.print(F(", los60 "));
Serial.print(los60 - la_temperatura_del_compresor);
Serial.print(F(", -tb o +ts "));
Serial.print(variacionenlatemperatura);
Serial.print(F(", sw_ti "));
Serial.print(sw_ti);
Serial.print(F(", tb "));
Serial.println(sw_tb);
int tmp1 = la_temperatura_del_compresor / 100; // dejo solo los grados
int tmp2 = tmp1 / 10; // tomo las decenas
delay(1000);
for (int tmpn1 = tmp2; tmpn1 > 0; tmpn1 = tmpn1 - 1)
{
// por cada decena de temperatura...
// los parpadeamos cada pocos segundos
digitalWrite(LED_BUILTIN, HIGH); // encendemos el led del arduino
digitalWrite(miled_k, HIGH); // activamos el rele
beep(70);
digitalWrite(LED_BUILTIN, LOW); // apagamos el led del arduino
digitalWrite(miled_k, LOW); // activamos el rele
delay(200);
}
delay(1000);
for (int tmpn1 = tmp1 - (tmp2 * 10); tmpn1 > 0; tmpn1 = tmpn1 - 1)
{
// por cada unidad de temperatura...
// los parpadeamos cada pocos segundos
digitalWrite(LED_BUILTIN, HIGH); // encendemos el led del arduino
digitalWrite(miled_k, HIGH); // activamos el rele
beep(70);
digitalWrite(LED_BUILTIN, LOW); // apagamos el led del arduino
digitalWrite(miled_k, LOW); // activamos el rele
delay(200);
}
sw_beep = false;
delay(3000);
}
void beep(int setenta)
{
if (sw_beep == false & setenta == 70)
{
delay(200);
return; // solo suena en el cambio de va a vd y viceversa
}
else
{
delay(100);
}
for (int tmpn1 = 1; tmpn1 < setenta; tmpn1++)
{
digitalWrite(mialtavoz_a, HIGH); // activamos el rele
delay(1);
digitalWrite(mialtavoz_a, LOW); // activamos el rele
delay(1);
}
}
void recoger_datos_del_sensor()
{
// --------------------------------------------- con simulador WOKWI arduino ---------------
// Delay between measurements.
// delay(delayMS);
// Get temperature event and print its value.
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature))
{
Serial.println(F("Error reading temperature!"));
return;
}
la_temperatura_del_compresor = event.temperature * 100;
variacionenlatemperatura = la_temperatura_del_compresor - la_temperatura_del_compresor_old;
// ---------------------------------------------------------------WOKWI--------------------------
/* // --------------------------------------------- sin simulador WOKWI arduino ---------------
// --------------------------------------------- de otros ------------------------------
// Leemos la humedad relativa
// float h = dht.readHumidity();
// Leemos la temperatura en grados centígrados (por defecto)
float t = dht.readTemperature();
// Leemos la temperatura en grados Fahreheit
// float f = dht.readTemperature(true);
// Comprobamos si ha habido algún error en la lectura
// if (isnan(h) || isnan(t) || isnan(f))
// {
if (isnan(t))
{
Serial.println(F("Error01")); // obteniendo los datos del sensor DHT11"));
return;
}
// }
// Calcular el índice de calor en Fahreheit
// float hif = dht.computeHeatIndex(f, h);
// Calcular el índice de calor en grados centígrados
// float hic = dht.computeHeatIndex(t, h, false);
// Serial.print(F("Humedad: "));
// Serial.print(F(h));
// Serial.print(F(" %\t"));
// Serial.print(F("Temperatura: "));
// Serial.print(F(t));
// Serial.print(F(" *C "));
// Serial.print(F(f));
// Serial.print(F(" *F\t"));
// Serial.print(F("Índice de calor: "));
// Serial.print(F(hic));
// Serial.print(F(" *C "));
// Serial.print(F(hif));
// Serial.println(F(" *F"));
// -------------------------------------------------------------------------------------
la_temperatura_del_compresor = t * 100;
variacionenlatemperatura = la_temperatura_del_compresor - la_temperatura_del_compresor_old;
// ---------------------------------------------------------------WOKWI--------------------------
*/
}