Fluctuacion valores en entrada analógica

Hola a todos,

Estoy intentando hacer un proyecto para el que necesito medir la temperatura ambiente, he usado varios códigos diferentes, varias tarjetas (nano, uno, WIFI D1 R1) y tambien he probado con una NTC100k y con un LM35.

No he conseguido aún una temperatura fiable pero eso no es lo que me preocupa (ya hallaré el camino), lo que me preocupa es que los valores de entrada por el puerto analógico siempre me fluctúa bastante.

hasta ahora había usado algún puerto analógico para leer una LDR y no había tenido problemas pero ahora no se qué pasa.

Cuando he usado la NTC100K, he usado un divisor de tensión con una R de 1K, y lo he alimentado con 5 y con 3.3v (para la WIFI D1 R1 solo con 3.3v) y cuando he usado el LM35 lo he alimentado con 3.3 y con 5 y nada...

No se si se me escapa algo básico al usar un puerto analógico o no.

A ver si me podéis orientar. Ya se que he sido muy bago al no poner códigos pero como he usado varios y el resultado oscila tanto creo que no viene por ahí el fallo.

Gracias por leerme.

¿De qué tipo de fluctuaciones hablamos? ¿un par de grados, decenas? ¿Has utilizado algún filtro en la entrada usando condensadores?¿Algún filtro por software (media/mediana/paso bajo)?

Como ves, más que soluciones te planteo dudas, ya que no sabemos el montaje y como lees.

Gracias, las dudas pueden ser el principio de las soluciones…

No he usado ningún filtro en C ni en software.

Simplemente recibo el valor de la entrada analogica
(por ejemplo en el caso del LM35 y lo escalo.

Pensé que el valor de la resistencia es demasiado pequeño pero entonces solo pasaría en el divisor de tensión.

Te pongo un ejemplo del código para el divisor de tensión y la NTC100K:

const int sensorPin= A0;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int value = analogRead(sensorPin);
  float millivolts = (value / 1023.0) * 5000;
  float celsius = millivolts / 10; 
  Serial.print(celsius);
  Serial.println(" C");
  delay(2000);
}

Aquí el ejemplo de código para lalectura desde el LM35:

#include <stdio.h>
#include <math.h>

int analogPin=0;     // Pin donde esta conectado el divisor de tension en el Arduino

float Vin=3.3;       // [V]       Voltage de entrada en el divisor de tension
float Raux=1000;    // [ohm]     Valor de la resistencia secundaria del divisor de tension
float R0=100000;     // [ohm]     Valor de resistencia nominal del termistor (NTC) a 25ºC
float T0=298.15;     // [K] (25ºC)

float Vout=0.0;      // [V]        Voltage given by the Voltage-Divider
float Rout=0.0;      // [ohm]      Resistencia actual del Termistor (NTC)

// Valores para calcular el valor Beta, si no lo sabemos
// float T1=273;     // [K]        Temperatura del 1º punto del test (en grados Kelvin)
// float T2=373;     // [K]        Temperatura del 2º punto del test (en grados Kelvin)
// float RT1=19750;  // [ohms]     Resistencia a 273K grados Kelvin (0ºC)
// float RT2=2150;   // [ohms]     Resistencia a 373K grados Kelvin (100ºC)

float beta=0.0;      // [K]        Parametro Beta
float Rinf=0.0;      // [ohm]      Parametros Rinf
float TempK=0.0;     // [K]        Temperatura de salida en grados Kelvin
float TempC=0.0;     // [ºC]       Temperatura de salida en grados Celsius

int iCont;            // Contador de ciclos, par el calculo de la temperatura media
float cTemp1;         // Variable temporal para acumular las temperaturas leidas 

void setup() {
  // Configuramos el puerto Serie
  Serial.begin(9600);

  // Configuramos el pin del Arduino en entrada
  pinMode(analogPin, INPUT);

  // Parametros generales para el calculo
  // Formula para calcular el valor beta si no disponemos de el
  // beta=(log(RT1/RT2))/((1/T1)-(1/T2));
  // Valor beta, los fabricantes suelen disponer ya de este valor, 
  // mirar en la tabla de carateristicas del termistor
  beta = 4380;
  Rinf=R0*exp(-beta/T0);
}

