Montaje 10: Termómetro digital

Requisitos:

  • Una termorresistencia NTC, una resistencia de 1K
  • Un display de 7 segmentos

Planteamiento: Leeremos nuestra fiebre en el display.

Presentación de: Adquisición de datos

A no ser que dispongamos de la curva de respuesta de la NTC o que seamos capaces de hacer un ajuste de los datos, el comportamiento no lineal del sensor nos va a impedir construir un termómetro de forma sencilla.

Lo que sí podemos hacer es reducir el intervalo de medida de forma que, dentro de ese intervalo, el comportamiento sea aproximadamente lineal y conocer y apechugar con el posible error involucrado.

Para una NTC de 150 ohmios el intervalo que correspondería a un termómetro clínico (35-41) presenta un comportamiento razonable.

En este montaje podemos comprobar primero la no linealidad de la respuesta y luego limitarnos a esta zona que es aproximadamente lineal.

Para ello, situamos nuestro sensor en el agua que se forma al derretirse hielo, con lo que tenemos el valor de la señal a 0 grados (780).

Usando un termómetro convencional y agua templada y caliente podemos obtener otros valores y comprobar cómo no se mantienen las proporciones entre los aumentos en la temperatura y en los valores de las señales.

Para obtener los valores de las señales podemos usar el mismo proceso de monitorización descrito en el ejercicio termostato?.

Para representar luego los valores de las medidas usaremos procedimientos similares a los del ejercicio cuenta atrás?.

Tenemos que calibrar el sensor con una fuente externa y lo haremos colocándolo en agua caliente con un termómetro que servirá de referencia y anotando los valores de temperatura para el momento en que el display cambia de dígito.

Una vez que tenemos la tabla de los valores:

GradosSeñal
39.7952
38.2950
37.3948
36.6946
35.7944

Damos el salto (un poco sin red) de redondear alegremente y considerar que un aumento de uno en la señal corresponderá a medio grado de temperatura. Así podremos mapear linealmente los valores de señal en valores de temperatura que se mostrarán en el display.

Para representar la temperatura con valores de medio grado introducimos el octavo segmento del display: el punto. Para aprovechar los procedimientos del ejercicio cuenta atrás? tratamos este segmento aparte, asignándole una salida digital fuera de la cadena e incluyendo su apagado en los procedimientos que nos muestran los otros dígitos.

Variantes:

  • Crea una cadena que guarde los valores de las últimas dos temperaturas medidas y permita recuperarlos.
  • Idea una forma de guardar en cadenas los valores de las temperaturas para no tener que indicarlos cada vez explícitamente.
  • Busca la forma de guardar en cadenas los números de dos cifras (y el punto) y crea un procedimiento que los muestre.

VIDEO DEL MONTAJE 10

CODIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

 int cadenasegmentos[]={4,6,7,8,9,11,12};      //cadena en la que se guardan los PINes de las salidas digitales
 int cero[]={1,1,1,1,0,1,1};
 int uno[]={0,0,0,1,0,1,0};                    //tenemos un 0 por cada segmento apagado y un 1 por cada uno encendido 
                                               //en el PIN correspondiente a su posición en la cadena
 int dos[]={1,0,1,1,1,0,1};                    //contando en este orden;
 int tres[]={1,0,0,1,1,1,1};                   //                1                      
 int cuatro[]={0,1,0,0,1,1,0};                 //              -----
 int cinco[]={1,1,0,0,1,1,1};                  //            |       |
 int seis[]={0,1,1,0,1,1,1};                   //          2 |   5   | 4  
 int siete[]={1,0,0,1,0,1,0};                  //              -----
 int ocho[]={1,1,1,1,1,1,1};                   //            |       |
 int nueve[]={1,1,0,1,1,1,0};                  //          3 |       | 6
 int ntc=0;                                    //              -----
 int n=0;                                      //                7
 int medida=0; 
 int punto=3;                                  // el octavo segmento, el punto, lo tratamos aparte
 int temperatura=0;
 void setup(){                        
   for(n=0;n<7;n++){                      
     pinMode(cadenasegmentos[n],OUTPUT);   
   }
   pinMode(3,OUTPUT); 
   beginSerial(9600);
 }
 void CERO(){
   for(n=0;n<7;n++){
     if (cero[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);  
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW);
     }
   }
   digitalWrite(3,HIGH);                       //para tener apagado el punto
 }
 void UNO(){
   for(n=0;n<7;n++){
     if (uno[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
   digitalWrite(3,HIGH);
 }
 void DOS(){
   for(n=0;n<7;n++){
     if (dos[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
   digitalWrite(3,HIGH);
 }
 void TRES(){
   for(n=0;n<7;n++){
     if (tres[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
   digitalWrite(3,HIGH);
 }
 void CUATRO(){
   for(n=0;n<7;n++){
     if (cuatro[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
   digitalWrite(3,HIGH);
 }
 void CINCO(){
   for(n=0;n<7;n++){
     if (cinco[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
   digitalWrite(3,HIGH);
 }
 void SEIS(){
   for(n=0;n<7;n++){
     if (seis[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
   digitalWrite(3,HIGH);
 }
 void SIETE(){
   for(n=0;n<7;n++){
     if (siete[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
   digitalWrite(3,HIGH);
 }
 void OCHO(){
   for(n=0;n<7;n++){
     if (ocho[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
   digitalWrite(3,HIGH);
 }
 void NUEVE(){
   for(n=0;n<7;n++){
     if (nueve[n]==0){
       digitalWrite(cadenasegmentos[n],HIGH);
     }
     else{
       digitalWrite(cadenasegmentos[n],LOW); 
     }
   }
 digitalWrite(3,HIGH);
 }
 void PUNTO(){
   digitalWrite(3,LOW);                        //enciende el punto
 }   
 void monitoriza(){                            //procedimiento que envía al display los valores de la señal del sensor
   printInteger(medida);
   printString("       ");
   delay(100);
 } 
 void treintayseis(){
   TRES();
   delay(2000);
   SEIS();
   delay(2000);
 } 
 void treintayseisymedio(){
   TRES();
   delay(2000);
   SEIS();
   delay(2000);
   PUNTO();
   delay(2000);
   CINCO();
   delay(2000);
 }
 void treintaysiete(){
   TRES();
   delay(2000);
   SIETE();
   delay(2000);
 }  
 void treintaysieteymedio(){
   TRES();
   delay(2000);
   SIETE();
   delay(2000);
   PUNTO();
   delay(2000);
   CINCO();
   delay(2000);
 }  
 void treintayocho(){
   TRES();
   delay(2000);
   OCHO();
   delay(2000);
 }  
 void treintayochoymedio(){
   TRES();
   delay(2000);
   OCHO();
   delay(2000);
   PUNTO();
   delay(2000);
   CINCO();
   delay(2000);
 } 
 void treintaynueve(){
   TRES();
   delay(2000);
   NUEVE();
   delay(2000);
 }  
 void treintaynueveymedio(){
   TRES();
   delay(2000);
   NUEVE();
   delay(2000);
   PUNTO();
   delay(2000);
   CINCO();
   delay(2000);
 } 
 void cuarenta(){
   CUATRO();
   delay(2000);
   CERO();
   delay(2000);
 } 
 void cuarentaymedio(){
   CUATRO();
   delay(2000);
   CERO();
   delay(2000);
   PUNTO();
   delay(2000);
   CINCO();
   delay(2000);
 } 
 void cuarentayuno(){
   CUATRO();
   delay(2000);
   UNO();
   delay(2000);
 }  
 void loop(){
   medida=analogRead(ntc);
   delay(100);
   monitoriza();                           
   temperatura=(36+((medida-945)/2));
   if(temperatura==36){
     treintayseis();
   }
   if(temperatura==36+(1/2)){
     treintayseisymedio();
   }
   if(temperatura==37){
     treintaysiete();
   }
   if(temperatura==37+(1/2)){
     treintaysieteymedio();
   }
   if(temperatura==38){
     treintayocho();
   }
   if(temperatura==38+(1/2)){
     treintayochoymedio();
   }
   if(temperatura==39){
     treintaynueve();
   }
   if(temperatura==39+(1/2)){
     treintaynueveymedio();
   }
   if(temperatura==40){
     cuarenta();
   }
   if(temperatura==40+(1/2)){
     cuarentaymedio();
   }
   if(temperatura==41){
     cuarentayuno();
   }
   for (n=0;n<7;n++){                          //si la temperatura está fuera del rango (36º-41º) muestra el punto
     digitalWrite(cadenasegmentos[n],HIGH);
   }
   digitalWrite(3,LOW);
 }

Volver?

  Copyright (c) 2006  Juan Carlos Alonso de Mena

  Permission is granted to copy, distribute and/or modify this document under the terms of 
 the GNU Free Documentation License, Version 1.2 or any later version published by the
 Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no
 Back-Cover Texts.  A copy of the license is included in the section entitled 
 GNU Free Documentation License?.