Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Calibrador de Presión PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 119

UNIVERSIDAD NACIONAL DE SAN AGUSTIN DE AREQUIPA

ESCUELA DE POSGRADO
UNIDAD DE POSGRADO DE LA FACULTAD DE INGENIERIA DE
PRODUCCION Y SERVICIOS

MAESTRIA EN CIENCIAS: INGENIERIA ELECTRONICA CON


MENCION EN AUTOMATIZACION E INSTRUMENTACION

DISEÑO E IMPLEMENTACION DE UN CALIBRADOR DE


PRESION PARA EQUIPOS BIOMEDICOS

Tesis para optar el Grado Académico de Maestro en Ciencias: Ingeniería


Electrónica con Mención en Automatización e Instrumentación

Bachiller en Ingeniería Electrónica: José Angel Valdez Flores


Asesor: Dr. Ing. Raúl Sulla Torres

AREQUIPA – PERU
2017
A la memoria de mi abuela.

A mi padre, por fortalecerme.

A mi madre, por sus sabias enseñanzas.

A mi hermana, por su incondicional apoyo.


INDICE

Pág.

RESUMEN 1

CAPITULO I

GENERALIDADES

1.1 MARCO REFERENCIAL 2


1.1.1 TITULO PRELIMINAR 2
1.1.2 AREA 2
1.1.3 RESPONSABLE 2
1.1.4 ASESOR 2
1.1.5 AMBITO GEOGRAFICO 2
1.2 EL PROBLEMA 3
1.2.1 SELECCION DEL PROBLEMA 3
1.2.2 FORMULACION DEL PROBLEMA 3
1.2.3 JUSTIFICACION DEL ESTUDIO 4
1.2.4 ALCANCES Y LIMITACIONES DE LA INVESTIGACION 5
1.2.5 OBJETIVO GENERAL 5
1.2.6 OBJETIVOS ESPECIFICOS 5
1.3 HIPOTESIS Y VARIABLES 6
1.3.1 HIPOTESIS 6
1.3.2 VARIABLES 6

1.3.2.1 Variables Independientes 6

1.3.2.2 Variable Dependiente 6

1.3.2.3 Variable Interviniente 6

CAPITULO II

FUNDAMENTACION TEORICA

2.1 ANTECEDENTES DEL PROBLEMA 7


2.2 MARCO TEORICO 8
2.2.1 INSTRUMENTACION ELECTRONICA 8
2.2.2 SISTEMAS DIGITALES EN INSTRUMENTACION ELECTRONICA 8
2.2.3 TRANSDUCTORES, SENSORES Y ACCIONAMIENTOS 8
2.2.3.1 PROPIEDADES DE LOS SENSORES 10
2.2.3.2 TIPOS DE SENSORES 12
2.2.3.3 SENSORES RESISTIVOS 14
2.2.3.3.1 DETECTORES DE TEMPERATURA RESISTIVOS (RTD) 14
2.2.3.3.2 HIGROMETROS RESISTIVOS 16
2.2.3.3.3 SENSORES DE PRESION 16
2.2.3.3.4 MEDIDA DE RESISTENCIAS 16
2.2.3.4 BOMBA DE AIRE MECANICA 17
2.2.4 INSTRUMENTACION DIGITAL 18
2.2.5 RELOJ EN TIEMPO REAL(RTC) 18
2.2.6 CIRCUITO INTEGRADO MAX232 19
2.2.7 PROCESAMIENTO DE DATOS 19
2.2.7.1 SISTEMAS DE MEDIDA 19
2.2.8 EL MICROCONTROLADOR 21
2.2.8.1 ARQUITECTURA INTERNA 21
2.2.8.1.1 El Procesador 22
2.2.8.1.2 Memoria de programa 23
2.2.8.1.3 Memoria de datos 25
2.2.8.1.4 Líneas de E/S para los controladores de periféricos 25
2.2.8.1.5 Recursos auxiliares 25
2.2.8.2 PROGRAMACION DE MICROCONTROLADORES 26
2.2.8.3 INSTRUMENTAL DE TRABAJO 26
2.2.8.3.1 El microcontrolador AVR 27
2.2.8.3.2 Arquitectura del microcontrolador AVR 27
2.2.8.3.3 El registro de estado 28
2.2.8.3.4 Registro de propósito general 30
2.2.9 PROGRAMACION DEL MICROCONTROLADOR 31
2.2.9.1 LA GESTION DE LOS PUERTOS 31
2.2.9.2 PROGRAMACION EN LENGUAJE C 32
2.2.9.3 ESTRUCTURA DE UN PROGRAMA 32
2.2.9.4 VARIABLES Y CONSTANTES 32
2.2.9.5 OPERADORES 34
2.2.9.6 FUNCIONES 35
2.2.9.7 DECLARACIONES DE CONTROL 35
2.2.10 EL TRANSISTOR COMO INTERRUPTOR 37
2.2.11 FUENTES DE ALIMENTACION REGULADAS 38
2.2.12 FILTROS RC ACTIVOS 38
2.2.13 PRESION ARTERIAL 39
2.2.14 MEDICION DE LA PRESION ARTERIAL 39

CAPITULO III

DISEÑO E IMPLEMENTACION DEL CALIBRADOR

3.1 GENERALIDADES 41
3.2 FUENTE DE ALIMENTACION 43
3.3 CIRCUITO DE CONTROL 45
3.3.1 CIRCUITO DE ACTIVACION DE BOMBA DE DIAFRAGMA 46
3.3.2 CIRCUITO DE ACTIVACION DE VALVULA DE DESCARGA 47
3.3.3 CIRCUITO DE COMUNICACIÓN RS232 48
3.3.4 CIRCUITO DE RELOJ EN TIEMPO REAL 49
3.3.5 TARJETA ELECTRONICA BASADA EN MICROCONTROLADOR 50
3.4 INTERFAZ DE USUARIO 57
3.4.1 CIRCUITO PARA EL INGRESO DE DATOS 57
3.4.2 CIRCUITO PARA LA VISUALIZACION DE DATOS 57
3.4.3 ZUMBADOR E INDICADORES VISUALES 57
3.5 ESPECIFICACIONES TECNICAS 58

CAPITULO IV

PRUEBAS Y RESULTADOS EXPERIMENTALES

4.1 PRUEBAS EXPERIMENTALES 59


4.2 RESULTADOS EXPERIMENTALES 61

CAPITULO V

CONCLUSIONES Y RECOMENDACIONES

5.1 CONCLUSIONES 63
5.2 RECOMENDACIONES 64

REFERENCIAS BIBLIOGRAFICAS 65
ANEXOS 68
1

RESUMEN

En el presente trabajo se desarrolla un equipo de calibración de presión


que permite la verificación del correcto funcionamiento de un equipo de
medición de presión arterial, no invasivo, incluyendo la medición de la
altitud, temperatura, humedad, presión, así como la visualización de los
parámetros que intervienen en el proceso de calibración; presentando un
sistema electrónico adecuado a las condiciones del entorno.
Específicamente se realiza el cálculo de altura, humedad, temperatura,
tiempo, para registrar las condiciones a las que se encuentra sometido el
equipo en el momento de realizar la calibración, de igual modo se obtiene
un valor del sensor de presión para actuar sobre un sistema de
acumulación de aire, que a su vez se conecta a un equipo de medición de
presión arterial, realizando la comparación de valores obtenidos.

El trabajo se divide en cinco capítulos. En el primer capítulo se describen


los lineamientos generales que orientaron el desarrollo de la tesis. El
segundo capítulo comprende la fundamentación teórica, donde se
presentan los diferentes conceptos relacionados con el presente trabajo.
En el tercer capítulo se presenta el diseño y la construcción del sistema. El
cuarto capítulo está referido a las pruebas que consolidan el diseño.
Finalmente las conclusiones y recomendaciones.

Haciendo un análisis del presente trabajo, se logra cumplir con la hipótesis


planteada, teniendo un sistema electrónico que optimiza el proceso de
calibración de acuerdo a las condiciones del entorno.
2

CAPITULO I

GENERALIDADES

1.4 MARCO REFERENCIAL

1.4.1 TITULO PRELIMINAR

“DISEÑO E IMPLEMENTACION DE UN CALIBRADOR DE PRESION PARA


EQUIPOS BIOMEDICOS”

1.4.2 AREA

Instrumentación Electrónica

1.4.3 RESPONSABLE

Ing. José Angel Valdez Flores

1.4.4 ASESOR

Dr. Ing. Raúl Sulla Torres

1.4.5 AMBITO GEOGRAFICO

Universidad Nacional de San Agustín

Av. Venezuela S/N Cercado Arequipa-Perú


3

1.5 EL PROBLEMA

1.2.1 SELECCION DEL PROBLEMA

Los establecimientos de salud cuentan con equipos que registran la presión


arterial de los pacientes como parte del diagnóstico médico.

Los equipos de calibración tienen un costo elevado, presentan error de escala


y estos no son producidos en el país.

Existen normas que establecen la calibración de equipos médicos por lo


menos una vez al año en todos los establecimientos de salud, como es el
caso de los equipos de medición de presión arterial no invasiva.

1.2.2 FORMULACION DEL PROBLEMA

Uno de los equipos médicos utilizados para la medición de la presión arterial


no invasiva es el tensiómetro, siendo parte importante del diagnóstico médico
a realizar, razón por la cual estos instrumentos de medición tienen que
encontrarse en óptimo estado de funcionamiento.

Los equipos de calibración sufren desperfectos de funcionamiento debido a la


diversidad de climas en nuestro territorio nacional, influyendo también la altura
de trabajo a la que pueden verse sometidos, esto se traduce en una variación
de la escala la cual tiene que ser compensada en los informes técnicos de
calibración, sin considerar el desgaste mecánico producido por el transporte
de los mismos, debiendo trabajar en algunos casos sobre los 5000 m.s.n.m.
4

Las empresas dedicadas al servicio de calibración presentan dificultades en el


caso de inoperatividad del equipo, tanto los repuestos como el servicio técnico
no se encuentran en el mercado local, representando un costo de
mantenimiento elevado derivando en la obsolescencia del equipo.

La calibración de los tensiómetros es realizada por personal técnico calificado,


representando un costo adicional para los establecimientos de salud.

1.2.3 JUSTIFICACION DEL ESTUDIO

Los equipos de medición de presión arterial no invasiva, presentan errores de


funcionamiento debido al uso continuo de los mismos, esto conlleva a errores
de diagnóstico comprometiendo la salud e inclusive poniendo en riesgo la vida
de los pacientes.

Los establecimientos de salud contarán con un equipo sencillo de operar, con


el cual pueden calibrar sus instrumentos para medición de la presión arterial
no invasiva, teniendo además un modo automático para un fácil manejo del
mismo, contando con una interfaz de usuario amigable.

Los costos de calibración serán reducidos, en razón de que estas pueden


realizadas por personal interno, contando con servicio técnico local; esto
beneficiará a hospitales, clínicas, centros médicos, empresas dedicadas al
mantenimiento de equipos médicos, debido a que incrementarán sus ingresos
económicos.

El diseño del equipo de calibración se encuentra acorde a las condiciones


climáticas del territorio peruano, considerando las variaciones que pueden
presentarse por la temperatura y altura de trabajo a la que se encuentre
sometido, mejorando de esta manera la calidad en los resultados.
5

1.2.4 ALCANCES Y LIMITACIONES DE LA INVESTIGACION

El área de trabajo se enmarca dentro de la Instrumentación Electrónica.

La aplicación será principalmente para equipos de medición aneroides, puesto


que los establecimientos de salud optan por estos equipos debido a que son
libres de mercurio y presentan menor incidencia de errores que los digitales.

1.2.5 OBJETIVO GENERAL

El objetivo del proyecto es diseñar un sistema electrónico que permita la


calibración de instrumentos de medición de presión arterial no invasiva, con
una fácil manipulación del sistema, haciendo posible la verificación,
visualización y exportación de los resultados obtenidos.

1.2.6 OBJETIVOS ESPECIFICOS

 Diseñar un sistema de medición de presión en el rango de 0-400


mmHg.
 Diseñar un sistema de visualización de parámetros.
 Diseñar un sistema de calibración manual y automática de acuerdo al
protocolo.
 Diseñar un sistema de generación de presión de aire.
 Diseñar un sistema de medición de temperatura y humedad, para
registro de condiciones de calibración.
 Diseñar un sistema para medición de fugas de aire.
 Diseñar un sistema de generación de protocolos mediante interfaz
RS232.
 Ensamblar los componentes del equipo de calibración.
 Poner en operación y realizar pruebas de funcionamiento.
6

1.6 HIPOTESIS Y VARIABLES

1.3.1 HIPOTESIS

El calibrador proporcionará niveles de presión estables, el margen de error de


medición permitido será de ±3 mmHg, se tendrá un procesamiento de la señal
de temperatura y humedad para registrar las condiciones en que se realiza la
medición; se visualizarán mediante un display.

1.3.2 VARIABLES

1.3.2.1 Variables Independientes

 Humedad
 Temperatura

1.3.2.2 Variable Dependiente

 Presión

1.3.2.3 Variable Interviniente

 Altura
7

CAPITULO II

FUNDAMENTACION TEORICA

2.3 ANTECEDENTES DEL PROBLEMA

En el Hospital del MINSA en la ciudad del Cusco, se pudo observar que


quince instrumentos de medición de presión arterial HOMEDICS BPA 300 se
encontraban fuera de rango.

En EsSalud Cusco se pudo observar que al fallar un tensiómetro,


frecuentemente se cambiaban los manómetros, puesto que no se contaba con
un equipo calibrador de presión.

En la Clínica SANNA, se pudo observar que los esfigmomanómetros


presentaban desajustes en su calibración, sobre todo los digitales, mostrando
erróneamente alta presión en pacientes, esto era corroborado debido a que
posteriormente se realizaban mediciones en consultorio con instrumentos
debidamente calibrados, no cuenta con calibrador de presión, el servicio es
tercerizado.

En la Clínica Arequipa, se pudo observar que la aguja de un


esfigmomanómetro se encontraba fuera de rango, teniendo esta que ser
ajustada mecánicamente para operar dentro de los parámetros adecuados, no
cuentan con calibrador de presión.
8

En la empresa SERMED, se pudo observar que el equipo de calibración


presentaba error de -8 mmHg el cual se compensaba en el resultado final,
adicionándolo al valor obtenido.

2.4 MARCO TEORICO

2.2.1 INSTRUMENTACION ELECTRONICA

Es el área de la electrónica que está orientada a la medición de distintos tipos


magnitudes mediante la utilización de recursos electrónicos. Estas mediciones
pueden ser convenientemente tratadas de tal manera que se actúe en el
proceso sobre el cual las magnitudes se encuentran implicadas, dando lugar al
control y monitoreo electrónico. [1]

2.2.4 SISTEMAS DIGITALES EN INSTRUMENTACION ELECTRONICA

Este tipo de sistemas presenta insensibilidad al ruido, adecuado aislamiento


galvánico por el uso de optoacopladores, capacidad de sincronización y
control, almacenamiento de información, procesado de las señales medidas,
autocalibración de sensores, presentación de datos adaptable a diferentes
tipos de pantalla, flexibilidad en el diseño, facilidad en la manipulación y
transmisión de datos. [2]

2.2.5 TRANSDUCTORES, SENSORES Y ACCIONAMIENTOS

Un transductor en general, es todo dispositivo que transforma una cantidad


física, en otra equivalente; por ejemplo, la incidencia de la luz en una
fotoresistencia, puede generar una variación en la resistencia eléctrica del
dispositivo.
9

En un sentido más amplio, un transductor no se limita a la medición de


cantidades físicas, también son empleados para medir o detectar propiedades
químicas y biológicas. Por lo que, es un dispositivo que absorbe energía de un
sistema y la transforma, cediéndola a otro sistema.

Una definición útil se encuentra en Pallas 1 “Un sensor es un dispositivo que, a


partir de la energía del medio donde se mide, da una señal de salida
transducible que es función de la variable medida. Sensor y transductor se
emplean a veces como sinónimos, pero sensor sugiere un significado más
extenso: la ampliación de los sentidos para adquirir un conocimiento de
cantidades físicas que, por su naturaleza o tamaño, no pueden ser percibidas
directamente por los sentidos”.
En un transductor, se entiende que la señal de entrada y la de salida no deben
ser homogéneas.

En la actualidad y particularmente en robótica, se emplea la denominación de


sensor para designar el transductor de entrada, y la denominación de actuador
o accionamiento para designar el transductor de salida.
Los primeros pretenden la obtención de información, mientras que los
segundos buscan la conversión de energía.

En adelante se utilizará el término sensor para referirnos a los transductores


de entrada. [3]

1
Pallas, R. Introducción a los sistemas de medida. En su: Sensores y Acondicionadores de Señal.
España: Marcombo, 2003, p.3.
10

2.2.5.1 PROPIEDADES DE LOS SENSORES


La relación existente entre la entrada y la salida de un sensor, cuando
la entrada es constante o cuando ha transcurrido un tiempo hasta que la salida
tome el valor final, se define mediante las características estáticas del sensor.
Alcance, fondo de escala: Es la diferencia entre los máximos y los mínimos
valores entre los que se necesita medir. Se recomienda no utilizar un sensor
para medidas por debajo de 1/10 del máximo valor que se puede medir. Por
ejemplo si un sensor de presión puede medir hasta 1000 Pa, no se debería
utilizar para medir menos de 100 Pa.

Sensibilidad: Es la pendiente de la curva que relaciona la salida eléctrica con


la magnitud física a medir. Figura 2.1

Figura 2.1 Sensibilidad

Resolución: Es el incremento mínimo en el valor de entrada al cual responde


un dispositivo, generando un cambio detectable en la salida.

No-linealidad: En general, la linealidad de un sistema se relaciona con que se


cumpla el principio de superposición y proporcionalidad.
En el contexto de sensores, la no-linealidad se define como “la máxima
desviación de la curva de calibración del sensor con respecto a la línea recta
por la que se ha aproximado. Habitualmente se suele expresar en % con
11