void loop()
{
  cTemp1=0;  
  for (iCont = 1; iCont <= 500; iCont ++)
  {
    // Cálculo del valor de la resistencia termistor (NTC) actual (a través de Vout)
    Vout=Vin*((float)(analogRead(analogPin))/1024.0); 
    Rout=(Raux*Vout/(Vin-Vout));

    // Calculo de la temperatura en grados Kelvin
    TempK=(beta/log(Rout/Rinf));
    // Calculo de la temperatura en grados Celsius
    TempC=TempK-273.15; 
    // Almacenamos la temperatura (grados Celsuis) actual para despues obtener la media
    cTemp1 = cTemp1 + TempC; 
    // Hacemos una pausa de 10 milisegundos    
    delay(10);
  }

  // Calculamos la temperatura media
  TempC = cTemp1/iCont;

  // Mostramos la temperatura media en grados Celsius
  Serial.println(TempC);

  // Hacemos una pausda de 1 seg.
  delay(1000);
}

Este último lo uso ya que los ejemplo que veía por ahí eran de divisores de tensión con valores de resistencia mucho mayores de 1K que es de lo que dispongo yo.

Ambos códigos no son mios, son extraidos de tutoriales de internet.

Los códigos deben postearse usando etiquetas para códigos no citas. Por favor lee las normas, 1er hilo de cualquier sección.

No se de donde lo copiaste pero el que lo hizo poca idea tiene de el tiempo que le lleva a un microcontrolador hacer tantas cuentas inutilmente.
Si lo que quieres es sumar 500 valores lo cual me parece excesivo desde el vamos, solo suma lo que lee el ADC (conversor analógico digital) y al final promedias y haces 1 vez los cálculos y no 500 veces todo

Esto que estaba escrito así

for (iCont = 1; iCont <= 500; iCont ++)
  {
    // Cálculo del valor de la resistencia termistor (NTC) actual (a través de Vout)
    Vout=Vin*((float)(analogRead(analogPin))/1024.0);
    Rout=(Raux*Vout/(Vin-Vout));

    // Calculo de la temperatura en grados Kelvin
    TempK=(beta/log(Rout/Rinf));
    // Calculo de la temperatura en grados Celsius
    TempC=TempK-273.15;
    // Almacenamos la temperatura (grados Celsuis) actual para despues obtener la media
    cTemp1 = cTemp1 + TempC;
    // Hacemos una pausa de 10 milisegundos    
    delay(10);
  }

cambia a esta otra manera mas simple de hacerlo sin tanta operación matemática!!

unsigned long valores = 0;
  for (iCont = 1; iCont <= 500; iCont ++)   {
    // Cálculo del valor de la resistencia termistor (NTC) actual (a través de Vout)
   suma += analogRead(analogPin);
    // Hacemos una pausa de 10 milisegundos    
    delay(10);
  }

    Vout=Vin*((float)(suma)/(500.0*1024.0));
    Rout=(Raux*Vout/(Vin-Vout));

    // Calculo de la temperatura en grados Kelvin
    TempK=(beta/log(Rout/Rinf));
    // Calculo de la temperatura en grados Celsius
    TempC=TempK-273.15;
    // Almacenamos la temperatura (grados Celsuis) actual para despues obtener la media
      cTemp1 = cTemp1 + TempC;

Y de paso qué es esto, tomas 500 valores y luego dices que vas a calcular la media?

  // Almacenamos la temperatura (grados Celsuis) actual para despues obtener la media
      cTemp1 = cTemp1 + TempC;

Hi,
Yo uso el LM35 sin problems pero al voltaje que lo alimenta uso un condensador 10uf electrolitico y uno de .1uf en parallelo al de 10uf. Tambien debes trenzar los cables que conectan a al LM35. Otra cosa que puedes hacer si quire mejorar las lecturas es de cambiar la referencia a un voltio 1.1 usando la instrucion "analogReference()". esto te va a dar mejor resulucion en las lecturas ya que la salida del LM35 es en milivoltios.Otra cosa es que el voltaje de entrada del LM35 es de 4 voltios a 30 voltios. Yo uso los 5 voltios de la salida del Arduino y los filtros.

Gracias a ambos por vuestra ayuda, en cuanto lo aplique os cuento.

Solo una pregunta más (por ahora): lo de trenzar los cables... Se trenzan los tres cables entre sí? Cuál es el fin?

Gracias.

Hi,
Yo trenzo los 3 cables. Es una practica que se usa para eliminar cualquier voltaje inducido en los cable. Al trenzarlos los voltajes inducidos se canselan. Esto no quire decir que va resolver tu problema pues puede ser tambien ruidos digitales intruducidos por el micro.