Go Down

Topic: Problemas al leer datos analógicos (Read 121 times) previous topic - next topic

emmanuelsofts

May 20, 2017, 01:59 am Last Edit: May 20, 2017, 02:05 am by emmanuelsofts
Saludos comunidad, estoy tratando de leer datos analógicos por medio de un Arduino Mega 2560 Genérico

Por ejemplo un sensor de Temperatura LM35

Al momento de leerlos en un pin Analógico (A0 en concreto) con analogRead() me salta valores que varian entre 200 y 350, siendo un sensor de temperatura tengo entendido que mide directamente en grados C°.

Mi pregunta:
- Es adecuada la forma en que transformo los datos que se lee así en bruto, quiero mostrarlos en grados C°. Puesto que recibo como resultado números reales entre 1.0 a 2.0 Teniendo un clima aproximadamente de 20 C°

Les comparto mi humilde código

Code: [Select]
#define pin_temp A0

float tempC;

void setup() {
  Serial.begin(9600);
}

void loop() {

  tempC = (5.0 * analogRead(pin_temp))/1023.0;
 
  Serial.println(analogRead(pin_temp));
  Serial.println(tempC);
 
  delay(2000);
 
}


Resultados

Code: [Select]

287
1.40
290
1.42
290
1.42
283
1.38
287
1.40
277
1.35



El voltaje que uso es de 5 aunque con el multimetro alcanzo a presenciar que es de 4.8. (Esta conectado un sensor ultrasonico como módulo Bluetooh, no se si hagan ruido)

Más que nada quiero destacar al momento de dividirlo entre 1023, se que la lectura arroja datos entre 0 - 1023, pero tengo una idea de que es por la resolucion del arduino.

También al aplicar calor mis números disminuyen, cosa que se me hace raro, de manera similar al aplicar frió aumenta.

Gracias por ayudarme, estoy al pendiente de dudas o comentarios.

Gracias

surbyte

#1
May 20, 2017, 06:19 am Last Edit: May 20, 2017, 06:23 am by surbyte
Para comenzar un sensor LM35 entrega una salida analógica en mV, el valor en grados debe multiplicarse por 100. Así que tu ecuación esta incompleta.

La correcta es así

Code: [Select]
tempC = (500.0 * analogRead(pin_temp))/1023.0;

lo siguiente es una tontería pero para poder apreciar mejor las cosas modifica la forma de presentarlo de este modo

 
Code: [Select]
Serial.print(analogRead(pin_temp));
 Serial.print(" ");
 Serial.println(tempC);


Esto hará que los dos valores se vean en una sola línea y será mas facil observar las lecturas y compararlas.

Tus valores leídos 287, 290, 283, 287, 277 lucen caóticos pero en realidad no lo son tanto.
Es común ver esa proyección de valores en la salida de un LM35.

Algunos montan un capacitor de 1 o 10uF entre el pin Analógico y GND para filtrar las perturbaciones.
Otro modo de hacerlo es promediando.
Tomar N muestras y luego calcular su promedio.

A ver si este código responde mejor a tus espectativas

Code: [Select]
#define pin_temp A0
#define N        20

float tempC;
float media;
unsigned long suma;

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned int valor;

  suma = 0;
  for (byte i=1; i<N; i++) {
     suma += analogRead(pin_temp);
  }
  media = suma/N;
  tempC = (float) (media * 500.0)/(1023.0);
 
  Serial.println(media);
  Serial.println(tempC);
 
  delay(1000);
}




emmanuelsofts

He compilado y subido el código (Solo modifique la presentación)

Code: [Select]
#define pin_temp A0
#define N        20

float tempC;
float media;
unsigned long suma;

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned int valor;

  suma = 0;
  for (byte i=1; i<N; i++) {
       suma += analogRead(pin_temp);
  }
  media = suma/N;
  tempC = (float) (media * 500.0)/(1023.0);
 
  Serial.print("Media: ");
  Serial.print(media);
  Serial.print("\tTempC: ");
  Serial.println(tempC);
 
  delay(1000);
}


Y en el monitor serie tenemos esto

Code: [Select]
Media: 356.00 TempC: 174.00
Media: 249.00 TempC: 121.70
Media: 341.00 TempC: 166.67
Media: 272.00 TempC: 132.94
Media: 280.00 TempC: 136.85
Media: 330.00 TempC: 161.29
Media: 239.00 TempC: 116.81
Media: 334.00 TempC: 163.25
Media: 275.00 TempC: 134.41
Media: 270.00 TempC: 131.96
Media: 344.00 TempC: 168.13
Media: 240.00 TempC: 117.30
Media: 327.00 TempC: 159.82


Aun sigue saliendo valores muy altos. Aun sin el capacitor esto es normal?
El echo de multiplicar por 100 hizo que los valores cambiaran de 1.0 y 2.0 a 100.0 a 200.0

PD: Es cierto que el sensor LM35 lee de -55 a 150 °C?
Si fuera el caso, no tendría valores negativos ya que el analogRead() da como mínimo 0?

emmanuelsofts

#3
May 20, 2017, 07:13 am Last Edit: May 21, 2017, 02:10 am by surbyte Reason: Usar etiquetas para postear imágenes o esquemas
Les comparto mi diagrama


surbyte

Primero corrije esto (un error mío)

Code: [Select]
  for (byte i=1; i<N; i++) {
por

Code: [Select]
  for (byte i=0; i<N; i++) {
Son N muestras y no N-1 como te puse antes.

También agrega solo para confirmar que no perdamos info en la conversión de tipos de variables aunque los valores se ven bien.

Code: [Select]
media = (float) suma/N;

El LM35 entrega valores

Quote
La salida del LM35 es lineal con la temperatura, incrementando el valor a razón de 10mV por cada grado centígrado. El rango de medición es de -55ºC (-550mV) a 150ºC (1500 mV). Su precisión a temperatura ambiente es de 0,5ºC.
Asi que si lees valores que estan proximos a 150 C lo cual es un disparate.
Tu sensor esta mal o bien esta conectado al revés.

Tu esquema luce bien asi que supongo que el sensor esta mal.
Lee con un testes/multímetro la salida del sensor. Si confirmas los valores de salida la pregunta es porque tanta aleatoriedad?
Como alimentas arduino?

Go Up