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.
Circuito eléctrico
Esta imagen muestra como ejemplo la conexión de dos de ellas
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.
Las cinco sondas
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:
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.
Tomamos nota de las lecturas
Por ejemplo en mi caso fueron:
Numero de sonda | Lectura a 0° |
1 | 632 |
2 | 630 |
3 | 629 |
4 | 628 |
5 | 641 |
Ahora hacemos lo mismo pero colocando las sondas en agua hirviendo
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 sonda | Lectura a 100° |
1 | 452 |
2 | 459 |
3 | 450 |
4 | 449 |
5 | 473 |
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í:
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.
Hola cesar buen día! Una consulta, hasta cuantos metros se podría extender la cables con los sensores? Gracias Saludos
ResponderEliminarHola 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.
ResponderEliminarSensacional trabajo, César. Un saludo.
ResponderEliminarLuis.
Excelente!! adelante con todo!
ResponderEliminarintente replicarlo y por agluna razon no me funciono
ResponderEliminarNo 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.
ResponderEliminarMuy bueno. Mis felicitaciones por el proyecto.
ResponderEliminararduino 1, donde te puedo mandar una foto del montaje o algo
ResponderEliminarpor otro lado me gustaria charlar con usted por el skype o cuenta de correo , para intercambiar experiencias(que me enseñe alguito)
ResponderEliminarmi email es cesarguazzaroni@gmail.com
ResponderEliminarHola cesar , un proyecto muy bonito ,,,, ¿hasta que temperatura se puede medir con esos diodos ?
ResponderEliminarHola 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.
ResponderEliminarSaludos
cesar el recubrimiento con cinta negra termocontraible es nesesaria, que tal si sumerjo los diodos sin ese recubrimiento
ResponderEliminarNo 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.
ResponderEliminarHola, 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.
ResponderEliminarMi 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.)
Hola Cesar.
ResponderEliminarYo 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
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.
ResponderEliminarExcelente proyecto! Mis felicitaciones César!
ResponderEliminarsiga así :D
saludos!
[…] ← Cinco termómetros a la vez con Arduino […]
ResponderEliminarsaludos 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
ResponderEliminarMandame 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
ResponderEliminarSaludos 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
ResponderEliminar#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(" "); } }
gracias por el aporte lo voy a probar
ResponderEliminarTendra el archivo en formato *.ino ya que me sale un error....
ResponderEliminarel 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