domingo, 28 de abril de 2013

Cinco termómetros a la vez con Arduino

Estaba preparando las prácticas para mis alumnos de física en calor y temperatura y sucede que más de una vez, llegamos al laboratorio de la escuela y hay un solo termómetro (con suerte) otras veces me pasó que el que estaba, tenía el bulbo roto :-(

Hay muy lindos experimentos que serán motivo de otra entrada en mi blog con calor y es necesario contar con varios termómetros que lean en forma simultanea, este es el tema que hoy abordaremos.

Materiales

5 diodos 1N4148 (valen menos de 1$ o podemos sacarlos de alguna plaqueta)

5 resistencias de ¼ W de 2K2 ohms (tres bandas rojas en el código de colores)

Cable de mouse

Spaguetti termocontraible

La placa arduino.

clip_image002

Circuito eléctrico

Esta imagen muestra como ejemplo la conexión de dos de ellas

termometro5sondas

Construcción de las sondas

Es conveniente usar para todas la misma longitud de cable, unos 50 cm esta bastante bien, podemos usar el cable de los Mouse que son muy flexibles, tienen varios cables dentro pero solo usaremos dos de ellos. En uno de los extremos soldamos el diodo cuidando siempre usar los mismos colores para ánodo y cátodo, para luego no confundirnos en la conexión. Una vez soldado le pondremos un trozo de termocontraible para dejarlo prolijo y resguardar las soldaduras.

clip_image006

Las cinco sondas

clip_image008

En la imagen se ve el protoboard con las cinco sondas y ya conectadas a la placa Arduino

Calibrado

Para calibrar es sumamente sencillo, una vez armado el dispositivo como se ve en la imagen anterior cargamos el siguiente código a Arduino
//Código para calibrar las sondas del termómetro
void setup() {
Serial.begin(9600);
analogReference(INTERNAL);// pone como referencia iterna 1.1V
}
void loop() {
Serial.print (" Term 1= ");
Serial.print (analogRead(0));
Serial.print (" Term 2= ");
Serial.print (analogRead(1));
Serial.print (" Term 3= ");
Serial.print (analogRead(2));
Serial.print (" Term 4= ");
Serial.print (analogRead(3));
Serial.print (" Term 5= ");
Serial.println (analogRead(4));
delay(1000);
}

Una vez hecho esto activamos el monitor, nos encontraremos con cinco columnas como estas:

clip_image010

Atamos las 5 sondas con una banda elástica y las colocamos en una copa con hielo y un poco de agua dejando unos minutos para que se estabilicen las lecturas.

clip_image012

Tomamos nota de las lecturas

Por ejemplo en mi caso fueron:



























Numero de sondaLectura a 0°
1632
2630
3629
4628
5641

Ahora hacemos lo mismo pero colocando las sondas en agua hirviendo

clip_image014

Igual que antes tomamos nota, como ejemplo doy los valores míos pero cada uno deberá hacer sus medidas para que los termómetros marquen bien.



























Número de sondaLectura a 100°
1452
2459
3450
4449
5473

Ahora vamos a cargar el código que dará las lecturas de los termómetros que es este:
// termometro múltiple fácil de calibrar
float termometro1= 0;// entrada A0
float termometro2= 0;// entrada A1
float termometro3= 0;// entrada A2
float termometro4= 0;// entrada A3, se pueden poner mas sondas en A4 y 5
float termometro5= 0;
int tiempo=0;
int cnt=0;
float t1=0;
float t2=0;
float t3=0;
float t4=0;
float t5=0;
void setup() {
Serial.begin(9600);
analogReference(INTERNAL);// pone como referencia iterna 1.1V
}
void loop() {
   t1 = map(analogRead(0),452,632,1000,0); // a 0°C la lectrura de analgRead es 140 y a 100°C es 99
   t2 = map(analogRead(1),459,630,1000,0);// calibrar cada sonda por separado y poner los valores correspondientes en map  
   t3 = map(analogRead(2),450,629,1000,0);
   t4 = map(analogRead(3),449,628,1000,0);
   t5 = map(analogRead(4),473,641,1000,0);
   termometro1= t1/10;
    termometro2= t2/10;
     termometro3= t3/10;
      termometro4= t4/10;
       termometro5= t5/10;
   tiempo =millis()/1000;
   // para ver en el monitor
Serial.print (tiempo);
Serial.print (" Term 1= ");  
Serial.print (termometro1,1);
Serial.print ("        Term 2= ");
Serial.print (termometro2,1);
Serial.print ("        Term 3= ");
Serial.print (termometro3,1);
Serial.print ("        Term 4= ");
Serial.print (termometro4,1);
Serial.print ("        Term 5= ");
Serial.println (termometro5,1);
delay(1000);
}

Antes de proceder a cargarlo vamos a colocar los datos de referencia

Donde dice:

t1 = map(analogRead(0),450,631,1000,0);

debemos reemplazar los valores en rojo por las lecturas que tomamos a 0° y a 100° para la sonda 1, asi:

t1 = map(analogRead(0),452,632,1000,0);

Luego igual con la sonda2, 3, 4 y 5

En mi caso quedaría asi:
t1 = map(analogRead(0),452,632,1000,0); // a 0°C la lectrura de analgRead es 140 y a 100°C es 99
t2 = map(analogRead(1),459,630,1000,0);// calibrar cada sonda por separado y poner los valores correspondientes en map
t3 = map(analogRead(2),450,629,1000,0);
t4 = map(analogRead(3),449,628,1000,0);
t5 = map(analogRead(4),473,641,1000,0);

Hecho esto grabamos y levantamos el código a arduino, activamos el monitor y tenemos que tener lectura igual +/- 1° en todas las sondas marcando temperatura ambiente

Así:

con1digito

Listo, ahora podemos usar nuestras sonda por separado, probamos si da el cero con agua con hielo, o la temperatura corporal etc.

Este dispositivo voy a usarlo en unas pruebas interesantes de calor y tempertura en una próxima entrada.

25 comentarios:

  1. Hola cesar buen día! Una consulta, hasta cuantos metros se podría extender la cables con los sensores? Gracias Saludos

    ResponderEliminar
  2. Hola Leo, no hice pruebas pero yo no lo extendería a mas de 1 metro, cuando haces la calibración igual se compensa pero son tan pocos los mV de variación que temo no sea muy bueno poner cables muy largos.

    ResponderEliminar
  3. Sensacional trabajo, César. Un saludo.
    Luis.

    ResponderEliminar
  4. Silvana Pennacchioni1 de mayo de 2013, 3:09

    Excelente!! adelante con todo!

    ResponderEliminar
  5. intente replicarlo y por agluna razon no me funciono

    ResponderEliminar
  6. No tiene secretos, lo único que hayas puesto los diodos al revés, empezá con una sonda hasta que mida, después seguís con las demás. No se que placa arduino tenés, hay algunas viejitas que no soportan el analogRead, pero igual debería leer.

    ResponderEliminar
  7. Muy bueno. Mis felicitaciones por el proyecto.

    ResponderEliminar
  8. arduino 1, donde te puedo mandar una foto del montaje o algo

    ResponderEliminar
  9. por otro lado me gustaria charlar con usted por el skype o cuenta de correo , para intercambiar experiencias(que me enseñe alguito)

    ResponderEliminar
  10. mi email es cesarguazzaroni@gmail.com

    ResponderEliminar
  11. Hola cesar , un proyecto muy bonito ,,,, ¿hasta que temperatura se puede medir con esos diodos ?

    ResponderEliminar
  12. Hola Domingo, parece que la máxima temperatura a medir es la máxima que soporta la juntura del diodo, según el datasheet, son 200°C, anuque primero petara el plástico y el termocontraible.
    Saludos

    ResponderEliminar
  13. cesar el recubrimiento con cinta negra termocontraible es nesesaria, que tal si sumerjo los diodos sin ese recubrimiento

    ResponderEliminar
  14. No creo haya problemas en ponerlos sin el termocontraíble, lo que deberás cuidar es que no se toquen los dos terminales, estaba pensando en hacer una sonda con un tubo de bronce de 3 o 5 cm de unos 2,5 mm de diámetro creo que quedaría mas "presentable" si lo hago pondré detalles.

    ResponderEliminar
  15. Hola, estoy en un proyecto donde tengo que leer 16 termocuplas (estoy pensando multiplexarlas 16-1) y solo leer un valor analogico, ya que tambien llevan un circuito de acondicionamiento para punto frio (Ad594, AD595) y seria muy costoso utilizar 16 de estos (20 dolares aprox), en esta parte a veces se utilizan termopares tipo J o K, tendria que utilizar otro Demultiplexor para cuando detecte union tipo J o K la senal pase por uno o por otro acondicionador.

    Mi duda es que tiempo tarda en leer una señal analogica y procesarla, ya que me recomiendan tomar 100 lecturas por cada termopar para tener una lectura confiable. Serian 1600 lecturas analogicas para las 16 entradas.

    Despues tendre que implementar un PID para controlar 16 salidas, (utilizare 15 pwm por hardware del arduino mega y necesitaria otra salida mas por software.)

    ResponderEliminar
  16. Hola Cesar.
    Yo para calibrar las sondas de temperatura, tanto con temperaturas positivas como negativas utilizo una célula peltier acoplado a un disipador grande para tener una buena inercia termica, en este caso es aconsejable que sea lenta.
    También se puede controlar la célula peltier con un sistema PID y situar todo el conjunto de calibración en un recinto aislado térmicamente, cuanto mas parecido a un termo mejor (la sonda de temperatura de toma de datos para ajustar el PID ha de estar calibrada y tener la resolución necesaria).

    Para ajustar las sondad de medida como las que tu usas, se puede realizar un montaje en un recinto como el que he descrito o uno similar y utilizar junto con el arduino una sonda calibrada.
    en un programa que mide la temperatura de la sonda calibrada y la de las que deseamos calibrar establecemos unos puntos de medida y vemos las diferencias con nuestras sondas.

    De este modo podemos establecer la calibración en modo casi automático.

    Un factor importante: Una buena unión térmica entre las sondas a calibrar y el sistema de calibración , se puede usar silicona como la que se utiliza para colocar los transistores de potencia en los disipadores o los procesadores de nuestros ordenadores al disipador.

    No me extiendo más.

    Saludos.

    Juan

    ResponderEliminar
  17. Muchas gracias Juan, efectivamente las sondas no quedan apareadas ciento por ciento, hay diferencias de +/- 0.5 °C, Creo que sería conveniente colocar el diodo dentro de un tubo de bronce con jalea siliconada.

    ResponderEliminar
  18. Excelente proyecto! Mis felicitaciones César!
    siga así :D
    saludos!

    ResponderEliminar
  19. alexander marquez31 de julio de 2013, 5:37

    saludos profesor es un excelente trabajo, disculpe soy estudiante de ing forestal en Venezuela y estoy tratando de hacer los mismo con 6 sensores de temperatura lm35 pero meha sido imposible hacer que arraque mi codigo solo me muestra en la lcd 16x2 las casillas donde deben ir los valores en blanco, sera posible que me ayude a revisar mi codigo, tengo una tarjeta arduino uno r3, 6 sensores lm 35, y una pantalla lcd 16x2

    ResponderEliminar
  20. Mandame el código en un e-mail y veré si puedo ayudarte. No soy muy bueno en programación pero intentaré ver cual es el problema

    ResponderEliminar
  21. alexander neil araque31 de julio de 2013, 10:45

    Saludos profesor, el problema es que no me sale ningún resultado en la pantalla solo muestra inicio temp1 temp2 temp3 temp4 temp5 temp6 , pero no resultados de las mediciones, muchas gracias profesor, no sabe cuanto le agradezco me pueda ayudar, saludos desde Venezuela

    #include /* The circuit: * LCD RS pin to digital pin 8 * LCD Enable pin to digital pin 9 * LCD D4 pin to digital pin 4 * LCD D5 pin to digital pin 5 * LCD D6 pin to digital pin 6 * LCD D7 pin to digital pin 7 * LCD R/W pin to ground */

    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    int temp1; int temp2; int temp3; int temp4; int temp5; int temp6;

    int temp1_analogPin = A0; int temp2_analogPin = A1; int temp3_analogPin = A2; int temp4_analogPin = A3; int temp5_analogPin = A4; int temp6_analogPin = A5;

    void setup () { lcd.begin(16, 2); lcd.clear();

    lcd.print("INICIO"); delay(6000); lcd.clear(); lcd.setCursor(0,1);

    lcd.setCursor(0,0); lcd.print("temp1: tem2:"); delay(10000); lcd.clear();

    lcd.setCursor(0,1); lcd.print("temp3: temp4:"); delay(10000); lcd.clear();

    lcd.setCursor(0,0); lcd.print("temp5: temp6:"); delay(10000); lcd.clear();

    }

    void loop()

    { Temp1 = analogRead(temp1_analogPin);

    delay(10000); temp1_value_clear();

    temp2 = analogRead(temp2_analogPin); delay(10000); temp_value_clear();

    temp3 = analogRead(temp3_analogPin); delay(10000); temp3_value_clear();

    temp4 = analogRead(temp4_analogPin); delay(10000); temp4_value_clear();

    temp5 = analogRead(temp5_analogPin); delay(10000); temp5_value_clear();

    temp6 = analogRead(temp6_analogPin); delay(10000); temp6_value_clear();

    tempagua = analogRead(tempagua_analogPin); delay(10000);

    }

    void temp1_value_clear(void) { unsigned char i; for(i=0 ; i<2 ; i++) { lcd.setCursor(2,i); // set cursor position lcd.print(" "); }

    for(i=0 ; i<2 ; i++) { lcd.setCursor(10,i); // set cursor position lcd.print(" "); } } void temp2_value_clear(void) { unsigned char i ; for(i=0 ; i<2 ; i++) { lcd.setCursor(2,i); // set cursor position lcd.print(" "); }

    for(i=0 ; i<2 ; i++) { lcd.setCursor(10,i); // set cursor position lcd.print(" "); } } void temp3_value_clear(void) { unsigned char i ; for(i=0 ; i<2 ; i++) { lcd.setCursor(2,i); // set cursor position lcd.print(" "); }

    for(i=0 ; i<2 ; i++) { lcd.setCursor(10,i); // set cursor position lcd.print(" "); } } void temp4_value_clear(void) { unsigned char i ; for(i=0 ; i<2 ; i++) { lcd.setCursor(2,i); // set cursor position lcd.print(" "); }

    for(i=0 ; i<2 ; i++) { lcd.setCursor(10,i); // set cursor position lcd.print(" "); } } void temp5_value_clear(void) { unsigned char i ; for(i=0 ; i<2 ; i++) { lcd.setCursor(2,i); // set cursor position lcd.print(" "); }

    for(i=0 ; i<2 ; i++) { lcd.setCursor(10,i); // set cursor position lcd.print(" "); } } void temp6_value_clear(void) { unsigned char i ; for(i=0 ; i<2 ; i++) { lcd.setCursor(2,i); // set cursor position lcd.print(" "); }

    for(i=0 ; i<2 ; i++) { lcd.setCursor(10,i); // set cursor position lcd.print(" "); } }

    ResponderEliminar
  22. gracias por el aporte lo voy a probar

    ResponderEliminar
  23. Tendra el archivo en formato *.ino ya que me sale un error....

    ResponderEliminar
  24. el código esta en texto de la entrada, algunos comandos responden solo a ciertas placas, fijate el comando de la linea que da el error y como debe escribirse para la placa que vos tenes.

    ResponderEliminar