Calibrador de Presión PDF
Calibrador de Presión PDF
Calibrador de Presión PDF
ESCUELA DE POSGRADO
UNIDAD DE POSGRADO DE LA FACULTAD DE INGENIERIA DE
PRODUCCION Y SERVICIOS
AREQUIPA – PERU
2017
A la memoria de mi abuela.
Pág.
RESUMEN 1
CAPITULO I
GENERALIDADES
CAPITULO II
FUNDAMENTACION TEORICA
CAPITULO III
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
CAPITULO V
CONCLUSIONES Y RECOMENDACIONES
5.1 CONCLUSIONES 63
5.2 RECOMENDACIONES 64
REFERENCIAS BIBLIOGRAFICAS 65
ANEXOS 68
1
RESUMEN
CAPITULO I
GENERALIDADES
1.4.2 AREA
Instrumentación Electrónica
1.4.3 RESPONSABLE
1.4.4 ASESOR
1.5 EL PROBLEMA
1.3.1 HIPOTESIS
1.3.2 VARIABLES
Humedad
Temperatura
Presión
Altura
7
CAPITULO II
FUNDAMENTACION TEORICA
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
La no-linealidad será:
ℎ
𝑥100%
𝑋𝑠 − 𝑋𝑖
Donde,
𝑋𝑠: límite superior.
𝑋𝑖: límite inferior.
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
𝑀á𝑥𝑖𝑚𝑎 𝑑𝑖𝑓𝑒𝑟𝑒𝑛𝑐𝑖𝑎
𝐻𝑖𝑠𝑡é𝑟𝑒𝑠𝑖𝑠 = 𝑥100%
𝑋𝑠 − 𝑋𝑖
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
- Analógicos
- Digitales3
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
ΔT = (T - T0) = (T - 273)
dR(T)/dT = R0 α
S = (d R(T)/dT)/R0 = α
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
5
Jones, E. Mechanical gas pumps. En su: Jones’ Instrument Technology Volume 4:
Instrumentation Systems. England: Butterworth & Co. Ltd. 1987, p. 31.
18
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
8
Reyes, C. Comunicación serial con el CI. MAX232. En su: Microcontroladores PIC. Ecuador:
Rispergraf, 2008, p135.
20
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
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.
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
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
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.
S: Bit de signo
El bit S siempre es el or-exclusivo entre la bandera negativa “N” y la
bandera de desborde en “V”.
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.
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.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.
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.
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
11
Maloney, T. El transistor como interruptor. En su: Electrónica Industrial. Dispositivos y Sistemas.
México: Prentice-Hall Hispanoamericana, 1983, p. 2.
38
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
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
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
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
3.6 GENERALIDADES
Visualización de
Parámetros
Señal de Válvula de Tensiómetro
P, T°, H, Altura
Alimentación Aire
T°
Controlador
H
17
ARDUINO. Arduino Mega 2560&Genuino Mega 2560. [en línea]
<https://www.arduino.cc/en/Main/arduinoBoardMega2560#> [consulta: 01 abril 2017]
46
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.
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.
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
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,6mmHg/torr,hPa,atm,milibar,psi,kgf/m2
{Seleccionar tipo de medición}
Presión absolutaPresión manométrica+presión atmosférica al nivel
del mar
Opción1,Opción2Calcular 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
ManualIntroducir 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 0Valor de presión=0 mmHg
SI la presión medida es mayor a 310mmHgAccionar la válvula de descarga de
aire por seguridad
54
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
Comprende:
Circuito para el ingreso de datos.
Circuito para la visualización de datos.
Zumbador, indicadores visuales.
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.
CAPITULO IV
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
CAPITULO V
CONCLUSIONES Y RECOMENDACIONES
10.1 CONCLUSIONES
10.2 RECOMENDACIONES
REFERENCIAS BIBLIOGRAFICAS
11. BARNETT, R., O’CULL, L., COX, S., (2007). Embedded C Programming
and the Atmel AVR, 2e. Estados Unidos. Ed. Cengage Learning.
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.
20. Cooper,T. DS1307 Real Time Clock Breakout Board Kit. Adafruit Industries,
2016.
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
#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 ;
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 ;
uint16_t insert3digits(){
uint16_t keyvalue = 0 ;
uint16_t insert4digits(){
uint16_t keyvalue = 0 ;
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
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;
}
}
digitalWrite(relais, LOW);
break;
default:
wrongsound();
break;
}
}
}
}
void drawscreen04 (int einheit) {
float rango = 0 ;
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;
}
}
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(){
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(){
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 (!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
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(){
digitalWrite(relais, HIGH);
}
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
void screen16(){
102
u8g.firstPage();
do {
drawscreen16();
} while( u8g.nextPage() );
}
void setupMode(){
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() );
}
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 setclock() {
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() {
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(){
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
void screen30(){
u8g.firstPage();
do {
drawscreen30();
} while( u8g.nextPage() );
}
void qualityMode(){
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;}
}
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();
}
}