Go Down

Topic: [SOLUCIONADO] Valores pequeñísimos en entradas analógicas (Read 1 time) previous topic - next topic

juancmar

Hola. Tras algún tiempo sin encontrar solución os pido ayuda.

Tengo un pequeño proyecto para mi moto. La voy a equipar con un arduino nano y algunos sensores que echo a faltar.

De momento estoy haciendo pruebas con un 'tilt sensor' que ya tenía y con una PT100. El caso es que el tilt sensor me da valores siempre inferiores a 100 (aunque lo sacuda), aunque coherentes. Pero hoy he conectado la pt100 haciendo un divisor de tensión con una resistencia de 1k (para que saque menos de 1.1V, independientemente si está a 20 o a 400 grados, según su datasheet). Por supuesto he utilizado analogReference(INTERNAL), pero los valores en A2 (donde tengo la toma del divisor de tensión) siempre me da entre 0 y 4 (independientemente de que la sonda esté a temperatura ambiente o en contacto con el soldador) y no son resultados muy coherentes.

El tilt sensor es un módulo con salida analógica y digital (evidentemente utilizo la analógica). En el divisor de tensión la resistencia de 1k está como R1 y la PT100 como R2, es decir:

                                A2
                                 |
                                 |
+ -------- R1 (1k)-------|-------- R2 (PT100) ------------  -

Otra cosa que me llama la atención es que se supone que la salida analógica del tilt sensor debería sacar entre 0 y 5 volts y rara vez saca más de 0,5.

Estoy perdido  ... ¿Alguna idea?

GO_zalo

#1
Jun 30, 2015, 11:16 pm Last Edit: Jun 30, 2015, 11:27 pm by GO_zalo
tendrás que poner que  Tilt Sensor te refieres, por que los que yo conozco son equivalentes a un contacto de un pulsador, no es de que den 0 a 5 V es que están NA y cuando vibra se cierran, debes tratarlos como si de un push button se tratara (con su pullup y todo)

juancmar

Cierto. Aporto más información:

- sensor:

Salida analógica conectada a A0. Alimentada por la salida 5V del Nano

- Sonda PT100:

Es una sonda de 2 hilos, por eso el divisor. La entrada de tensión del divisor es la salida de 5V del Nano

- El BT es un HC-05 y funciona de maravilla. Conectado a D10 y D11. Alimentado por la salida 5V del Nano

- Los negativos todos unidos

- El Nano se alimenta por +12V por Vin

Adjunto también una foto del invento:

El resto de componentes están bajo el nano, el HC-05 y el sensor para ahorrar espacio.

juancmar

Adjunto además un esquema de conexiones y el sketch, aunque como no he encontrado en Fritzing los símbolos del vibration sensor y el PT100 los he cambiado por una brújula (tb 4 pines) y un termistor.


Sketch:
Code: [Select]
#include <SoftwareSerial.h>

#define RxD 10
#define TxD 11

SoftwareSerial BTSerial(RxD, TxD);
int led = 13;
int tiltVCC= 8;
int tilt=A0;
int pt100=A2;
int vtilt;
int vpt100;
int comando;

void setup()
{  
  pinMode(led,OUTPUT);
  digitalWrite(led,LOW);
  BTSerial.flush();
  delay(500);
  analogReference(INTERNAL);
  BTSerial.begin(9600);
  BTSerial.print("Hola, soy Perica: ");

  delay(100);

}

void loop()
{
  vtilt = analogRead(tilt);
  vpt100 = analogRead(pt100);
  if (vpt100 > 2){
    BTSerial.write("temp: ");
    BTSerial.println(vpt100);
  }
  if (vtilt > 10)
  {
    BTSerial.write("Cuidadin: ");
    BTSerial.println(vtilt);
  }
  while (BTSerial.available())
  {
       char dato= BTSerial.read();
       switch(dato)
       {
         case '2':
         {
           BTSerial.write("temp: ");
           BTSerial.println(vpt100 + "|" + vtilt);
           break;
         }
         case '1':
         {
           digitalWrite(led,HIGH);
           BTSerial.println("Led ON");
           break;
         }
         case '0':
         {
           digitalWrite(led,LOW);
           BTSerial.println("Led OFF");
           break;
         }      
       }
  }
}



surbyte

Si mides tensión con un tester/multímetro entre gnd y A0 del modulo PT100 que lees?

max_saeta

#5
Jul 05, 2015, 04:23 am Last Edit: Jul 05, 2015, 04:26 am by max_saeta
Saludos.
Para poder tomar la lectura de la PT100 vas a tener que cambiar la resistencia de 1K por una de 100 ohm, si es posible de precision de 1%.
Luego de eso usa estas dos rutinas que hice para una PT1000. Donde Rc es el valor de la resistencia que colocas para el divisor de tension.
Puerto es el pin usado para conectar la PT100

Code: [Select]
float Rc  = 1000.0;           //  Resistencia de calibracion
bool   activo =  false;

float calcula_resistencia(byte puerto, float RC){
  unsigned long lectura = 0;
  float intensidad = 0;
  for(int i = 0; i < max_lectura; i++) lectura += analogRead(puerto);
  lectura/=max_lectura;
  Serial.println(lectura);
  intensidad = (lectura-1023.0) / RC;
  return abs(lectura / intensidad);
}

long calcula_temperatura(float R,float R0) {
   float A=3.9083E-3;
   float B=-5.775E-7;
   float T;
   
   R=R/R0;
   
   //T = (0.0-A + sqrt((A*A) - 4.0 * B * (1.0 - R))) / 2.0 * B;
   T=0.0-A;
   T+=sqrt((A*A) - 4.0 * B * (1.0 - R));
   T/=(2.0 * B);
   
   if(T>0&&T<200) {
     return T;
   }
   else {
     //T=  (0.0-A - sqrt((A*A) - 4.0 * B * (1.0 - R))) / 2.0 * B;
     T=0.0-A;
     T-=sqrt((A*A) - 4.0 * B * (1.0 - R));
     T/=(2.0 * B);
     return (long)T;
   }
}


Yo hago uso de las rutinas llamandolas asi:

Code: [Select]
float resistencia = calcula_resistencia(T2, Rc);
    long temperatura =  calcula_temperatura(resistencia,Rc);

juancmar

Chicos muchisimas gracias por vuestras aportaciones. Al poner el multímetro en la pt100, como GO_zalo me sugirió me he dado cuenta de que no llevaba tensión, y tampoco  R1 ni el vibration sensor. Entonces he visto que había soldado el cable que los alimenta a GND en vez de a 5V. HORROOORR. Una vez soltado y resoldado en su sitio parece que todo funciona ok.

En cuanto a las rutinas de max_saeta me encantan, así que en cuanto tenga un rato libre las pruebo.

Gracias a todos por vuestra ayuda.

Go Up