Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Fri Jul 22 2022 16:05:23 by
1.7.2