respecto al alcance y suele denominarse como error de linealidad e incluso


como linealidad”. 2 Figura 2.2

Figura 2.2 No linealidad

La no-linealidad será:

𝑥100%
𝑋𝑠 − 𝑋𝑖

Donde,
𝑋𝑠: límite superior.
𝑋𝑖: límite inferior.

Histéresis: En ocasiones los caminos que sigue la gráfica (magnitud-señal


eléctrica) no tienen el mismo comportamiento en el incremento de la magnitud
que en el decremento.

Por ejemplo, si se tiene una balanza cuyo rango es igual a 100 kg. y se va
incrementando gradualmente el peso sobre la balanza hasta llegar al valor
máximo, es probable que la indicación del peso no sea la misma cuando se
disminuya desde el máximo. Si frente a 50 kg. en el primer caso marca 49kg. y
en el segundo caso marca 51kg, la histéresis es de 2kg. o bien expresada
respecto del alcance es del 2%. Figura 2.3 [4]

2
Pérez, M. [y otros]. Características estáticas. En su: Instrumentación Electrónica. España:
Paraninfo. 2003, p. 16.
12

Figura 2.3 Histéresis

𝑀á𝑥𝑖𝑚𝑎 𝑑𝑖𝑓𝑒𝑟𝑒𝑛𝑐𝑖𝑎
𝐻𝑖𝑠𝑡é𝑟𝑒𝑠𝑖𝑠 = 𝑥100%
𝑋𝑠 − 𝑋𝑖

2.2.5.2 TIPOS DE SENSORES


a) Posición, proximidad o presencia
 Finales de carrera mecánicos (Posición)
 Detectores de proximidad:
1. Inductivos:
 Sensibles a materiales ferromagnéticos:
 De contacto auxiliar.
 De bobina.
 Sensibles a materiales metálicos.
2. Capacitivos
3. Ópticos:
 Directos.
 Con fibras ópticas acopladas.
13

b) Desplazamiento o movimiento
1. Medida de grandes distancias
2. Medida de distancias cortas
3. Pequeños desplazamientos
 Resistivos
 Inductivos
 Capacitivos
4. Medidores de ángulos
 Resistivos
 Inductivos
 Capacitivos
 Encoders o digitales: incrementales y absolutos
c) Velocidad
 Tacómetros:
 Mecánicos
 Eléctricos: Tacodinamos y Tacoalternadores
 Ópticos
d) Presión / Fuerza
1. Mecánicos
2. Electromecánicos
 Piezoeléctricos
 Resistivos
 Galgas extensométricas
 Capacitivos
 Resistivos
e) Temperatura
 Termoresistencias
 Termistores:NTC y PTC
 Termopares
 Pirómetros de radiación
14

f) Luz
 Fotoresistencias o LDR
 Fotodiodos
 Fototransistores

Los sensores pueden ser:


Activos: Generan por sí mismos una señal eléctrica.
Pasivos: No generan por sí mismos una señal eléctrica.

En función a la señal de salida, los sensores se pueden clasificar en:

- Analógicos
- Digitales3

En los sensores digitales, el acondicionamiento de la señal de salida se realiza


con mayor facilidad. [3]

2.2.5.3 SENSORES RESISTIVOS


Este tipo de sensores tienen diferentes aplicaciones debido a que varias
magnitudes físicas, pueden ejercer una variación en el valor de la resistencia
eléctrica de un determinado material.

4.2.3.3.1. DETECTORES DE TEMPERATURA RESISTIVOS (RTD)


Este tipo de sensores (cuyas siglas corresponden a Resistive
Temperature Detector) se basan en la propiedad de algunos metales,
que varían su resistencia en función de la temperatura a la cual se ven
sometidos. La mayoría de veces la variación es lineal. Usualmente se
utilizan metales como son el Pt (Platino), y el Ni (Níquel).

3
CATEDU. Sensores, captadores y actuadores. [en línea] <http://e-
ducativa.catedu.es/44700165/aula/archivos/repositorio/4750/4928/html/3_clasificacin_de_trans
ductores.html> [consulta: 24 febrero 2017]
15

Pueden ser de dos tipos:


- NTC (Negative Temperature Coefficient) en el caso de que la
resistencia disminuya con el aumento de temperatura.
- PTC (Positive Temperature Coefficent) en caso contrario, es decir,
su resistencia aumenta a medida que aumenta la temperatura.
La resistencia de la RTD se caracteriza como:

R = R0(1 + αΔT) (PTC)


R = R0(1 - αΔT) (NTC)

ΔT = (T - T0) = (T - 273)

donde la temperatura a que se encuentra la RTD se expresa en grados


Kelvin. De esta forma, cuando T = 273K (0 ºC), entonces tenemos que
R = R0, por lo que R0 es la resistencia a cero grados centígrados.

La sensibilidad (S) es la pendiente de la curva de calibración:

R(T) = R0(1 + α(T - T0)) = R0 + R0α(T - T0) = R0 + R0αT - R0αT0

dR(T)/dT = R0 α

En concreto para la RTD no utilizamos este resultado, sino:

S = (d R(T)/dT)/R0 = α

El parámetro α se denomina coeficiente de temperatura.4 [3][4]

4
Lindemann, W. Transductores: Sensores y actuadores [en línea]
<https://www.academia.edu/9713734/TEMA_4_TRANSDUCTORES_SENSORES_Y_ACTUADORES_1
_-SENSORES_RESISTIVOS> [consulta: 24 febrero 2017]
16

4.2.3.3.2. HIGROMETROS RESISTIVOS


Este tipo de sensores se componen de elementos sensibles a la
humedad, que al ionizarse incrementan la conductividad del medio en el
que se encuentran. Por lo general se mide la humedad relativa, que
viene a ser la relación entre la presión parcial del vapor de agua
presente y la necesaria para que existiera saturación a una temperatura
dada, este valor es expresado en porcentaje. [3][5]

4.2.3.3.3. SENSORES DE PRESION


En este tipo de sensores, al aplicar presión en un cristal de cuarzo se
establecen cargas eléctricas en el mismo, generándose el denominado
efecto piezoeléctrico. Del mismo modo, al someter al cristal a un campo
eléctrico, éste se deforma. Por esta razón, los elementos que presenten
el efecto piezoeléctrico pueden ser utilizados para transformar energía
mecánica en eléctrica y viceversa. [3][5]

4.2.3.3.4. MEDIDA DE RESISTENCIAS


La variación de la resistencia en un sensor resistivo se puede expresar
como R=R0f(x), con f(0)=1. Cuando la relación es lineal se tiene:

El valor de x tiene un margen de variación distinto según el tipo de


sensor y, según el margen de variación de la magnitud que se mide.
Para efectos prácticos se puede decir que varía entre 0 a -1 en el caso
de los potenciómetros lineales de cursor deslizante, y 10-5 a 10-2 para
las galgas extensométricas. Los valores intermedios de x se presentan
en las RTD y termistores (que no sean para conmutación).
En todos los circuitos de medida, hay dos consideraciones generales
para todos los sensores resistivos.
17

En primer lugar, siempre se requiere una alimentación eléctrica para


obtener una señal de salida, debido a que la variación de resistencia en
sí no genera señal alguna. En segundo lugar, el valor de la
alimentación, que influye directamente en el valor de la señal de salida,
está limitado por un posible auto-calentamiento del sensor, ya que la
variación de temperatura influye en el valor de la resistencia.
Existen diversos métodos para la medida de resistencias, que se
clasifican en métodos de deflexión y métodos de comparación.
En los métodos de deflexión se mide la caída de tensión en bornes de
la resistencia a medir, o la corriente que la atraviesa; o ambas cosas.
Los segundos se basan en los puentes de medida. [3]

2.2.5.4 BOMBA DE AIRE MECANICA


Se tienen dos tipos principales de bombas de aire mecánicas que son
del tipo rotatorio, y las de desplazamiento positivo o bomba de diafragma5. Las
bombas de diafragma son muy utilizadas, debido a la mejora en la fabricación
de materiales para diafragmas y por prescindir de sellos mecánicos de pistón
que puedan ocasionar fugas de aire. Existe una variedad de tamaños, desde
las unidades de miniatura hasta las de uso industrial; se puede optimizar su
uso al operar junto con una válvula de descarga. La bomba de pistón aún es
utilizada en ciertos casos donde se requiere una elevada precisión en el
caudal (por ejemplo en la mezcla de gases). En estos casos, operan
usualmente inmersas en aceite con la finalidad de que el pistón se encuentre
bien lubricado evitando que se filtren los gases desde o hacia la atmósfera. [6]

5
Jones, E. Mechanical gas pumps. En su: Jones’ Instrument Technology Volume 4:
Instrumentation Systems. England: Butterworth & Co. Ltd. 1987, p. 31.
18

3.2.4 INSTRUMENTACION DIGITAL

En el sistema convencional de 4-20mA, se tiene una doble conversión, esto


implica que si la salida del sensor es analógica, para linealizarla, detectar
límites o realizar otras operaciones, puede digitalizarse para ser procesada por
un microcontrolador. Si posteriormente se transmite con un bucle de 4-20mA,
hay que convertirla de nuevo en analógica, y convertirla nuevamente en digital
en el procesador central que controla todo el sistema. En un sensor que
incorpore comunicación digital se prescinde de esta doble conversión. “Si
además la comunicación es tipo bus, ya no se emplea un canal para una única
información (como en los sistemas 4-20mA), sino que el mismo canal físico es
compartido por varias informaciones distintas, viajando en los dos sentidos y
esto comporta una notable reducción de costes de cableado, sobre todo si es
un bus serie. Con un sistema en bus, la incorporación de nuevos sensores y
actuadores en un proceso o sistema de medida sólo hace falta tenerle en
cuenta en el software del sistema, no en el cableado. Además, la instalación
de un nuevo transmisor no exige detener el proceso, sino que basta
transmitirle los datos de calibración, linealización, alarmas, etc. Pero para que
distintos instrumentos sean compatibles con un mismo bus, debe haber un
acuerdo en sus especificaciones”.6

3.2.5 RELOJ EN TIEMPO REAL(RTC)

Un reloj en tiempo real, conocido por sus siglas en inglés como RTC (Real
Time Clock), es un circuito integrado que permite el registro del tiempo actual;
funciona con una batería, manteniendo el registro del tiempo inclusive cuando
se desconecta la energía.7 El RTC cuenta segundos, minutos, horas, meses,
años, tiene memoria de acceso aleatorio no volátil, utiliza dos conductores
para la transferencia de datos, usa un cristal oscilador de 32,768Khz.
6
Pallas, R. Instrumentación digital: buses para sensores. En su: Sensores y Acondicionadores de
Señal. España: Marcombo, 2003, p.461.
7
Cooper,T. DS1307 Real Time Clock Breakout Board Kit. Adafruit Industries, 2016, p.5.
19

3.2.6 CIRCUITO INTEGRADO MAX232

El circuito integrado MAX232, realiza la conversión de niveles de tensión


eléctrica de 5V y 0V a +10V y -10V respectivamente, debido a un arreglo de
condensadores que multiplica los niveles de tensión indicados. Dispone de 2
juegos de transmisores y receptores.

El circuito integrado MAX232, ayuda a convertir los valores de tensión de la


lógica transistor a transistor, conocido por sus siglas en inglés como TTL
(transistor-transistor logic), en niveles de tensión de la norma RS232; esto
significa que si se envía un estado lógico alto (5V) desde el microcontrolador,
a la salida del circuito integrado MAX232 se tendrá un valor de -10V, y si se
envía un estado lógico bajo (0V) se presenta un valor de +10V.8 [7]

3.2.7 PROCESAMIENTO DE DATOS

2.2.7.1 SISTEMAS DE MEDIDA


Un sistema de medida viene a ser la combinación de dos o más
elementos, subconjuntos y partes necesarias para realizar una o varias
funciones. “En los sistemas de medida, esta función es la asignación objetiva y
empírica de un número a una propiedad o cualidad de un objeto o evento, de
tal forma que la describa. Es decir, el resultado de la medida debe ser:
independiente del observador (objetiva), basada en la experimentación
(empírica), y de tal forma que exista una correspondencia entre las relaciones
numéricas y las relaciones entre las propiedades descritas”.
Los objetivos de un sistema de medida pueden ser: el monitoreo o
seguimiento de procesos, como es el caso de la medición de la temperatura,
de los contadores de gas y de agua, de la monitorización clínica, etc.; el
control de un proceso, como en el caso de un termostato o el control de nivel

8
Reyes, C. Comunicación serial con el CI. MAX232. En su: Microcontroladores PIC. Ecuador:
Rispergraf, 2008, p135.
20

de un depósito; y también puede ser un necesidad de la ingeniería


experimental, como es el caso del estudio de la distribución de temperaturas
en el interior de una pieza irregular, o de las fuerzas sobre el conductor
simulado de un vehículo cuando éste choca contra un objeto.
Las medidas en prototipos son además necesarias para verificar los
resultados de los modelos desarrollados en un software de simulación. En la
figura 2.4 se describe la estructura general de un sistema de medida y de
control. En un sentido amplio, realizar una medición implica, además de la
adquisición de la información, realizada por un elemento sensor o transductor,
también el procesamiento de dicha información y la presentación de
resultados, de tal manera que puedan ser percibidos por nuestros sentidos.
Estas funciones pueden ser locales o remotas, implicando ello, en el segundo
caso, la necesidad de transmitir información. 9

Figura 2.4 Estructura general de un sistema de medida y control.

9
Pallas, R. Introducción a los sistemas de medida. En su: Sensores y Acondicionadores de Señal.
España: Marcombo, 2003, p.1.
21

3.2.8 EL MICROCONTROLADOR

Es un circuito integrado programable empleado para el control del


funcionamiento de tareas determinadas, debido a su reducido tamaño, suele ir
incorporado dentro del dispositivo al cual controla. Es por esta última
característica que se le denomina “controlado incrustado” (embedded
controller).
El microcontrolador es un computador dedicado, es decir cumple con una
tarea específica debido a que en su memoria sólo reside un programa
destinado a gobernar una aplicación determinada; tiene líneas de
entrada/salida donde se puede conexionar los sensores y actuadores del
dispositivo a controlar. Una vez programado el microcontrolador solo sirve
para realizar la tarea asignada.

2.2.8.1 ARQUITECTURA INTERNA


Un microcontrolador consta principalmente de las siguientes partes:
5. Procesador.
6. Memoria no volátil para contener el programa.
7. Memoria de lectura y escritura para guardar los datos.
8. Líneas de E/S para los controladores de periféricos:
a) Comunicación paralelo.
b) Comunicación serie.
c) Diversas puertas de comunicación (bus l2C, USB, etc.).
5. Recursos auxiliares:
a) Circuito de reloj.
b) Temporizadores.
c) Perro Guardián («watchdog»).
d) Conversores AD y DA.
e) Comparadores analógicos.
f) Protección ante fallos de la alimentación.
g) Estado de reposo o de bajo consumo.
22

2.2.8.1.1 El Procesador
Con el objetivo de conseguir altos rendimientos en el procesamiento de
instrucciones, se emplea procesadores de arquitectura Harvard frente a
los tradicionales de arquitectura von Neumann.
En esta última la UCP (Unidad Central de Proceso) se conectaba con
una memoria única, donde se encontraban datos e instrucciones, a
través de un sistema de buses. Figura 2.5.

Figura 2.5 Arquitectura de von Neumann, la UCP se comunicaba a través de


un sistema de buses con la Memoria, donde se guardaban las instrucciones y
los datos.

En la arquitectura Harvard, en cambio, la memoria de instrucciones y la


memoria de datos son independientes, y cada una tiene un propio
sistema de buses para el acceso, además la capacidad de memoria es
diferente. Figura 2.6.

Figura 2.6 En la arquitectura de «Harvard» la memoria de instrucciones y la


de datos son independientes.
23

En los modernos microcontroladores el procesador es de arquitectura


RISC (Computadores de Juego de Instrucciones Reducido), posee un
repertorio de instrucciones máquina pequeño y simple, de forma que la
mayor parte de las instrucciones se ejecuta en un ciclo de instrucción.
La segmentación permite al procesador realizar al mismo tiempo la
ejecución de una instrucción y la búsqueda del código de la siguiente.
De esta forma se puede ejecutar cada instrucción en un ciclo (en los
PIC cada ciclo de instrucción son cuatro ciclos de reloj).
El alto rendimiento y elevada velocidad que se alcanza en los modernos
procesadores, como el que tienen los microcontroladores PIC, es
producto de la conjunción de tres técnicas:
 Arquitectura Harvard
 Arquitectura RISC
 Segmentación

2.2.8.1.2 Memoria de programa


En la memoria de programa se almacenan todas las instrucciones del
programa de control. Como se ejecutará siempre el mismo programa,
debe estar grabado de forma permanente.
Se tienen cinco tipos de memoria adecuados para soportar esta
función:

1) ROM con máscara


En este tipo de memoria el programa se graba en el chip durante su
fabricación mediante el uso de “máscaras”. Debido al elevado costo de
diseño e instrumental sólo aconsejan usar este tipo de memoria cuando
fabrican grandes series.

2) EPROM
En este tipo de memoria la grabación del programa se realiza mediante
un dispositivo físico (grabador) conectado a una computadora personal.
24

En la superficie del encapsulado se encuentra una ventana de cristal


por la que se puede exponer al chip de la memoria a rayos ultravioleta
para borrarla y ser reutilizada.

3) OTP (Programable una vez)


Tiene como característica que sólo puede ser grabado una vez,
utilizando el mismo procedimiento que con la memoria EPROM, con la
diferencia de que posteriormente no se puede borrar. Por su bajo precio
y la sencillez de la grabación, se aconseja este tipo de memoria para
prototipos finales y series de producción cortas.

