Heladera Lauckner Lipari
Dependencies: DS1820 TextLCD mbed
Fork of DS1820_HelloWorld by
main.cpp@5:838bc36ed9e4, 2018-05-23 (annotated)
- Committer:
- juanlipari
- Date:
- Wed May 23 22:31:23 2018 +0000
- Revision:
- 5:838bc36ed9e4
- Parent:
- 3:f483abe4bc57
Heladera Lauckner Lipari;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |