Antulio Morgado / Mbed 2 deprecated FRDM-KL46Z_Deshidratador

Dependencies:   mbed TextLCD

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*******************************************************************************
00002 *
00003 * ARCHIVO:      main.cpp
00004 *
00005 * PROYECTO:     FRDM-KL46Z_Deshidratador
00006 *
00007 * PLATAFORMA:   FRDM-KL46Z
00008 *
00009 * DISPOSITIVO:  MKL46Z256VLL4
00010 *
00011 * HERRAMIENTA:  Mbed Compiler
00012 *
00013 * DESCRIPCION:  El programa principal lee los datos provenientes del sensor de
00014 *               humedad y temperatura DHT22. Formatea los datos y los despliega
00015 *               por la terminal serial.
00016 *               Posee un menú de Configuración por medio de la Pantalla LCD
00017 *               
00018 *
00019 * VERSION:      Beta
00020 * REV:          A
00021 * RELEASE:      0
00022 *
00023 * AUTOR(ES):    Antulio Morgado Valle, Raziel López Escamilla
00024 *
00025 * FECHA:        10/20/2018
00026 *
00027 * Bugs & Fixes:
00028 * - 30/10/18
00029 *   Se corrigió menu de OTRO (Opera correctamente)
00030 *   Se añadió variable de "error_code" para monitoreo de operación del DHT
00031 *   Se añadió libreria RGB para convertirla a objetos para utilizarse en la 
00032 *   señalización de Alarmas
00033 *   Fallo de control de seguridad al Canceler el Proceso de Deshidratación
00034 *******************************************************************************/
00035 
00036 /*
00037 ** ===================================================================
00038 **     Librerias del Programa
00039 ** ===================================================================
00040 */
00041 #include "mbed.h"
00042 #include "stdio.h"
00043 #include "TextLCD.h"
00044 #include "I2C.h"
00045 #include "SPI.h"
00046 #include "Serial.h" 
00047 #include "DHT.h"
00048 //#include "Led_RGB.h"
00049 
00050 /*
00051 ** ===================================================================
00052 **     Definiciones y Constantes del programa.
00053 ** ===================================================================
00054 */
00055 
00056 #define LCDFILAS        4
00057 #define LCDCOLUMNAS     20
00058 
00059 #define TAPWM           255
00060 
00061 #define NOFRUTAS        11
00062 #define CONDALARM       2
00063 
00064 #define DHT_TIPO        DHT11
00065 #define DHT_PIN         PTD2
00066 #define  on             0               // Estado para boton presionado
00067 #define off             1               // Estado para boton sin presionar
00068 #define hold            2               // Estado para boton mantenido presionado
00069 #define release         3               // Estado para boton al liberarse 
00070 #define Buzz_On         1               // Buzzer Encendido
00071 #define Buzz_Off        0               // Buzzer Apagado
00072 #define HIGH            1               // 
00073 #define LOW             0               // 
00074 /*
00075 ** -------------------------------------------------------------------
00076 **    Inicialización de los Pines de Entrada.
00077 ** -------------------------------------------------------------------
00078 */
00079 DigitalIn   PIN_SWITCH     (PTC4,PullUp);  // Switch de Puerta Abierta
00080 DigitalIn   PIN_BOK        (PTC6,PullUp);  // Botón OK
00081 DigitalIn   PIN_BDERECHO   (PTC7,PullUp);  // Botón DERECHA
00082 DigitalIn   PIN_BARRIBA    (PTC8,PullUp);  // Botón ARRIBA
00083 DigitalIn   PIN_BABAJO     (PTC9,PullUp);  // Botón ABAJO
00084 DigitalIn   PIN_BIZQUIERDO (PTC10,PullUp); // Botón IZQUIERDA
00085 DigitalIn   PIN_BRETURN    (PTC11,PullUp); // Botón RETURN 
00086 /*
00087 ** -------------------------------------------------------------------
00088 **    Inicialización de los Pines de Salida.
00089 ** -------------------------------------------------------------------
00090 */
00091 DigitalOut  PIN_BUZZER     (PTB20);  // Buzzer Piezo Eléctrico
00092 DigitalOut  PIN_MOTOR      (PTA12);  // Encendido/Apagado del Elemento de Ventilación 
00093 DigitalOut  Red_Led        (PTE29);  // Led de Actividad del Programa
00094 DigitalOut  Green_Led      (PTD5);   // Led de Actividad del Programa
00095 // Soporte LED RGB
00096 //DigitalOut  Led_Rojo(PTE6);      // Led RGB
00097 //DigitalOut  Led_Verde(PTE3);     // Led RGB
00098 //DigitalOut  Led_Azul (PTE2);     // Led RGB
00099 /*
00100 ** -------------------------------------------------------------------
00101 **    Inicialización de las Salidas PWM.
00102 ** -------------------------------------------------------------------
00103 */
00104 PwmOut      PIN_QUEMADOR   (PTE31);  // PWM Control del Elemento Calefactor
00105 
00106 /*
00107 ** -------------------------------------------------------------------
00108 **    Inicialización de las Entradas Analógicas.
00109 ** -------------------------------------------------------------------
00110 */
00111 //AnalogIn    Temperatura   (PTB0);    // Sensor de Temperatura:       LM35
00112 //AnalogIn    Fotocelda     (PTB1);    // Sensor de Luminosidad:       Fotocelda
00113 //AnalogIn    Ozono         (PTB2);    // Sensor de Ozono:             KS123
00114 /*
00115 ** -------------------------------------------------------------------
00116 **    Inicialización de los Pines de Funciones Especiales.
00117 ** -------------------------------------------------------------------
00118 */
00119 /************************************************* 
00120 * Initialize the library with the numbers of the interface pins
00121 * Board Freedom FRDM-KL46Z
00122 * IDE  Mbed On Line Compiler
00123 * LCD  I2C  PCF8574A
00124 * Pin  Board    LCD
00125 *      I2C_SCL  SCL (white) + resistance pull-up 4.7k
00126 *      I2C_SDA  SDA (blue)  + resistance pull-up 4.7k
00127 *      5V       5V  (red)
00128 *      GND      GND (black)
00129 ***************************************************/
00130 //LiquidCrystal_I2C lcd(0x7E, LCDCOLUMNAS, LCDFILAS);
00131 //i2c_LCD lcd(0x7E, LCDCOLUMNAS, LCDFILAS);
00132 
00133 /************************************************* 
00134 * Initialize the library with the numbers of the interface pins
00135 * Board Freedom FRDM-KL46Z
00136 * IDE  Mbed On Line Compiler
00137 * LCD  SPI  74595
00138 * Pin  Board     LCD
00139 *      SPI_MOSI  SER   (white) 
00140 *      SPI_MISO  none  (blue)  
00141 *      SPI_CLK   SRCLK
00142 *      SPI_PCS   RCLK
00143 *      5V       5V  (red)
00144 *      GND      GND (black)
00145 ***************************************************/
00146 // Host PC Communication channels
00147 Serial      Terminal(USBTX, USBRX);         // Tx, Rx
00148 //Serial      Terminal(PTA2,PTA1);          // Terminal Serial
00149 //Serial      Terminal(PTE0, PTE1);         // Tx, Rx Using MAX3232 or BlueTooth
00150 
00151 // Bluetooth Communication support
00152 Serial   bluetooth(PTE0, PTE1);             // Tx, Rx
00153 
00154 // I2C Communication
00155 I2C         i2c_LCD(PTC2,PTC1);             // SDA, SCL
00156 
00157 // SPI Communication
00158 //SPI         spi_LCD(PTD6,PTD7,PTD5,PTD4);   // MOSI, MISO, SCLK, SSEL
00159 
00160 // LCD instantiation 
00161 //TextLCD LCD(PTC5, PTC6, PTC8, PTC9, PTC10, PCT11, TextLCD::LCD20x2); // 4bit bus: rs, e, d4-d7
00162 //TextLCD_SPI lcd(&spi_LCD, PTD4, TextLCD::LCD16x4, TextLCD::HD44780);   // SPI bus, SN74595 expander, CS pin, LCD Type 
00163 TextLCD_I2C lcd(&i2c_LCD, 0x7E, TextLCD::LCD20x4);                   // I2C bus, PCF8574A Arduino Shield, LCD Type
00164 
00165 //librerias del DHT22  
00166 DHT dht(PTA13, DHT11);              // DHT_PIN, DHT_TIPO (DHT11, DHT22)
00167 
00168 /*
00169 ** ===================================================================
00170 **     Variables del Programa
00171 ** ===================================================================
00172 */
00173 /* -------------------------------------------------------------------
00174 **   Variables Booleanas.
00175 **
00176 **   Para la Botonera, Checar_Botones()
00177 **   Variables de cada Boton.
00178 **   Posibles Valores:
00179 **    0 - No esta siendo apretado.
00180 **    1 - Esta siendo apretado.
00181 ** -------------------------------------------------------------------*/
00182 bool B_Arriba;
00183 bool B_Abajo;
00184 bool B_Izquierdo;
00185 bool B_Derecho;
00186 bool B_Ok;
00187 bool B_Return;
00188 
00189 /* -------------------------------------------------------------------
00190 **   Variables Booleanas.
00191 **
00192 **   Para el Motor y Quemador
00193 **     Variables de componentes a controlar.
00194 **   Posibles Valores:
00195 **    0 - Dispositivo apagado.
00196 **    1 - Dispositivo encendido.
00197 ** -------------------------------------------------------------------*/
00198 bool Motor;
00199 bool Quemador;
00200 
00201 /* -------------------------------------------------------------------
00202 **   Variables Booleanas.
00203 **
00204 **   Para el Control de Interfaz.
00205 **     Variables que ayudan al desplazamiento de cada interfaz.
00206 **   Posibles Valores.
00207 **    0 - Acción Autorizada.
00208 **    1-  Acción No Autorizada.
00209 ** -------------------------------------------------------------------*/
00210 bool Bandera;
00211 bool Avanzar;
00212 bool Deshidratando;
00213 bool PuertaAb;
00214 bool Scroll_Cambio;
00215 
00216 /* -------------------------------------------------------------------
00217 **   Variables enteras sin signo.
00218 **
00219 **   La variables guardan las opciones disponibles de la interfaz.
00220 ** -------------------------------------------------------------------*/
00221 
00222 uint16_t Opcion;        //Guarda la opción actual en la que se encuentra la interfaz.
00223 uint16_t Opcion_Ant;    //Guarda la opción Anterior en la que se encontraba la interfaz.
00224 uint16_t Opcion_Max;    //Guarda el número máximo de opciones disponibles en el menú que se encuentra la Interfaz.
00225 uint16_t Scroll;
00226 
00227 /* -------------------------------------------------------------------
00228 **   Variables flotantes.
00229 **
00230 **   Variables que guardan datos de los sensores.
00231 ** -------------------------------------------------------------------*/
00232 
00233 float h;                    //Guarda la Humedad del ambiente.
00234 float t;                    //Guarda la Temperatura del ambiente.
00235 float TF;                   //Variable que guarda la temperatura final.
00236 float HF;                   //Variable que guarda la humedad final.
00237 
00238 //Variables de Rangos de control
00239 float Hot_min = 25;
00240 float Hot_max = 35;
00241 float Hum_min = 70;
00242 float Hum_max = 90;
00243 
00244 /* -------------------------------------------------------------------
00245 **   Variables de tipo caracter.
00246 **
00247 **   Arreglo de Caracteres
00248 ** -------------------------------------------------------------------*/
00249 char     Sensores[CONDALARM][20] = {" TEMPERATURA", " HUMEDAD"};      //Arreglo que guarda el nombre de los sensores
00250 char     Fruta[NOFRUTAS][20] = {"ARANDANO", "AJO", "HIGO", "MELON", "MANZANA", "PLATANO", "PAPA", "JITOMATE", "MANGO", "UVA", "OTRO"};  // Arreglo que guarda el nombre de las frutas disponibles
00251 int16_t  Temp[NOFRUTAS]     = {        55,   55,    65,     60,       50,       70,    55,        65,      65,   55,    55};            // Vector que contiene temperatura de deshidratacion de la fruta.
00252 int16_t  Hume[NOFRUTAS]     = {        15,   10,    16,     18,       14,       15,    12,         8,      16,   15,    15};            //Vector que contiene la humedad de la fruta.
00253 int16_t  Seg;                //Variable que guarda segundos.
00254 int16_t  Min;                //Variable que guarda minuros.
00255 int16_t  Hor;                //Variable que guarda horas.
00256 
00257 char     Flecha = 126;       //Tiene el valor en ascii de la flecha.
00258 char     Porcentaje = 37;
00259 char     Celcius = 223;
00260 int16_t  NInterrupciones;
00261 int16_t  DC;
00262 float    DUTYCYCLE=0.7071;  //Valor RMS para el PWM
00263 uint8_t  buf[128];          //Buffer para Transmisión y Recepción Serial
00264 /* -------------------------------------------------------------------
00265 **   Variables para Códigos de Error.
00266 **
00267 **   Variables que guardan el estado de los dispositivos y sensores.
00268 ** -------------------------------------------------------------------*/
00269 int16_t  error_code;          //Retorno del Código de Error de las funciones    
00270 
00271 /*
00272 ** ===================================================================
00273 **   Declaración de Funciones Prototipo
00274 **     Funciones de Usuario.
00275 ** ===================================================================
00276 */
00277 void setup(void);
00278 void Checar_Botones();
00279 bool Deshidratacion(int FrutaD);
00280 void Checar_Calefactor(int TempD);
00281 void Interrupcion();
00282 void Intro();
00283 void Imprime_Menu();
00284 void Imprime_InfoDeshidratacion();
00285 void Imprime_InfoSensores();
00286 void Imprime_Tiempo(int, int);
00287 void Inicio();
00288 void Conf_Otro();
00289 void Alarmas();
00290 void Contacto();
00291 void Acerca();
00292 void Imprime_Flecha();
00293 void Apagar_Calefactor();
00294 void Reporte_Des();
00295 bool inf_fruta(int);
00296 bool Puerta_Abierta();
00297 void Conteo_Cronometro();
00298 void Init_Conometro();
00299 void Init_Var();
00300 void ConfT2_PWM3(int);
00301 void CalefactorON();
00302 void CalefactorOFF();
00303 void MotorON(int);
00304 void MotorOFF();
00305 
00306 /*
00307 ** ###################################################################
00308 **
00309 **           P R O G R A M A     P R I N C I P A L
00310 **
00311 **     para la operación del microcontrolador MKL46Z256VLL4.
00312 **
00313 ** ###################################################################
00314 */
00315 int main()
00316 {
00317 /*
00318 ** ===================================================================
00319 **    InicializaciÓn interna de la Tarjeta FRDM-KL46Z.
00320 ** ===================================================================
00321 */
00322 
00323     setup();            //Inicializa el Hardware Principal
00324 /*
00325 ** -------------------------------------------------------------------
00326 **    Inicialización de las Interrupciones.
00327 **    Ticker Inicialzation 
00328 ** -------------------------------------------------------------------
00329 */
00330 Ticker TimerInt;        // Asignación del vector de interrupción para el Ticker
00331  
00332   TimerInt.attach(&Interrupcion, 0.250);   // Periodo de Interrupción = 250ms  
00333   while (true){
00334       Init_Var();                   //Inicializamos variables iniciales.
00335       Scroll = 0;                   //Colocamos scroll de pantalla en 0;
00336       Opcion_Ant = 1;               //Colocamos Opcion anterior en 1
00337       Opcion_Max = 4;               //Número Máximo de opciones es 4.
00338     //  interrupts();                 //Autoriza las interrupciones.
00339       Terminal.printf("Main Menu\n\r"); 
00340       Imprime_Menu();               //Imprime el Menú.
00341       while (!Avanzar) {            //Entra al Bucle hasta que el valor de Avanzar no cambie a 1.
00342         Imprime_Flecha();           //Imprime la Flecha en el display en la posicion de la opcion.
00343         wait_ms(250);                 //Colocamos un retraso de 250 ms para que no entre a un bucle infinito y tenga tiempo disponible para hacer otras interrupciones.
00344       }
00345       switch (Opcion) {            //Dependiendo la opción seleccionada llama a la función correspondiente.
00346         case 1:
00347           Inicio();
00348           break;
00349         case 2:
00350           Conf_Otro();
00351           break;
00352         case 3:
00353           Contacto();
00354           break;
00355         case 4:
00356           Acerca();
00357           break;
00358       }    
00359   }
00360   
00361 }
00362 /*
00363 ** ###################################################################
00364 **              FIN DEL PROGRAMA PRINCIPAL
00365 ** ###################################################################
00366 */
00367 /*
00368 ** ===================================================================
00369 **     Prototipo   :  setup ()
00370 **     Componente  :  Cpu [MKL46Z256VLL]
00371 **     Descripción :
00372 **         Esta función inicializa el hardware y puertos de comunicación
00373 **         "Serial", "I2C" y "LCD"
00374 **     Argumentos  : Ninguno
00375 **     Retorna     : Nada
00376 ** ===================================================================
00377 */
00378 void setup() {
00379 /* Inicia la comunicación la Terminal */  /* 115200 Bauds, 8 bits, 1 stop, N parity */
00380   Terminal.baud(115200);                  // Se inicia la comunicación serial.    
00381   Terminal.printf(" System is Wake Up!.\n\r"); 
00382 /* Inicialización del Bluetooth */      
00383   bluetooth.baud(115200);                  // Se inicia la comunicación Bluetooth.  
00384 //  bluetooth.scanf("%s", buf);             //Lee un caracter desde el Bluetooth
00385 //  bluetooth.printf("recv: %s", buf);      //Hace eco al Bluetooth
00386 //  Terminal.printf("recv: %s\r\n", buf);   //Imprime en la terminal el caracter recibido
00387   bluetooth.printf("Bluetooth Starting OK! ... \n\r"); 
00388   Terminal.printf("Bluetooth Starting OK! ... \n\r");       
00389 /* Prueba del Buzzer */    
00390   Terminal.printf("Testing Buzzer... \n\r");   
00391     PIN_BUZZER = Buzz_On;
00392     wait_ms(750);
00393     PIN_BUZZER = Buzz_Off;
00394     wait_ms(125);
00395     PIN_BUZZER = Buzz_On;
00396     wait_ms(250);
00397     PIN_BUZZER = Buzz_Off;   
00398     wait_ms(125);
00399     PIN_BUZZER = Buzz_On;
00400     wait_ms(500);
00401     PIN_BUZZER = Buzz_Off;
00402 /* Configufración del Display LCD */      /* Mucho OjO !!! */
00403 //  spi_LCD.frequency(1000000);    // Frecuencia de operación para el SPI
00404 //  spi_LCD.format(8,0);              // Modo de Operación para el SPI
00405   i2c_LCD.frequency(100000);        // Frecuencia de operación para el I2C
00406   i2c_LCD.start();                  // Inicio de operación para el I2C 
00407 /* Arranque del Display LCD */  
00408   Terminal.printf("LCD Display is Starting...\n\r"); 
00409 //  lcd.init(TextLCD::LCDDatalength, 4 ); // Enciende la Iluminación de Fondo
00410   lcd.setBacklight(TextLCD::LightOn); // Enciende la Iluminación de Fondo
00411   lcd.setCursor(TextLCD::CurOff_BlkOff);
00412   lcd.cls();                        // Limpia el Display LCD
00413   lcd.printf("Hello World!\n");     // El LCD saluda al Mundo!
00414   lcd.printf("Hola Mundo!\n");      // El LCD saluda al Mundo!
00415   lcd.printf("Ciao Mondo!\n");      // El LCD saluda al Mundo!
00416   lcd.printf("Bonjour le Monde");   // El LCD saluda al Mundo! 
00417   wait(2); 
00418   lcd.cls();                            // Limpia el Display LCD
00419   lcd.setBacklight(TextLCD::LightOff);  // Apaga la Iluminación de Fondo
00420   Timer Elpased_Time;                   //Inicialia el Tiempo a Transcurrir
00421   Elpased_Time.start();
00422   for (int row=0; row<lcd.rows(); row++)// Prueba toda la Pantalla
00423   {
00424    uint16_t col=0; 
00425     lcd.putc('0' + row);                
00426     for (col=1; col<lcd.columns()-1; col++) 
00427     {    
00428       lcd.putc('*');                    //llena lalinea con el caracter "*"
00429     }
00430     lcd.putc('+');                      //Al final pone el caracter "+"
00431   }  
00432   Elpased_Time.start();                 //Calcula el tiempo transcurrido
00433   Terminal.printf("All my hard work took %f sec\r\n", Elpased_Time.read());  
00434   wait(1);  
00435   Terminal.printf("LCD Display and TextLCD Enhanced Test Completed.\n\r"); 
00436   lcd.cls();  
00437   lcd.setCursor(TextLCD::CurOff_BlkOn); //
00438 // Set and show user defined characters. A maximum of 8 UDCs are supported by the HD44780.
00439 // They are defined by a 5x7 bitpattern. 
00440   lcd.setUDC(0, (char *) udc_0);        // Show |>
00441   lcd.putc(0);   
00442   Terminal.printf("LCD Starting OK! ... \n\r"); 
00443   wait_ms(500);
00444   Terminal.printf("\rPrinting Intro \n\r"); 
00445   Intro();                              // Se ejecuta la Introducción en la LCD.
00446   uint16_t NInterrupciones = 0;         //Contador de Interrupciones (util para ahorro de energía).
00447 }
00448 
00449 /***    Fin de la initialization interna.     ***/
00450 
00451 
00452 /*
00453 ** ===================================================================
00454 **     Prototipo   :  Init_Var (Inicializa variables de estado)
00455 **     Componente  :  Cpu [MKL46Z256VLL]
00456 **     Descripción :
00457 **         Esta función inicializa las banderas de estado para
00458 **         "Bandera", "Avanzar" y "Opción"
00459 **     Argumentos  : Ninguno
00460 **     Retorna     : Nada
00461 ** ===================================================================
00462 */
00463 void Init_Var() {
00464   Bandera = 0;                  //Bandera en 0.
00465   Avanzar = 0;                  //Avanzar en 0.
00466   Opcion  = 1;                  //Colocamos en Opcion 1.
00467 }
00468 
00469 /*
00470 ** ===================================================================
00471 **     Prototipo   :  Imprime_Flecha() (Imprime la Flecha)
00472 **     Componente  :  Cpu [MKL46Z256VLL]
00473 **     Descripción :
00474 **         Con ayuda de las opciones, imprime la flecha en la opcion
00475 **         seleccionada, moviendola a traves del menú.
00476 **     Argumentos  : Ninguno
00477 **     Retorna     : Nada
00478 ** ===================================================================
00479 */
00480 
00481 void Imprime_Flecha() {
00482   lcd.locate(0, Opcion_Ant - 1 - Scroll); //Coloca cursor de la LCD en la Opcion Anterior.
00483   lcd.printf(" ");                        //Borra la flecha que previamente impresa.
00484   lcd.locate(0, Opcion - 1 - Scroll);     //Coloca cursor de la LCD en la Opcion Actual.
00485   lcd.setUDC(0, (char *) udc_0);          // Show |>
00486   lcd.putc(0);                            //Imprime la nueva flecha.
00487 }
00488 
00489 /*
00490 ** ===================================================================
00491 **     Prototipo   :  Checar_Botones() (Verifica el estado de la botonera)
00492 **     Componente  :  Cpu [MKL46Z256VLL]
00493 **     Descripción :
00494 **         Verifica si algún boton está siendo presionado,
00495 **         e indaga su posición y envia por la terminal serial
00496 **         la ubicación del botón seleccionado
00497 **     Argumentos  : Ninguno
00498 **     Retorna     : Nada
00499 ** ===================================================================
00500 */
00501 
00502 void Checar_Botones() {
00503 
00504   B_Arriba = !PIN_BARRIBA; //Lee el pin y lo asigna a la variable booleana correspondiente.
00505   if (B_Arriba) //Si se presionó envia mensaje al serial para mostarlo en la terminal.
00506     Terminal.printf("Arriba   \r");
00507 
00508   B_Abajo = !PIN_BABAJO;
00509   if (B_Abajo)
00510     Terminal.printf("Abajo    \r");
00511 
00512   B_Izquierdo = !PIN_BIZQUIERDO;
00513   if (B_Izquierdo)
00514     Terminal.printf("Izquierdo\r");
00515 
00516   B_Derecho = !PIN_BDERECHO;
00517   if (B_Derecho)
00518     Terminal.printf("Derecho  \r");
00519 
00520   B_Ok = !PIN_BOK;
00521   if (B_Ok)
00522     Terminal.printf("Ok       \r");
00523 
00524   B_Return = !PIN_BRETURN;
00525   if (B_Return)
00526     Terminal.printf("Return   \r");
00527 
00528   if (B_Arriba || B_Abajo || B_Izquierdo || B_Derecho || B_Ok || B_Return ) { //Verifica si algun boton fue apretado
00529     PIN_BUZZER = Buzz_On;                                             //Enciende el buzzer.
00530   } else
00531     PIN_BUZZER = Buzz_Off;                                            //Si no se presiono algun boton se apaga el buzzer.
00532 }
00533 
00534 /*
00535 ** ===================================================================
00536 **     Prototipo   :  Interrupcion() (Verifica el estado de la botonera)
00537 **     Componente  :  Cpu [MKL46Z256VLL]
00538 **     Descripción :
00539 **         Con las interrupciones activadas se manda llamar a esta funcion.
00540 **         Verifica si algun boton esta siendo presionado y habilita o
00541 **         deshabiita banderas para Avanzar dentro del menú de la interfaz.
00542 **     Argumentos  : Ninguno
00543 **     Retorna     : Nada
00544 ** ===================================================================
00545 */
00546 
00547 void Interrupcion() {
00548 
00549   if (Deshidratando) {
00550     Conteo_Cronometro();                                                     //Cronometro Activado.
00551     PuertaAb = !PIN_SWITCH;                                                  //Checa el estado de la puerta.
00552     //NInterrupciones ++;                                 //Incrementa el numero de interrupciones 
00553   }
00554  
00555   Checar_Botones();                                                           //Lee el estado de los botones.
00556 
00557   if (B_Arriba || B_Abajo || B_Izquierdo || B_Derecho || B_Ok || B_Return ) { //Checa si algun boton fue presionado.
00558     if (Opcion_Max && (B_Arriba || B_Abajo)) {                                //Checamos si exite opciones disponibles y si se activo el boton de arriba y abajo.
00559 
00560       if (B_Arriba && (Opcion == Scroll + 1) && (Scroll != 0) && (Opcion_Max > 4)) { //Entra al if si se Activa el Boton de arriba, existe un scroll, nos encontramos en la opcion mas alta disponible en el display.
00561         Scroll_Cambio = 1;                                                  //Indicamos que se debe hacer un cambio de Scroll.
00562         Scroll--;                                                           //Decrementamos el Scroll.
00563         Opcion_Ant = Opcion;                                                //Actualizamos valor a la variable que guarda las opciones anteriores.
00564         Opcion--;                                                           //Decrementa el valor de opción.
00565       }
00566       else if (B_Arriba && (Opcion != 1) ) {                                  //Checamos si presionamos Arriba la opcion no es la primera.
00567         Opcion_Ant = Opcion;                                                  //Actualizamos valor a la variable que guarda las opciones anteriores.
00568         Opcion--;
00569         Terminal.printf("%d",Opcion);
00570       }
00571       else if (B_Abajo && (Opcion == Scroll + 4) && (Opcion < (Opcion_Max)) && (Opcion_Max > 4)) { //Checamos si presionamos Abajo la opcion es la 4ta de la pantalla, el scroll no es el ultimo posible y nuestras opciones son mayores a 4.
00572         Scroll_Cambio = 1;                                                   //Indicamos que se debe hacer un cambio de Scroll.
00573         Scroll++;          //Decrementamos el Scroll.
00574         Opcion_Ant = Opcion;                                                 //Atualiza opcion anterior.
00575         Opcion++;
00576       }
00577       else if (B_Abajo && (Opcion != Opcion_Max) ) {                         //Checa si se presiona el boton de abajo y la opcion actual no es la ultima opción.
00578         Opcion_Ant = Opcion;                                                 //Atualiza opcion anterior.
00579         Opcion++;                                                            //Incrementa la opcion.
00580       }
00581     }
00582     else if (B_Ok) {                                                         //Verifica si presionamos el Boton OK.
00583       Bandera = 1;                                                           //Cambia bandera a 1 permitiendo el paso a la siguiente acción.
00584       Avanzar = 1;                                                          //Permite el paso a la siguiente opción.
00585     }
00586     else if (B_Return) {                                                     //Checa si se presiono el boton de Regreso.
00587       Bandera = 1;                                                           //Cambia bandera a 1 permitiendo el paso a la siguiente acción.
00588 //      Avanzar = 0;                                                           //Permite el paso a la opción anterior.
00589     }
00590   }
00591 }
00592 
00593 
00594 /*
00595 ** ===================================================================
00596 **     Prototipo   :  Intro() (Envia mensajes a la pantalla LCD)
00597 **     Componente  :  Cpu [MKL46Z256VLL]
00598 **     Descripción :
00599 **         Envia mensajes al inicio del programa a traves del LCD.
00600 **         Limpia la interfaz del LCD
00601 **     Argumentos  : Ninguno
00602 **     Retorna     : Nada
00603 ** ===================================================================
00604 */
00605 void Intro() {
00606   lcd.setBacklight(TextLCD::LightOn);       // Enciende la Iluminación de Fondo
00607   lcd.setCursor(TextLCD::CurOff_BlkOff);    // Apaga el Cursor
00608   lcd.cls();
00609   lcd.locate(0,0);
00610   lcd.locate(7, 0);
00611   lcd.printf("I.P.N.");
00612   lcd.locate(5, 1);
00613   lcd.printf("E.S.I.M.E.");
00614   lcd.locate(3, 2);
00615   lcd.printf("DESHIDRATADOR");
00616   wait_ms(2000);
00617 }
00618 
00619 /*
00620 ** ===================================================================
00621 **     Prototipo   :  Imprime_Menu() (Imprime el Menú en la pantalla LCD)
00622 **     Componente  :  Cpu [MKL46Z256VLL]
00623 **     Descripción :
00624 **         Envia mensajes y coloca mensajes del menú en la LCD.
00625 **         Limpia la interfaz del LCD
00626 **     Argumentos  : Ninguno
00627 **     Retorna     : Nada
00628 ** ===================================================================
00629 */
00630 void Imprime_Menu() {
00631   lcd.setBacklight(TextLCD::LightOn);       // Enciende la Iluminación de Fondo
00632   lcd.setCursor(TextLCD::CurOff_BlkOff);    // Apaga el Cursor
00633   lcd.cls();
00634   lcd.locate(0,0);
00635   lcd.locate(1, 0);
00636   lcd.printf("MENU");
00637   lcd.locate(1, 1);
00638   lcd.printf("PERSONALIZAR");
00639   //lcd.printf("CONFiG OTRO");
00640   lcd.locate(1, 2);
00641   lcd.printf("CONTACTO");
00642   lcd.locate(1, 3);
00643   lcd.printf("ACERCA DE... ");
00644 }
00645 
00646 /*
00647 ** ===================================================================
00648 **     Prototipo   :  Imprime_InfoDeshidratacion() (Imprime info en la pantalla LCD)
00649 **     Componente  :  Cpu [MKL46Z256VLL]
00650 **     Descripción :
00651 **         Envia mensajes sobre las variables y el estado de operación
00652 **         del deshidratador y coloca mensajes en la pantalla LCD.
00653 **         Limpia la interfaz del LCD
00654 **     Argumentos  : Ninguno
00655 **     Retorna     : Nada
00656 ** ===================================================================
00657 */
00658 void Imprime_InfoDeshidratacion() {
00659   lcd.setBacklight(TextLCD::LightOn);       // Enciende la Iluminación de Fondo
00660   lcd.setCursor(TextLCD::CurOff_BlkOff);    // Apaga el Cursor
00661   lcd.cls();
00662   lcd.locate(0, 0);
00663   lcd.printf("TEMPERATURA: ");
00664   lcd.locate(0, 1);
00665   lcd.printf("HUMEDAD:     %");
00666   lcd.locate(0, 2);
00667   lcd.printf("VENT:     QUEM: ");
00668   lcd.locate(0, 3);
00669   lcd.printf("TIEMPO:");
00670 }
00671 /*
00672 ** ===================================================================
00673 **     Prototipo   :  Imprime_InfoSensores() (Imprime info en la pantalla LCD)
00674 **     Componente  :  Cpu [MKL46Z256VLL]
00675 **     Descripción :
00676 **         Imprime las mediciones datos e información obtenida de los
00677 **         sensores y es enviada a la pantalla LCD.
00678 **         Envia los respectivos mensajes y los despliega en la
00679 **         pantalla LCD.
00680 **         Limpia la interfaz del LCD
00681 **     Argumentos  : Ninguno
00682 **     Retorna     : Nada
00683 ** ===================================================================
00684 */
00685 void Imprime_InfoSensores() {
00686   uint16_t Porcentaje;
00687   lcd.setBacklight(TextLCD::LightOn);       // Enciende la Iluminación de Fondo
00688   lcd.setCursor(TextLCD::CurOff_BlkOff);    // Apaga el Cursor
00689   lcd.locate(12, 0);                //Coloca el cursor en la columna 12 y fila 0.
00690   lcd.printf("%.2f",t);             //Imprime valores de temperatura.
00691   lcd.locate(8, 1);                 //Coloca el cursor en la columna 8 fila 1.
00692   lcd.printf("%.2f",h);             //Imprime valores de humedad.
00693   lcd.locate(6, 2);                 //Coloca el cursor en columna 6 fila 2.
00694   Porcentaje = DC * 100 / 255;      // 
00695   if (Motor) {                      //Vericamos estado del motor.
00696     lcd.printf("%d",Porcentaje);    //Si - Imprime en LCD ON.
00697     lcd.printf("%");                //
00698   } else                            //No.
00699     lcd.printf("OFF");              //Imprime en LCD OFF.
00700   lcd.locate(16, 2);                //Colocamos cursor en columna 16 , fila 2.
00701   if (Quemador)                     //Verificamos estado del quemador.
00702     lcd.printf("ON ");              //Si - imprime mensaje en LCD de ON.
00703   else                              //No.
00704     lcd.printf("OFF");              //Imprime mesaje en LCD de OFF.
00705 }
00706 /*
00707 ** ===================================================================
00708 **     Prototipo   :  Imprime_Tiempo() (Imprime info en la pantalla LCD)
00709 **     Componente  :  Cpu [MKL46Z256VLL]
00710 **     Descripción :
00711 **         Imprime en la LCD el tiempo transcurrido.
00712 **         Formatea el mensaje y los despliega en la pantalla LCD.
00713 **         Limpia la interfaz del LCD
00714 **     Argumentos  : Ninguno
00715 **     Retorna     : Nada
00716 **     Variables Globales:
00717 **       uint16_t Columna - Almacena el valor de columna en la que desea imprimir en la LCD.
00718 **       uint16_t Fila    - Almacena el valor de fila en la que desea imprimir en la LCD.
00719 ** ===================================================================
00720 */
00721 void Imprime_Tiempo(int Columna,int Fila) {
00722   lcd.setBacklight(TextLCD::LightOn);       // Enciende la Iluminación de Fondo
00723   lcd.setCursor(TextLCD::CurOff_BlkOff);    // Apaga el Cursor
00724   lcd.locate(Columna, Fila);
00725   if (Hor < 10)
00726     lcd.printf("0");
00727   lcd.printf("%d",Hor);
00728   lcd.printf(":");
00729   if (Min < 10)
00730     lcd.printf("0");
00731   lcd.printf("%d",Min);
00732     lcd.printf(":");
00733   if (Seg < 10)
00734     lcd.printf("0");
00735   lcd.printf("%d",Seg);
00736     lcd.printf(" ");
00737 }
00738 /*
00739 ** ===================================================================
00740 **     Prototipo   :  Inicio() (Despliega Menú en la pantalla LCD)
00741 **     Componente  :  Cpu [MKL46Z256VLL]
00742 **     Descripción :
00743 **         Inicia el proceso de deshidratación.
00744 **         Imprime el menú de inicio en la pantalla LCD y permite
00745 **         navegar dentro de él.
00746 **         Envia los respectivos mensajes y los despliega en la
00747 **         pantalla LCD.
00748 **         Limpia la interfaz del LCD
00749 **     Argumentos  : Ninguno
00750 **     Retorna     : Nada
00751 ** ===================================================================
00752 */
00753 void Inicio() {
00754   bool MenuInicio;              //Variable que permite regresar a esta opción.
00755   MenuInicio = true;            //Inicializamos variable con verdadero.
00756   Scroll = 0;                   //Colocamos Scroll de pantalla en 0 (no hay scroll);
00757   while (MenuInicio) {          //Mientras este en 1 MenuInicio repetira el proceso de esta opción.
00758     Init_Var();                 //Se inicializan las variables.
00759     Opcion_Ant = 1;             //Opcion anterior en 1.
00760     Opcion_Max = NOFRUTAS;      //El máximo número de opciones.
00761     do {
00762       Scroll_Cambio = 0;        //Indicamos que no hay cambio de scroll por ahora.
00763       lcd.cls();                //Limpiamos LCD.
00764       for (int c = 0; c < 4; c++) {     //FOR que imprime nombres de las frutas en las 4 lineas de la LDC.
00765         lcd.locate(1, c);               //Coloca el cursor al inicio de la fila.
00766         lcd.printf(Fruta[c + Scroll]);  //Imprime el nombre de la Fruta dependiendo el valor del scroll.
00767       }
00768       while (!Bandera && !Scroll_Cambio) {     //Entra en un bucle de espera hasta que se active la bandera con 1.
00769         Imprime_Flecha();                      //Imprime la Flecha en el display en la posicion de la opcion.
00770         wait_ms(250);                          //Aplicamos un retardo para no hacer un bucle infinito.
00771       }
00772     } while (Scroll_Cambio);                   //Este ciclo se repite mientras exista cambios en el Scroll.
00773     if (Avanzar)                               //Si se activa la variable avanzar con 1.
00774       MenuInicio = Deshidratacion(Opcion - 1); //Comienza Deshidratacion.
00775     else
00776       MenuInicio = 0;                          //regresa al menu anterior.
00777   }
00778 }
00779 
00780 /*
00781 ** ===================================================================
00782 **     Prototipo   :  Deshidratación() (Despliega Menú en la pantalla LCD)
00783 **     Componente  :  Cpu [MKL46Z256VLL]
00784 **     Descripción :
00785 **         Supervisa el proceso de deshidratación.
00786 **         Imprime el menú de estado en la pantalla LCD y actualiza
00787 **         los datos en tirmpo real.
00788 **         Envia los respectivos mensajes y los despliega en la
00789 **         pantalla LCD.
00790 **         Limpia la interfaz del LCD
00791 **     Llamado por: Inicio()
00792 **     Argumentos  : Ninguno
00793 **     Retorna     : valor BOOLEANO.
00794 **          0 - Deshidratacion cancelada
00795 **          1 - Final de la deshidratación.
00796 ** ===================================================================
00797 */
00798 bool Deshidratacion(int FrutaD) {
00799   
00800   //Mostramos informacion de fruta.
00801   Deshidratando = inf_fruta(FrutaD);
00802   if (Deshidratando) {
00803     //Colocamos variables en condiciones iniciales.
00804     Opcion_Max = 0;                 //0 no existen opciones disponibles.
00805     Init_Var();                     //Se inicializan las variables.
00806     Init_Conometro();               //Iniciamos variables del cronometro.
00807     //ConfT2_PWM3(TAPWM);           //Configuracion de Timer2 PARA MODO FAST PWM EN PIN 3.
00808     PIN_QUEMADOR = DUTYCYCLE;       //Enciende el Quemador
00809     while (!Bandera && !Avanzar) {          //Ciclo que se repite hasta que la bandera no sea activada.
00810       if (PuertaAb)       
00811       {                                     //Checa si la puerta esta abierta
00812         Deshidratando = Puerta_Abierta();   //SI - Dependiedo de la decision del usuario puede o no continuar la deshidratación.
00813         PIN_BUZZER = Buzz_On;               //Enciende el buzzer.
00814         wait(2);    
00815         PIN_BUZZER = Buzz_Off;              //Apaga el buzzer 
00816         wait(1);
00817       }
00818       else        {                                //NO...
00819         Imprime_InfoDeshidratacion();       //Colocamos mensajes en la LCD.
00820         while (!PuertaAb && Deshidratando && !Bandera) {   //Mientras la puerta este cerrada y la variable Desidratando sea verdadera.
00821         error_code=dht.readData();          //Lee el Sensor de Humedad y Temperatura
00822         //wait(5); 
00823         /*if (error_code != 0) { 
00824             Terminal.printf("\rError Reading DHT   ");           //No se puedo leer DHT
00825             Terminal.printf("\r\nPlease Check Sensor !!! \n\r"); //Envia mensaje de error a la Terminal
00826             lcd.cls();                      //Limpiamos LCD.
00827             lcd.locate(1, 0);               //Coloca el cursor al inicio de la fila.
00828             lcd.printf("Error de Sensores");//Encia mensaje de Error.
00829             lcd.locate(1, 1);               //Coloca el cursor al inicio de la fila.
00830             lcd.printf("Revise Equipo ! "); //Encia mensaje de Error.
00831             PIN_BUZZER = Buzz_On;           //Enciende el buzzer 
00832             wait(10);                       //Espera 10 seg
00833           }
00834           Terminal.printf("\rReading DHT ... ");
00835           Terminal.printf("\r\nError Code: %d \r\n", error_code);  */
00836           h = dht.ReadHumidity();                          //Se lee la humedad
00837           Terminal.printf("\rHumedad: %.2f ", h);            
00838           t = dht.ReadTemperature(CELCIUS);                //Se lee la temperatura: CELCIUS=0,FARENHEIT=1,KELVIN=2
00839           Terminal.printf("\tTemperatura: %.2f \r\n\v\v\v\v", t);            
00840           Checar_Calefactor(Temp[FrutaD]);                 //Verifica sesores y enciende componentes.
00841           Imprime_InfoSensores();                          //Impresion de informacion de sensores,
00842           Imprime_Tiempo(7, 3);                            //Impresion de Tiempo.
00843           if (Hor == 5 && Min == 30) {                     //Tiempo Transcurrido es igual a 5:30:XX .
00844             Bandera = 1;                                   // SI - Termina el proceso.
00845             Terminal.printf("\rDemasiado Tiempo de Deshidratacion ...\n\r");
00846             Terminal.printf("\rTiempo Terminado !!! \n\r");  
00847            }
00848         }
00849       }
00850     }
00851     //Deshidratacion terminada.
00852     Terminal.printf("\rDeshidratacion Terminada  \n\r");
00853     Terminal.printf("\rTiempo Terminado !!! \n\r");      
00854     TF = t;                                             //Almacenamos el valor final de temperatura.
00855     HF = h;                                             //Almacenamos el valor final de humedad.
00856     Terminal.printf("\rHumedad Final: %.2f ", HF);                     //Humedad Final
00857     Terminal.printf("\tTemperatura Interna: %.2f \r\n\v\v\v\v", TF);     //Temperatura Final
00858     Deshidratando = 0;                                  //Indica que termina la deshidratacion.
00859     Apagar_Calefactor();                                //Apaga el calefactor.
00860     Reporte_Des();                                      //Muestra reporte de deshidratacion.
00861     return 1;                                           //Indicamos que termino la deshidratación.
00862   }
00863   else
00864     return 0;                                             //Indica que no se inicio el proceso.
00865 }
00866 /*
00867 ** ===================================================================
00868 **     Prototipo   :  inf_fruta() (Confugura pramatros de deshidratación)
00869 **     Componente  :  Cpu [MKL46Z256VLL]
00870 **     Descripción :
00871 **         Despliega en la LCD la informacion de la fruta seleccionada.
00872 **         Imprime el menú de estado en la pantalla LCD y actualiza
00873 **         los datos en tirmpo real.
00874 **         Envia los respectivos mensajes y los despliega en la
00875 **         pantalla LCD.
00876 **         Limpia la interfaz del LCD
00877 **     Argumentos  :
00878 **            uint16_t Fruit - recibe el numero de fruta contenido en los arreglos.
00879 **     Retorna     : valor BOOLEANO.
00880 **              0 - Continuar con deshidratacion.
00881 **              1 - Cancelar.
00882 ** ===================================================================
00883 */
00884 bool inf_fruta(int Fruit) {
00885 
00886   //Colocamos variables en condiciones iniciales.
00887   Opcion_Max = 0;                       //0 no existen opciones disponibles.
00888   Init_Var();                           //Inicializamos variables
00889   lcd.setBacklight(TextLCD::LightOn);   // Enciende la Iluminación de Fondo
00890   lcd.setCursor(TextLCD::CurOff_BlkOff);    // Apaga el Cursor
00891   lcd.cls();                            //Limpiamos pantalla.
00892   lcd.locate(0, 0);
00893   lcd.printf(Fruta[Fruit]);             //Imprimimos nombre de fruta.
00894   lcd.locate(0, 1);
00895   lcd.printf("TEMPERATURA MAX: ");
00896   lcd.printf("%d", Temp[Fruit]);        //Imprimimos temperatura maxima de fruta.
00897   lcd.locate(0, 2);
00898   lcd.printf("HUMEDAD MAX: ");
00899   lcd.printf("%d", Hume[Fruit]);        //Imprimimos humedad maxima de fruta.
00900   lcd.locate(0, 3);
00901   lcd.printf("ATRAS             OK");
00902 
00903   while (!Bandera) {                    //Esperamos hasta que se presione algún boton (atras o adelante).
00904     wait_ms(250);
00905   }
00906   if (Avanzar)                          //Verificamos si el Boton fue el de Avanzar.
00907     return 1;
00908   else
00909     return 0;                          //
00910 }
00911 /*
00912 ** ===================================================================
00913 **     Prototipo   :  Puerta_Abierta() (Despliega info en la pantalla LCD)
00914 **     Componente  :  Cpu [MKL46Z256VLL]
00915 **     Descripción :
00916 **         Rutina que se ejecuta a la hora de abrir la puerta durante
00917 **         el proceso de deshidratación.
00918 **         Pone en pause el proceso hasta que se cierre nuevamente la
00919 **         puerta.
00920 **         Imprime el estado en la pantalla LCD.
00921 **         Envia los respectivos mensajes y los despliega en la
00922 **         pantalla LCD.
00923 **         Limpia la interfaz del LCD
00924 **     Argumentos  : Ninguno
00925 **     Retorna     : Nada
00926 ** ===================================================================
00927 */
00928 bool Puerta_Abierta() {
00929   Init_Var();
00930   Terminal.printf("\r\nPuerta Abierta ");
00931   Terminal.printf("\r\nProceso Suspendido !!! \r\n");  
00932   CalefactorOFF();
00933   lcd.setBacklight(TextLCD::LightOn);       // Enciende la Iluminación de Fondo
00934   lcd.setCursor(TextLCD::CurOff_BlkOff);    // Apaga el Cursor  
00935   lcd.cls();
00936   lcd.locate(0, 0);
00937   lcd.printf("   PUERTA  ABIERTA");
00938   lcd.locate(0, 1);
00939   lcd.printf("      PROCESO");
00940   lcd.locate(0, 2); 
00941   lcd.printf("    SUSPENDIDO");
00942   PIN_BUZZER = Buzz_On;               //Enciende el buzzer.
00943   wait_ms(5000);                            //Espera 5 segundos
00944   lcd.cls();
00945   lcd.locate(0, 0);
00946   lcd.printf("     POR FAVOR   ");
00947   lcd.locate(0, 1);
00948   lcd.printf("      CIERRE");
00949   lcd.locate(0, 2);
00950   lcd.printf("     LA PUERTA");
00951   lcd.locate(0, 3);
00952   lcd.printf("   PARA CONTINUAR!");  
00953   PIN_BUZZER = Buzz_Off;              //Apaga el buzzer 
00954   while (PuertaAb && !Avanzar)  //Mientras la puerta está abierta
00955     wait_ms(250);
00956   return !Avanzar;              //Se detiene el proceso
00957 }
00958 /*
00959 ** ===================================================================
00960 **     Prototipo   :  Checar_Calefactor() (Verifica estado del calefactor)
00961 **     Componente  :  Cpu [MKL46Z256VLL]
00962 **     Descripción :
00963 **         Enciende o apaga de calefactor con ayuda de las variables de
00964 **         humedad y temperatura.
00965 **         Imprime el menú de estado en la pantalla LCD y actualiza
00966 **         los datos en tirmpo real.
00967 **         Envia los respectivos mensajes y los despliega en la
00968 **         pantalla LCD.
00969 **         Limpia la interfaz del LCD
00970 **     Argumentos  : Ninguno
00971 **     Retorna     : Nada
00972 ** ===================================================================
00973 */
00974 void Checar_Calefactor(int TempD) {
00975   if ((t > (TempD - 2) && t < (TempD + 1)) || (h > 75))
00976     MotorON(130);
00977   else if (t < (TempD - 2) && (h <= 75))
00978     MotorOFF();
00979   else if (t >= (TempD + 1))
00980     MotorON(196);
00981 
00982   if (t <= (TempD - 1)) {           //Checa si el quemador esta apagado y su tempertatura es igual o menor que la temperatura de la fruta.
00983     wait_ms(1000);                  //Retardo de 1 seg.
00984     CalefactorON();
00985   }
00986   else if (t >= (TempD + 1)) {      //Checa si el motor esta encendido y la si la temperatura es mayor a la maxima permitida
00987     CalefactorOFF();
00988     wait_ms(2000);                  //retardo de 2 segundos.
00989   }
00990 }
00991 /*
00992 ** ===================================================================
00993 **     Prototipo   :  Apagar_Calefactor() (Apaga el calefactor)
00994 **     Componente  :  Cpu [MKL46Z256VLL]
00995 **     Descripción :
00996 **         Apaga de calefactor despues de haber terminado el proceso
00997 **         de deshidratacion.
00998 **         Imprime el menú de estado en la pantalla LCD y actualiza
00999 **         los datos en tirmpo real.
01000 **         Envia los respectivos mensajes y los despliega en la
01001 **         pantalla LCD.
01002 **         Limpia la interfaz del LCD
01003 **     Argumentos  : Ninguno
01004 **     Retorna     : Nada
01005 ** ===================================================================
01006 */
01007 void Apagar_Calefactor() {
01008   lcd.cls();
01009   lcd.locate(5, 0);
01010   lcd.printf("ENFRIANDO");
01011   lcd.locate(6, 1);
01012   lcd.printf("SISTEMA");
01013   lcd.locate(2, 2);
01014   lcd.printf("ESPERE POR FAVOR");
01015   lcd.locate(0, 3);
01016   lcd.printf("TEMPERATURA: ");
01017 //Enfriamiento del Sistema  
01018   CalefactorOFF();                     //Apaga el Elemento Calefactor
01019   do {
01020     t = dht.ReadTemperature(CELCIUS);  //Se lee la temperatura: CELCIUS=0, FARENHEIT=1, KELVIN=2
01021     lcd.locate(13, 3);
01022     lcd.printf("%.2f",t);              //Temperatura interna del Deshidratador
01023     Terminal.printf("\rEnfriando, Temperatura: %.2f",t);   //
01024     wait_ms(1000);                     //Espera 1 segundo
01025      } 
01026   while (t > 37);                      //Hasta que la Temperatura Llega a 37°C
01027     MotorOFF();                        //Apaga el Elemento de Ventilación
01028   if (t < 25 ){
01029     printf("\rEs Seguro Abrir Deshidratador !!!   \n\r");    
01030     lcd.cls();                         //Limpia el LCD
01031     lcd.locate(3,1);
01032     lcd.printf("Es Seguro Abrir ");    //Apertura segura del Deshidratador
01033     lcd.locate(3,2);
01034     lcd.printf(" Deshidratador ");     //Apertura segura del Deshidratador
01035     wait(30);                           //Espera 30 segundos   
01036    }     
01037 }
01038 /*
01039 ** ===================================================================
01040 **     Prototipo   :  Reporte_Des() (Reporta el estado del proceso)
01041 **     Componente  :  Cpu [MKL46Z256VLL]
01042 **     Descripción :
01043 **         Despliega en la LCD valores finales de humedad, temperatura
01044 **         y tiempo total del proceso de deshidratación.
01045 **         Imprime el menú de estado en la pantalla LCD y actualiza
01046 **         los datos en tirmpo real.
01047 **         Envia los respectivos mensajes y los despliega en la
01048 **         pantalla LCD.
01049 **         Limpia la interfaz del LCD
01050 **         Limpia la interfaz del LCD
01051 **     Argumentos  : Ninguno
01052 **     Retorna     : Nada
01053 ** ===================================================================
01054 */
01055 void Reporte_Des() {
01056   //Colocamos variables en condiciones iniciales.
01057   Opcion_Max = 0;                 //0 no existen opciones disponibles.
01058   Init_Var();
01059 
01060   lcd.cls();
01061   lcd.locate(0, 0);
01062   lcd.printf(" PROCESO TERMINADO");
01063   lcd.locate(0, 1);
01064   lcd.printf("TEMP. FINAL: ");
01065   lcd.printf("%.2f",TF);
01066   lcd.locate(0, 2);
01067   lcd.printf("HUM. FINAL: ");
01068   lcd.printf("%.2f",HF);
01069   lcd.locate(0, 3);
01070   lcd.printf("TIEMPO DES:");
01071 
01072   Imprime_Tiempo(12, 3);
01073   while (!Avanzar) {
01074     wait_ms(250);
01075   }
01076 
01077 }
01078 /*
01079 ** ===================================================================
01080 **     Prototipo   :  Conf_Otro() (Configura parámetros de deshidratación)
01081 **     Componente  :  Cpu [MKL46Z256VLL]
01082 **     Descripción :
01083 **         Configura valores de opcion del menú: OTRO
01084 **         en el cual se puede seleccionar valores para la temperatura
01085 **         y humedad de otro alimento que se desee deshidratar.
01086 **         Imprime el menú de estado en la pantalla LCD y actualiza
01087 **         los datos en tirmpo real.
01088 **         Envia los respectivos mensajes y los despliega en la
01089 **         pantalla LCD.
01090 **         Limpia la interfaz del LCD
01091 **     Argumentos  : Ninguno
01092 **     Retorna     : Nada
01093 ** ===================================================================
01094 */
01095 void Conf_Otro() {
01096  uint16_t MenuConf;
01097  uint16_t Temp_Aux;
01098  uint16_t Hume_Aux;
01099   MenuConf = 1;
01100   while (MenuConf) {                    
01101     Init_Var();                             //se inicializan los valores
01102     Scroll = 0;                             //No hay scroll.
01103     Opcion_Ant = 1;                         //Iniciamos Opcion anterior = 1.
01104     Opcion_Max = CONDALARM;                 //Opciones iguales a las alarmas disponibles.
01105     lcd.cls();                              //Limpiamos pantalla.
01106     lcd.locate(1, 0);
01107     lcd.printf("TEMP. MAX:   ");
01108     lcd.printf("%d", Temp[NOFRUTAS - 1]);   //Imprimimos temperatura maxima de fruta.
01109     lcd.locate(1, 1);
01110     lcd.printf("HUMEDAD MAX: ");
01111     lcd.printf("%d", Hume[NOFRUTAS - 1]);   //Imprimimos humedad maxima de fruta.
01112     lcd.locate(0, 3);
01113     lcd.printf("CANCELAR          OK");
01114     Temp_Aux = Temp[NOFRUTAS - 1];          //Son guardadas en una variable auxiliar.
01115     Hume_Aux = Hume[NOFRUTAS - 1];          //Humedad gurdada en una variable auxiliar
01116     while (!Bandera) {                      //
01117       Temp[NOFRUTAS - 1] = Temp_Aux;        //Aplica cambio a variable original de temperatura.
01118       Hume[NOFRUTAS - 1] = Hume_Aux;        //Aplica cambio a variable original de humedad.
01119       wait_ms(250); 
01120       Imprime_Flecha();
01121       if (Opcion == 1 && B_Derecho) {       //Opcion de temperatura DERECHA.
01122         Temp_Aux++;                         //Incrementa tempertura de variable auxiliar.
01123       }
01124       else if (Opcion == 1 && B_Izquierdo) { //Opcion de temperatura IZQUIERDA.
01125         Temp_Aux--;                         //Decrementa temperatura de la variable auxiliar.
01126       }
01127       else if (Opcion == 2 && B_Derecho) {   //Opcion de humedad DERECHA.
01128         Hume_Aux++;                         //Incrementa humedad de la variable auxiliar.
01129       }
01130       else if (Opcion == 2 && B_Izquierdo) { //Opcion de humedad IZQUIERA.
01131         Hume_Aux--;                         //Decrementa humedad de la variable auxiliar.
01132       } 
01133     //Mostramos valores modificados.      
01134     lcd.locate(1, 0);
01135     lcd.printf("TEMP. MAX:   ");
01136     lcd.printf("%d", Temp[NOFRUTAS - 1]);   //Actualizamos Temperatura maxima de fruta.    
01137     lcd.locate(1, 1);
01138     lcd.printf("HUMEDAD MAX: ");
01139     lcd.printf("%d", Hume[NOFRUTAS - 1]);   //Actualizamos Humedad maxima de fruta.
01140     }                                   
01141     if (Avanzar) {                          //Si aprieta el boton OK
01142       lcd.cls();                            //Limpiamos pantalla.  
01143       lcd.locate(0, 1);
01144       lcd.printf("      VALORES");
01145       lcd.locate(1, 2);
01146       lcd.printf("    ACTUALIZADOS");
01147       wait_ms(2000);
01148     }
01149     MenuConf = 0;
01150   }
01151 }
01152 /*
01153 ** ===================================================================
01154 **     Prototipo   :  Init_Cronometro() (Configura el cronómetro)
01155 **     Componente  :  Cpu [MKL46Z256VLL]
01156 **     Descripción :
01157 **         Configura valores iniciales del cronómetro.
01158 **         Imprime el menú de estado en la pantalla LCD y actualiza
01159 **         los datos en tirmpo real.
01160 **         Envia los respectivos mensajes y los despliega en la
01161 **         pantalla LCD.
01162 **         Limpia la interfaz del LCD
01163 **     Argumentos  : Ninguno
01164 **     Retorna     : Nada
01165 ** ===================================================================
01166 */
01167 void Init_Conometro() {
01168   Seg = 0;
01169   Min = 0;
01170   Hor = 0;
01171 }
01172 /*
01173 ** ===================================================================
01174 **     Prototipo   :  Conteo_Cronometro() (incrementa el cronómetro)
01175 **     Componente  :  Cpu [MKL46Z256VLL]
01176 **     Descripción :
01177 **         Incrementa variables que realizan el conteo del tiempo
01178 **         transcurrido del proceso de deshidratación.
01179 **         Imprime el menú de estado en la pantalla LCD y actualiza
01180 **         los datos en tirmpo real.
01181 **         Envia los respectivos mensajes y los despliega en la
01182 **         pantalla LCD.
01183 **         Limpia la interfaz del LCD
01184 **     Argumentos  : Ninguno
01185 **     Retorna     : Nada
01186 ** ===================================================================
01187 */
01188 void Conteo_Cronometro() {
01189   NInterrupciones++;                        //Incrementa valor de interrupciones (Deacuerdo a la interrupcion se incrementa cada 250 ms).
01190   if (NInterrupciones >= 4) {               //Al completar al menos 4 interrupciones (4x250ms=1S) tendriamos al menos 1s.
01191     Seg++;                                  //Incrementamos el valor de la variable que almacena los segundos.
01192     NInterrupciones = NInterrupciones - 4;  //Decrementamos las 4 interrupciones que representan el segundo.
01193     if (Seg > 59) {                         //Si tenemos mas de 59 segundos...
01194       Seg = 0;                              //Reiniciamos variable Seg.
01195       Min++;                                //Incrementamos los minutos.
01196       if (Min > 59) {                       //Si tenemos mas de 59 minutos...
01197         Min = 0;                            //Reiniciams la variable Min.
01198         Hor++;                              //Incrementamos el valor de las horas.
01199       }
01200     }
01201   }
01202 }
01203 /*
01204 ** ===================================================================
01205 **     Prototipo   :  ConfT2_PWM3() (configuración del PWM3)
01206 **     Componente  :  Cpu [MKL46Z256VLL]
01207 **     Descripción :
01208 **         Configuracion de Timer2 PARA MODO FAST PWM EN PIN 3.
01209 **     Argumentos  : Recibe varieble entera
01210 **           uint16_t DUTYCYCLE - Ciclo util del PWM
01211 **                            0.0=0%    1.0=100%
01212 **     Retorna     : Nada
01213 ** ===================================================================
01214 */
01215 void ConfT2_PWM3(int DUTYCYCLE) {
01216   //TIMER2
01217   
01218 //  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
01219 //  TCCR2B =  _BV(CS22) | _BV(CS21) | _BV(CS20);
01220 //  OCR2B = DUTYCYCLE;                              //Ancho de pulso.
01221   //Aqui termina configuración.
01222 }
01223 /*
01224 ** ===================================================================
01225 **     Prototipo   :  CalefactorON() (Encendido del elemento Calefactor)
01226 **     Componente  :  Cpu [MKL46Z256VLL]
01227 **     Descripción :
01228 **         Enciende el elemento Calefactor.
01229 **     Argumentos  : Ninguno
01230 **     Retorna     : Nada
01231 ** ===================================================================
01232 */
01233 void CalefactorON() {
01234   Quemador = 1;                     //Coloca la Bandera de Estado en 1.
01235   DUTYCYCLE = HIGH;                 //Pone al Máximo el Quemador 
01236   PIN_QUEMADOR = DUTYCYCLE;         //Actualiza el PWM del Quemador
01237 }
01238 /*
01239 ** ===================================================================
01240 **     Prototipo   :  CalefactorOFF() (Apagado del elemento Calefactor)
01241 **     Componente  :  Cpu [MKL46Z256VLL]
01242 **     Descripción :
01243 **         Apaga el elemento Calefactor.
01244 **     Argumentos  : Ninguno
01245 **     Retorna     : Nada
01246 ** ===================================================================
01247 */
01248 void CalefactorOFF() {
01249   Quemador = 0;                     //Colocamos la Bandera de Estado en 0.
01250   PIN_QUEMADOR = LOW;               //Pone al Mínimo el Quemador
01251 }
01252 /*
01253 ** ===================================================================
01254 **     Prototipo   :  MotorON() (Enciende el Ventilador)
01255 **     Componente  :  Cpu [MKL46Z256VLL]
01256 **     Descripción :
01257 **         Enciende el ventilador del deshidratador.
01258 **     Argumentos  : Ninguno
01259 **     Retorna     : Nada
01260 ** ===================================================================
01261 */
01262 void MotorON(int CicloUtil) {
01263   Motor = 1;        //Actualiza la Bandera de Estado en 1.      
01264   DC = CicloUtil;   //
01265   PIN_MOTOR = DC;   //Encendemos Ventilador.
01266 }
01267 /*
01268 ** ===================================================================
01269 **     Prototipo   :  MotorOFF() (Apaga el Ventilador)
01270 **     Componente  :  Cpu [MKL46Z256VLL]
01271 **     Descripción :
01272 **         Apaga el ventilador del deshidratador.
01273 **     Argumentos  : Ninguno
01274 **     Retorna     : Nada
01275 ** ===================================================================
01276 */
01277 void MotorOFF() {
01278   Motor = 0;        //Colocamos la Bandera de Estado en 0.
01279   PIN_MOTOR = 0;    //Apagamos Ventilador.
01280 }
01281 /*
01282 ** ===================================================================
01283 **     Prototipo   :  Contacto() (Muestra info en la pantalla LCD)
01284 **     Componente  :  Cpu [MKL46Z256VLL]
01285 **     Descripción :
01286 **         Muestra en la pantalla información de contacto con los autores.
01287 **         Envia los respectivos mensajes y los despliega en la
01288 **         pantalla LCD.
01289 **         Limpia la interfaz del LCD
01290 **     Argumentos  : Ninguno
01291 **     Retorna     : Nada
01292 ** ===================================================================
01293 */
01294 void Contacto() {
01295   Bandera = 0;
01296   Avanzar = 0;
01297   lcd.cls();
01298   lcd.locate(0,0);
01299   lcd.printf("ATEAM & TEAM-T Unltd");
01300   lcd.locate(0, 1);
01301   lcd.printf("Antulio Morgado Valle");
01302   lcd.locate(0, 2);
01303   lcd.printf("Raziel Lopez Escamilla");
01304   lcd.locate(0, 3);
01305   lcd.printf("IPN ESIME Zacatenco");
01306   while (!Bandera)
01307     wait_ms(250);
01308 }
01309 /*
01310 ** ===================================================================
01311 **     Prototipo   :  Acerca() (Muestra info en la pantalla LCD)
01312 **     Componente  :  Cpu [MKL46Z256VLL]
01313 **     Descripción :
01314 **         Muestra en la pantalla información del prototipo y de los autores.
01315 **         Envia los respectivos mensajes y los despliega en la
01316 **         pantalla LCD.
01317 **         Limpia la interfaz del LCD
01318 **     Argumentos  : Ninguno
01319 **     Retorna     : Nada
01320 ** ===================================================================
01321 */
01322 void Acerca() {
01323   Bandera = 0;
01324   Avanzar = 0;
01325   lcd.cls();
01326   lcd.locate(0,0);
01327   lcd.printf("PROTOTIPO ELABORADO ");
01328   lcd.locate(0, 1);
01329   lcd.printf("  POR PROFESORES Y ");
01330   lcd.locate(0, 2);
01331   lcd.printf("  ALUMNOS DE ESIME ");
01332   lcd.locate(0, 3);
01333   lcd.printf("Version: Beta");
01334   while (!Bandera)
01335     wait_ms(250);
01336 }