4) EEPROM
El procedimiento de grabación es similar a las memorias OTP y
EPROM, sin embargo el borrado es sencillo al realizarse de la misma
forma que el grabado, es decir, eléctricamente. El microcontrolador se
ubica sobre el zócalo del grabador para ser programada y borrada
tantas veces como se requiera, ideal para la enseñanza y elaboración
de proyectos. Se garantiza 1,000000 de ciclos de escritura/borrado.

5) FLASH
Se caracteriza por ser una memoria no volátil, de bajo consumo. Al
igual que las EEPROM se puede escribir y borrar en circuito, sin
embargo suelen disponer de mayor capacidad.
El borrado sólo es posible con bloques completos y no se puede
realizar sobre posiciones concretas. En las FLASH se garantizan 1.000
ciclos de escritura-borrado.
Altamente recomendables en aplicaciones donde sea necesario
modificar el programa a lo largo del tiempo de vida del producto, como
consecuencia del desgaste o cambios de piezas, como sucede con los
vehículos.
25

2.2.8.1.3 Memoria de datos


Los datos manejados por los programas están en constante variación,
por lo que es conveniente que la memoria que los contiene sea de
lectura y escritura, la memoria RAM estática (SRAM) es adecuada
aunque sea volátil.
También existen microcontroladores que tienen como memoria de datos
una de lectura y escritura no volátil, del tipo EEPROM. De esta manera,
cualquier corte en el suministro de energía no produce una pérdida de
la información, la cual está disponible al reiniciarse el programa.

2.2.8.1.4 Líneas de E/S para los controladores de periféricos


En el microcontrolador se destinan pines, dos o cuatro, para recibir la
alimentación, dos para el cristal de cuarzo, otro para generar el Reset;
los pines restantes sirven para establecer una comunicación con los
periféricos externos que controla.
Las líneas de E/S que se adaptan con los periféricos manejan
información en paralelo y se agrupan en conjuntos de ocho, recibiendo
el nombre de, puertas. Existen modelos con líneas que soportan la
comunicación en serie; otros disponen de conjuntos de líneas que
implementan puertas de comunicación para diversos protocolos, como
el I2C, el USB, etc.

2.2.8.1.5 Recursos auxiliares


Dependiendo de las aplicaciones a las que está orientado cada modelo
de microcontrolador, el fabricante incorpora diversos complementos que
refuerzan la potencia y la flexibilidad del dispositivo.
Entre los recursos más comunes se citan a los siguientes:

a) Circuito de reloj, encargado de generar los impulsos que sincronizan


el funcionamiento de todo el sistema.
b) Temporizadores, orientados a controlar tiempos.
26

c) Perro Guardián («watchdog»), destinado a provocar una


reinicialización cuando el programa queda bloqueado.
d) Conversores AD y DA, para poder recibir y enviar señales
analógicas.
e) Comparadores analógicos, para verificar el valor de una señal
analógica.
f) Sistema de protección ante fallos de la alimentación.
g) Estado de Reposo, en el que el sistema queda “congelado” y el
consumo de energía se reduce al mínimo.

2.2.8.2 PROGRAMACION DE MICROCONTROLADORES


Para la programación se utiliza lenguajes de bajo y alto nivel. El
lenguaje de bajo nivel representa un ahorro de código en la elaboración del
programa, uno de los más usados es el Ensamblador, que es el más cercano
a la máquina.
Los lenguajes de alto nivel sin embargo representan una sencillez en el
manejo del programa, los más utilizados son el C y el BASIC.

2.2.8.3 INSTRUMENTAL DE TRABAJO


Al realizar un diseño con circuitos integrados programables se
necesitan herramientas para la implementación del hardware y software. Con
respecto al software, en adición a los compiladores de los lenguajes es bueno
disponer de simuladores software, que son programas que simulan la
ejecución de instrucciones, representando el comportamiento interno del
procesador y el estado de las líneas de E/S, aunque el comportamiento no es
idéntico, puesto que se trata de una simulación, se proporciona una
aproximación aceptable, en especial cuando no es fundamental el trabajo en
tiempo real. Respecto al hardware, una herramienta necesaria es el grabador,
que sirve para escribir el programa en la memoria del microcontrolador. [8]
27

2.2.8.3.1 El microcontrolador AVR


En el diseño es muy importante la elección del microcontrolador que
mejor satisfaga las necesidades del proyecto.
Se tiene más de un centenar de versiones diferentes y cada año
aumenta considerablemente su lista.
Atmel produce una serie de microcontroladores RISC (computador de
juego de instrucciones reducido) conocidos como AVR, que presentan
características como las siguientes:

- Arquitectura Hardvare, que maximiza el rendimiento y paralelismo.


- La memoria de programa ejecuta las instrucciones con segmentación
de dos etapas.
- 32 registros de propósito general de 8 bits, para acceso rápido.
- Ejecución de la mayoría de instrucciones en un ciclo de reloj.

2.2.8.3.2 Arquitectura del microcontrolador AVR


Al utilizar la arquitectura Hardvare, el AVR accede a la memoria de
datos e instrucciones de manera separada y simultánea. Cuando se
ejecutan las instrucciones, mientras una instrucción está siendo
ejecutada la siguiente instrucción está siendo pre-obtenida de la
memoria de programa. De los 32 registros de 8 bit, seis pueden ser
usados como tres registros de 16 bit para direccionamiento indirecto.
La unidad aritmética lógica, por sus siglas en inglés ALU (arithmetic
logic unit), permite realizar las operaciones aritméticas y lógicas entre
registros o entre una constante y un registro. Después de una operación
aritmética, el registro de estado es actualizado para reflejar información
acerca del resultado de una operación. Las instrucciones del AVR,
tienen normalmente un formato compuesto por una palabra de 16 bit.
Cada dirección en la memoria de programas contiene instrucciones de
16 ó 32 bit. Figura 2.7.
28

Figura 2.7 Diagrama de bloques de la arquitectura del microcontrolador AVR.

2.2.8.3.3 El registro de estado


El registro de estado contiene información acerca del resultado de la
última instrucción ejecutada. Esta información puede ser utilizada para
alterar el flujo de un programa con la finalidad de ejecutar operaciones
condicionales. El registro de estados es actualizado luego de ejecutarse
una operación en la ALU, esto en muchos casos elimina la necesidad
de usar instrucciones de comparación dedicadas, teniendo como
resultado un código más compacto y rápido. El registro de estado del
AVR se muestra en la figura 2.8.

Figura 2.8 Registro de estado.


29

I: Habilita Interrupción global


El bit I permite habilitar las interrupciones con “1” lógico, siendo el bit “0”
no se aceptará ningún pedido de interrupción. Cambia a “0”
automáticamente mediante hardware cuando ocurre alguna
interrupción, pudiendo ser puesto a “1” con la instrucción RETI.
También se pueden utilizar las instrucciones SEI y CLI.

T: Respaldo de Bit
Utiliza la instrucción BLD para carga y BST para almacenamiento. La
posición del bit T, puede ser usada como destino o fuente de un bit
determinado desde un registro a otro.

H: Bandera de acarreo de bits inferiores


Bandera de acarreo de 4 bits inferiores en determinado tipo de
instrucciones. Es de utilidad en operaciones de decimal codificado a
binario (BCD: binary-coded decimal).

S: Bit de signo
El bit S siempre es el or-exclusivo entre la bandera negativa “N” y la
bandera de desborde en “V”.

V: Bandera de desborde en operaciones de complemento a dos


La bandera V cambia su estado lógico a “1” cuando el resultado de una
operación de complemento a dos se encuentra fuera del rango
permitido: caso de operaciones de 8 bits cuando el resultado no se
encuentra entre +127 y -128 decimal.

N: Bandera de negativo
La bandera N, cambia su estado lógico a “1” cuando el resultado de una
operación lógica ó aritmética es negativo, siendo el bit más significativo
igual a 1. Cambia a “0” en caso contrario.
30

Z: Bandera de cero
La bandera Z, cambia su estado lógico a “1” cuando el resultado de una
operación lógica o aritmética es cero.

C: Bandera de acarreo
La bandera C, cambia su estado lógico a “1” cuando se presenta
acarreo en el bit más significativo de una operación lógica o aritmética.

2.2.8.3.4 Registro de propósito general


Con la finalidad de alcanzar el desempeño y flexibilidad requeridos este
registro esta optimizado para las instrucciones del AVR. En la figura 2.9
se muestra la estructura de los 32 registros de propósito general. R26 y
R27 forman el registro X de 16 bits, R28 y R29 forman el registro Y de
16 bits, R30 y R31 forman el registro Z de 16 bits. [9]

Figura 2.9 Registro de estado.


31

3.2.9 PROGRAMACION DEL MICROCONTROLADOR

2.2.9.1 LA GESTION DE LOS PUERTOS


Los terminales de entrada/salida se encuentran divididos en puertos,
que son nombrados alfabéticamente A, B, C, D, etc. Los puertos pueden tener
hasta 8 terminales, que básicamente se comportan como una entrada/salida
digital. Dependiendo de las características del microcontrolador AVR, los
puertos pueden tener asignado un bloque funcional como: convertidor AD,
USART, I2C, etc. [10]
En la familia de los AVR (figura 2.10), se tiene hasta 11 puertos en el AVR
ATmega 2560, donde se encuentran bloques de TIMERS, CCP, MSSP,
USART, PSP y convertidores AD. 10

Figura 2.10 Características de la familia AVR ATmega.

Los puertos se caracterizan por ser independientes, esto quiere decir que
cada puerto puede ser programado para comportarse como una entrada o
salida digital. La habilitación del puerto como entrada o salida se realiza a
través de los registros. [10]

10
DATASHEET Atmel ATmega640/V-1280/V-1281/V-2560/V-2561/V 8 bit Atmel Microcontroller
with 16/32/64KB In-System Programmable Flash.
32

2.2.9.2 PROGRAMACION EN LENGUAJE C


Mediante la programación en lenguaje C (alto nivel), se puede gestionar
el microcontrolador, junto a otras herramientas de programación, como
pueden ser: editor, compilador, enlazador, cargador, depurador, ambiente de
desarrollo integrado.

2.2.9.3 ESTRUCTURA DE UN PROGRAMA


En la escritura de un programa se deben tener en cuenta una serie de
elementos básicos en su estructura.

 Directivas de preprocesado: Controlan la conversión del


programa a lenguaje máquina.
 Programas o funciones: Permiten la ejecución de instrucciones.
Se puede tener uno o varios.
 Instrucciones: Establecen el comportamiento del microcontrolador
en todo momento.
 Comentarios: Describen las líneas de programa. [10]

2.2.9.4 VARIABLES Y CONSTANTES


Las variables al igual que en álgebra son valores que pueden cambiar,
las contantes son valores fijos. Se encuentran almacenadas en la memoria de
programa. Las variables tienen un tipo y tamaño determinado. Figura 2.11.
33

Figura 2.11 Tipos de variables.

Las variables definidas en un programa, de acuerdo al ámbito, pueden ser del


tipo local o global. Las variables locales se utilizan solamente en la función
donde están declaradas; las variables globales pueden ser utilizadas en todas
las funciones del programa. Ambas, deben ser declaradas antes de ser
utilizadas y las globales se declaran antes y fuera de cualquier función.

Las variables, de acuerdo a la clase de almacenamiento, pueden ser definidas


también como:

 Automático: Se usa por defecto, no hace falta que se declare, la variable


existe mientras la función esté activa. Estas variables no se inicializan a
cero, su valor se pierde cuando se sale de la función.
 Estático: Una variable local estática se localiza en el espacio de memoria
global, se inicializa a cero y mantiene su valor al entrar y salir de la función.
34

 Registro: Una variable local de registro se usa de manera temporal, a


través de un registro donde se almacena para reducir la cantidad de ciclos
máquina necesaria para acceder a la variable.

2.2.9.5 OPERADORES
Los operadores son símbolos que le indican al compilador el tipo de
operación que será realizada. Figura 2.12, 2.13, 2.14.

Figura 2.12 Operadores aritméticos.

Figura 2.13 Operadores relacionales.


35

Figura 2.14 Operadores para manejo de bits.

2.2.9.6 FUNCIONES
Las funciones son bloques de sentencias, las sentencias deben estar
enmarcadas dentro de las funciones. Del mismo modo que las variables, las
funciones se definen antes de ser utilizadas. Una función puede ser llamada
desde la sentencia de otra función. Una función puede retornar un valor a la
sentencia que ha llamado. La función además de devolver un valor puede
recibir parámetros o argumentos.

2.2.9.7 DECLARACIONES DE CONTROL


Las declaraciones son usadas para controlar el proceso de ejecución
del programa, pueden ser las siguientes:

Estructura if-else:
En la estructura if-else, primero se evalúa la expresión y es cierta ejecuta una
sentencia, en caso contrario ejecutará la sentencia subsecuente.
36

Estructura switch:
En la estructura switch, se evalúa una expresión y conforme a una constante
determinada, ejecuta sentencias enlazadas. Se encuentra asociada al
comando case, si ninguno de los case corresponde a la constante se ejecuta
el comando default (comando opcional). Se tiene también el comando break,
el cual permite la salida de las sentencias enlazadas en switch, de lo contrario
se ejecuta el siguiente case.

Estructura for:
En la estructura for, se inicializa una variable a la cual se le asigna un valor
inicial con el cual se controla un bucle. Una condición de finalización permite la
evaluación antes de la ejecución de sentencias, en el caso de que el resultado
de la evaluación sea cierto se ejecutan las sentencias, en caso contrario se
sale del for. Se tiene asociado el comando de incremento o decremento que
modifican la variable de control después de la ejecución del bucle.

Estructura while/do-while:
En la estructura while, se evalúa una expresión y se ejecuta una sentencia en
tanto la expresión sea verdadera. Do-while se diferencia del while y del for en
la condición de finalización, esto implica que las sentencias se ejecutan al
menos una vez, en este caso while se evalúa al final del bucle. [10][11]
37

3.2.10 EL TRANSISTOR COMO INTERRUPTOR

Por lo general el transistor es usado para amplificar señales variables en el


tiempo, sin embargo también puede ser usado como interruptor. Aunque no
reproduce con exactitud la acción de un interruptor de contactos mecánicos,
presenta ciertas ventajas sobre estos. En la figura 2.32 se puede apreciar la
configuración del transistor como interruptor, donde se muestra la resistencia
de carga colocada en serie con el colector.
El voltaje Vin determina cuando el interruptor se encuentra en estado abierto o
cerrado, impidiendo la circulación de corriente por la carga o permitiéndolo
respectivamente.
Si Vin es un voltaje bajo no hay circulación de corriente por la unión base-
emisor. Siendo la corriente de base nula, no hay corriente de colector, por
tanto no circulará corriente por la resistencia. En estas circunstancias el
transistor opera como interruptor abierto en serie con la resistencia; cuando el
transistor opera de esta forma, se dice que está cortado o en corte.11[12]

Figura 2.33 Circuito elemental de un transistor como interruptor.

11
Maloney, T. El transistor como interruptor. En su: Electrónica Industrial. Dispositivos y Sistemas.
México: Prentice-Hall Hispanoamericana, 1983, p. 2.
38

3.2.11 FUENTES DE ALIMENTACION REGULADAS

La fuente de alimentación continua es uno de los sistemas, o en términos más


concretos subsistemas, más necesarios en Electrónica.
Tanto si se trata de sistemas de comunicación, instrumentación o cualquier
sistema electrónico, pequeño o grande, es necesario una fuente de energía
que proporcione una señal de corriente continua.
La fuente de alimentación tiene como función, convertir una tensión alterna de
60Hz 220V de valor eficaz de la red de distribución en una tensión continua.
Por consiguiente la fuente de alimentación contiene varios circuitos: (1) el
transformador, que eleve o rebaje la tensión de la línea, según convenga; (2)
el circuito rectificador, que convierta la corriente alterna en corriente
unidireccional o sea en corriente continua pulsátil; (3) un circuito filtro, que
elimine el rizado o lo reduzca al mínimo; y (4) algún tipo de circuito regulador,
que mantenga constante el nivel de continua a la salida aun cuando varíe el
12
consumo. [13]

3.2.12 FILTROS RC ACTIVOS

Estos filtros están compuestos por resistencias y condensadores. “Un filtro


permite que se transmitan una o más bandas de frecuencia mientras rechaza
las señales que no se hallen en dichas bandas. En un filtro pasa-baja (o de
paso bajo), la banda transmitida se extiende desde cero hasta un cierta
frecuencia máxima. Un filtro pasa-alta (o de paso alto) sólo deja pasar
frecuencias superiores a un cierto valor especificado”. 13 [14]

12
Cirovic, M. Fuentes de Alimentación Reguladas. En su: Electrónica fundamental: dispositivos,
circuitos y sistemas. España: Reverté, 1991, p. 369.
13
Holt, C. Filtros RC Activos. En su: Circuitos Electrónicos, digitales y analógicos. España: Reverté,
1989, p. 888.
39

3.2.13 PRESION ARTERIAL

La presión arterial se define como “la fuerza que ejerce la sangre al circular
por las arterias. Las arterias son vasos sanguíneos que llevan sangre desde el
corazón” La presión se mide con dos cifras; como por ejemplo 120/80, la
primera cifra (120) mide la fuerza de la sangre en las arterias cuando el
corazón se contrae, denominándose presión sistólica, la segunda cifra (80)
mide la fuerza de la sangre en las arterias cuando el corazón está relajado,
conocida coma presión diastólica.14

3.2.14 MEDICION DE LA PRESION ARTERIAL

Uno de los primeros experimentos para el estudio de la presión arterial fue


introducir un tubo en la arteria del cuello de un caballo y medir la variación de
presión generada por el corazón. Para la medición de la presión arterial en
seres humanos, ésta debía ser realizada sin que se tuviera contacto directo
con la sangre. Sin embargo, se tenía que dar una definición práctica de la
presión arterial, y que se pueda medir. No hubo una manera sencilla de
realizar la medición indirecta (sin entrar en contacto con la sangre) del valor
instantáneo de la presión arterial, hasta la introducción del método sistólico-
diastólico. Aún aceptado en la actualidad, esta técnica de detección se
encuentra basada en los sonidos de Korotkoff. La tecnología digital,
proporciona equipos de medición de la presión arterial para su uso tanto en
hospitales como en el hogar. 15 [15]

