Heladera Lauckner Lipari

Dependencies:   DS1820 TextLCD mbed

Fork of DS1820_HelloWorld by Erik -

Committer:
juanlipari
Date:
Wed May 23 22:33:13 2018 +0000
Revision:
6:b2a27e6f6195
Parent:
5:838bc36ed9e4
Heladera LAUCKNER, LIPARI;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
juanlipari 5:838bc36ed9e4 1 #define CANT_SAMPLES 10 //Constante que se define por si se quiere agregar mas mediciones al promedio
Sissors 0:e069f9f26768 2
Sissors 0:e069f9f26768 3 #include "mbed.h"
Sissors 0:e069f9f26768 4 #include "DS1820.h"
juanlipari 5:838bc36ed9e4 5 #include "TextLCD.h"
Sissors 0:e069f9f26768 6
juanlipari 5:838bc36ed9e4 7 #define MAX_PROBES 2 //Constante que se define para la cant de sensores DS1820 (Lo requiere la lib)
juanlipari 5:838bc36ed9e4 8
juanlipari 5:838bc36ed9e4 9 enum {DEMORA, CONTROL, MODO, OFF, SET, UP, DOWN, //Estados de la ME de Interrupciones
juanlipari 5:838bc36ed9e4 10 MODO_HELADERA, SET_HELADERA, MODO_FREEZER, SET_FREEZER, //Estados de la ME de LCD
juanlipari 5:838bc36ed9e4 11 CERO, ESPERANDO, UNO, //Estados de la ME de antirebotes
juanlipari 5:838bc36ed9e4 12 ADC_FRZ, SAMPLES}; //Estados de la ME de Mediciones del ADC
juanlipari 5:838bc36ed9e4 13
juanlipari 5:838bc36ed9e4 14 Ticker timer1; //Timer para controlar los tiempos de pulsadores 1mSeg
juanlipari 5:838bc36ed9e4 15 Ticker timer2; //Timer para controlar los tiempos del sensor DS1820 200mSeg
juanlipari 5:838bc36ed9e4 16 InterruptIn modo(PTD5); //Pin de entrada del Pulsador de Modo
juanlipari 5:838bc36ed9e4 17 InterruptIn set(PTD0); //Pin de entrada del Pulsador de Set
juanlipari 5:838bc36ed9e4 18 InterruptIn up(PTD2); //Pin de entrada del Pulsador de UP
juanlipari 5:838bc36ed9e4 19 InterruptIn down(PTD3); //Pin de entrada del Pulsador de DOWN
juanlipari 5:838bc36ed9e4 20 DS1820 probe1(A0); //Pin asociado al sensor DS1820
juanlipari 5:838bc36ed9e4 21 AnalogIn LM35(A1); //Pin de entrada analogico del LM35
juanlipari 5:838bc36ed9e4 22 DigitalOut salida_frz(PTC2); //Salida activada para enfriar el freezer
juanlipari 5:838bc36ed9e4 23 DigitalOut salida_hel(PTC1); //Salida activada para enfriar la heladera
juanlipari 5:838bc36ed9e4 24
juanlipari 5:838bc36ed9e4 25 // I2C Communication
juanlipari 5:838bc36ed9e4 26 I2C i2c_lcd(PTC9,PTC8); // SDA, SCL
juanlipari 5:838bc36ed9e4 27
juanlipari 5:838bc36ed9e4 28
juanlipari 5:838bc36ed9e4 29 // LCD instantiation
juanlipari 5:838bc36ed9e4 30 TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD16x2); //Se indica que sera por I2C, la address del modulo y tipo de LCD
juanlipari 5:838bc36ed9e4 31
juanlipari 5:838bc36ed9e4 32
juanlipari 5:838bc36ed9e4 33 unsigned char puls_modo = 0, puls_set = 0, puls_up = 0, puls_down = 0, set_hel = 8, set_frz = 16; //Variables de los pulsadores y el valor seteado
juanlipari 5:838bc36ed9e4 34 short PULS_tic;
juanlipari 5:838bc36ed9e4 35
juanlipari 5:838bc36ed9e4 36 unsigned char ADC_CONV_state = ADC_FRZ, cuentaFrz = 0, cuentaHel = 0; //Variables usadas en las mediciones de los sensores
juanlipari 5:838bc36ed9e4 37 float acumHel = 0, acumFrz = 0, resHel = 0, resFrz = 0, resADC; //Variables usadas en las mediciones de los sensores
juanlipari 5:838bc36ed9e4 38
juanlipari 5:838bc36ed9e4 39 //Variables usadas en los pulsadores
juanlipari 5:838bc36ed9e4 40 char habilitacion = 0, valor_puls_modo, valor_puls_set, valor_puls_up, valor_puls_down, anti_rebote_state, hab_antirrebote;
juanlipari 5:838bc36ed9e4 41 short espera_tic = 50; //Variable de tiempo
juanlipari 5:838bc36ed9e4 42
juanlipari 5:838bc36ed9e4 43
juanlipari 5:838bc36ed9e4 44 //Prototipos
juanlipari 5:838bc36ed9e4 45 void ADC_CONV_Step(void);
juanlipari 5:838bc36ed9e4 46 void ADC_CONV_TIEMPO (void);
juanlipari 5:838bc36ed9e4 47 void timer_init(void);
juanlipari 5:838bc36ed9e4 48 void anti_rebote_step (char hab);
juanlipari 5:838bc36ed9e4 49 void flanco_modo (void);
juanlipari 5:838bc36ed9e4 50 void flanco_set (void);
juanlipari 5:838bc36ed9e4 51 void flanco_up (void);
juanlipari 5:838bc36ed9e4 52 void flanco_down (void);
juanlipari 5:838bc36ed9e4 53 void Interrupciones(void);
juanlipari 5:838bc36ed9e4 54 void TIEMPOS(void);
juanlipari 5:838bc36ed9e4 55 void LCD_init(void);
juanlipari 5:838bc36ed9e4 56 void LCDStep(void);
juanlipari 5:838bc36ed9e4 57 void HeladeraStep(void);
juanlipari 5:838bc36ed9e4 58 void Activacion_frio(void);
juanlipari 5:838bc36ed9e4 59
juanlipari 5:838bc36ed9e4 60
juanlipari 5:838bc36ed9e4 61 int main()
juanlipari 5:838bc36ed9e4 62 {
juanlipari 5:838bc36ed9e4 63 probe1.convertTemperature(false, DS1820::all_devices); //Iniciacion del sensor DS1820 (Lo requiere la lib)
juanlipari 5:838bc36ed9e4 64 timer_init(); //Funcion que configura los timers
juanlipari 5:838bc36ed9e4 65 LCD_init(); //Funcion que configura e inicia el LCD
juanlipari 5:838bc36ed9e4 66 while(1) {
juanlipari 5:838bc36ed9e4 67 ADC_CONV_Step(); //Maquina de estados de medicion del ADC
juanlipari 5:838bc36ed9e4 68 Interrupciones(); //Maquina de estados de interrupciones de los pulsadores
juanlipari 5:838bc36ed9e4 69 LCDStep(); //Maquina de estados que controla el LCD
juanlipari 5:838bc36ed9e4 70 Activacion_frio(); //Maquina de estados que controla la activacion de las salidas
juanlipari 5:838bc36ed9e4 71 }
juanlipari 5:838bc36ed9e4 72
juanlipari 5:838bc36ed9e4 73 }
juanlipari 5:838bc36ed9e4 74
juanlipari 5:838bc36ed9e4 75 //Funcion que se ejecuta cada 1mSeg
juanlipari 5:838bc36ed9e4 76 void TIEMPOS (void)
juanlipari 5:838bc36ed9e4 77 {
juanlipari 5:838bc36ed9e4 78 if(PULS_tic > 0)
juanlipari 5:838bc36ed9e4 79 PULS_tic--;
juanlipari 5:838bc36ed9e4 80 if(espera_tic > 0)
juanlipari 5:838bc36ed9e4 81 espera_tic--;
juanlipari 5:838bc36ed9e4 82 }
juanlipari 5:838bc36ed9e4 83
juanlipari 5:838bc36ed9e4 84
juanlipari 5:838bc36ed9e4 85 void timer_init (void)
juanlipari 5:838bc36ed9e4 86 {
juanlipari 5:838bc36ed9e4 87 timer1.attach(&TIEMPOS, 0.001); //TIMER cada 1mSeg
juanlipari 5:838bc36ed9e4 88 timer2.attach(&ADC_CONV_TIEMPO, 0.2); //TIMER cada 200mSeg (sensor DS1820)
juanlipari 5:838bc36ed9e4 89 }
juanlipari 5:838bc36ed9e4 90
juanlipari 5:838bc36ed9e4 91 //Maquina que controla las mediciones del ADC y calcula un promedio
juanlipari 5:838bc36ed9e4 92 void ADC_CONV_Step(void)
juanlipari 5:838bc36ed9e4 93 {
juanlipari 5:838bc36ed9e4 94 switch(ADC_CONV_state) {
juanlipari 5:838bc36ed9e4 95 default: //Si no se definio estado, es ADC_FRZ
juanlipari 5:838bc36ed9e4 96 case ADC_FRZ: //Estado ADC_FZR
juanlipari 5:838bc36ed9e4 97 resADC = 3.3 * LM35.read(); //Se lee la entrada y se la multiplica segun la ganancia requerida
juanlipari 5:838bc36ed9e4 98 resADC = (resADC *26)/3.3; //Se hace regla de tres para la ganancia requerida
juanlipari 5:838bc36ed9e4 99 acumFrz = acumFrz + resADC; //El valor medido se le suma al acumulado para luego calcular el promedio
juanlipari 5:838bc36ed9e4 100 cuentaFrz++; //La variable que guarda la cant de mediciones aumenta 1
juanlipari 5:838bc36ed9e4 101
juanlipari 5:838bc36ed9e4 102 ADC_CONV_state = SAMPLES; //Proximo estado
juanlipari 5:838bc36ed9e4 103 break;
juanlipari 5:838bc36ed9e4 104
juanlipari 5:838bc36ed9e4 105 case SAMPLES: //Estado Samples
juanlipari 5:838bc36ed9e4 106 if(cuentaHel >= CANT_SAMPLES) //Si cant de mediciones es > 0 = a la cant de samples definida...
juanlipari 5:838bc36ed9e4 107 {
juanlipari 5:838bc36ed9e4 108 resHel = acumHel/ CANT_SAMPLES; //Calcula el promedio y lo guarda en resHel
juanlipari 5:838bc36ed9e4 109 acumHel = 0; //Reinicia la variable que acumula los resultados
juanlipari 5:838bc36ed9e4 110 cuentaHel = 0; //Reinicia la variable que cuenta la cant de mediciones
juanlipari 5:838bc36ed9e4 111 }
juanlipari 5:838bc36ed9e4 112
juanlipari 5:838bc36ed9e4 113 if(cuentaFrz >= CANT_SAMPLES) //Si cant de mediciones es > 0 = a la cant de samples definida...
juanlipari 5:838bc36ed9e4 114 {
juanlipari 5:838bc36ed9e4 115 resFrz = acumFrz/ CANT_SAMPLES; //Calcula el promedio y lo guarda en resFrz
juanlipari 5:838bc36ed9e4 116 acumFrz = 0; //Reinicia la variable que acumula los resultados
juanlipari 5:838bc36ed9e4 117 cuentaFrz = 0; //Reinicia la variable que cuenta la cant de mediciones
juanlipari 5:838bc36ed9e4 118 }
juanlipari 5:838bc36ed9e4 119
juanlipari 5:838bc36ed9e4 120 ADC_CONV_state = ADC_FRZ; //Proximo estado
Sissors 0:e069f9f26768 121 break;
Sissors 0:e069f9f26768 122 }
juanlipari 5:838bc36ed9e4 123 }
juanlipari 5:838bc36ed9e4 124
juanlipari 5:838bc36ed9e4 125 //Funcion que se repite cada 200mSeg
juanlipari 5:838bc36ed9e4 126 void ADC_CONV_TIEMPO (void)
juanlipari 5:838bc36ed9e4 127 {
juanlipari 5:838bc36ed9e4 128 probe1.convertTemperature(false, DS1820::all_devices); //Prepara al sensor para la medicion (lo requiere la lib)
juanlipari 5:838bc36ed9e4 129 acumHel = (probe1.temperature() + acumHel); //Se guarda la medicion y se le suma al acumulado
juanlipari 5:838bc36ed9e4 130 cuentaHel++; //La variable que guarda la cant de mediciones aumenta 1
Sissors 0:e069f9f26768 131 }
Sissors 0:e069f9f26768 132
juanlipari 5:838bc36ed9e4 133
juanlipari 5:838bc36ed9e4 134 unsigned char LCDState = MODO_HELADERA; //Variable de estado del LCD
juanlipari 5:838bc36ed9e4 135 //Maquina de estado que escribe en el LCD el modo en el que se está
juanlipari 5:838bc36ed9e4 136 void LCDStep(void)
juanlipari 5:838bc36ed9e4 137 {
juanlipari 5:838bc36ed9e4 138 switch(LCDState) {
juanlipari 5:838bc36ed9e4 139 default: //Si no se definio estado, es MODO_HELADERA
juanlipari 5:838bc36ed9e4 140 case MODO_HELADERA: //Estado MODO_HELADERA
juanlipari 5:838bc36ed9e4 141 lcd.printf("Temp Hel: %2.1f", resHel); //Escribe en el LCD Temp Hel: y el valor del promedio del sensor con 1 decimal de precision
juanlipari 5:838bc36ed9e4 142 lcd.putc(0); //Escribe en el LCD el simbolo de º
juanlipari 5:838bc36ed9e4 143 lcd.printf("C"); //Escribe en el LCD una C, terminando el espacio en esa fila
juanlipari 5:838bc36ed9e4 144 lcd.printf("Temp Set: 0%d.0",set_hel); //Escribe en el LCD Temp Set: y el valor seteado por el usuario
juanlipari 5:838bc36ed9e4 145 lcd.putc(0); //Escribe en el LCD el simbolo de º
juanlipari 5:838bc36ed9e4 146 lcd.printf("C"); //Escribe en el LCD una C, terminando el espacio en esa fila
juanlipari 5:838bc36ed9e4 147 lcd.locate(0,0); //Coloca al cursor en la primera posicion del LCD
juanlipari 5:838bc36ed9e4 148 break;
juanlipari 5:838bc36ed9e4 149
juanlipari 5:838bc36ed9e4 150 case SET_HELADERA: //Estado SET_HELADERA
juanlipari 5:838bc36ed9e4 151 lcd.printf("Hel set: %d",set_hel); //Escribe en el LCD Set Hel: y el valor actual seteado
juanlipari 5:838bc36ed9e4 152 lcd.putc(0); //Escribe en el LCD el simbolo de º
juanlipari 5:838bc36ed9e4 153 lcd.printf("C\n"); //Escribe en el LCD una C y baja al proximo renglon
juanlipari 5:838bc36ed9e4 154 lcd.printf(" UP "); //Escribe en el LCD UP
juanlipari 5:838bc36ed9e4 155 lcd.putc(3); //Escribe en el LCD el simbolo de una flecha hacia arriba
juanlipari 5:838bc36ed9e4 156 lcd.printf(" DOWN "); //Escribe en el LCD DOWN
juanlipari 5:838bc36ed9e4 157 lcd.putc(4); //Escribe en el LCD el simbolo de una flecha hacia abajo
juanlipari 5:838bc36ed9e4 158 lcd.locate(0,0); //Coloca al cursor en la primera posicion del LCD
juanlipari 5:838bc36ed9e4 159 break;
juanlipari 5:838bc36ed9e4 160
juanlipari 5:838bc36ed9e4 161 case MODO_FREEZER: //Estado MODO_FREEZER
juanlipari 5:838bc36ed9e4 162 lcd.printf("Temp FRZ:-"); //Escribe en el LCD Temp FRZ:-
juanlipari 5:838bc36ed9e4 163 if(resFrz < 10) //Si la medicion es menor a 10...
juanlipari 5:838bc36ed9e4 164 lcd.printf("0%2.1f", resFrz); //Escribe el valor del promedio del sensor con 1 decimal de precision, con un cero delante
juanlipari 5:838bc36ed9e4 165 else
juanlipari 5:838bc36ed9e4 166 lcd.printf("%2.1f", resFrz); //Si no escribe el valor del promedio del sensor con 1 decimal de precision
juanlipari 5:838bc36ed9e4 167 lcd.putc(0); //Escribe en el LCD el simbolo de º
juanlipari 5:838bc36ed9e4 168 lcd.printf("C"); //Escribe en el LCD una C, terminando el espacio en esa fila
juanlipari 5:838bc36ed9e4 169 lcd.printf("Temp Set:-%d.0",set_frz); //Escribe en el LCD Temp Set:- y el valor seteado por el usuario
juanlipari 5:838bc36ed9e4 170 lcd.putc(0); //Escribe en el LCD el simbolo de º
juanlipari 5:838bc36ed9e4 171 lcd.printf("C"); //Escribe en el LCD una C, terminando el espacio en esa fila
juanlipari 5:838bc36ed9e4 172 lcd.locate(0,0); //Coloca al cursor en la primera posicion del LCD
juanlipari 5:838bc36ed9e4 173 break;
juanlipari 5:838bc36ed9e4 174
juanlipari 5:838bc36ed9e4 175 case SET_FREEZER: //Estado SET_FREEZER
juanlipari 5:838bc36ed9e4 176 lcd.printf("FRZ set: -%d",set_frz); //Escribe en el LCD FRZ set:-
juanlipari 5:838bc36ed9e4 177 lcd.putc(0); //Escribe en el LCD el simbolo de º
juanlipari 5:838bc36ed9e4 178 lcd.printf("C\n"); //Escribe en el LCD una C y baja al proximo renglon
juanlipari 5:838bc36ed9e4 179 lcd.printf(" UP "); //Escribe en el LCD UP
juanlipari 5:838bc36ed9e4 180 lcd.putc(3); //Escribe en el LCD el simbolo de una flecha hacia arriba
juanlipari 5:838bc36ed9e4 181 lcd.printf(" DOWN "); //Escribe en el LCD DOWN
juanlipari 5:838bc36ed9e4 182 lcd.putc(4); //Escribe en el LCD el simbolo de una flecha hacia abajo
juanlipari 5:838bc36ed9e4 183 lcd.locate(0,0); //Coloca al cursor en la primera posicion del LCD
juanlipari 5:838bc36ed9e4 184 break;
Sissors 0:e069f9f26768 185 }
Sissors 0:e069f9f26768 186 }
Sissors 0:e069f9f26768 187
juanlipari 5:838bc36ed9e4 188 //Funcion que inicializa el LCD
juanlipari 5:838bc36ed9e4 189 void LCD_init(void)
juanlipari 5:838bc36ed9e4 190 {
juanlipari 5:838bc36ed9e4 191 lcd.setBacklight(TextLCD::LightOn); //Se enciende el BackLight
juanlipari 5:838bc36ed9e4 192 lcd.setCursor(TextLCD::CurOff_BlkOff); //Se desactiva el cursor y el parpadeo de este
juanlipari 5:838bc36ed9e4 193 lcd.setUDC(0, (char *) udc_degr); //Se crea el simbolo de grado asociandolo al caracter 0
juanlipari 5:838bc36ed9e4 194 lcd.setUDC(3, (char *) udc_uparrow); //Se crea el simbolo de flecha UP asociandolo al caracter 3
juanlipari 5:838bc36ed9e4 195 lcd.setUDC(4, (char *) udc_downarrow); //Se crea el simbolo de flecha DOWN sociandolo al caracter 4
juanlipari 5:838bc36ed9e4 196 }
juanlipari 5:838bc36ed9e4 197
juanlipari 5:838bc36ed9e4 198 //Maquina de estado antirrebote del pulsador de MODO
juanlipari 5:838bc36ed9e4 199 void anti_rebote_step_modo(void)
juanlipari 5:838bc36ed9e4 200 {
juanlipari 5:838bc36ed9e4 201 switch(anti_rebote_state) {
juanlipari 5:838bc36ed9e4 202 case CERO: //Estado de que el pulsador quedo en cero (presionado)
juanlipari 5:838bc36ed9e4 203 puls_modo = 0; //iguala variable a como quedo el pulsador de modo
juanlipari 5:838bc36ed9e4 204 habilitacion = 0; //deshabilita la maquina (se vuelve a habilitar con interrupin)
juanlipari 5:838bc36ed9e4 205 break;
juanlipari 5:838bc36ed9e4 206
juanlipari 5:838bc36ed9e4 207 case ESPERANDO: //estado de espera para sacar el rebote
juanlipari 5:838bc36ed9e4 208 if(espera_tic >0) //si no paso la espera termina aca la maquina
juanlipari 5:838bc36ed9e4 209 return;
juanlipari 5:838bc36ed9e4 210 valor_puls_modo = modo.read(); //si paso la espera, iguala una variable a lo que lee en la entrada del pulsador
juanlipari 5:838bc36ed9e4 211
juanlipari 5:838bc36ed9e4 212 if(valor_puls_modo == 0) { //si esa variable es 0, cambia el estado de la maquina a CERO
juanlipari 5:838bc36ed9e4 213 anti_rebote_state = CERO;
juanlipari 5:838bc36ed9e4 214
juanlipari 5:838bc36ed9e4 215 switch (LCDState) { //Si estaba en modo heladera pasa a freezer
juanlipari 5:838bc36ed9e4 216 case MODO_HELADERA:
juanlipari 5:838bc36ed9e4 217 lcd.cls();
juanlipari 5:838bc36ed9e4 218 LCDState = MODO_FREEZER;
juanlipari 5:838bc36ed9e4 219 break;
juanlipari 5:838bc36ed9e4 220
juanlipari 5:838bc36ed9e4 221 case MODO_FREEZER: //Si estaba en modo freezer pasa a heladera
juanlipari 5:838bc36ed9e4 222 lcd.cls();
juanlipari 5:838bc36ed9e4 223 LCDState = MODO_HELADERA;
juanlipari 5:838bc36ed9e4 224 break;
juanlipari 5:838bc36ed9e4 225
juanlipari 5:838bc36ed9e4 226 default:
juanlipari 5:838bc36ed9e4 227 break;
juanlipari 5:838bc36ed9e4 228 }
juanlipari 5:838bc36ed9e4 229
juanlipari 5:838bc36ed9e4 230 } else
juanlipari 5:838bc36ed9e4 231 anti_rebote_state = UNO; //si la variable no es 0 (es 1), cambia el estado de la maquina a UNO
juanlipari 5:838bc36ed9e4 232 break;
juanlipari 5:838bc36ed9e4 233
juanlipari 5:838bc36ed9e4 234 case UNO: //Estado de que el pulsador quedo en cero (presionado)
juanlipari 5:838bc36ed9e4 235 puls_modo = 1; //iguala variable a como quedo el pulsador de modo
juanlipari 5:838bc36ed9e4 236 habilitacion = 0; //deshabilita la maquina (se vuelve a habilitar con interrupin)
juanlipari 5:838bc36ed9e4 237 break;
juanlipari 5:838bc36ed9e4 238 }
juanlipari 5:838bc36ed9e4 239 }
juanlipari 5:838bc36ed9e4 240
juanlipari 5:838bc36ed9e4 241 void anti_rebote_step_set(void) //PULSADOR DE SET
juanlipari 5:838bc36ed9e4 242 { //TODOS LOS PULSADORES SON IGUALES, SOLO CAMBIAN LOS NOMBRES DE LAS VARIABLES PARA DIFERENCIARLOS
juanlipari 5:838bc36ed9e4 243 switch(anti_rebote_state) {
juanlipari 5:838bc36ed9e4 244 case CERO:
juanlipari 5:838bc36ed9e4 245 puls_set = 0;
juanlipari 5:838bc36ed9e4 246 habilitacion = 0;
juanlipari 5:838bc36ed9e4 247 break;
juanlipari 5:838bc36ed9e4 248
juanlipari 5:838bc36ed9e4 249 case ESPERANDO:
juanlipari 5:838bc36ed9e4 250 if(espera_tic >0)
juanlipari 5:838bc36ed9e4 251 return;
juanlipari 5:838bc36ed9e4 252 valor_puls_set = set.read();
juanlipari 5:838bc36ed9e4 253
juanlipari 5:838bc36ed9e4 254 if(valor_puls_set == 0) {
juanlipari 5:838bc36ed9e4 255 anti_rebote_state = CERO;
juanlipari 5:838bc36ed9e4 256
juanlipari 5:838bc36ed9e4 257 switch (LCDState) { //LO QUE HACE
juanlipari 5:838bc36ed9e4 258 case MODO_HELADERA:
juanlipari 5:838bc36ed9e4 259 lcd.cls();
juanlipari 5:838bc36ed9e4 260 LCDState = SET_HELADERA;
juanlipari 5:838bc36ed9e4 261 break;
juanlipari 5:838bc36ed9e4 262
juanlipari 5:838bc36ed9e4 263 case MODO_FREEZER:
juanlipari 5:838bc36ed9e4 264 lcd.cls();
juanlipari 5:838bc36ed9e4 265 LCDState = SET_FREEZER;
juanlipari 5:838bc36ed9e4 266 break;
juanlipari 5:838bc36ed9e4 267
juanlipari 5:838bc36ed9e4 268 case SET_HELADERA:
juanlipari 5:838bc36ed9e4 269 lcd.cls();
juanlipari 5:838bc36ed9e4 270 LCDState = MODO_HELADERA;
juanlipari 5:838bc36ed9e4 271 break;
juanlipari 5:838bc36ed9e4 272
juanlipari 5:838bc36ed9e4 273 case SET_FREEZER:
juanlipari 5:838bc36ed9e4 274 lcd.cls();
juanlipari 5:838bc36ed9e4 275 LCDState = MODO_FREEZER;
juanlipari 5:838bc36ed9e4 276 break;
juanlipari 5:838bc36ed9e4 277 default:
juanlipari 5:838bc36ed9e4 278 break;
juanlipari 5:838bc36ed9e4 279 }
juanlipari 5:838bc36ed9e4 280 } else
juanlipari 5:838bc36ed9e4 281 anti_rebote_state = UNO;
juanlipari 5:838bc36ed9e4 282 break;
juanlipari 5:838bc36ed9e4 283
juanlipari 5:838bc36ed9e4 284 case UNO:
juanlipari 5:838bc36ed9e4 285 puls_set = 1;
juanlipari 5:838bc36ed9e4 286 habilitacion = 0;
juanlipari 5:838bc36ed9e4 287 break;
juanlipari 5:838bc36ed9e4 288 }
juanlipari 5:838bc36ed9e4 289 }
juanlipari 5:838bc36ed9e4 290
juanlipari 5:838bc36ed9e4 291 void anti_rebote_step_up(void) //PULSADOR DE UP
juanlipari 5:838bc36ed9e4 292 { //TODOS LOS PULSADORES SON IGUALES, SOLO CAMBIAN LOS NOMBRES DE LAS VARIABLES PARA DIFERENCIARLOS
juanlipari 5:838bc36ed9e4 293 switch(anti_rebote_state) {
juanlipari 5:838bc36ed9e4 294 case CERO:
juanlipari 5:838bc36ed9e4 295 puls_up = 0;
juanlipari 5:838bc36ed9e4 296 habilitacion = 0;
juanlipari 5:838bc36ed9e4 297 break;
juanlipari 5:838bc36ed9e4 298
juanlipari 5:838bc36ed9e4 299 case ESPERANDO:
juanlipari 5:838bc36ed9e4 300 if(espera_tic >0)
juanlipari 5:838bc36ed9e4 301 return;
juanlipari 5:838bc36ed9e4 302 valor_puls_up = up.read();
juanlipari 5:838bc36ed9e4 303
juanlipari 5:838bc36ed9e4 304 if(valor_puls_up == 0) {
juanlipari 5:838bc36ed9e4 305 anti_rebote_state = CERO;
juanlipari 5:838bc36ed9e4 306
juanlipari 5:838bc36ed9e4 307 switch (LCDState) { //En el caso de los pulsadore UP y DOWN, lo que hacen es aumentar/disminuir en 1 la variable set que corresponda
juanlipari 5:838bc36ed9e4 308
juanlipari 5:838bc36ed9e4 309 case SET_HELADERA:
juanlipari 5:838bc36ed9e4 310 if(set_hel<8) //Si no se llegó al limite, aumenta 1
juanlipari 5:838bc36ed9e4 311 set_hel++;
juanlipari 5:838bc36ed9e4 312 else
juanlipari 5:838bc36ed9e4 313 set_hel = 2; //Vuelve al valor minimo
juanlipari 5:838bc36ed9e4 314 break;
juanlipari 5:838bc36ed9e4 315
juanlipari 5:838bc36ed9e4 316 case SET_FREEZER:
juanlipari 5:838bc36ed9e4 317
juanlipari 5:838bc36ed9e4 318 if(set_frz < 24) //Si no se llegó al limite, aumenta 1
juanlipari 5:838bc36ed9e4 319 set_frz++;
juanlipari 5:838bc36ed9e4 320 else
juanlipari 5:838bc36ed9e4 321 set_frz = 16; //Vuelve al valor minimo
juanlipari 5:838bc36ed9e4 322 break;
juanlipari 5:838bc36ed9e4 323
juanlipari 5:838bc36ed9e4 324 default:
juanlipari 5:838bc36ed9e4 325 break;
juanlipari 5:838bc36ed9e4 326 }
juanlipari 5:838bc36ed9e4 327
juanlipari 5:838bc36ed9e4 328 } else
juanlipari 5:838bc36ed9e4 329 anti_rebote_state = UNO;
juanlipari 5:838bc36ed9e4 330 break;
juanlipari 5:838bc36ed9e4 331
juanlipari 5:838bc36ed9e4 332 case UNO:
juanlipari 5:838bc36ed9e4 333 puls_up = 1;
juanlipari 5:838bc36ed9e4 334 habilitacion = 0;
juanlipari 5:838bc36ed9e4 335 break;
juanlipari 5:838bc36ed9e4 336 }
juanlipari 5:838bc36ed9e4 337 }
juanlipari 5:838bc36ed9e4 338
juanlipari 5:838bc36ed9e4 339 void anti_rebote_step_down(void) //PULSADOR DE DOWN
juanlipari 5:838bc36ed9e4 340 { //TODOS LOS PULSADORES SON IGUALES, SOLO CAMBIAN LOS NOMBRES DE LAS VARIABLES PARA DIFERENCIARLOS
juanlipari 5:838bc36ed9e4 341 switch(anti_rebote_state) {
juanlipari 5:838bc36ed9e4 342 case CERO:
juanlipari 5:838bc36ed9e4 343 puls_down = 0;
juanlipari 5:838bc36ed9e4 344 habilitacion = 0;
juanlipari 5:838bc36ed9e4 345 break;
juanlipari 5:838bc36ed9e4 346
juanlipari 5:838bc36ed9e4 347 case ESPERANDO:
juanlipari 5:838bc36ed9e4 348 if(espera_tic >0)
juanlipari 5:838bc36ed9e4 349 return;
juanlipari 5:838bc36ed9e4 350 valor_puls_down = down.read();
juanlipari 5:838bc36ed9e4 351
juanlipari 5:838bc36ed9e4 352 if(valor_puls_down == 0) {
juanlipari 5:838bc36ed9e4 353 anti_rebote_state = CERO;
juanlipari 5:838bc36ed9e4 354
juanlipari 5:838bc36ed9e4 355 switch (LCDState) { //En el caso de los pulsadore UP y DOWN, lo que hacen es aumentar/disminuir en 1 la variable set que corresponda
juanlipari 5:838bc36ed9e4 356
juanlipari 5:838bc36ed9e4 357 case SET_HELADERA:
juanlipari 5:838bc36ed9e4 358
juanlipari 5:838bc36ed9e4 359 if(set_hel > 2) //Si no se llegó al limite, disminuye 1
juanlipari 5:838bc36ed9e4 360 set_hel--;
juanlipari 5:838bc36ed9e4 361 else
juanlipari 5:838bc36ed9e4 362 set_hel = 8; //Vuelve al valor maximo
juanlipari 5:838bc36ed9e4 363 break;
juanlipari 5:838bc36ed9e4 364
juanlipari 5:838bc36ed9e4 365 case SET_FREEZER:
juanlipari 5:838bc36ed9e4 366
juanlipari 5:838bc36ed9e4 367 if(set_frz > 16) //Si no se llegó al limite, disminuye 1
juanlipari 5:838bc36ed9e4 368 set_frz--;
juanlipari 5:838bc36ed9e4 369 else
juanlipari 5:838bc36ed9e4 370 set_frz = 24; //Vuelve al valor maximo
juanlipari 5:838bc36ed9e4 371 break;
juanlipari 5:838bc36ed9e4 372
juanlipari 5:838bc36ed9e4 373 default:
juanlipari 5:838bc36ed9e4 374 break;
juanlipari 5:838bc36ed9e4 375 }
juanlipari 5:838bc36ed9e4 376
juanlipari 5:838bc36ed9e4 377 } else
juanlipari 5:838bc36ed9e4 378 anti_rebote_state = UNO;
juanlipari 5:838bc36ed9e4 379 break;
juanlipari 5:838bc36ed9e4 380
juanlipari 5:838bc36ed9e4 381 case UNO:
juanlipari 5:838bc36ed9e4 382 puls_down = 1;
juanlipari 5:838bc36ed9e4 383 habilitacion = 0;
juanlipari 5:838bc36ed9e4 384 break;
juanlipari 5:838bc36ed9e4 385 }
juanlipari 5:838bc36ed9e4 386 }
juanlipari 5:838bc36ed9e4 387
juanlipari 5:838bc36ed9e4 388 void flanco_modo (void) //Si se detecto un flanco ascendente o descendente del pulsador de modo
juanlipari 5:838bc36ed9e4 389 {
juanlipari 5:838bc36ed9e4 390 PULS_tic = 40; // Demora de Puls es 40mSeg, demora para evitar el rebote
juanlipari 5:838bc36ed9e4 391 hab_antirrebote = MODO; //eligue que pulsador habilitar
juanlipari 5:838bc36ed9e4 392 anti_rebote_state = ESPERANDO; //modifica el estado de la maquina antirrebote a ESPERANDO
juanlipari 5:838bc36ed9e4 393 habilitacion = 1; //habilita la maquina de antirrebote
juanlipari 5:838bc36ed9e4 394 }
juanlipari 5:838bc36ed9e4 395
juanlipari 5:838bc36ed9e4 396 void flanco_set (void)
juanlipari 5:838bc36ed9e4 397 { //TODOS LOS DETECTORES DE FLANCO SON IGUALES, SOLO CAMBIA QUE MAQUINA SE HABILITA DE LAS 4 OPCIONES DE PUILSADORES
juanlipari 5:838bc36ed9e4 398 PULS_tic = 40; // Demora de Puls es 40mSeg
juanlipari 5:838bc36ed9e4 399 hab_antirrebote = SET;
juanlipari 5:838bc36ed9e4 400 anti_rebote_state = ESPERANDO;
juanlipari 5:838bc36ed9e4 401 habilitacion = 1;
juanlipari 5:838bc36ed9e4 402 }
juanlipari 5:838bc36ed9e4 403
juanlipari 5:838bc36ed9e4 404 void flanco_up (void)
juanlipari 5:838bc36ed9e4 405 { //TODOS LOS DETECTORES DE FLANCO SON IGUALES, SOLO CAMBIA QUE MAQUINA SE HABILITA DE LAS 4 OPCIONES DE PUILSADORES
juanlipari 5:838bc36ed9e4 406 PULS_tic = 40; // Demora de Puls es 40mSeg
juanlipari 5:838bc36ed9e4 407 hab_antirrebote = UP;
juanlipari 5:838bc36ed9e4 408 anti_rebote_state = ESPERANDO;
juanlipari 5:838bc36ed9e4 409 habilitacion = 1;
juanlipari 5:838bc36ed9e4 410 }
juanlipari 5:838bc36ed9e4 411
juanlipari 5:838bc36ed9e4 412 void flanco_down (void)
juanlipari 5:838bc36ed9e4 413 { //TODOS LOS DETECTORES DE FLANCO SON IGUALES, SOLO CAMBIA QUE MAQUINA SE HABILITA DE LAS 4 OPCIONES DE PUILSADORES
juanlipari 5:838bc36ed9e4 414 PULS_tic = 40; // Demora de Puls es 40mSeg
juanlipari 5:838bc36ed9e4 415 hab_antirrebote = DOWN;
juanlipari 5:838bc36ed9e4 416 anti_rebote_state = ESPERANDO;
juanlipari 5:838bc36ed9e4 417 habilitacion = 1;
juanlipari 5:838bc36ed9e4 418 }
juanlipari 5:838bc36ed9e4 419
juanlipari 5:838bc36ed9e4 420
juanlipari 5:838bc36ed9e4 421 void Interrupciones(void) //HABILITA INTERRUPCIONES DE PULSADORES
juanlipari 5:838bc36ed9e4 422 {
juanlipari 5:838bc36ed9e4 423
juanlipari 5:838bc36ed9e4 424 modo.fall(&flanco_modo); //Habilita interrupción MODO
juanlipari 5:838bc36ed9e4 425 modo.rise(&flanco_modo);
juanlipari 5:838bc36ed9e4 426 set.fall(&flanco_set); //Habilita interrupción SET
juanlipari 5:838bc36ed9e4 427 set.rise(&flanco_set);
juanlipari 5:838bc36ed9e4 428 up.fall(&flanco_up); //Habilita interrupción UP
juanlipari 5:838bc36ed9e4 429 up.rise(&flanco_up);
juanlipari 5:838bc36ed9e4 430 down.fall(&flanco_down); //Habilita interrupción DOWN
juanlipari 5:838bc36ed9e4 431 down.rise(&flanco_down);
juanlipari 5:838bc36ed9e4 432
juanlipari 5:838bc36ed9e4 433 if(habilitacion == 1) { //si se detecto un flanco en alguna de las entradas de los pulsadores
juanlipari 5:838bc36ed9e4 434 switch (hab_antirrebote) { //dependiendo de que pulsador se toco, eligue que maquina debe ejecutar
juanlipari 5:838bc36ed9e4 435 case MODO:
juanlipari 5:838bc36ed9e4 436 anti_rebote_step_modo(); //maquina modo
juanlipari 5:838bc36ed9e4 437 break;
juanlipari 5:838bc36ed9e4 438 case SET:
juanlipari 5:838bc36ed9e4 439 anti_rebote_step_set(); //maquina set
juanlipari 5:838bc36ed9e4 440 break;
juanlipari 5:838bc36ed9e4 441 case UP:
juanlipari 5:838bc36ed9e4 442 anti_rebote_step_up(); //maquina up
juanlipari 5:838bc36ed9e4 443 break;
juanlipari 5:838bc36ed9e4 444 case DOWN:
juanlipari 5:838bc36ed9e4 445 anti_rebote_step_down(); //maquina down
juanlipari 5:838bc36ed9e4 446 break;
juanlipari 5:838bc36ed9e4 447 }
juanlipari 5:838bc36ed9e4 448 }
juanlipari 5:838bc36ed9e4 449 }
juanlipari 5:838bc36ed9e4 450
juanlipari 5:838bc36ed9e4 451 //Funcion que controla las salidas
juanlipari 5:838bc36ed9e4 452 void Activacion_frio(void)
juanlipari 5:838bc36ed9e4 453 {
juanlipari 5:838bc36ed9e4 454 if(resHel < (set_hel - 1)) //Si el promedio de las mediciones es menor al valor seteado menos un grado de margen...
juanlipari 5:838bc36ed9e4 455 salida_hel = 0; // No hay que enfriar, se desactiva la salida
juanlipari 5:838bc36ed9e4 456 else if(resHel > (set_hel + 1)) //Si el promedio de las mediciones es mayor al valor seteado mas un grado de margen...
juanlipari 5:838bc36ed9e4 457 salida_hel = 1; //Se debe enfriar, se activa la salida
juanlipari 5:838bc36ed9e4 458
juanlipari 5:838bc36ed9e4 459 //Como el valor seteado se toma como positivo para la funcion de los pulsadores up y down, al compararlos se debe tomar como negativos
juanlipari 5:838bc36ed9e4 460
juanlipari 5:838bc36ed9e4 461 if(resFrz < ((set_frz * -1) - 1)) //Si el promedio de las mediciones es menor al valor seteado menos un grado de margen...
juanlipari 5:838bc36ed9e4 462 salida_frz = 0; // No hay que enfriar, se desactiva la salida
juanlipari 5:838bc36ed9e4 463 else if(resFrz > ((set_frz * -1) + 1)) //Si el promedio de las mediciones es mayor al valor seteado mas un grado de margen...
juanlipari 5:838bc36ed9e4 464 salida_frz = 1; //Se debe enfriar, se activa la salida
juanlipari 5:838bc36ed9e4 465 }