Trabajo práctico horno eléctrico

Dependencies:   TextLCD mbed

Committer:
MarceRondan
Date:
Wed May 23 00:11:13 2018 +0000
Revision:
1:556fb9468e90
Parent:
0:d0f1b335181e
Trabajo Pr?ctico 1. Punto 3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MarceRondan 0:d0f1b335181e 1 #include "mbed.h"
MarceRondan 0:d0f1b335181e 2 #include "TextLCD.h"
MarceRondan 0:d0f1b335181e 3
MarceRondan 0:d0f1b335181e 4 #define apretado 0
MarceRondan 0:d0f1b335181e 5 #define reposo 1
MarceRondan 0:d0f1b335181e 6
MarceRondan 0:d0f1b335181e 7 //Defino entradas, salidas e interrupciones
MarceRondan 0:d0f1b335181e 8 AnalogIn entrada_temp_sel(PTB0);
MarceRondan 0:d0f1b335181e 9 AnalogIn entrada_time_sel(PTB1);
MarceRondan 0:d0f1b335181e 10 AnalogIn entrada_temp(PTB2);
MarceRondan 0:d0f1b335181e 11
MarceRondan 0:d0f1b335181e 12
MarceRondan 0:d0f1b335181e 13 InterruptIn int_puls_coccion(PTD0);
MarceRondan 0:d0f1b335181e 14 InterruptIn int_puls_start(PTD2);
MarceRondan 0:d0f1b335181e 15 InterruptIn int_puls_luz(PTD3);
MarceRondan 0:d0f1b335181e 16 InterruptIn int_encoder1(PTD6);
MarceRondan 0:d0f1b335181e 17 InterruptIn int_encoder2(PTD7);
MarceRondan 0:d0f1b335181e 18
MarceRondan 0:d0f1b335181e 19 DigitalOut luz (LED1);
MarceRondan 0:d0f1b335181e 20
MarceRondan 0:d0f1b335181e 21 DigitalOut c1_sal (PTB8);
MarceRondan 0:d0f1b335181e 22 DigitalOut c2_sal (PTB9);
MarceRondan 0:d0f1b335181e 23 DigitalOut vent_sal (PTB10);
MarceRondan 0:d0f1b335181e 24 DigitalOut led_indicador (PTB11);
MarceRondan 0:d0f1b335181e 25
MarceRondan 0:d0f1b335181e 26 DigitalIn encoder1_b (PTA17);
MarceRondan 0:d0f1b335181e 27 DigitalIn encoder2_b (PTC13);
MarceRondan 0:d0f1b335181e 28
MarceRondan 0:d0f1b335181e 29 //Defino puertos I2C e inicializo LCD
MarceRondan 0:d0f1b335181e 30 I2C i2c_lcd(PTC2,PTC1);
MarceRondan 0:d0f1b335181e 31 TextLCD_I2C lcd(&i2c_lcd, 0x7E, TextLCD::LCD16x2);
MarceRondan 0:d0f1b335181e 32
MarceRondan 0:d0f1b335181e 33 //Declaro los estados de la máquina de estados
MarceRondan 0:d0f1b335181e 34 enum {off,on_calentar,on_enfriar};
MarceRondan 0:d0f1b335181e 35
MarceRondan 0:d0f1b335181e 36 //Declaro funciones
MarceRondan 0:d0f1b335181e 37 void timer_antirrebote(void);
MarceRondan 0:d0f1b335181e 38 void timer_refresh(void);
MarceRondan 0:d0f1b335181e 39 void timer_principal(void);
MarceRondan 0:d0f1b335181e 40 void display(void);
MarceRondan 0:d0f1b335181e 41 void detect(void);
MarceRondan 0:d0f1b335181e 42 void leer_pulsador(void);
MarceRondan 0:d0f1b335181e 43 void leer_potes(void);
MarceRondan 0:d0f1b335181e 44 void control(void);
MarceRondan 0:d0f1b335181e 45
MarceRondan 0:d0f1b335181e 46 //Defino variables
MarceRondan 0:d0f1b335181e 47 unsigned int start=0,enable_contador=0,enable_pulsador=0;
MarceRondan 0:d0f1b335181e 48 unsigned int temp_sel = 0,temp_sel_real = 0, temp_med, time_sel = 0, time_sel_real = 0, coccion_sel = 2;
MarceRondan 0:d0f1b335181e 49 unsigned int cont_antirrebote, cont_refresh;
MarceRondan 0:d0f1b335181e 50 unsigned int state;
MarceRondan 0:d0f1b335181e 51 unsigned int c1,c2,vent;
MarceRondan 0:d0f1b335181e 52 unsigned char hab_tomar_valor;
MarceRondan 0:d0f1b335181e 53 unsigned char hab;
MarceRondan 0:d0f1b335181e 54 unsigned int aux = 0;
MarceRondan 0:d0f1b335181e 55
MarceRondan 0:d0f1b335181e 56 //Defino timers
MarceRondan 0:d0f1b335181e 57 Ticker atrb;
MarceRondan 0:d0f1b335181e 58 Ticker refresh;
MarceRondan 0:d0f1b335181e 59 Ticker principal;
MarceRondan 0:d0f1b335181e 60
MarceRondan 0:d0f1b335181e 61 int main()
MarceRondan 0:d0f1b335181e 62 {
MarceRondan 0:d0f1b335181e 63 //Inicializo timers
MarceRondan 0:d0f1b335181e 64 atrb.attach(&timer_antirrebote,0.001);
MarceRondan 0:d0f1b335181e 65 refresh.attach(&timer_refresh,0.01);
MarceRondan 0:d0f1b335181e 66 principal.attach(&timer_principal,1);
MarceRondan 0:d0f1b335181e 67 //Inicializo interrupciones
MarceRondan 0:d0f1b335181e 68 int_puls_start.fall(&detect);
MarceRondan 0:d0f1b335181e 69 int_puls_luz.fall(&detect);
MarceRondan 0:d0f1b335181e 70 int_puls_coccion.fall(&detect);
MarceRondan 0:d0f1b335181e 71 int_encoder1.fall(&detect);
MarceRondan 0:d0f1b335181e 72 int_encoder2.fall(&detect);
MarceRondan 0:d0f1b335181e 73
MarceRondan 0:d0f1b335181e 74 //Defino estado inicial del LCD
MarceRondan 0:d0f1b335181e 75 lcd.setBacklight(lcd.LightOn);
MarceRondan 0:d0f1b335181e 76 lcd.setCursor(lcd.CurOff_BlkOff);
MarceRondan 0:d0f1b335181e 77 //Defino caracter "º" para LCD
MarceRondan 0:d0f1b335181e 78 lcd.setUDC(0, (char *) udc_degr);
MarceRondan 0:d0f1b335181e 79
MarceRondan 0:d0f1b335181e 80 //Escribo caracteres en LCD que nunca se modifican
MarceRondan 0:d0f1b335181e 81 lcd.locate(4,1);
MarceRondan 0:d0f1b335181e 82 lcd.putc(0);
MarceRondan 0:d0f1b335181e 83 lcd.printf("C");
MarceRondan 0:d0f1b335181e 84 lcd.locate(12,1);
MarceRondan 0:d0f1b335181e 85 lcd.printf("min ");
MarceRondan 0:d0f1b335181e 86
MarceRondan 0:d0f1b335181e 87
MarceRondan 0:d0f1b335181e 88 while (1) {
MarceRondan 0:d0f1b335181e 89 leer_pulsador();//Función para leer pulsadores y eleminar rebote
MarceRondan 0:d0f1b335181e 90 leer_potes();//Función para obtener valores de potenciómetros
MarceRondan 0:d0f1b335181e 91 control();//Función principal de control de entradas y salidas
MarceRondan 0:d0f1b335181e 92 display();//Función que escribe el LCD
MarceRondan 0:d0f1b335181e 93 }
MarceRondan 0:d0f1b335181e 94 }
MarceRondan 0:d0f1b335181e 95
MarceRondan 0:d0f1b335181e 96 void control()
MarceRondan 0:d0f1b335181e 97 {
MarceRondan 0:d0f1b335181e 98 if(start == 1) {
MarceRondan 0:d0f1b335181e 99
MarceRondan 0:d0f1b335181e 100 if(hab_tomar_valor == 1) {
MarceRondan 0:d0f1b335181e 101 //Congela los valores a utilizar por el horno e inicia la cocción
MarceRondan 0:d0f1b335181e 102 temp_sel = temp_sel_real;
MarceRondan 0:d0f1b335181e 103 time_sel = time_sel_real;
MarceRondan 0:d0f1b335181e 104 state = on_calentar;
MarceRondan 0:d0f1b335181e 105 hab_tomar_valor = 0;
MarceRondan 0:d0f1b335181e 106 }
MarceRondan 0:d0f1b335181e 107 } else {
MarceRondan 0:d0f1b335181e 108 state = off;
MarceRondan 0:d0f1b335181e 109 hab_tomar_valor = 1;
MarceRondan 0:d0f1b335181e 110 }
MarceRondan 0:d0f1b335181e 111 //Asigna los valores de las variables a sus correspondientes salidas
MarceRondan 0:d0f1b335181e 112 c1_sal = c1;
MarceRondan 0:d0f1b335181e 113 c2_sal = c2;
MarceRondan 0:d0f1b335181e 114 vent_sal = vent;
MarceRondan 0:d0f1b335181e 115
MarceRondan 0:d0f1b335181e 116 switch(state) {
MarceRondan 0:d0f1b335181e 117 case off:
MarceRondan 0:d0f1b335181e 118 //Caso "apagado"
MarceRondan 0:d0f1b335181e 119 c1 = 0;
MarceRondan 0:d0f1b335181e 120 c2 = 0;
MarceRondan 0:d0f1b335181e 121 vent = 0;
MarceRondan 0:d0f1b335181e 122 hab = 1;
MarceRondan 0:d0f1b335181e 123 break;
MarceRondan 0:d0f1b335181e 124 case on_calentar:
MarceRondan 0:d0f1b335181e 125 //Caso "calentar" (cuando la temperatura está por debajo del umbral)
MarceRondan 0:d0f1b335181e 126 if(hab == 1) {
MarceRondan 0:d0f1b335181e 127 hab = 0;
MarceRondan 0:d0f1b335181e 128 c1 = (coccion_sel >> 1)& 1;
MarceRondan 0:d0f1b335181e 129 c2 = (coccion_sel >> 2)& 1;
MarceRondan 0:d0f1b335181e 130 vent = (coccion_sel & 1);
MarceRondan 0:d0f1b335181e 131 led_indicador = 0;
MarceRondan 0:d0f1b335181e 132 }
MarceRondan 0:d0f1b335181e 133 if(temp_med >= temp_sel + 10) { //Si la temperatura está por encima cambia estado
MarceRondan 0:d0f1b335181e 134 state = on_enfriar;
MarceRondan 0:d0f1b335181e 135 hab = 1;
MarceRondan 0:d0f1b335181e 136 }
MarceRondan 0:d0f1b335181e 137 if(time_sel <= 0) {
MarceRondan 0:d0f1b335181e 138 //Si se termina el tiempo cambia estado a "off"
MarceRondan 0:d0f1b335181e 139 led_indicador = 1;
MarceRondan 0:d0f1b335181e 140 state = off;
MarceRondan 0:d0f1b335181e 141 start = 0;
MarceRondan 0:d0f1b335181e 142 hab = 1;
MarceRondan 0:d0f1b335181e 143 }
MarceRondan 0:d0f1b335181e 144 break;
MarceRondan 0:d0f1b335181e 145 case on_enfriar:
MarceRondan 0:d0f1b335181e 146 //Caso "enfriar" (cuando la temperatura está por encima del umbral)
MarceRondan 0:d0f1b335181e 147 if(hab == 1) {
MarceRondan 0:d0f1b335181e 148 hab = 0;
MarceRondan 0:d0f1b335181e 149 c1 = 0;
MarceRondan 0:d0f1b335181e 150 c2 = 0;
MarceRondan 0:d0f1b335181e 151 vent = (coccion_sel & 1);
MarceRondan 0:d0f1b335181e 152 led_indicador = 0;
MarceRondan 0:d0f1b335181e 153 }
MarceRondan 0:d0f1b335181e 154 if(temp_med <= temp_sel - 10) { //Si la temperatura está por debajo cambia estado
MarceRondan 0:d0f1b335181e 155 state = on_calentar;
MarceRondan 0:d0f1b335181e 156 hab = 1;
MarceRondan 0:d0f1b335181e 157 }
MarceRondan 0:d0f1b335181e 158 if(time_sel <= 0) {
MarceRondan 0:d0f1b335181e 159 //Si se termina el tiempo cambia estado a "off"
MarceRondan 0:d0f1b335181e 160 led_indicador = 1;
MarceRondan 0:d0f1b335181e 161 state = off;
MarceRondan 0:d0f1b335181e 162 start = 0;
MarceRondan 0:d0f1b335181e 163 hab = 1;
MarceRondan 0:d0f1b335181e 164 }
MarceRondan 0:d0f1b335181e 165 break;
MarceRondan 0:d0f1b335181e 166 }
MarceRondan 0:d0f1b335181e 167 }
MarceRondan 0:d0f1b335181e 168 void display()
MarceRondan 0:d0f1b335181e 169 {
MarceRondan 0:d0f1b335181e 170 //Escribe el LCD actualizando variables
MarceRondan 0:d0f1b335181e 171 if(!cont_refresh) {
MarceRondan 0:d0f1b335181e 172 cont_refresh = 15;
MarceRondan 0:d0f1b335181e 173 if((coccion_sel >> 1)& 1 == 1) {
MarceRondan 0:d0f1b335181e 174 lcd.locate(2,0);
MarceRondan 0:d0f1b335181e 175 lcd.printf("UP");
MarceRondan 0:d0f1b335181e 176 }
MarceRondan 0:d0f1b335181e 177 if((coccion_sel >> 2)& 1 == 1) {
MarceRondan 0:d0f1b335181e 178 lcd.locate(5,0);
MarceRondan 0:d0f1b335181e 179 lcd.printf("DOWN");
MarceRondan 0:d0f1b335181e 180 }
MarceRondan 0:d0f1b335181e 181 if((coccion_sel & 1) == 1) {
MarceRondan 0:d0f1b335181e 182 lcd.locate(10,0);
MarceRondan 0:d0f1b335181e 183 lcd.printf("VENT");
MarceRondan 0:d0f1b335181e 184 }
MarceRondan 0:d0f1b335181e 185 lcd.locate(1,1);
MarceRondan 0:d0f1b335181e 186 if(state == off) {
MarceRondan 0:d0f1b335181e 187 lcd.printf("%d",temp_sel_real);
MarceRondan 0:d0f1b335181e 188 lcd.locate(8,1);
MarceRondan 0:d0f1b335181e 189 if(time_sel_real<100)
MarceRondan 0:d0f1b335181e 190 lcd.printf("0%d ",time_sel_real);
MarceRondan 0:d0f1b335181e 191 else
MarceRondan 0:d0f1b335181e 192 lcd.printf("%d ",time_sel_real);
MarceRondan 0:d0f1b335181e 193 } else {
MarceRondan 0:d0f1b335181e 194 lcd.printf("%d",temp_sel);
MarceRondan 0:d0f1b335181e 195 lcd.locate(8,1);
MarceRondan 0:d0f1b335181e 196 if(time_sel<100)
MarceRondan 0:d0f1b335181e 197 lcd.printf("0%d ",time_sel);
MarceRondan 0:d0f1b335181e 198 else
MarceRondan 0:d0f1b335181e 199 lcd.printf("%d ",time_sel);
MarceRondan 0:d0f1b335181e 200 }
MarceRondan 0:d0f1b335181e 201
MarceRondan 0:d0f1b335181e 202 }
MarceRondan 0:d0f1b335181e 203 }
MarceRondan 0:d0f1b335181e 204
MarceRondan 0:d0f1b335181e 205 void leer_pulsador()
MarceRondan 0:d0f1b335181e 206 {
MarceRondan 0:d0f1b335181e 207 if (enable_contador) {//Detecta que pulsador está apretado y realiza la acción correspondiente con su variable
MarceRondan 0:d0f1b335181e 208 enable_contador = 0;
MarceRondan 0:d0f1b335181e 209 if(int_puls_start.read() == apretado) {
MarceRondan 0:d0f1b335181e 210 if(!start)
MarceRondan 0:d0f1b335181e 211 start = 1;
MarceRondan 0:d0f1b335181e 212 else
MarceRondan 0:d0f1b335181e 213 start = 0;
MarceRondan 0:d0f1b335181e 214 }
MarceRondan 0:d0f1b335181e 215 if(int_puls_luz.read() == apretado) {
MarceRondan 0:d0f1b335181e 216 if(!luz)
MarceRondan 0:d0f1b335181e 217 luz = 1;
MarceRondan 0:d0f1b335181e 218 else
MarceRondan 0:d0f1b335181e 219 luz = 0;
MarceRondan 0:d0f1b335181e 220 }
MarceRondan 0:d0f1b335181e 221 if(int_puls_coccion.read() == apretado && state == off) {
MarceRondan 0:d0f1b335181e 222 printf("%d",coccion_sel);
MarceRondan 0:d0f1b335181e 223 lcd.locate(0,0);
MarceRondan 0:d0f1b335181e 224 lcd.printf(" ");
MarceRondan 0:d0f1b335181e 225 if(coccion_sel<7)
MarceRondan 0:d0f1b335181e 226 coccion_sel++;
MarceRondan 0:d0f1b335181e 227 else
MarceRondan 0:d0f1b335181e 228 coccion_sel = 2;
MarceRondan 0:d0f1b335181e 229 }
MarceRondan 0:d0f1b335181e 230 if(int_encoder1.read() == apretado) {
MarceRondan 0:d0f1b335181e 231 printf("%d\n",temp_sel_real);
MarceRondan 0:d0f1b335181e 232 if(encoder1_b == 0) {
MarceRondan 0:d0f1b335181e 233 if(temp_sel_real < 280)
MarceRondan 0:d0f1b335181e 234 temp_sel_real++;
MarceRondan 0:d0f1b335181e 235 } else if(temp_sel_real > 100)
MarceRondan 0:d0f1b335181e 236 temp_sel_real--;
MarceRondan 0:d0f1b335181e 237 }
MarceRondan 0:d0f1b335181e 238 if(int_encoder2.read() == apretado) {
MarceRondan 0:d0f1b335181e 239 printf("%d\n",time_sel_real);
MarceRondan 0:d0f1b335181e 240 if(encoder1_b == 0) {
MarceRondan 0:d0f1b335181e 241 if(time_sel_real < 240)
MarceRondan 0:d0f1b335181e 242 time_sel_real++;
MarceRondan 0:d0f1b335181e 243 } else if(time_sel_real > 1)
MarceRondan 0:d0f1b335181e 244 time_sel_real--;
MarceRondan 0:d0f1b335181e 245 }
MarceRondan 0:d0f1b335181e 246 }
MarceRondan 0:d0f1b335181e 247 if(enable_pulsador == 1) {
MarceRondan 0:d0f1b335181e 248 enable_pulsador = 0;
MarceRondan 0:d0f1b335181e 249 }
MarceRondan 0:d0f1b335181e 250 }
MarceRondan 0:d0f1b335181e 251
MarceRondan 0:d0f1b335181e 252 void leer_potes()
MarceRondan 0:d0f1b335181e 253 {
MarceRondan 0:d0f1b335181e 254 //Asigna los valores de las entradas analógicas a las variables correspondientes
MarceRondan 0:d0f1b335181e 255 temp_sel_real = (entrada_temp_sel.read()*120)+100;//Temperatura
MarceRondan 0:d0f1b335181e 256 time_sel_real = entrada_time_sel.read()*240;//Tiempo
MarceRondan 0:d0f1b335181e 257 temp_med = (entrada_temp.read_u16()*0.005)+180;//Temperatura medida por LM35
MarceRondan 0:d0f1b335181e 258 }
MarceRondan 0:d0f1b335181e 259
MarceRondan 0:d0f1b335181e 260 void detect()
MarceRondan 0:d0f1b335181e 261 {
MarceRondan 0:d0f1b335181e 262 //Detecta una interrupción y activa el contador
MarceRondan 0:d0f1b335181e 263 if (cont_antirrebote == 0 && enable_pulsador == 0) {
MarceRondan 0:d0f1b335181e 264 cont_antirrebote = 20;
MarceRondan 0:d0f1b335181e 265 enable_pulsador = 1;
MarceRondan 0:d0f1b335181e 266 }
MarceRondan 0:d0f1b335181e 267 }
MarceRondan 0:d0f1b335181e 268 void timer_antirrebote()
MarceRondan 0:d0f1b335181e 269 {
MarceRondan 0:d0f1b335181e 270 if (cont_antirrebote > 0) {//Resta la variable de antirrebote cada 1ms
MarceRondan 0:d0f1b335181e 271 cont_antirrebote--;
MarceRondan 0:d0f1b335181e 272 if(!cont_antirrebote)
MarceRondan 0:d0f1b335181e 273 enable_contador = 1;
MarceRondan 0:d0f1b335181e 274 }
MarceRondan 0:d0f1b335181e 275 }
MarceRondan 0:d0f1b335181e 276
MarceRondan 0:d0f1b335181e 277 void timer_refresh()
MarceRondan 0:d0f1b335181e 278 {
MarceRondan 0:d0f1b335181e 279 if(cont_refresh > 0)//Resta cada 10ms
MarceRondan 0:d0f1b335181e 280 cont_refresh--;
MarceRondan 0:d0f1b335181e 281 }
MarceRondan 0:d0f1b335181e 282
MarceRondan 0:d0f1b335181e 283 void timer_principal()
MarceRondan 0:d0f1b335181e 284 {
MarceRondan 0:d0f1b335181e 285 if(time_sel > 0 && state != off)//Resta cada 1 segundo si el horno está en funcionamiento
MarceRondan 0:d0f1b335181e 286 time_sel--;
MarceRondan 0:d0f1b335181e 287 }