En la medición de la presión arterial se suele emplear un manómetro especial,


denominado esfigmomanómetro. En este instrumento, mediante un bulbo de
caucho se introduce aire en una manga envuelta firmemente en torno al brazo
y al mismo tiempo en el esfigmomanómetro.

14
La presión arterial y su salud. American Society of Hypertension, Inc. 2010.
15
Nandor, R. Evolution of Medical Device Technology. En: Dyro, J., The Clinical Engineering
Handbook. España: Academic Press, 2004, p. 339.
40

La presión en la manga se incrementa hasta que el flujo de sangre por la


arteria braquial se detenga. En ese momento se apertura una válvula y la
persona que realiza la medición escucha una serie de sonidos a través de un
estetoscopio aplicado a la arteria en un punto inmediatamente debajo de la
manga. En el momento que la presión en la manga y en la arteria braquial son
muy cercanos al valor máximo producido por el corazón (la presión sistólica),
la arteria se abre por un momento con cada latido del corazón. En este punto,
la velocidad de la sangre es mayor y turbulenta, y el flujo es ruidoso. El
esfigmomanómetro está calibrado para registrar la presión en milímetros de
mercurio, y el valor obtenido es de alrededor de 120mmHg para un corazón
normal. Los valores de 140mmHg o más se consideran altos por lo que se
suelen prescribir medicamentos para reducir la presión arterial. En el instante
en que la presión en la manga disminuye, se siguen escuchando sonidos
intermitentes hasta que la presión se encuentre por debajo de la presión
cardiaca mínima (la presión diastólica). En este punto se pueden percibir
sonidos continuos. En un corazón normal, esta transición se produce a los
80mmHg, aproximadamente, y se considera que en los valores por arriba de
90mmHg se requiere la intervención del médico. Las lecturas de presión
arterial se suelen expresar como la relación sistólica/diastólica, que es de
120/80 para un corazón normal. 16 [16]

16
Serway, R., Faughn, J. Mediciones de la presión arterial. En su: Física. México: Pearson
Educación, 2001, p. 267.
41

CAPITULO III

DISEÑO E IMPLEMENTACION DEL CALIBRADOR

3.6 GENERALIDADES

De acuerdo a los objetivos planteados, el equipo a desarrollar, permitirá


realizar la calibración de manómetros utilizados para la medición de la presión
arterial no invasiva (esfigmomanómetro), haciendo posible la verificación,
visualización y exportación de los resultados obtenidos. La prueba de
funcionamiento se realizará con un esfigmomanómetro, el cual forma parte de
un tensiómetro aneroide, es por ello que el prototipo debe presentar las
condiciones necesarias para realizar un buen proceso.

El calibrador digital optimiza el uso de recursos, puesto que, se puede incluir el


monitoreo de varias señales y ejercer acción sobre transductores de manera
simultánea. Una tarjeta electrónica basada en microcontrolador puede realizar
estas operaciones; seleccionando una que presente características
adecuadas, se tendrán los resultados deseados.

Al realizar el proceso de calibración, se debe tener un valor de presión


constante, en algunos casos se necesitará variar la presión gradualmente para
generar el protocolo de calibración. Asimismo se mide la temperatura,
humedad, altitud para registrar las condiciones en las cuales se realiza la
calibración, incluyendo el almacenamiento del tiempo real.
42

El equipo calibrador de presión se divide en las siguientes partes:

 La fuente de alimentación, se encargará de suministrar los niveles de


tensión deseados para el funcionamiento del sistema.
 Circuito de control, para generar los valores de presión deseados,
registrar la temperatura, humedad, tiempo real.
 Sistema de compresión de aire, para mantener presión en los niveles
requeridos.
 Interfaz de usuario, para que el usuario se comunique con el equipo, y
donde se pueda visualizar la presión, la altura, la temperatura, la
humedad.

Visualización de
Parámetros
Señal de Válvula de Tensiómetro
P, T°, H, Altura
Alimentación Aire


Controlador
H

Figura 3.1 Diagrama general del calibrador de presión.


43

3.7 FUENTE DE ALIMENTACION

La función de la fuente de alimentación es convertir una tensión alterna en una


tensión continua y lo más estable posible, con este propósito se utilizan los
siguientes componentes: Transformador de entrada, rectificador a diodos, filtro
para el rizado, regulador lineal.

Figura 3.2 Componentes de la fuente de alimentación.

En el diseño se necesita un valor de 3,3 V para la alimentación de diferentes


componentes como la bomba de diafragma, válvula de descarga de aire.

La fuente de alimentación regulada alcanza un valor máximo de 36 voltios, se


utilizan los diodos en configuración puente, y el regulador L200, que es un
regulador positivo con limitador de corriente, suministrando valores de 2A
desde 2.85V hasta 36V. Este dispositivo puede ser utilizado cuando se
requieran niveles de tensión que no son suministrados por los reguladores
estándar.

Según la hoja de características, la salida en el regulador es [anexo 1]:


𝑅2
𝑉𝑜𝑢𝑡 = 𝑉𝑟𝑒𝑓 (1 + )
𝑅1

De acuerdo a la hoja de datos se tiene valores de R1 igual a 820Ω y un


potenciómetro de 10K para R2=RV1, para obtener el valor de tensión de salida
de deseado.
44

El transformador tiene un valor de 1A nominal, y relación de valor de voltaje


igual a 280V/8V. Este transformador se utilizará para implementar la fuente
regulada, se implementa con fusibles de protección de 100mA y 1A.
Para la rectificación, el puente de diodos está formado por cuatro diodos
1N4001, con una corriente nominal de 1 A, corriente directa de pico no
repetitivo de 30A, tensión inversa de pico igual a 50V, voltaje de activación de
1.1 V [anexo 2].
Se utilizan valores de 470uF, 10uF para disminuir el rizado, estos valore se
toman experimentalmente, mostrando una mayor estabilidad que con otros de
diferentes valores. Los condensadores de 0,22uF y 100nF, se utilizan de
acuerdo a la hoja de características del regulador L200. Se incluye un punto
de verificación o de prueba P4.

Figura 3.3 Fuente de alimentación regulada.


45

3.8 CIRCUITO DE CONTROL

El circuito de control para el prototipo se implementa con la tarjeta electrónica


Arduino MEGA2560. El MEGA 2560 está basado en el microcontrolador
ATMEGA2560 [anexo 3]. Tiene 54 pines de entradas/salidas digitales (14 de las
cuales pueden ser utilizadas como salidas PWM), 16 entradas analógicas, 4
UARTs (puertos serial por hardware), cristal oscilador de 16 Mhz, conexión
USB, conector de alimentación, conector ICSP y botón de reinicio. Incorpora
todo lo necesario para que el microcontrolador trabaje; se puede conectar a
una computadora personal por medio de un cable USB o con una fuente de
alimentación externa. 17El circuito de control está compuesto por las siguientes
etapas:

 Circuito de activación de bomba de diafragma.


Tiene como finalidad el ingreso de aire al sistema de generación de
presión.

 Circuito de activación de válvula de descarga.


Sirve para regular la presión de aire, realizando la descarga en caso de
tener una presión elevada.

 Circuito de comunicación RS232.


Se utiliza cuando es necesario transmitir los datos mediante el
protocolo de comunicación RS232, para enlazarse con una
computadora personal.

 Circuito de reloj en tiempo real.


Se utiliza para establecer el tiempo actual.

17
ARDUINO. Arduino Mega 2560&Genuino Mega 2560. [en línea]
<https://www.arduino.cc/en/Main/arduinoBoardMega2560#> [consulta: 01 abril 2017]
46

 Tarjeta electrónica basada en microcontrolador.


Tiene como función procesar la información del sistema, para la
generación de valores de presión deseados, registro de valores de
temperatura, humedad, tiempo real. [Ver anexo 4]

3.3.1 CIRCUITO DE ACTIVACION DE BOMBA DE DIAFRAGMA

Este circuito tiene como finalidad activar o desactivar una bomba de


diafragma, que para el prototipo se activa con un valor de 3.3V. Cuando se
activa la bomba de diafragma, se permite el ingreso y la acumulación de aire
en un tanque de 500ml incorporado. Se utiliza un transistor BC639 para la
conmutación, con una resistencia limitadora de corriente de 1.2K, el diseño
incluye diodos emisores de luz como indicadores visuales de funcionamiento,
con resistencia limitadora igual a 620Ω. Se tiene también un diodo 1N4001,
cuya función es proteger al controlador de las corrientes de autoinducción que
se generan en la bobina del motor de la bomba de diafragma.

Figura 3.4 Circuito de activación de la bomba de diafragma.


47

3.3.2 CIRCUITO DE ACTIVACION DE VALVULA DE DESCARGA

Este circuito tiene como finalidad activar o desactivar una válvula de descarga,
que para el prototipo se activa con un valor de 3.3V. Cuando se activa la
bomba de diafragma, permitiendo el ingreso y la acumulación de aire en el
tanque de 500ml incorporado, se generan valores de sobrepresión, los
mismos que son regulados mediante la activación de la válvula de descarga.
Se utiliza un transistor BC639 para la conmutación, con una resistencia
limitadora de corriente de 1.2K, el diseño incluye diodos emisores de luz como
indicadores visuales de funcionamiento, con resistencia limitadora igual a
620Ω. Se tiene también un diodo 1N4001, cuya función es proteger al
controlador de las corrientes de autoinducción que se generan en la bobina de
la válvula solenoide de descarga de aire.

Figura 3.5 Circuito de activación de la válvula de descarga.


48

3.3.3 CIRCUITO DE COMUNICACIÓN RS232

Este circuito tiene como finalidad la adaptación a niveles de tensión


necesarios para la comunicación con una computadora personal. Mediante la
interfaz RS232 se puede enviar información de las mediciones efectuadas a
una computadora personal para su procesamiento, impresión, archivamiento,
análisis estadístico, etc. Se utiliza para ello el circuito integrado MAX232, con
la configuración de condensadores de acuerdo a la hoja de características y
dos conectores DB9 para la conexión a un equipo de cómputo.

Figura 3.6 Circuito de comunicación RS232.


49

3.3.4 CIRCUITO DE RELOJ EN TIEMPO REAL

Este circuito tiene como finalidad establecer los valores actuales de hora y
fecha, para el registro en los protocolos. Se utiliza el circuito integrado
DS1307, con interfaz de comunicación I2C a través del bus bidireccional,
cristal oscilador de 32,768KHz, resistencia de polarización igual a 10K. El
circuito detecta fallas en la alimentación de energía, activando una fuente de
respaldo. Utiliza una batería de 3V, la cual permite asegurar un
funcionamiento continuo. Figura 3.7.

Figura 3.7 Circuito de reloj en tiempo real DS1307.


50

3.3.5 TARJETA ELECTRONICA BASADA EN MICROCONTROLADOR

La tarjeta electrónica tiene como finalidad principal procesar la señal enviada


por los sensores y en función a ello enviar una señal a los actuadores, para
obtener valores de presión deseados. El Mega 2560 permite conectar una
pantalla LCD, teclado, además de los dispositivos periféricos, que permiten la
activación de la bomba de diafragma y la válvula de descarga que
consecuentemente generará los valores de presión ingresados de manera
manual como automática; así como también la visualización de temperatura,
humedad, altitud, tiempo real, para registrar las condiciones ambientales en
las cuales se realiza la calibración.

La señal de temperatura y humedad es enviada por el sensor digital DHT11 a


la tarjeta electrónica, de acuerdo a la hoja de características [anexo 5]. El
DHT11 se acciona con un valor de tensión eléctrica igual a 5V. Figura 3.7.

Figura 3.7 Conexión del sensor DHT11 al microcontrolador.


51

La señal de presión es enviada a la tarjeta de electrónica de control por el


sensor digital BMP085, conforme a la hoja de características [anexo 6]. Figura
3.8.

Figura 3.8 Conexión del sensor BMP085 al microcontrolador.

El sensor de presión tiene un rango de trabajo de 300 a 1100 hPa (9000m a


-500m sobre el nivel del mar), con una resolución igual a 0.03hPa/0.25m,
rango de operación de temperatura entre -40°C y 85°C con ±2°C de exactitud,
interfaz de comunicación I2C, para el prototipo se utiliza una tarjeta
adaptadora con señal de alimentación igual a 3.3V. En la programación se
debe ingresar el valor de presión a nivel del mar, que para el diseño es de
1015hPa (dato proporcionado por el Instituto del Mar del Perú-IMARPE).18

18
IMARPE. Presión atmosférica a nivel del mar. [en línea]
http://www.imarpe.pe/imarpe/index.php?id_seccion=I0178030101000000000000 [consulta: 04
abril 2017]
52

Para permitir el ingreso de aire al tanque de almacenamiento de 500ml y


generar los valores de presión deseados, se actúa sobre una bomba de
diafragma de tipo rotatorio [anexo 7], para uso médico (monitoreo de presión
arterial no invasiva), de bajo consumo de energía, vibraciones reducidas, libre
de aceite, bajo ruido, tamaño compacto, liviano, con flujo de aire de 510
ml/min a una presión de 100mbar. Figura 3.9.

Figura 3.9 Bomba de diafragma de tipo rotatorio.

Una vez alcanzado el volumen de aire total del tanque de almacenamiento, se


pueden generar valores de sobrepresión, los mismos que afectan el valor de
salida requerido; razón por la cual se acciona una válvula de descarga de aire
para regular la presión [anexo 8] y obtener los valores deseados. Para ello se
utiliza una válvula solenoide de aplicación médica (dispositivos de presión
arterial no invasiva), de bajo costo, tamaño compacto, liviano, bajo nivel de
tensión inducida, con una presión igual 6psi. Figura 3.10.

Figura 3.10 Válvula solenoide de descarga de aire.


53

El algoritmo del programa se presenta a continuación:

Inicio
{Inicializar sensor de temperatura y humedad, sensor de presión, RTC}
T°C/HR% Condiciones ambientales
Altura Condiciones ambientales
Fecha/Hora Tiempo
En caso de que no se inicialice el sensor, enviar señal de error
{Calibrar presión offset y altura}
SI no se inicia correctamente el sensor de presión
Mostrar mensaje de error
, caso contrario
Calcular altura, presión offset.
{Seleccionar opciones}
Opción1,Opción2  Calibración,Medición
{Seleccionar modo de medición}
1,2,3,4,5,6mmHg/torr,hPa,atm,milibar,psi,kgf/m2
{Seleccionar tipo de medición}
Presión absolutaPresión manométrica+presión atmosférica al nivel
del mar
Opción1,Opción2Calcular presión absoluta, calcular presión relativa
{Seleccionar modo de calibración}
Opción1,Opción2,Opción3 Modo manual,modo programado,modo pérdida
de aire
Opción1 Modo manual
ManualIntroducir valor de presión entre 0 y 300mmHg
MIENTRAS el valor de presión no sea menor a 300mmHg, no se enciende la
bomba de diafragma
SI no se inicia correctamente el sensor de presión
Mostrar mensaje de error
, caso contrario
{Generar la presión ingresada}
SI la presión medida es menor a 0Valor de presión=0 mmHg
SI la presión medida es mayor a 310mmHgAccionar la válvula de descarga de
aire por seguridad
54

{Activar la bomba de diafragma}


SI la presión deseada-2.99<presión medida <presión deseada-0.2Mantener
encendida la bomba de diafragma
, caso contrario
SI la presión medida<presión deseada-3Accionar bomba de diafragma
, caso contrario
SI la presión medida>presión deseada+0.2Desactivar bomba de diafragma
, caso contrario
{Realizar una aproximación sucesiva en tres pasos}
SI la presión medida > presión deseada+15Accionar válvula de descarga
de aire
SI la presión deseada+5<presión medida <presión
deseada+14.99Accionar válvula de descarga de manera secuencial
SI la presión deseada+1<presión medida <presión deseada+4.99Accionar
válvula de descarga de manera secuencial con baja cantidad de aire

Opción2 Modo programado


{Ingresar lectura de manómetro y realizar cálculos}
Se generan valores de presión programados en
mmHg(20,40,60,80,100,120,150,200,250,280)Se ingresan lecturas del
esfigmomanómetro
ErrorValor programado – Valor medido
Desviación(Valor medido*100/Valor programado) – 100
{Visualizar de resultados}
Del cálculo entre valores máximos y mínimos de error se tiene
Cálculo de error <= 3mmHg  Pasa la prueba
Cálculo de error > 3mmHg  Pasa la prueba para uso no clínico
Cálculo de error > 5mmHg  No pasa la prueba
ProgramadoGeneración automática de valores de presión entre 20 y
280mmHg
SI no se inicia correctamente el sensor de presión
Mostrar mensaje de error
, caso contrario
{Generar la presión programada}
MIENTRAS la presión de medida sea menor a 280mmHgAccionar la
bomba de diafragma
55

{Desactivar la bomba de diafragma y activar válvula de descarga}


Una vez superado el valor de 280mmHg se desactiva la bomba de diafragma
y se acciona la válvula de descarga de aire
{Activar la bomba de diafragma para todos los valores programados}
20,40,60,80,100,120,150,200,250,280 (valores en mmHg)Valores
programados
SI la presión medida es menor a 0Valor de presión=0 mmHg
SI la presión medida es mayor a 310mmHgAccionar la válvula de descarga
de aire por seguridad
SI la presión deseada-2.99<presión medida <presión deseada-
0.2Mantener encendida la bomba de diafragma
, caso contrario
SI la presión medida<presión deseada-3Accionar bomba de
diafragma
, caso contrario
SI la presión medida>presión deseada+0.2Desactivar bomba de
diafragma
, caso contrario
{Realizar una aproximación sucesiva en tres pasos}
SI la presión medida > presión deseada+15Accionar válvula de
descarga de aire
SI la presión deseada+5<presión medida <presión
deseada+14.99Accionar válvula de descarga de manera secuencial
SI la presión deseada+1<presión medida <presión
deseada+4.99Accionar válvula de descarga de manera secuencial
con baja cantidad de aire

Opción3 Modo pérdida de aire


{Calcular pérdida de aire}
SI no se inicia correctamente el sensor de presión
Mostrar mensaje de error
, caso contrario
{Generar la presión programada}
MIENTRAS la presión de medida sea menor a 200mmHgAccionar
la bomba de diafragma
56

{Desactivar la bomba de diafragma y medir presión}


Una vez superado el valor de 200mmHg se desactiva la bomba de
diafragma, se mide el valor de presión, se espera 60s y se mide el
valor de presión
{Realizar el cálculo de pérdida de aire en 2 etapas}
Variación de presión (Vp1)Valor inicial (Vi) – Valor después de 60s
Accionar la válvula de descarga de aire, generar la presión programada
Variación de presión (Vp2)Valor inicial – Valor después de 60s
Porcentaje de pérdida(Vp2-Vp1)*100/(Vi-Vp1)
Calcular valores para la generación de protocolos de calibración, registrando las
condiciones ambientales de humedad, temperatura, día, mes, año, hora, minuto,
segundo, en que fueron realizadas las mediciones. Transmitir información en
caso de ser requerida.
Mostrar valores en pantalla LCD
Fin.
[Código: ver anexo 9]

La norma europea EN 1060 abarca los dispositivos, mecánicos y electrónicos,


de medición de presión arterial no invasiva y está divida en cuatro partes. La
EN 1060-1 contiene los requerimientos generales para todos los tipos de
esfigmomanómetros no invasivos. La EN 1060-2 incluye requerimientos
complementarios para esfigmomanómetros mecánicos. La EN 1060-3 incluye
requerimientos complementarios para sistemas electromecánicos de medición
de presión arterial. La EN 1060-4 describe los procedimientos de calibración
para determinar la precisión general del sistema de esfigmomanómetros no
invasivos automáticos. Las condiciones de temperatura y humedad durante la
calibración deben estar en el rango de 15°C a 25 °C y 20% al 80%
respectivamente. Los valores para la calibración deben estar en el rango de
0mmHg al máximo valor nominal del dispositivo sometido a verificación. El
máximo error permisible en cualquier punto del rango de medición es de
±3mmHg, dentro de las condiciones ambientales especificadas previamente. 19

19
Chandra, S., Lay-Ekuakille, A. The EU Standard EN 1060. En su: Advances in Biomedical Sensing,
Measurements, Instrumentation and Systems. Alemania: Springer, 2010, p. 297.
57

3.9 INTERFAZ DE USUARIO

Comprende:
 Circuito para el ingreso de datos.
 Circuito para la visualización de datos.
 Zumbador, indicadores visuales.

3.4.1 CIRCUITO PARA EL INGRESO DE DATOS

Se utiliza un teclado 4x4, para el ingreso de datos. Este circuito interactúa con
el circuito de visualización de datos. En el menú se seleccionan las opciones
con las que se desea trabajar.

3.4.2 CIRCUITO PARA LA VISUALIZACION DE DATOS

Se visualizan los datos mediante una pantalla de cristal líquido (LCD). Se


ingresan las opciones deseadas mediante el teclado, que pueden ser los
valores de presión en modo manual o solicitar el modo programado, cálculo de
presión absoluta y relativa, cálculo de pérdida de aire; se visualizan valores de
presión, humedad, temperatura, altura, día, mes, año, hora, minuto, segundo,
cálculo de errores, mensajes de error.

3.4.3 ZUMBADOR E INDICADORES VISUALES

El zumbador emite un sonido cuando se inicializa el sistema, y cuando se


pulsan las teclas al ingresar los datos. Los indicadores visuales (diodos
emisores de luz) permiten verificar el funcionamiento de los componentes,
como son la bomba de diafragma, la válvula de descarga, así como indicar un
error de funcionamiento en el sistema.
58

3.10 ESPECIFICACIONES TECNICAS

El prototipo se desarrolla tomando en cuenta los antecedentes y el


funcionamiento de acuerdo a las condiciones de humedad, temperatura,
altura, para ello se utilizan dispositivos electrónicos que pueden operar bajo
ciertas condiciones ambientales del territorio peruano.

Las especificaciones técnicas son:

a. Rango de presión: 0 a 400mmHg.


b. Presentación de resultados en mmHg, kg/m2, Pa, atm, psi y milibar.
c. Modo de calibración manual.
d. Modo de calibración automática o programada.
e. Interfaz RS232.
f. Tanque de almacenamiento de aire de 500ml.
g. Medición de fugas de aire.
h. Medición de temperatura, humedad, altitud.
i. Teclado matricial para ingreso de datos.
j. Pantalla LCD para visualización de datos.

Los valores mostrados, se toman en función de la aplicación a la que se


someterá el prototipo, teniendo en cuenta que los procesos de calibración
están orientados a los tensiómetros aneroides.
.
59

CAPITULO IV

PRUEBAS Y RESULTADOS EXPERIMENTALES

8.1 PRUEBAS EXPERIMENTALES

Se realizaron pruebas experimentales, con el objetivo de comprobar el


funcionamiento del prototipo en un proceso real de calibración de un
tensiómetro aneroide; contrastando la teoría con la práctica.

Para la medición de la presión en modo manual, se tiene un valor ingresado y


un valor de lectura en el esfigmomanómetro.

Valor de Valor de
presión presión medido
ingresado
30 mmHg 30 mmHg
50 mmHg 50 mmHg
90 mmHg 92 mmHg
130 mmHg 131 mmHg
140 mmHg 140 mmHg
180 mmHg 180 mmHg
220 mmHg 219 mmHg
240 mmHg 240 mmHg
260 mmHg 261 mmHg

Tabla 1. Valores de presión medidos en el esfigmomanómetro versus valores de


presión ingresados en modo manual.
60

Para la medición de presión en modo automático, se tienen valores


programados y valores de lectura en el esfigmomanómetro.

Valores de presión Valores de


programados presión medidos
20 mmHg 20 mmHg
40 mmHg 40 mmHg
60 mmHg 60 mmHg
80 mmHg 81 mmHg
100 mmHg 101 mmHg
120 mmHg 120 mmHg
150 mmHg 150 mmHg
200 mmHg 200 mmHg
250 mmHg 250 mmHg
280 mmHg 282 mmHg

Tabla 2. Valores de presión medidos en el esfigmomanómetro versus valores de


presión en modo programado.

Se selecciona la opción para calcular la pérdida de aire, en este modo se


evidencia la correcta inicialización del sensor de presión, accionándose la
bomba de diafragma hasta un obtener un valor de presión mayor a 200mmHg,
donde en intervalos de 60 segundos se obtienen mediciones de presión para
su posterior comparación y valoración.
61

8.2 RESULTADOS EXPERIMENTALES

De los valores obtenidos en la tabla 1, se tienen los siguientes resultados


experimentales:

Valores de presión Error


ingresados
30 mmHg 0 mmHg
50 mmHg 0 mmHg
90 mmHg -2 mmHg
130 mmHg -1 mmHg
140 mmHg 0 mmHg
180 mmHg 0 mmHg
220 mmHg 1 mmHg
240 mmHg 0 mmHg
260 mmHg -1 mmHg

Tabla 4. Valores de presión ingresados y error, modo manual.

De los resultados experimentales obtenidos en modo manual, se tiene que el


esfigmomanómetro evaluado se encuentra dentro del rango de funcionamiento
permitido, debido a que el valor de error se encuentra en el margen permitido
±3 mmHg.
62

De los valores medidos en la tabla 2, se tienen los siguientes resultados


experimentales:

Valores de presión Desviación Porcentaje de


programados desviación
20 mmHg 0 mmHg 0%
40 mmHg 0 mmHg 0%
60 mmHg 0 mmHg 0%
80 mmHg -1 mmHg 1.2 %
100 mmHg -1 mmHg 1.0 %
120 mmHg 0 mmHg 0%
150 mmHg 0 mmHg 0%
200 mmHg 0 mmHg 0%
250 mmHg 0 mmHg 0%
280 mmHg -2 mmHg 0.7%

Tabla 5. Valores de desviación y porcentaje de desviación, modo programado.

De los resultados experimentales obtenidos en modo programado, se tiene


que el esfigmomanómetro evaluado se encuentra dentro del rango de
funcionamiento permitido, debido a que se encuentra en el margen ±3 mmHg.

Del resultado experimental en modo de pérdida de aire, se tiene un valor igual


a 0%.

De la revisión de los resultados obtenidos, se puede comprobar que el sistema


tiene un margen de error permitido de ±3 mmHg, fuera de este rango se
muestran mensajes indicando que el esfigmomanómetro no se encuentra apto
para uso clínico, se presentan también valores de presión estables.
63

CAPITULO V

CONCLUSIONES Y RECOMENDACIONES

10.1 CONCLUSIONES

El presente estudio está orientado a la verificación del correcto funcionamiento


de tensiómetros aneroides, generando valores de presión estables, con
márgenes de error permitidos. Se logró responder a los objetivos planteados.

1. La presión entregada por el equipo, ofrece mejoras en la medición,


debido a los valores estables de presión generados.
2. El equipo está orientado para trabajar en función de las condiciones
climatológicas del territorio peruano, pudiendo ser adaptado mediante
programación.
3. La utilización de sensores y actuadores con rangos de funcionamiento
acordes a las condiciones ambientales del territorio peruano, permite
tener una mayor precisión y exactitud.
4. El equipo muestra en la pantalla LCD las mediciones de presión,
temperatura, humedad, altitud, fecha y hora.
5. Las variables medidas pueden ser analizadas mediante una
computadora personal mediante las interfaces RS232.
6. Se ha comprobado que en el proceso de calibración es necesario
garantizar los niveles de presión requeridos, puesto que la utilización de
tensiómetros aneroides en mal estado conlleva a un mal diagnóstico del
paciente y por ende riesgos mayores en su tratamiento.
64

10.2 RECOMENDACIONES

1. Realizar un análisis para determinar el tiempo de estabilización, en


base a los datos que pueden ser obtenidos mediante el USART del
microcontrolador.
2. Se debe tener un especial cuidado en el ingreso de los valores leídos
en el esfigmomanómetro, para evitar errores de paralaje.
3. Utilizar una pantalla táctil, debido a que el teclado convencional puede
presentar corrosión en climas húmedos.
4. Incorporar un sistema de transmisión de datos, inalámbrico.
5. Desarrollar un programa aplicativo para su uso con teléfonos
inteligentes.
6. Evaluar el almacenamiento de información en una base de datos para
su análisis estadístico.
7. Diseñar un sistema portátil, para un transporte sencillo.
8. Diseñar un sistema de procesamiento de imagen para el registro y
verificación automática del valor de presión mostrado en el
esfigmomanómetro, para que el proceso de calibración se realice en un
tiempo menor.
9. Diseñar un programa con control PID, para un análisis comparativo con
el programa desarrollado.
10. Realizar pruebas con diferentes equipos de medición de presión
arterial, para afianzar la eficacia del prototipo.
65

REFERENCIAS BIBLIOGRAFICAS

1. GRANDA, M., MEDIAVILLA, E., (2015). Instrumentación Electrónica. Ed.


Universidad Cantabria.

2. BOSCH, J., CARMONA, M., (2012). Instrumentación Electrónica


Avanzada. Ed. Universidad de Barcelona.

3. PALLAS, R., (2003) Sensores y Acondicionadores de Señal. Ed.


Marcombo.

4. PEREZ GARCIA, M., ALVAREZ ANTON, J., CAMPO RODRIGUEZ, J.,


FERRERO MARTIN, F., GRILLO ORTEGA, G., (2003). Instrumentación
Electrónica. España. Ed. Thomson-Paraninfo.

5. COOPER, W., HELFRICK, A., (1991). Instrumentación Electrónica


Moderna y Técnicas de Medición. México. Ed. Prentice Hall.

6. JONES, E., (1987). Jones’ Instrument Technology Volume 4:


Instrumentation Systems. Inglaterra. Ed. Butterworth & Co.

7. REYES, C., (2008). Microcontroladores PIC Programación en Basic.


Ecuador. Ed. Rispergraf.

8. ANGULO USATEGUI, J. M., ANGULO MARTINEZ, I., (2003).


Microcontroladores PIC – Diseño Práctico de Aplicaciones. España. Ed.
McGraw Hill.

9. GADRE, D., (2001). Programming and Customizing the AVR


Microcontroller. Estados Unidos. Ed. McGraw-Hill.

10. GARCIA, E., (2008) Compilador C CCS y Simulador Proteus para


Microcontroladores PIC. Ed. Marcombo.

11. BARNETT, R., O’CULL, L., COX, S., (2007). Embedded C Programming
and the Atmel AVR, 2e. Estados Unidos. Ed. Cengage Learning.

12. MALONEY, T. J., (1983). Electrónica Industrial. México. Ed. Prentice-Hall.


66

13. CIROVIC, M., (1991). Electrónica fundamental: Dispositivos, circuitos y


sistemas. España. Ed. Reverté.

14. HOLT, C., (1989). Circuitos electrónicos, digitales y analógicos. España.


Ed. Reverté.

15. DYRO, J., NANDOR, R., (2004). The Clinical Engineering Handbook.
España. Ed. Academic Press.

16. SERWAY, R., FAUGHN, J., (2001). Física. México. Ed. Pearson
Educación.

17. CHANDRA, S., LAY-EKUAKILLE, A., (2010). Advances in Biomedical


Sensing, Measurements, Instrumentation and Systems. Alemania. Ed.
Springer.

18. CATEDU. Sensores, captadores y actuadores. [en línea] <http://e-


ducativa.catedu.es/44700165/aula/archivos/repositorio/4750/4928/html/3_cl
asificacin_de_transductores.html> [consulta: 24 febrero 2017]

19. Lindemann, W. Transductores: Sensores y actuadores [en línea]


<https://www.academia.edu/9713734/TEMA_4_TRANSDUCTORES_SENS
ORES_Y_ACTUADORES_1_-SENSORES_RESISTIVOS> [consulta: 24
febrero 2017]

20. Cooper,T. DS1307 Real Time Clock Breakout Board Kit. Adafruit Industries,
2016.

21. La presión arterial y su salud. American Society of Hypertension, Inc. 2010.

22. ARDUINO. Arduino Mega 2560&Genuino Mega 2560. [en línea]


<https://www.arduino.cc/en/Main/arduinoBoardMega2560#> [consulta: 01
abril 2017]

23. IMARPE. Presión atmosférica a nivel del mar. [en línea]


http://www.imarpe.pe/imarpe/index.php?id_seccion=I017803010100000000
0000 [consulta: 04 abril 2017]

24. ARIAS, F. G., (1999). El Proyecto de Investigación – Guía para su


elaboración. Venezuela. Ed. Episteme
67

25. HERNANDEZ SAMPIERI, R., FERNANDEZ COLLADO, C., BAPTISTA


LUCIO, P., (1991). Metodología de la Investigación Científica. México. Ed.
McGraw-Hill.

26. HERNANDEZ SAMPIERI, R., FERNANDEZ COLLADO, C., BAPTISTA


LUCIO, P., (2007). Fundamentos de metodología de la investigación.
España. Ed. McGraw-Hill.

27. SANCHEZ CARLESSI, H., REYES MEZA, C., (1996). Metodología de la


Investigación Científica. Perú. Ed. Mantaro.
68

ANEXOS
69

[Anexo 1]
70

[Anexo 2]
71

[Anexo 3]
72

[Anexo 4]
73

[Anexo 5]
74

[Anexo 6]
75
76

[Anexo 7]
77

[Anexo 8]
78

[Anexo 9] Código de Programa

#include <Wire.h>
#include <Adafruit_BMP085.h>
#include "U8glib.h"
#include <Keypad.h>
#include <DS1307new.h>
#include "DHT.h"
#include <EEPROM.h>
#define DHTPIN 4
#define DHTTYPE DHT11
U8GLIB_ST7920_128X64 u8g(7, 6, 5, U8G_PIN_NONE);
Adafruit_BMP085 bmp;
DHT dht(DHTPIN, DHTTYPE);
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','4','7','S'},
{'2','5','8','0'},
{'3','6','9','E'},
{'A','B','C','D'}
};
byte rowPins[ROWS] = {A12, A13, A14, A15};
byte colPins[COLS] = {A8, A9, A10, A11};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String serialnumber = "PEAV-0001";
int baudrate = 9600;
int motor = 12;
int relais = 11 ;
int busyled = 10 ;
int piezopin = 13 ;
const int temperaturecalfactor = +2 ;
const int humiditycalfactor = +5 ;
int temperature = 0 ;
float temperature_bmp = 0 ;
int humidity = 0 ;
float presure = 0 ;
float altitude = 0 ;
float meters = 0 ;
int32_t realaltitude = 0 ;
float mmHg = 0 ;
float mmHg_offset = 0 ;
float isPresure = 0 ;
float toPresure = 0;
float resultPresure = 0 ;
float result_actual_presure[10];
float result_is_presure[10];
float testvalues[10] = {20, 40, 60, 80, 100,120,150,200,250,280};
long dT_0 = 0 ;
long dT_15 = 0 ;
long dT_30 = 0 ;
long dT_45 = 0 ;
long dT_60 = 0 ;
float totalmmHg = 0 ;
float totaltoleranz = 0 ;
float maxtoleranz = 0 ;
float mintoleranz = 0 ;
float maxmmHg = 0 ;
float minmmHg = 0 ;
char *MenuText1[6] ;
char *MenuText2[6] ;
char *MenuText3[6] ;
char *MenuText4[6] ;
79

