#include <DHT.h>
#define lm35Pin A0 // El pin analógico al que está conectado el sensor DHT22
#define DHTTYPE DHT22
DHT dht(lm35Pin, DHTTYPE);
const int numMediciones = 30; // Número de mediciones a tomar
int randomNumber = 0;
#include <math.h> // Agregado para usar la función sqrt()
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
Serial.println("¡Bienvenido!, se tomarán un número de mediciones de la temperatura ambiente: ");
Serial.println("------------------------");
delay(100);
float temperaturas[numMediciones]; // Arreglo para almacenar las temperaturas
for (int i = 0; i < numMediciones; i++) {
randomNumber = random(1, 10);
int lectura = analogRead(lm35Pin); // Lee el valor analógico
float temp = ((lectura / 1024.0) * 50 + randomNumber); // Convierte a grados centígrados
temperaturas[i] = temp; // Almacena la temperatura en el arreglo
Serial.print("Temperatura ");
Serial.print(i + 1);
Serial.print(": ");
Serial.print(temp);
Serial.println(" °C");
delay(1000); // Espera 1 segundo entre mediciones
}
// Ordenar las temperaturas de menor a mayor usando el algoritmo de burbuja
for (int i = 0; i < numMediciones - 1; i++) {
for (int j = 0; j < numMediciones - i - 1; j++) {
if (temperaturas[j] > temperaturas[j + 1]) {
// Intercambiar las temperaturas si están en el orden incorrecto
float tempSwap = temperaturas[j];
temperaturas[j] = temperaturas[j + 1];
temperaturas[j + 1] = tempSwap;
}
}
}
Serial.println("------------------------");
Serial.println("Tomas finalizadas, procedemos a organizar valores de menor a mayor:");
// Imprimir las temperaturas ordenadas de menor a mayor
for (int i = 0; i < numMediciones; i++) {
Serial.print("Medición ");
Serial.print(i + 1);
Serial.print(": ");
Serial.print(temperaturas[i]);
Serial.println(" °C");
}
// Calcular el tercer cuartil (Q3)
float pos_Q3=((numMediciones-1)*0.75)+1;
float numeroFloat = pos_Q3;
int numeroInt = round(numeroFloat); // Redondea
float Q3 = temperaturas[numeroInt - 1]; // Q3 es el valor en la posición numeroInt - 1
// Calcular el primer cuartil (Q1)
float pos_Q1=((numMediciones-1)*0.25)+1;
float numeroFloat1 = pos_Q1;
int numeroInt1 = round(numeroFloat1); // Redondea
float Q1 = temperaturas[numeroInt1 - 1]; // Q1 es el valor en la posición numeroInt1 - 1
// Calcular el rango intercuartílico (IQR)
float IQR = Q3 - Q1;
// Calcular valores atípicos mayores
float ATMY = Q3 + 1.5 * IQR;
// Calcular valores atípicos menores
float ATMN = Q1 - 1.5 * IQR;
Serial.println("------------------------");
Serial.println("Procedemos a calcular el Rango Intercuatílico: ");
Serial.print("Primer Cuartil (Q1): ");
Serial.print(Q1);
Serial.println(" °C");
Serial.print("Tercer Cuartil (Q3): ");
Serial.print(Q3);
Serial.println(" °C");
Serial.print("Rango Intercuartílico (IQR): ");
Serial.println(IQR);
Serial.print("Valores Atípicos Mayores: ");
Serial.println(ATMY);
Serial.print("Valores Atípicos Menores: ");
Serial.println(ATMN);
// Filtrar valores atípicos
float valoresFiltrados[numMediciones]; // Arreglo para almacenar los valores filtrados
int numValoresFiltrados = 0; // Contador de valores filtrados
for (int i = 0; i < numMediciones; i++) {
if (temperaturas[i] >= ATMN && temperaturas[i] <= ATMY) {
// Si el valor está dentro del rango aceptable, agrégalo al arreglo de valores filtrados
valoresFiltrados[numValoresFiltrados] = temperaturas[i];
numValoresFiltrados++;
}
}
Serial.println("------------------------");
Serial.println("Procedemos a calcular el Promedio y la Desviación de los Valores Filtrados: ");
// Calcular promedio de valores filtrados
float sumaValoresFiltrados = 0;
for (int i = 0; i < numValoresFiltrados; i++) {
sumaValoresFiltrados += valoresFiltrados[i];
}
if (numValoresFiltrados > 0) {
float promedioValoresFiltrados = sumaValoresFiltrados / numValoresFiltrados;
Serial.print("Promedio de Valores Filtrados: ");
Serial.print(promedioValoresFiltrados);
Serial.println(" °C");
// Calcular desviación de los valores filtrados
float sumaDiferenciasAlCuadrado = 0;
for (int i = 0; i < numValoresFiltrados; i++) {
float diferencia = valoresFiltrados[i] - promedioValoresFiltrados;
sumaDiferenciasAlCuadrado += diferencia * diferencia;
}
if (numValoresFiltrados > 1) { // Se requiere al menos 2 valores para calcular la desviación estándar
float varianza = sumaDiferenciasAlCuadrado / (numValoresFiltrados - 1);
float desviacionEstandar = sqrt(varianza);
Serial.print("Desviación estándar de Valores Filtrados: ");
Serial.print(desviacionEstandar);
Serial.println(" °C");
} else {
Serial.println("No hay suficientes valores para calcular la desviación estándar.");
}
} else {
Serial.println("No hay valores dentro del rango aceptable.");
}
//----------------------------------------------------------------
// Calcular el promedio de los datos no filtrados
float sumaValoresNoFiltrados = 0;
for (int i = 0; i < numMediciones; i++) {
sumaValoresNoFiltrados += temperaturas[i];
}
float promedioValoresNoFiltrados = sumaValoresNoFiltrados / numMediciones;
// Calcular la desviación estándar de los datos no filtrados
float sumaDiferenciasAlCuadrado = 0;
for (int i = 0; i < numMediciones; i++) {
float diferencia = temperaturas[i] - promedioValoresNoFiltrados;
sumaDiferenciasAlCuadrado += diferencia * diferencia;
}
float varianza = sumaDiferenciasAlCuadrado / numMediciones;
float desviacionEstandar = sqrt(varianza);
Serial.println("------------------------");
Serial.println("Procedemos a calcular el Promedio y la Desviación de los Valores NO Filtrados: ");
Serial.print("Promedio de Valores No Filtrados: ");
Serial.print(promedioValoresNoFiltrados);
Serial.println(" °C");
Serial.print("Desviación estándar de Valores No Filtrados: ");
Serial.print(desviacionEstandar);
Serial.println(" °C");
delay(60000); // Espera 1 minuto antes de la próxima serie de mediciones
}