const int pinNTC = A0; // Pin conectado al termistor
const int numSamples = 10; // Número de muestras para el filtro de promedio móvil
float readings[numSamples]; // Búfer circular para almacenar lecturas
int currentIndex = 0; // Índice actual en el búfer
float total = 0.0; // Suma acumulada para el promedio
// Coeficientes del termistor NTC (Steinhart-Hart)
const float A = 1.009249522e-03;
const float B = 2.378405444e-04;
const float C = 2.019202697e-07;
void setup() {
Serial.begin(9600);
Serial.println("Iniciando termómetro con filtro de ruido...");
// Inicializar el búfer circular
for (int i = 0; i < numSamples; i++) {
readings[i] = 0.0;
}
}
float calcularTemperatura(float resistencia) {
float logR = log(resistencia);
float temperaturaKelvin = 1.0 / (A + B * logR + C * pow(logR, 3));
return temperaturaKelvin - 273.15; // Convertir a Celsius
}
float leerPromedioAnalogico(int pin, int muestras) {
long suma = 0;
for (int i = 0; i < muestras; i++) {
suma += analogRead(pin);
delay(10); // Pequeño retraso entre lecturas para mayor estabilidad
}
return suma / (float)muestras;
}
void loop() {
// Leer un promedio estabilizado del ADC
float lecturaEstabilizada = leerPromedioAnalogico(pinNTC, 20); // 20 lecturas promedio
float voltaje = lecturaEstabilizada * (5.0 / 1023.0); // Conversión a voltaje
float resistencia = (10000 * (5.0 / voltaje - 1.0)); // Calcular resistencia del NTC
// Calcular temperatura
float temperatura = calcularTemperatura(resistencia);
// Filtro de promedio móvil
total -= readings[currentIndex]; // Restar la lectura más antigua
readings[currentIndex] = temperatura; // Actualizar con la nueva lectura
total += readings[currentIndex]; // Sumar la nueva lectura
currentIndex = (currentIndex + 1) % numSamples; // Mover el índice
float temperaturaFiltrada = total / numSamples; // Calcular promedio filtrado
// Mostrar datos en el monitor serial
Serial.print("Lectura ADC: ");
Serial.print(lecturaEstabilizada);
Serial.print(" | Voltaje: ");
Serial.print(voltaje, 2);
Serial.print(" V | Resistencia: ");
Serial.print(resistencia, 2);
Serial.print(" Ohm | Temp. Cruda: ");
Serial.print(temperatura, 2);
Serial.print(" °C | Temp. Filtrada: ");
Serial.print(temperaturaFiltrada, 2);
Serial.println(" °C");
delay(500); // Actualización cada 500 ms
}