char *ErrorMessageText[16];
uint16_t startAddr = 0x0000;
uint16_t lastAddr;
uint16_t TimeIsSet = 0xaa55;
float losing_percent= 0 ;
int testquantity = 0 ;
int maxtestpresure = 0 ;
int messurementcycles = 0;
float mintestpercent = 0 ;
float maxtestpercent = 0 ;
float starttestpercent = 0 ;
float stoptestpercent = 0 ;
void setup() {
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
u8g.setColorIndex(255);
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
u8g.setColorIndex(3);
else if ( u8g.getMode() == U8G_MODE_BW )
u8g.setColorIndex(1);
drawinit();
pinMode(motor, OUTPUT);
pinMode(relais, OUTPUT);
pinMode(busyled, OUTPUT);
digitalWrite(busyled, HIGH);
Wire.begin();
delay(2000);

if (!bmp.begin(BMP085_HIGHRES)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
dht.begin();
RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
if (TimeIsSet != 0xaa55)
{
RTC.stopClock();

RTC.fillByYMD(2013,1,1);
RTC.fillByHMS(12,0,0);

RTC.setTime();
TimeIsSet = 0xaa55;
RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
RTC.startClock();
}
else
{
RTC.getTime();
}
temperature_bmp = bmp.readTemperature();
presure = bmp.readPressure() ;
altitude = bmp.readAltitude() ;
realaltitude = bmp.readAltitude(101500) ;
mmHg_offset = presure * 0.00750062 ;
calaltitude();
if (!(isnan(temperature)) || !(isnan(humidity))) {
humidity = dht.readHumidity();
temperature = dht.readTemperature() + temperaturecalfactor;
}
calpresureflag = false ;
makesound();
digitalWrite(busyled, LOW);
setserial2();
Serial2.println(" ");
80

Serial2.println(" ");
Serial2.println("*************************************************************");
Serial2.println(" ");
}
void loop(void) {
screen01();
if ( (RTC.second == 0) | (RTC.second == 15) |(RTC.second == 30) | (RTC.second == 0)) {
if (!(isnan(temperature)) || !(isnan(humidity))) {
humidity = dht.readHumidity() + humiditycalfactor;
temperature = dht.readTemperature() + temperaturecalfactor;
}
}
char key = keypad.getKey();
if(key)
{
switch (key)
{
case 'B':
keysound();
messurementMode();
break;
case 'A':
keysound();
calibrationMode();
break;
case 'C':
keysound();
qualityMode();
break;
case 'D':
keysound();
setupMode();
break;
default:
wrongsound();
break;
}
}
}
void setserial2() {
int value = 0 ;
value = EEPROM.read(1);
if ( value > 3 ) {
value = 0 ;
EEPROM.write(1, 0);
}
switch (value) {
case 0:
Serial2.begin(9600);
break;
case 1:
Serial2.begin(19200);
break;
case 2:
Serial2.begin(57600);
break;
case 3:
Serial2.begin(115200);
break;
default:
Serial2.begin(9600);
}
}
void makesound(){
tone(piezopin, 650, 200);
81

delay(200);
tone(piezopin, 300, 300);
delay(300);
tone(piezopin, 400, 200);
delay(200);
tone(piezopin, 300, 300);
delay(300);
tone(piezopin, 650, 200);
}
void keysound(){
tone(piezopin, 650, 200);
}
void wrongsound(){
tone(piezopin, 400, 200);
}
int getNumber(){
int number = 0 ;
boolean endflag = false ;

while (endflag != true){

char key = keypad.getKey();


if(key)
{
switch (key)
{
case '1':
number = 1;
keysound();
endflag = true;
break;
case '2':
number = 2;
keysound();
endflag = true;
break;
case '3':
number = 3;
keysound();
endflag = true;
break;
case '4':
number = 4;
keysound();
endflag = true;
break;
case '5':
number = 5;
keysound();
endflag = true;
break;
case '6':
number = 6;
keysound();
endflag = true;
break;
case '7':
number = 7;
keysound();
endflag = true;
break;
case '8':
number = 8;
keysound();
endflag = true;
82

break;
case '9':
number = 9;
keysound();
endflag = true;
break;
case '0':
number = 0;
keysound();
endflag = true;
break;
default:
wrongsound();
break;
}
}
}
return number;
}
uint8_t insert2digits(){

uint8_t keyvalue = 0 ;

keyvalue = keyvalue + (getNumber()*10);


keyvalue = keyvalue + getNumber();
keysound();
return keyvalue ;
}

uint16_t insert3digits(){
uint16_t keyvalue = 0 ;

keyvalue = keyvalue + (getNumber()*100);


keyvalue = keyvalue + (getNumber()*10);
keyvalue = keyvalue + getNumber();
keysound();
return keyvalue ;
}

uint16_t insert4digits(){
uint16_t keyvalue = 0 ;

keyvalue = keyvalue + (getNumber()*1000);


keyvalue = keyvalue + (getNumber()*100);
keyvalue = keyvalue + (getNumber()*10);
keyvalue = keyvalue + getNumber();
keysound();
return keyvalue ;
}
void waitkey(){
boolean endflag = false;
while (endflag == false){
char key = keypad.getKey();
if(key) {endflag = true;}
}
}

void drawinitscreen(void) {
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 10, 35, "SW Version 1.0");
u8g.drawStr( 10, 57, "iniciando ...");
}
void drawinit() {
u8g.firstPage();
do {
83

drawinitscreen();
} while( u8g.nextPage() );
}
void drawstandardscreen(){
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.drawRFrame(0,0,128,64,0);
u8g.drawStr( 97, 13,*MenuText1);
u8g.drawRFrame(95,0,33,17,0);
u8g.drawStr( 97, 29,*MenuText2);
u8g.drawRFrame(95,16,33,17,0);
u8g.drawStr( 97, 45,*MenuText3);
u8g.drawRFrame(95,32,33,17,0);
u8g.drawStr( 97, 60,*MenuText4);
u8g.drawRFrame(95,48,33,16,0);
}
void ErrorMessage ( ){
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 0, 15, "Error:");
u8g.drawStr( 0, 35, *ErrorMessageText);
u8g.drawStr( 0, 57, " Llama Servicio");
}
void drawErrorMessage() {
u8g.firstPage();
do {
ErrorMessage();
} while( u8g.nextPage() );
while (1) {}
}
void calaltitude(){
altitude = 0 ;
realaltitude = 0 ;
mmHg_offset = 0 ;
presure = 0 ;

if (!bmp.begin(BMP085_HIGHRES)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
for (int i=0 ; i <10; ++i){
altitude = altitude + bmp.readAltitude() ;
realaltitude = realaltitude + bmp.readAltitude(101500) ;
presure = bmp.readPressure() ;
mmHg_offset = mmHg_offset + presure * 0.00750062 ;
keysound();
delay(1000);
}
altitude = altitude / 10 ;
realaltitude = realaltitude /10 ;
mmHg_offset = mmHg_offset /10 ;
}
void drawscreen01() {
RTC.getTime();
*MenuText1 = "Calib";
*MenuText2 = "Medic";
*MenuText3 = "Test";
*MenuText4 = "Setup";
drawstandardscreen();
u8g.setPrintPos(15,10);
u8g.print("Calibrador de ");
u8g.setPrintPos(25,20);
u8g.print(" Presion");
u8g.setFont(u8g_font_5x7);
u8g.setFontRefHeightExtendedText();
84

u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.setPrintPos(3,23);
u8g.print("Ambien: ");
u8g.print(temperature,1);
u8g.print("C ");
u8g.print(humidity,1);
u8g.print("%");
u8g.setPrintPos(3,33);
u8g.print("Altura: ");
u8g.print( bmp.readAltitude(101500),0);
u8g.print("m");
u8g.setPrintPos(3,43);
u8g.print("Fecha : ");
u8g.print(RTC.day, DEC);
u8g.print(".");
u8g.print(RTC.month, DEC);
u8g.print(".");
u8g.print(RTC.year, DEC);
u8g.setPrintPos(3,53);
u8g.print("Hora : ");
u8g.print(RTC.hour, DEC);
u8g.print(":");
u8g.print(RTC.minute, DEC);
u8g.print(":");
u8g.print(RTC.second, DEC);
}
void screen01(){
u8g.firstPage();
do {
drawscreen01();
} while( u8g.nextPage() );

}
void drawscreen02(int value) {
*MenuText1 = "Abso";
*MenuText2 = "Rela";
*MenuText3 = " ";
*MenuText4 = " ";
drawstandardscreen();
u8g.setPrintPos(15,10);
u8g.print("Modo Medicion");
u8g.setFont(u8g_font_5x7);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.setPrintPos(10,13);
u8g.print("1 - mmHg / torr");
if ( value == 1){ u8g.drawRFrame(3,12,85,10,3); };
u8g.setPrintPos(10,21);
u8g.print("2 - hPa");
if ( value == 2){ u8g.drawRFrame(3,20,85,10,3); };
u8g.setPrintPos(10,29);
u8g.print("3 - atm");
if ( value == 3){ u8g.drawRFrame(3,28,85,10,3); };
u8g.setPrintPos(10,37);
u8g.print("4 - milibar");
if ( value == 4){ u8g.drawRFrame(3,36,85,10,3); };
u8g.setPrintPos(10,45);
u8g.print("5 - psi");
if ( value == 5){ u8g.drawRFrame(3,44,85,10,3); };
u8g.setPrintPos(10,53);
u8g.print("6 - kgf/m2");
if ( value == 6){ u8g.drawRFrame(3,52,85,10,3); };
}
85

void screen02(int value){


u8g.firstPage();
do {
drawscreen02(value);
} while( u8g.nextPage() );
}

void drawscreen03 (int einheit) {

float rango = 0 ;
rango = mmHg_offset + 500;
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(30,12);
u8g.print("Modo absoluto");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
switch (einheit)
{
case 1: // mmHg / torr
u8g.setPrintPos(20,40);
u8g.print( (bmp.readPressure() * 0.00750062),1);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(90,50);
u8g.print("mmHg");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion: 225-");
u8g.print(rango,0);
break;
case 2: // PA
u8g.setPrintPos(20,40);
u8g.print(bmp.readPressure());
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(108,50);
u8g.print("Pa");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion:300-");
u8g.print((rango*133.32),0);
break;
case 3: // atm
u8g.setPrintPos(30,40);
u8g.print( ( bmp.readPressure()* 0.00000986923266716),3 );
u8g.setPrintPos(105,50);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.print("atm");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion:0.296-");
u8g.print((rango*0.001315789473684),3);
break;
case 4: // milibar
u8g.setPrintPos(30,40);
u8g.print((bmp.readPressure()* 0.01),1);
u8g.setPrintPos(85,50);
u8g.setFontPosTop();
86

u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.print("milibar");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion: 300-");
u8g.print((rango*1.333),0);
break;
case 5: //psi
u8g.setPrintPos(30,40);
u8g.print( bmp.readPressure()* 0.0001450378911491 );
u8g.setPrintPos(105,50);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.print("psi");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion:4.35-");
u8g.print((rango*0.01933679515879),2);
break;
case 6: // kgf/m2
u8g.setPrintPos(30,40);
u8g.print( (bmp.readPressure()* 0.1019716212978),0);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(90,50);
u8g.print("kgf/m2");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion:3059-");
u8g.print((rango*13.59509806316 ),0);
break;
default:
break;
}
}

void screen03(int value){


u8g.firstPage();
do {
drawscreen03(value );
} while( u8g.nextPage() );
}

void absolutmode(int value){


boolean endflag = false;
if (!bmp.begin(BMP085_ULTRAHIGHRES)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
digitalWrite(busyled, HIGH);
digitalWrite(relais, HIGH);
while ( endflag != true ) {
screen03( value );
char key = keypad.getKey();
if(key)
{
switch (key)
{
case 'E':
endflag = true ;
keysound();
digitalWrite(busyled, LOW);
87

digitalWrite(relais, LOW);
break;
default:
wrongsound();
break;
}
}
}
}
void drawscreen04 (int einheit) {

float rango = 0 ;

rango = mmHg_offset + 500;


u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(30,12);
u8g.print("Modo Relativa");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
switch (einheit)
{
case 1: // mmHg / torr
u8g.setPrintPos(20,40);
u8g.print( ((bmp.readPressure() * 0.00750062) - mmHg_offset )-0.00750062,1);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(90,50);
u8g.print("mmHg");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion: 0-500");
break;
case 2: // PA
u8g.setPrintPos(20,40);
u8g.print(bmp.readPressure()-(mmHg_offset * 133.3223684211)-13.3,0);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(108,50);
u8g.print("Pa");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion:300-66660");
break;
case 3: // atm
u8g.setPrintPos(30,40);
u8g.print( (( bmp.readPressure()* 0.00000986923266716)-( mmHg_offset * 0.001315789473684 )-
0.00000986923266716,3 ));
u8g.setPrintPos(105,50);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.print("atm");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion:0.296-0.657");
break;
case 4: // milibar
u8g.setPrintPos(30,40);
u8g.print(((bmp.readPressure()* 0.01)-( mmHg_offset * 1.333223684211))-0.01,1);
u8g.setPrintPos(85,50);
88

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.print("milibar");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion: 300-666");
break;
case 5: // psi
u8g.setPrintPos(30,40);
u8g.print((bmp.readPressure()* 0.0001450378911491)-( mmHg_offset * 0.01933679515879)-0.0001450378911491);
u8g.setPrintPos(105,50);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.print("psi");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion:4.35-9.66");
break;
case 6: // kgf/m2
u8g.setPrintPos(30,40);
u8g.print( ((bmp.readPressure()* 0.1019716212978)-( mmHg_offset * 13.59509806316 ))- 0.1019716212978,0);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(90,50);
u8g.print("kgf/m2");
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Rango medicion:3059-6797");
break;
default:
break;
}
}

void screen04(int value){


u8g.firstPage();
do {
drawscreen04(value );
} while( u8g.nextPage() );
}

void relativmode(int value){


boolean endflag = false;

if (!bmp.begin(BMP085_ULTRAHIGHRES)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
digitalWrite(busyled, HIGH);
digitalWrite(relais, HIGH);
while ( endflag != true ) {
screen04( value );
char key = keypad.getKey();

if(key)
{
switch (key)
{
case 'E':
endflag = true ;
keysound();
89

digitalWrite(busyled, LOW);
digitalWrite(relais, LOW);
break;
default:
wrongsound();
break;
}
}
}
}
void messurementMode(){
int mode = 1 ;
int value = 1 ;
boolean endflag = false ;
screen02(value);
while ( endflag != true ) {
char key = keypad.getKey();
if(key)
{
switch (key)
{
case 'A':
mode = 1 ;
keysound();
absolutmode(value);
screen02(value);
screen02(value);
break;
case 'B':
mode = 2 ;
keysound();
relativmode(value);
screen02(value);
screen02(value);
break;
case 'C':
mode = 3 ;
keysound();
break;
case '1':
value = 1 ;
keysound();
screen02(value);
screen02(value);
break;
case '2':
value = 2 ;
keysound();
screen02(value);
screen02(value);
break;
case '3':
value = 3 ;
keysound();
screen02(value);
screen02(value);
break;
case '4':
value = 4 ;
keysound();
screen02(value);
screen02(value);
break;
case '5':
value = 5;
90

keysound();
screen02(value);
screen02(value);
break;
case '6':
value = 6;
keysound();
screen02(value);
screen02(value);
break;
case 'S':
keysound();
break;
case 'E':
endflag = true ;
keysound();
break;
default:
wrongsound();
break;
}
}
}
}

void drawscreen05() {
*MenuText1 = "Manu";
*MenuText2 = "Prog";
*MenuText3 = "Perd";
*MenuText4 = " ";
drawstandardscreen();
u8g.setPrintPos(5,10);
u8g.print("Modo Calibracion");
u8g.setFont(u8g_font_5x7);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.setPrintPos(10,15);
u8g.print(">> Ayuda <<<");
u8g.setPrintPos(5,23);
u8g.print("F1 = Manual");
u8g.setPrintPos(5,32);
u8g.print("F2 = Programada");
u8g.setPrintPos(5,40);
u8g.print("F3 = Perdida aire");
u8g.setPrintPos(5,48);
u8g.print("F4 = Pulse Cal");
}

void screen05(){
u8g.firstPage();
do {
drawscreen05();
} while( u8g.nextPage() );
}

void calibrationMode(){

boolean endflag = false ;

screen05();
while ( endflag != true ) {
char key = keypad.getKey();
if(key)
{
91

switch (key)
{
case 'A':
keysound();
manualmode();
screen05();
screen05();
break;
case 'B':
keysound();
programm_mode();
screen05();
screen05();
break;
case 'C':
perdidamode();
screen05();
screen05();
keysound();
break;
case 'D':
keysound();
keysound();
pulsemode();
screen05();
screen05();
break;
case 'S':
keysound();
break;
case 'E':
endflag = true ;
keysound();
break;
default:
wrongsound();
break;
}
}
}
}

void drawscreen06 () {
float rango = 0 ;

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(30,12);
u8g.print("Modo Manual");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(40,35);
u8g.print( isPresure ,0);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(90,45);
u8g.print("mmHg");
u8g.setPrintPos(3,50);
u8g.print("Objetivo: ");
u8g.print(toPresure,0);
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
92

u8g.print("F1=Introducir la presion");
}

void screen06(){
u8g.firstPage();
do {
drawscreen06();
} while( u8g.nextPage() );
}

void drawscreen07 () {
float rango = 0 ;
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(10,12);
u8g.print("Introducir el valor");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(40,40);
u8g.print(toPresure,0);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print(" Valor debe ser 0-300");
}

void screen07(){
u8g.firstPage();
do {
drawscreen07();
} while( u8g.nextPage() );
}
void insert3digitpresure(){
toPresure = 301 ;
while (toPresure > 300){
toPresure = 0 ;
digitalWrite(motor, LOW);
screen07();
toPresure = toPresure +(getNumber()*100);
screen07();
toPresure = toPresure + (getNumber()*10);
screen07();
toPresure = toPresure + getNumber();
screen07();
if ( toPresure > 300 ) { wrongsound();} else {
keysound();
delay(250);
keysound();
}
delay(750);
}
}
void manualmode(){

boolean startflag = false;


boolean nodisplayflag = false;
boolean endflag = false;

if (!bmp.begin(BMP085_STANDARD)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
93

digitalWrite(busyled, HIGH);
digitalWrite(relais, HIGH);
insert3digitpresure();
while ( endflag != true ) {
if(nodisplayflag == false){ screen06();}
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
if (isPresure < 0) { isPresure = 0;}
if (isPresure > 310) { digitalWrite(relais, HIGH);}
if ((isPresure < toPresure - 0.2 ) && (isPresure + 2.99 > toPresure )) {
digitalWrite(motor, HIGH);
nodisplayflag = true;
}
if (isPresure < toPresure - 3) {
digitalWrite(motor, HIGH);
nodisplayflag = false;
}
if (isPresure > toPresure + 0.2 ) {
digitalWrite(motor, LOW);
nodisplayflag = false;
}

if (isPresure > ( toPresure + 15 )) {


digitalWrite(relais, LOW);
nodisplayflag = false;
}
else
{
digitalWrite(relais, HIGH);
}
if ((isPresure > toPresure + 5) && (isPresure < ( toPresure + 14.99)))
{ digitalWrite(relais, HIGH);
delay(10);
digitalWrite(relais, LOW);
nodisplayflag = true;
}
if ((isPresure > toPresure + 1) && (isPresure < ( toPresure + 4.99)))
{ digitalWrite(relais, HIGH);
delay(5);
digitalWrite(relais, LOW);
nodisplayflag = true;
}

char key = keypad.getKey();


if(key)
{
switch (key)
{
case 'A':
digitalWrite(motor, LOW);
insert3digitpresure();
keysound();
break;
case 'E':
endflag = true ;
keysound();
digitalWrite(busyled, LOW);
digitalWrite(motor, LOW);
digitalWrite(relais, LOW);
break;
default:
wrongsound();
break;
}
}
}
94

if (!bmp.begin(BMP085_HIGHRES)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
}

void drawscreen12 () {
float rango = 0 ;

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(30,12);
u8g.print("Preparacion");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(5,40);
u8g.print("Esperar..");
u8g.setFontPosTop();
u8g.setPrintPos(2,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Inflacion y eliminar aire");
}

void screen12(){
u8g.firstPage();
do {
drawscreen12();
} while( u8g.nextPage() );
}

void drawscreen13 () {
float rango = 0 ;
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(30,12);
u8g.print("Generar registro");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(5,40);
u8g.print("Esperar..");
u8g.setFontPosTop();
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Transmito datos ...");
}
void screen13(){
u8g.firstPage();
do {
drawscreen13();
} while( u8g.nextPage() );
}
void drawscreen10 () {
float rango = 0 ;

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(20,12);
u8g.print("Modo Calibracion");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
95

u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(40,35);
u8g.print( isPresure ,0);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(90,35);
u8g.print("mmHg");
u8g.setPrintPos(3,50);
u8g.print("Objetivo:");
u8g.print(toPresure,0);
u8g.print(" Result.:");
u8g.print(resultPresure,0);
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("F1=Resultado F2=Proximo");
}
void screen10(){
u8g.firstPage();
do {
drawscreen10();
} while( u8g.nextPage() );
}

void drawscreen11 () {
float rango = 0 ;

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(3,12);
u8g.print("Leer valor manometro");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(40,40);
u8g.print(resultPresure,0);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setPrintPos(10,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Ingresa 3 digitos");
}

void screen11(){
u8g.firstPage();
do {
drawscreen11();
} while( u8g.nextPage() );
}

void drawscreen23 () {
float rango = 0 ;

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_5x7);
u8g.setPrintPos(10,0);
u8g.print(" Debe Desviacion %");
u8g.setPrintPos(10,18);
u8g.print(testvalues[0],1);
u8g.print("mmHg ");
u8g.print((testvalues[0] - result_is_presure[0]),1);
u8g.print("mmHg ");
u8g.print((((result_is_presure[0]) * 100) / testvalues[0])-100,1);
96

u8g.print("%");
u8g.setPrintPos(10,27);
u8g.print(testvalues[1],1);
u8g.print("mmHg ");
u8g.print((testvalues[1] - result_is_presure[1]),1);
u8g.print("mmHg ");
u8g.print((((result_is_presure[1]) * 100) / testvalues[1])-100,1);
u8g.print("%");
u8g.setPrintPos(10,36);
u8g.print(testvalues[2],1);
u8g.print("mmHg ");
u8g.print((testvalues[2] - result_is_presure[2]),1);
u8g.print("mmHg ");
u8g.print((((result_is_presure[2]) * 100) / testvalues[2])-100,1);
u8g.print("%");
u8g.setPrintPos(10,45);
u8g.print(testvalues[3],1);
u8g.print("mmHg ");
u8g.print((testvalues[3] - result_is_presure[3]),1);
u8g.print("mmHg ");
u8g.print((((result_is_presure[3]) * 100) / testvalues[3])-100,1);
u8g.print("%");
u8g.setPrintPos(10,54);
u8g.print(testvalues[4],1);
u8g.print("mmHg ");
u8g.print((testvalues[4] - result_is_presure[4]),1);
u8g.print("mmHg ");
u8g.print((((result_is_presure[4]) * 100) / testvalues[4])-100,1);
u8g.print("%");
}

void screen23(){
u8g.firstPage();
do {
drawscreen23();
} while( u8g.nextPage() );
}

void drawscreen24 () {
float rango = 0 ;

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_5x7);
u8g.setPrintPos(10,0);
u8g.print(" Debe Desviacion %");
u8g.setPrintPos(10,18);
u8g.print(testvalues[5],1);
u8g.print("mmHg ");
u8g.print((testvalues[5] - result_is_presure[5]),1);
u8g.print("mmHg ");
u8g.print((((result_is_presure[5]) * 100) / testvalues[5])-100,1);
u8g.print("%");
u8g.setPrintPos(10,27);
u8g.print(testvalues[6],1);
u8g.print("mmHg ");
u8g.print((testvalues[6] - result_is_presure[6]),1);
u8g.print("mmHg ");
u8g.print((((result_is_presure[6]) * 100) / testvalues[6])-100,1);
u8g.print("%");
u8g.setPrintPos(10,36);
u8g.print(testvalues[7],1);
u8g.print("mmHg ");
u8g.print((testvalues[7] - result_is_presure[7]),1);
u8g.print("mmHg ");
97

u8g.print((((result_is_presure[7]) * 100) / testvalues[7])-100,1);


u8g.print("%");
u8g.setPrintPos(10,45);
u8g.print(testvalues[8],1);
u8g.print("mmHg ");
u8g.print((testvalues[8] - result_is_presure[8]),1);
u8g.print("mmHg ");
u8g.print((((result_is_presure[8]) * 100) / testvalues[8])-100,1);
u8g.print("%");
u8g.setPrintPos(10,54);
u8g.print(testvalues[9],1);
u8g.print("mmHg ");
u8g.print((testvalues[9] - result_is_presure[9]),1);
u8g.print("mmHg ");
u8g.print((((result_is_presure[9]) * 100) / testvalues[9])-100,1);
u8g.print("%");
}

void screen24(){
u8g.firstPage();
do {
drawscreen24();
} while( u8g.nextPage() );
}

void drawscreen25 () {
float rango = 0 ;

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_5x7);
u8g.setPrintPos(10,0);
u8g.print(" RESUMEN");
u8g.setPrintPos(3,18);
u8g.print("Tolerancia res.: ");
u8g.print(totaltoleranz);
u8g.print("%");
u8g.setPrintPos(3,27);
u8g.print("Max. desviacion: ");
u8g.print(maxmmHg);
u8g.print("mmHg");
u8g.setPrintPos(3,36);
u8g.print("Min. desviacion: ");
u8g.print(minmmHg);
u8g.print("mmHg");
u8g.setPrintPos(3,45);
u8g.print("Desviacion res.: ");
u8g.print(totalmmHg);
u8g.print(" mmHg");
u8g.setPrintPos(3,55);
if ( ( totalmmHg <= 3) ){u8g.print(">>>Prueba aprobado<<<");}
if ( ( totalmmHg > 3) && (totalmmHg < 5 )){u8g.print(">>>Adecuado uso no clinico<<<");}
if ( ( totalmmHg > 5) ){ u8g.print(">>>Muestra fallo prueba<<<");}
}

void screen25(){
u8g.firstPage();
do {
drawscreen25();
} while( u8g.nextPage() );
}
void insert3digitresult(){

resultPresure = 0 ;
digitalWrite(motor, LOW);
98

screen11();
resultPresure = resultPresure +(getNumber()*100);
screen11();
resultPresure = resultPresure + (getNumber()*10);
screen11();
resultPresure = resultPresure + getNumber();
screen11();
keysound();
delay(1500);
}

void programm_mode(){

boolean startflag = false;


boolean nodisplayflag = false;
boolean endflag = false;
int teststep = 0 ;
if (!bmp.begin(BMP085_STANDARD)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
digitalWrite(busyled, HIGH);
digitalWrite(relais, HIGH);
screen12();
while (isPresure < 280) {
digitalWrite(motor, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
}
digitalWrite(motor, LOW);
for (int i=1; i < 30;i++){
keysound();
delay(500);
}
digitalWrite(relais, LOW);
for (int i=1; i < 10;i++){
wrongsound();
delay(500);
}
digitalWrite(relais, HIGH );
for (int teststage=0;teststage <10;++teststage){
toPresure = testvalues[teststage] ;
endflag = false ;
while ( endflag != true ) {
if(nodisplayflag == false){ screen10();}
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
if (isPresure < 0) { isPresure = 0;}
if (isPresure > 310) { digitalWrite(relais, HIGH);}
if ((isPresure < toPresure - 0.2 ) && (isPresure + 2.99 > toPresure )) {
digitalWrite(motor, HIGH);
nodisplayflag = true;
}
if (isPresure < toPresure - 3) {
digitalWrite(motor, HIGH);
nodisplayflag = false;
}
if (isPresure > toPresure + 0.2 ) {
digitalWrite(motor, LOW);
nodisplayflag = false;
}
if (isPresure > ( toPresure + 15 )) {
digitalWrite(relais, LOW);
nodisplayflag = false;
}
else
{
99

digitalWrite(relais, HIGH);
}

if ((isPresure > toPresure + 5) && (isPresure < ( toPresure + 14.99)))


{ digitalWrite(relais, HIGH);
delay(10);
digitalWrite(relais, LOW);
nodisplayflag = true;
}

if ((isPresure > toPresure + 1) && (isPresure < ( toPresure + 4.99)))


{ digitalWrite(relais, HIGH);
delay(5);
digitalWrite(relais, LOW);
nodisplayflag = true;
}
char key = keypad.getKey();
if(key)
{
switch (key)
{
case 'A':
digitalWrite(motor, LOW);
resultPresure = testvalues[teststage];
insert3digitresult();
keysound();
break;
case 'B':
endflag = true ;
keysound();
digitalWrite(motor, LOW);
digitalWrite(relais, LOW);
result_actual_presure[teststage] = isPresure;
result_is_presure[teststage] = resultPresure;
break;
default:
wrongsound();
break;
}
}
}
}
if (!bmp.begin(BMP085_HIGHRES)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
screen13();
printresultcalibracion();
keysound();
}

void printresultcalibracion(){
totalmmHg = 0 ;
maxmmHg = 0 ;
minmmHg = 0 ;
for (int i=1; i < 90;i++){
Serial2.print("*");
}
Serial2.println("*");
for (int i=1; i < 15;i++){
Serial2.print(" ");
}
Serial2.println("Acta de la calibracion");
Serial2.print( "Propietarios del equipo : ");
Serial2.println (owner);
100

Serial2.print ("Numero de Serie : ");


Serial2.println (serialnumber);
Serial2.print ("Fecha de inspeccion : ");
Serial2.print (RTC.day, DEC);
Serial2.print (".");
Serial2.print (RTC.month, DEC);
Serial2.print (".");
Serial2.println (RTC.year, DEC);
Serial2.print ("Hora de inspeccion : ");
Serial2.print (RTC.hour, DEC);
Serial2.print (":");
Serial2.print (RTC.minute, DEC);
Serial2.print (":");
Serial2.println (RTC.second, DEC);
if (!(isnan(temperature)) || !(isnan(humidity))) {
humidity = dht.readHumidity();
temperature = dht.readTemperature();
}
Serial2.print ("Temperatura sensor presion : ");
Serial2.print(temperature_bmp);
Serial2.println (" C");
Serial2.print ("Temperatura ambiente : ");
Serial2.print((temperature + temperaturecalfactor));
Serial2.println (" C");
Serial2.print ("Humedad ambiente : ");
Serial2.print((humidity+humiditycalfactor));
Serial2.println (" %");
for (int i=1; i < 90;i++){
Serial2.print("*");
}
Serial2.println("*");
Serial2.println(" ");
for (int i=0; i < 10;i++){
Serial2.print("Punto de ajuste :");
Serial2.print( testvalues[i],1 );
Serial2.print(" mmHg");
Serial2.print(" Real :");
Serial2.print(result_is_presure[i],1);
Serial2.print(" mmHg");
Serial2.print(" Desviacion :");
Serial2.print((testvalues[i] - result_is_presure[i]),1);
if ( maxmmHg < (testvalues[i] - result_is_presure[i])) {maxmmHg = (testvalues[i] - result_is_presure[i]);}
if ( minmmHg > (testvalues[i] - result_is_presure[i])) {minmmHg = (testvalues[i] - result_is_presure[i]);}
Serial2.print(" mmHg");
Serial2.print(" Error en % :");
Serial2.print((((result_is_presure[i]) * 100) / testvalues[i])-100,1);
if (maxtoleranz < ((((result_is_presure[i]) * 100) / testvalues[i])-100)) {maxtoleranz = ((result_is_presure[i]) * 100) /
testvalues[i]-100;}
if (mintoleranz > ((((result_is_presure[i]) * 100) / testvalues[i])-100)) {mintoleranz = ((result_is_presure[i]) * 100) /
testvalues[i]-100;}
Serial2.println(" %");
}
for (int i=1; i < 90;i++){
Serial2.print("*");
}
Serial2.println("*");
Serial2.println("Resultado de la medicion:");
Serial2.println(" ");
Serial2.print("Tolerancia positiva maxima : ");
Serial2.print(maxtoleranz);
Serial2.println(" %");
Serial2.print("Tolerancia negativa maxima : ");
Serial2.print(mintoleranz);
Serial2.println(" %");
mintoleranz = mintoleranz * -(1);
101

totaltoleranz = maxtoleranz + mintoleranz ;


Serial2.print("Tolerancia total : ");
Serial2.print(totaltoleranz);
Serial2.println(" %");
Serial2.println(" ");
Serial2.print("mmHg maxima desviacion : ");
Serial2.print(maxmmHg);
Serial2.println(" mmHg");
Serial2.print("mmHg minima desviacion : ");
Serial2.print(minmmHg);
Serial2.println(" mmHg");
minmmHg = minmmHg * -(1);
totalmmHg = maxmmHg + minmmHg ;
if ( totalmmHg < 0 ) { totalmmHg = totalmmHg * (-1);}
Serial2.print("Desviacion total : ");
Serial2.print(totalmmHg);
Serial2.println(" mmHg");
Serial2.println(" ");
Serial2.print("Resultado : ");
if ( ( totalmmHg <= 3.0) ){ Serial2.println(">>> Prueba de precision aprobado. <<<");}
if ( ( totalmmHg > 3.0) && (totalmmHg < 5 )){Serial2.println(">>> Creemos que el dispositivo solo es adecuado para
uso no profesional ! <<<");}
if ( ( totalmmHg > 5.0) ){ Serial2.println(">>> Muestra fallo ! El dispositivo no es adecuado para el uso ! <<<");}
for (int i=1; i < 80;i++){
Serial2.print("*");
}
Serial2.println("*");
screen23();
screen23();
waitkey();
keysound();
screen24();
screen24();
waitkey();
keysound();
screen25();
screen25();
waitkey();
keysound();
}
void drawscreen16() {
*MenuText1 = "Presi";
*MenuText2 = "Tiem";
*MenuText3 = "Seria";
*MenuText4 = "Altur";
drawstandardscreen();
u8g.setPrintPos(5,10);
u8g.print("Modo Configur.");
u8g.setFont(u8g_font_5x7);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.setPrintPos(10,15);
u8g.print(">> Ayuda <<<");
u8g.setPrintPos(5,25);
u8g.print("F1 = Perdida aire");
u8g.setPrintPos(5,35);
u8g.print("F2 = Tiempo");
u8g.setPrintPos(5,45);
u8g.print("F3 = Serial");
u8g.setPrintPos(5,55);
u8g.print("F4 = Calibr.Altura");
}

void screen16(){
102

u8g.firstPage();
do {
drawscreen16();
} while( u8g.nextPage() );
}

void setupMode(){

boolean endflag = false ;

screen16();
while ( endflag != true ) {
char key = keypad.getKey();
if(key)
{
switch (key)
{
case 'A':
keysound();
presure_calbration ();
screen16();
screen16();
break;
case 'B':
keysound();
setclock();
screen16();
screen16();
break;
case 'C':
serialcal();
keysound();
screen16();
screen16();
break;
case 'D':
altitudecal();
keysound();
screen16();
screen16();
break;
case 'S':
wrongsound();
break;
case 'E':
endflag = true ;
keysound();
break;
default:
wrongsound();
break;
}
}
}
}
void drawscreen15 () {

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(13,12);
u8g.print("Calibrar perdida aire");
u8g.setPrintPos(15,25);
u8g.print("Cierre la valvula !");
u8g.setFont(u8g_font_fur20);
103

u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(10,50);
u8g.print("Calibrar..");
u8g.setFontPosTop();
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Prueba inicia en 10 seg.");
}

void screen15(){
u8g.firstPage();
do {
drawscreen15();
} while( u8g.nextPage() );
}
void drawscreen17 () {
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(10,5);
u8g.print("Medir factores delta_T");
u8g.setPrintPos(45,22);
u8g.print("dT15 = ");
u8g.print(dT_15);
u8g.setPrintPos(45,32);
u8g.print("dT30 = ");
u8g.print(dT_30);
u8g.setPrintPos(45,42);
u8g.print("dT45 = ");
u8g.print(dT_45);
u8g.setPrintPos(45,52);
u8g.print("dT60 = ");
u8g.print(dT_60);
u8g.drawFrame(0,0,128,64);
}

void screen17(){
u8g.firstPage();
do {
drawscreen17();
} while( u8g.nextPage() );
}

void presure_calbration (){

if (!bmp.begin(BMP085_ULTRAHIGHRES)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
digitalWrite(busyled, HIGH);
digitalWrite(relais, HIGH);
screen15();
screen15();
for (int i=1; i < 10;i++){
keysound();
delay(500);
}
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
screen17();
screen17();
while (isPresure < 200 ) {
digitalWrite(motor, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
104

dT_0 = bmp.readPressure() ;
}
digitalWrite(motor, LOW);
delay(15000);
dT_15 = bmp.readPressure() ;
delay(15000);
dT_30 = bmp.readPressure();
delay(15000);
dT_45 = bmp.readPressure();
delay(15000);
dT_60 = bmp.readPressure();
keysound();
screen17();
keysound();
digitalWrite(relais, LOW);
delay(3000);
keysound();
calpresureflag = true ;
digitalWrite(busyled, LOW);
}
void drawscreen22 (int curpos) {

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_5x7);
u8g.setPrintPos(23,0);
u8g.print(" Ajuste del reloj");
u8g.setPrintPos(3,9);
u8g.print(" Dia : ");
u8g.print(RTC.day, DEC);
if (curpos == 1) {u8g.print(" <<<<<< ");}
u8g.setPrintPos(3,18);
u8g.print(" Mes : ");
u8g.print(RTC.month, DEC);
if (curpos == 2) {u8g.print(" <<<<<< ");}
u8g.setPrintPos(3,27);
u8g.print(" Ano : ");
u8g.print(RTC.year, DEC);
if (curpos == 3) {u8g.print(" <<<<<< ");}
u8g.setPrintPos(3,36);
u8g.print(" Hora : ");
u8g.print(RTC.hour, DEC);
if (curpos == 4) {u8g.print(" <<<<<< ");}
u8g.setPrintPos(3,45);
u8g.print(" Minuto : ");
u8g.print(RTC.minute, DEC);
if (curpos == 5) {u8g.print(" <<<<<< ");}
u8g.setPrintPos(3,54);
u8g.print(" Segundo : ");
u8g.print(RTC.second, DEC);
if (curpos == 6) {u8g.print(" <<<<<< ");}
}

void screen22(int curpos){


u8g.firstPage();
do {
drawscreen22(curpos);
} while( u8g.nextPage() );
}

void setclock() {

uint16_t isyear = 2000 ;


uint8_t ismonth = 1 ;
uint16_t isday = 1 ;
105

uint16_t ishour = 1 ;
uint16_t isminute = 1 ;
uint16_t issecound = 1 ;

int temp = 0 ;

RTC.getTime();
isyear = RTC.year ;
ismonth = RTC.month;
isday = RTC.day ;
ishour = RTC.hour ;
isminute = RTC.minute ;
issecound = RTC.second ;
screen22(1);
screen22(1);
isday = insert2digits();
screen22(2);
screen22(2);
ismonth = insert2digits();
screen22(3);
screen22(3);
isyear = insert4digits() ;
screen22(4);
screen22(4);
ishour = insert2digits() ;
screen22(5);
screen22(5);
isminute = insert2digits() ;
screen22(6);
screen22(6);
issecound = insert2digits() ;
RTC.stopClock();
RTC.fillByYMD(isyear,ismonth,isday);
RTC.fillByHMS(ishour,isminute,issecound);
RTC.setTime();
TimeIsSet = 0xaa55;
RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
RTC.startClock();
}
void drawscreen26 () {

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_5x7);
u8g.setPrintPos(3,0);
u8g.print(" Calibrar Altura/Offset");
u8g.setPrintPos(3,15);
u8g.print("desconecta todos de la");
u8g.setPrintPos(3,25);
u8g.print("salida de aire.");
u8g.setPrintPos(3,35);
u8g.print("Calib. demora 10 seg.");
u8g.setPrintPos(13,50);
u8g.print("> Tecla para seguir <");
}

void screen26(){
u8g.firstPage();
do {
drawscreen26();
} while( u8g.nextPage() );
}

void drawscreen27 () {
106

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_5x7);
u8g.setPrintPos(3,20);
u8g.print("Altura es: ");
u8g.print(realaltitude);
u8g.print("m");
u8g.setPrintPos(3,30);
u8g.print("Offset es: ");
u8g.print(mmHg_offset);
u8g.print("mmHg");
u8g.setPrintPos(13,50);
u8g.print("> Tecla para seguir <");
}

void screen27(){
u8g.firstPage();
do {
drawscreen27();
} while( u8g.nextPage() );
}

void altitudecal() {

screen26();
screen26();
waitkey();
keysound();
calaltitude();
screen27();
screen27();
waitkey();
keysound();
}

void drawscreen28 () {

*MenuText1 = "9600";
*MenuText2 = "19200";
*MenuText3 = "57600";
*MenuText4 = "115200";
drawstandardscreen();
u8g.setPrintPos(5,10);
u8g.print("Config.Serial");
u8g.setFont(u8g_font_5x7);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.setPrintPos(10,15);
u8g.print(">> Ayuda <<<");
u8g.setPrintPos(5,25);
u8g.print("F1 = 9600 Baud");
u8g.setPrintPos(5,35);
u8g.print("F2 = 19200 Baud");
u8g.setPrintPos(5,45);
u8g.print("F3 = 57600 Baud");
u8g.setPrintPos(5,55);
u8g.print("F4 = 115200 Baud");
}

void screen28(){
u8g.firstPage();
do {
drawscreen28();
107

} while( u8g.nextPage() );
}

void serialcal() {

boolean endflag = false ;

screen28();
while ( endflag != true ) {
char key = keypad.getKey();
if(key)
{
switch (key)
{
case 'A':
keysound();
EEPROM.write(1, 0);
setserial2();
Serial2.println("Se establecen para 9600 Baud");
screen28();
screen28();
break;
case 'B':
keysound();
EEPROM.write(1, 1);
setserial2();
Serial2.println("Se establecen para 19200 Baud");
screen28();
screen28();
break;
case 'C':
EEPROM.write(1, 2) ;
setserial2();
Serial2.println("Se establecen para 57600 Baud");
keysound();
screen28();
screen28();
break;
case 'D':
EEPROM.write(1, 3);
setserial2();
Serial2.println("Se establecen para 115200 Baud");
keysound();
screen28();
screen28();
break;
case 'S':
wrongsound();
break;
case 'E':
endflag = true ;
keysound();
break;
default:
wrongsound();
break;
}
}
}

void drawscreen14 () {
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
108

u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(8,12);
u8g.print("Medicion perdida aire");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(7,40);
u8g.print("Esperar..");
u8g.setFontPosTop();
u8g.setPrintPos(10,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Prueba demora un poco");
}

void screen14(){
u8g.firstPage();
do {
drawscreen14();
} while( u8g.nextPage() );
}

void drawscreen18 () {

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(10,12);
u8g.print("Resultado perdida Aire");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(10,45);
u8g.print(losing_percent,2);
u8g.print("%");
u8g.setFontPosTop();
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("Tecla para continuar");
}

void screen18(){
u8g.firstPage();
do {
drawscreen18();
} while( u8g.nextPage() );
}
void perdidamode(){

float actual_dT_60;
float calvalue = 0 ;

if (!bmp.begin(BMP085_ULTRAHIGHRES)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
if (calpresureflag == false ) { presure_calbration ();}
screen14();
screen14();
digitalWrite(busyled, HIGH);
digitalWrite(relais, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
while (isPresure < 200) {
digitalWrite(motor, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
}
109

digitalWrite(motor, LOW);
delay(60000);
actual_dT_60 = bmp.readPressure();
digitalWrite(busyled, LOW);
digitalWrite(relais, LOW);
/* Serial2.print(" ");
Serial2.print(" ");
Serial2.println("*********************************************");
Serial2.println(" Datos de Calibracion Factor dT ");
Serial2.println("*********************************************");
Serial2.print("Factor dT 0 : ");
Serial2.println(dT_0);
Serial2.print("Factor dT 15 : ");
Serial2.println(dT_15);
Serial2.print("Factor dT 30 : ");
Serial2.println(dT_30);
Serial2.print("Factor dT 45 : ");
Serial2.println(dT_45);
Serial2.print("Factor dT 60 : ");
Serial2.println(dT_60);
Serial2.println(" ");
Serial2.println(" ");
*/
Serial2.println("*************************************************************");
Serial2.println(" Resultados perdida de Aire ");
Serial2.println("*************************************************************");
Serial2.print(" Valor Total :");
Serial2.println(actual_dT_60,0);
calvalue = dT_0 - dT_60;
actual_dT_60 = dT_0 - actual_dT_60;
Serial2.print(" Perdida del Total :");
Serial2.println(actual_dT_60,0);
Serial2.print(" Perdida del Objecto :");
Serial2.println(actual_dT_60 - calvalue,0);
losing_percent = ( ((actual_dT_60 - calvalue) * 100 ) / (dT_0 - calvalue)) ;
Serial2.print(" Perdida en porciento :");
if(losing_percent > 0) {losing_percent = 0;}
Serial2.print(losing_percent);
Serial2.println(" % ");
Serial2.println(" ");
Serial2.println("Valor de la perdida de aire no debe esta mas grande como -1% !");
Serial2.println(" ");
Serial2.println(" ");
screen18();
keysound();
waitkey();
keysound();
}

void drawscreen08 () {
float rango = 0 ;

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(20,12);
u8g.print("Modo Pulstest");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(40,35);
u8g.print( isPresure ,2);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
110

u8g.setPrintPos(90,45);
u8g.print("mmHg");
u8g.setPrintPos(3,50);
u8g.print("Objetivo: ");
u8g.print(toPresure,0);
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print("F1=Introducir la presion");
}

void screen08(){
u8g.firstPage();
do {
drawscreen08();
} while( u8g.nextPage() );
}

void drawscreen09 () {
float rango = 0 ;

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_ncenR08);
u8g.setPrintPos(10,12);
u8g.print("Introducir el valor");
u8g.setFont(u8g_font_fur20);
u8g.setFontRefHeightExtendedText();
u8g.drawFrame(0,0,128,64);
u8g.setPrintPos(40,40);
u8g.print(toPresure,0);
u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setPrintPos(3,62);
u8g.setFont(u8g_font_5x7);
u8g.print(" Valor debe ser 0-300");
}
void screen09(){
u8g.firstPage();
do {
drawscreen09();
} while( u8g.nextPage() );
}
void pulsemode(){

boolean startflag = false;


boolean nodisplayflag = false;
boolean endflag = false;

if (!bmp.begin(BMP085_STANDARD)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
digitalWrite(busyled, HIGH);
digitalWrite(relais, HIGH);
insert3digitpresure();
while ( endflag != true ) {
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
screen08();
delay(500);
if ( startflag == false ){
nodisplayflag == false;
if(nodisplayflag == false){ }
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
if (isPresure < 0) { isPresure = 0;}
if (isPresure > 310) { digitalWrite(relais, HIGH);}
111

if ((isPresure < toPresure-0.1) && (isPresure + 2.9 > toPresure )) {


digitalWrite(motor, HIGH);
nodisplayflag = true;
}

if (isPresure < toPresure -3) {


digitalWrite(motor, HIGH);
nodisplayflag = false;
}

if (isPresure > toPresure+0.1 ) {


digitalWrite(motor, LOW);
nodisplayflag = false;
startflag = true ;
}
nodisplayflag = false;
}

char key = keypad.getKey();


if(key) .
{
switch (key)
{
case 'A':
digitalWrite(motor, LOW);
insert3digitpresure();
keysound();
break;
case 'E':
endflag = true ;
keysound();
digitalWrite(busyled, LOW);
digitalWrite(motor, LOW);
digitalWrite(relais, LOW);
break;
default:
wrongsound();
break;
}
}
}
}
void drawscreen30() {
*MenuText1 = "QT-1 ";
*MenuText2 = "QT-2 ";
*MenuText3 = " ";
*MenuText4 = " ";
drawstandardscreen();
u8g.setPrintPos(5,10);
u8g.print(" Modo Test");
u8g.setFont(u8g_font_5x7);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.setPrintPos(10,15);
u8g.print(">> Ayuda <<<");
u8g.setPrintPos(5,25);
u8g.print("F1 = Calidad norm");
u8g.setPrintPos(5,35);
u8g.print("F2 = Calidad estr");
u8g.setPrintPos(5,45);
u8g.print(" ");
u8g.setPrintPos(5,55);
u8g.print(" ");
}
112

void screen30(){
u8g.firstPage();
do {
drawscreen30();
} while( u8g.nextPage() );
}

void qualityMode(){

boolean endflag = false ;

screen30();
while ( endflag != true ) {
char key = keypad.getKey();
if(key)
{
switch (key)
{
case 'A':
keysound();
qualitytest1();
screen30();
screen30();
break;
case 'B':
keysound();

screen30();
screen30();
break;
case 'C':
wrongsound();
break;
case 'D':
wrongsound();
break;
case 'S':
wrongsound();
break;
case 'E':
endflag = true ;
keysound();
break;
default:
wrongsound();
break;
}
}
}
}

void perdidamessure(){

float actual_dT_60;
float calvalue = 0 ;

if (!bmp.begin(BMP085_ULTRAHIGHRES)) {
*ErrorMessageText = "Presion Error ";
drawErrorMessage();
}
if (calpresureflag == false ) { presure_calbration ();}
113

screen14();
screen14();
digitalWrite(busyled, HIGH);
digitalWrite(relais, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
while (isPresure < 200) {
digitalWrite(motor, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
}
digitalWrite(motor, LOW);
delay(60000);
actual_dT_60 = bmp.readPressure();
digitalWrite(relais, LOW);
calvalue = dT_0 - dT_60;
actual_dT_60 = dT_0 - actual_dT_60;
losing_percent = ( ((actual_dT_60 - calvalue) * 100 ) / (dT_0 - calvalue)) ;
if(losing_percent > 0) {losing_percent = 0;}
if (losing_percent < mintestpercent) {losing_percent = mintestpercent;}
if (losing_percent > maxtestpercent) {losing_percent = maxtestpercent;}
}

void drawscreen29 (int curpos) {

u8g.setFontPosTop();
u8g.setFontRefHeightExtendedText();
u8g.setFont(u8g_font_5x7);
u8g.setPrintPos(23,0);
u8g.print("Prueba de calidad normal");
u8g.setPrintPos(3,20);
u8g.print("Numero de muestras:");
u8g.print(testquantity,DEC);
if (curpos == 1) {u8g.print(" <<<<<< ");}
u8g.setPrintPos(3,30);
u8g.print("Ciclos de medida :");
u8g.print(messurementcycles, DEC);
if (curpos == 2) {u8g.print(" <<<<<< ");}
u8g.setPrintPos(3,40);
u8g.print("Presion Maxima : ");
u8g.print(maxtestpresure, DEC);
if (curpos == 3) {u8g.print(" <<<<<< ");}
}
void screen29(int curpos){
u8g.firstPage();
do {
drawscreen29(curpos);
} while( u8g.nextPage() );
}
void qualitytest1() {
int testquantity = 0 ;
int maxtestpresure = 0 ;
int messurementcycles = 0;
float mintestpercent = 0 ;
float maxtestpercent = 0 ;
float starttestpercent = 0 ;
float stoptestpercent = 0 ;
digitalWrite(busyled, HIGH);
testquantity = 0 ;
maxtestpresure = 0 ;
messurementcycles = 0;
mintestpercent = 0 ;
maxtestpercent = 0 ;
starttestpercent = 0 ;
stoptestpercent = 0 ;
screen29(1);
screen29(1);
114

testquantity = insert3digits();
screen29(2);
screen29(2);
maxtestpresure = insert3digits();
if ( maxtestpresure > 300) { maxtestpresure = 300 ; }
screen29(3);
screen29(3);
messurementcycles = insert2digits() ;
perdidamessure();
starttestpercent = losing_percent ;
for ( int i = 1; i <= testquantity; ++i){
digitalWrite(relais, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
while (isPresure < maxtestpresure) {
screen06();
digitalWrite(motor, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
}
digitalWrite(motor, LOW);
for ( i=0;i<6;i++) {
delay(500);
screen06();
}
digitalWrite(relais, LOW);
for ( i=0;i<10;i++) {
delay(500);
screen06();
}
digitalWrite(relais, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
while (isPresure < ( maxtestpresure / 2 )) {
screen06();
digitalWrite(motor, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
}
digitalWrite(motor, LOW);
for ( i=0;i<6;i++) {
delay(500);
screen06();
}
digitalWrite(relais, LOW);
for ( i=0;i<10;i++) {
delay(500);
screen06();
}
digitalWrite(relais, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
while (isPresure < ( maxtestpresure / 3 )) {
screen06();
digitalWrite(motor, HIGH);
isPresure = (bmp.readPressure() * 0.00750062)-mmHg_offset;
}
digitalWrite(motor, LOW);
for ( i=0;i<6;i++) {
delay(500);
screen06();
}
digitalWrite(relais, LOW);
for ( i=0;i<10;i++) {
delay(500);
screen06();
}
}

También podría gustarte