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:
| Grados | Señal |
| 39.7 | 952 |
| 38.2 | 950 |
| 37.3 | 948 |
| 36.6 | 946 |
| 35.7 | 944 |
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?.