TP01-SE2018-PUNTO3
Dependencies: mbed
main.cpp@0:8519ab8e8a30, 2018-06-05 (annotated)
- Committer:
- KilianPolkov
- Date:
- Tue Jun 05 00:18:10 2018 +0000
- Revision:
- 0:8519ab8e8a30
Version 1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
KilianPolkov | 0:8519ab8e8a30 | 1 | /* BOTON ARRIBA: 2do izquierda, BOTON ABAJO: 3ero izquierda, BOTON OK/STOP: 1ero derecha*/ |
KilianPolkov | 0:8519ab8e8a30 | 2 | |
KilianPolkov | 0:8519ab8e8a30 | 3 | /* consola */ |
KilianPolkov | 0:8519ab8e8a30 | 4 | /* pc.printf("TEMP: %d\n", temperaturaActual); |
KilianPolkov | 0:8519ab8e8a30 | 5 | pc.printf("TIME: %d\n", tiempoActual); |
KilianPolkov | 0:8519ab8e8a30 | 6 | pc.printf("MOTOR: %d\n", MOTOR_estado); |
KilianPolkov | 0:8519ab8e8a30 | 7 | */ |
KilianPolkov | 0:8519ab8e8a30 | 8 | |
KilianPolkov | 0:8519ab8e8a30 | 9 | #include "mbed.h" |
KilianPolkov | 0:8519ab8e8a30 | 10 | #include <string.h> |
KilianPolkov | 0:8519ab8e8a30 | 11 | |
KilianPolkov | 0:8519ab8e8a30 | 12 | /* -----definiciones----- */ |
KilianPolkov | 0:8519ab8e8a30 | 13 | #define DATA 1 // para mandar caracter al display LCD |
KilianPolkov | 0:8519ab8e8a30 | 14 | #define CMND 0 // para configurar registro al display LCD |
KilianPolkov | 0:8519ab8e8a30 | 15 | #define APRETADO 0 // para indicar el apretado del pulsador |
KilianPolkov | 0:8519ab8e8a30 | 16 | #define NO_APRETADO 1 // para indicar el no apretado del pulsador |
KilianPolkov | 0:8519ab8e8a30 | 17 | |
KilianPolkov | 0:8519ab8e8a30 | 18 | /* -----enumeraciones----- */ |
KilianPolkov | 0:8519ab8e8a30 | 19 | enum{MENU_MODO, MENU_TEMPERATURA, MENU_CENTRIFUGADO, MENU_TIEMPO, MENU_ENJUAGUE, MENU_LAVADO, CONFIG_MODO, CONFIG_TEMPERATURA, CONFIG_CENTRIFUGADO, CONFIG_TIEMPO, CONFIG_ENJUAGUE, LAVANDO, PAUSADO}; // SELECTOR_Step |
KilianPolkov | 0:8519ab8e8a30 | 20 | enum{OFF, ENJUAGADO, ENJABONADO, SUAVIZADO, DESAGOTE, CENTRIFUGADO}; // LAVADO_Step |
KilianPolkov | 0:8519ab8e8a30 | 21 | enum{ALGODON, SINTETICO, PROGRAMA_BEBE, PESADO, RAPIDO}; // MODO_Step |
KilianPolkov | 0:8519ab8e8a30 | 22 | enum{RPM_OFF = 0, RPM_MIN = 3, RPM_NORMAL = 6, RPM_MAX = 9}; // CENTRIFUGADO_Step |
KilianPolkov | 0:8519ab8e8a30 | 23 | enum{TEMP_MIN = 10, TEMP_BAJA = 20, TEMP_NORMAL = 30, TEMP_ALTA = 40, TEMP_MAX = 50}; // TEMP_Step |
KilianPolkov | 0:8519ab8e8a30 | 24 | enum{TIEMPO_FINAL_MIN = 30, TIEMPO_FINAL_BAJO = 40, TIEMPO_FINAL_NORMAL = 50, TIEMPO_FINAL_MEDIO = 60, TIEMPO_FINAL_ALTO = 70, TIEMPO_FINAL_MAX = 80}; // TIEMPO_Step |
KilianPolkov | 0:8519ab8e8a30 | 25 | enum{TIEMPO_OFF = 0, TIEMPO_MIN = 5, TIEMPO_NORMAL = 10, TIEMPO_MAX = 15}; // ENJUAGUE_Step y variables tiempo |
KilianPolkov | 0:8519ab8e8a30 | 26 | enum{PULS_NO_APRETADO, PULS_FLANCO_1, PULS_APRETADO, PULS_FLANCO_2}; // PULS_Step |
KilianPolkov | 0:8519ab8e8a30 | 27 | enum{NO_CALENTAR = 1, CALENTAR = 0}; // ACTUADOR_Step |
KilianPolkov | 0:8519ab8e8a30 | 28 | enum{NO_GIRAR = 0, GIRAR = 1}; // MOTOR_Step |
KilianPolkov | 0:8519ab8e8a30 | 29 | |
KilianPolkov | 0:8519ab8e8a30 | 30 | /* -----clases----- */ |
KilianPolkov | 0:8519ab8e8a30 | 31 | /* entradas */ |
KilianPolkov | 0:8519ab8e8a30 | 32 | DigitalIn PULSDOWN(PTB0); // boton abajo |
KilianPolkov | 0:8519ab8e8a30 | 33 | DigitalIn PULSUP(PTB1); // boton arriba |
KilianPolkov | 0:8519ab8e8a30 | 34 | DigitalIn PULSOK(PTB3); // boton aceptar |
KilianPolkov | 0:8519ab8e8a30 | 35 | AnalogIn LM35(PTC1); // sensor de temperatura analogico |
KilianPolkov | 0:8519ab8e8a30 | 36 | /* salidas */ |
KilianPolkov | 0:8519ab8e8a30 | 37 | DigitalOut CALENTADOR(LED1); // es un led para indicar el encendido/apagado del CALENTADOR |
KilianPolkov | 0:8519ab8e8a30 | 38 | DigitalOut MOTOR(PTC9); // es el enable para el driver del MOTOR |
KilianPolkov | 0:8519ab8e8a30 | 39 | PwmOut pwm(PTA5); // es la señal para variar la velocidad del MOTOR |
KilianPolkov | 0:8519ab8e8a30 | 40 | /* objetos */ |
KilianPolkov | 0:8519ab8e8a30 | 41 | Ticker timerMili; // instancia de la clase Ticker |
KilianPolkov | 0:8519ab8e8a30 | 42 | Ticker timerSeg; // instancia de la clase Ticker |
KilianPolkov | 0:8519ab8e8a30 | 43 | Serial pc(USBTX, USBRX); // instancia de la clase Serial |
KilianPolkov | 0:8519ab8e8a30 | 44 | I2C i2c(PTE0, PTE1); // instancia de la clase I2C - PTEO: SDA (data), PTE1: SCL (clock) |
KilianPolkov | 0:8519ab8e8a30 | 45 | |
KilianPolkov | 0:8519ab8e8a30 | 46 | typedef unsigned char BYTE; // sirve para escribir "BYTE" en ves de "unsigned char" que es mas largo |
KilianPolkov | 0:8519ab8e8a30 | 47 | |
KilianPolkov | 0:8519ab8e8a30 | 48 | /* -----variables globales----- */ |
KilianPolkov | 0:8519ab8e8a30 | 49 | /* modulo i2c */ |
KilianPolkov | 0:8519ab8e8a30 | 50 | const int address = 0x7E; // address de 8bits I2C |
KilianPolkov | 0:8519ab8e8a30 | 51 | int i2c_error = 0; // si hay error en el ACK se pone en 1, sino en 0 |
KilianPolkov | 0:8519ab8e8a30 | 52 | char fila1[17]; |
KilianPolkov | 0:8519ab8e8a30 | 53 | char fila2[17]; |
KilianPolkov | 0:8519ab8e8a30 | 54 | /* sensor LM35 */ |
KilianPolkov | 0:8519ab8e8a30 | 55 | char i = 0; |
KilianPolkov | 0:8519ab8e8a30 | 56 | float sensado[10], promedio; |
KilianPolkov | 0:8519ab8e8a30 | 57 | /* estados de funciones */ |
KilianPolkov | 0:8519ab8e8a30 | 58 | BYTE SELECTOR_estado; // SELECTOR_Step |
KilianPolkov | 0:8519ab8e8a30 | 59 | BYTE LAVADO_estado; // LAVADO_Step |
KilianPolkov | 0:8519ab8e8a30 | 60 | BYTE LAVADO_ultimoEstado; // LAVADO_Step |
KilianPolkov | 0:8519ab8e8a30 | 61 | BYTE MODO_estado; // MODO_Step |
KilianPolkov | 0:8519ab8e8a30 | 62 | BYTE CENTRIFUGADO_estado; // CENTRIFUGADO_Step |
KilianPolkov | 0:8519ab8e8a30 | 63 | BYTE TEMP_estado; // TEMP_Step |
KilianPolkov | 0:8519ab8e8a30 | 64 | BYTE TIEMPO_estado; // TIEMPO_Step |
KilianPolkov | 0:8519ab8e8a30 | 65 | BYTE ENJUAGUE_estado; // ENJUAGUE_Step |
KilianPolkov | 0:8519ab8e8a30 | 66 | BYTE PULS_tout; // PULS_Step |
KilianPolkov | 0:8519ab8e8a30 | 67 | BYTE ACTUADOR_estado; // ACTUADOR_Step |
KilianPolkov | 0:8519ab8e8a30 | 68 | BYTE MOTOR_estado; // MOTOR_Step |
KilianPolkov | 0:8519ab8e8a30 | 69 | /* estados de pulsadores */ |
KilianPolkov | 0:8519ab8e8a30 | 70 | BYTE PULSOK_estado, PULSUP_estado, PULSDOWN_estado; //variables utilizadas en la maquina de estados |
KilianPolkov | 0:8519ab8e8a30 | 71 | /* variables maquinas de estados */ |
KilianPolkov | 0:8519ab8e8a30 | 72 | char temperaturaSeteada, temperaturaActual, rpmSeteado, vecesEnjuagado; |
KilianPolkov | 0:8519ab8e8a30 | 73 | char tiempoActual, tiempoDiferido, tiempoSeteado, tiempoEnjuague, tiempoEnjabonado, tiempoSuavizado, tiempoDesagote, tiempoCentrifugado; // tiempos |
KilianPolkov | 0:8519ab8e8a30 | 74 | |
KilianPolkov | 0:8519ab8e8a30 | 75 | /* -----prototipos funciones----- */ |
KilianPolkov | 0:8519ab8e8a30 | 76 | /* funciones generales */ |
KilianPolkov | 0:8519ab8e8a30 | 77 | void miliSegundo(void); // se ejecuta cada milisegundo |
KilianPolkov | 0:8519ab8e8a30 | 78 | void segundo(void); // se ejecuta cada segundo |
KilianPolkov | 0:8519ab8e8a30 | 79 | void initMCU(void); // se ejecuta una sola vez al inicializar el microcontrolador |
KilianPolkov | 0:8519ab8e8a30 | 80 | void showTimeNow(void); // imprime en pantalla el tiempo actual |
KilianPolkov | 0:8519ab8e8a30 | 81 | void detectForBack(void); // vuelve al menu principal MENU_MODO |
KilianPolkov | 0:8519ab8e8a30 | 82 | void readSensor(void); // lee 10 valores y saca el promedio del sensor LM35 |
KilianPolkov | 0:8519ab8e8a30 | 83 | char isWashing(void); // devuelve true si esta lavando, sino false |
KilianPolkov | 0:8519ab8e8a30 | 84 | /* funciones maquina de estados */ |
KilianPolkov | 0:8519ab8e8a30 | 85 | void SELECTOR_Step(void); // maquina de estados principal |
KilianPolkov | 0:8519ab8e8a30 | 86 | void LAVADO_Step(void); // maquina de estados lavado |
KilianPolkov | 0:8519ab8e8a30 | 87 | void MODO_Step(void); // maquina de estados para setear modo o programa (algodon, sintetico) |
KilianPolkov | 0:8519ab8e8a30 | 88 | void CENTRIFUGADO_Step(void); // maquina de estados para setear centrifugado (configura las RPM, si esta en 0 RPM es que no centrifuga) |
KilianPolkov | 0:8519ab8e8a30 | 89 | void TEMP_Step(void); // maquina de estados para setear temperatura (para configurar manualmente la temperatura en vez de utilizar los modos o programas) |
KilianPolkov | 0:8519ab8e8a30 | 90 | void TIEMPO_Step(void); // maquina de estados para setear el tiempo diferido (cuando finaliza el ciclo de lavado) |
KilianPolkov | 0:8519ab8e8a30 | 91 | void ENJUAGUE_Step(void); // maquina de estados para setear ciclos de enjuague |
KilianPolkov | 0:8519ab8e8a30 | 92 | void ACTUADOR_Step(void); // maquina de estados para activar/desactivar el calentador |
KilianPolkov | 0:8519ab8e8a30 | 93 | void MOTOR_Step(void); // maquina de estados para activar/desactivar el motor |
KilianPolkov | 0:8519ab8e8a30 | 94 | BYTE PULS_Step(BYTE PULSADOR, BYTE& estado);// maquina de estados para detectar el flanco de los pulsadores |
KilianPolkov | 0:8519ab8e8a30 | 95 | /* funciones I2C */ |
KilianPolkov | 0:8519ab8e8a30 | 96 | void LCD_wr( BYTE dato ); // funcion para escritura de un byte |
KilianPolkov | 0:8519ab8e8a30 | 97 | /* funciones display LCD */ |
KilianPolkov | 0:8519ab8e8a30 | 98 | void LCD_init(void); // inicializacion del display LCD |
KilianPolkov | 0:8519ab8e8a30 | 99 | void LCD_send(BYTE data, BYTE reset); // manda 4 bits mas significativos, despues 4 bits menos significativos |
KilianPolkov | 0:8519ab8e8a30 | 100 | void printstr(char* s); // muestra en el display LCD un string |
KilianPolkov | 0:8519ab8e8a30 | 101 | void LCD_print(void); // muestra el display LCD |
KilianPolkov | 0:8519ab8e8a30 | 102 | |
KilianPolkov | 0:8519ab8e8a30 | 103 | int main() { |
KilianPolkov | 0:8519ab8e8a30 | 104 | LCD_init(); |
KilianPolkov | 0:8519ab8e8a30 | 105 | initMCU(); |
KilianPolkov | 0:8519ab8e8a30 | 106 | while(1) { |
KilianPolkov | 0:8519ab8e8a30 | 107 | /* ejecuta */ |
KilianPolkov | 0:8519ab8e8a30 | 108 | SELECTOR_Step(); // maquina de estados principal |
KilianPolkov | 0:8519ab8e8a30 | 109 | LCD_print(); // printea en el LCD |
KilianPolkov | 0:8519ab8e8a30 | 110 | |
KilianPolkov | 0:8519ab8e8a30 | 111 | /* girar o no girar el motor */ |
KilianPolkov | 0:8519ab8e8a30 | 112 | if(LAVADO_estado == ENJUAGADO || LAVADO_estado == CENTRIFUGADO) |
KilianPolkov | 0:8519ab8e8a30 | 113 | MOTOR_estado = GIRAR; |
KilianPolkov | 0:8519ab8e8a30 | 114 | else |
KilianPolkov | 0:8519ab8e8a30 | 115 | MOTOR_estado = NO_GIRAR; |
KilianPolkov | 0:8519ab8e8a30 | 116 | |
KilianPolkov | 0:8519ab8e8a30 | 117 | /* activa o desactiva el motor dependiendo de MOTOR_estado */ |
KilianPolkov | 0:8519ab8e8a30 | 118 | MOTOR_Step(); |
KilianPolkov | 0:8519ab8e8a30 | 119 | |
KilianPolkov | 0:8519ab8e8a30 | 120 | /* si esta lavando */ |
KilianPolkov | 0:8519ab8e8a30 | 121 | if(isWashing()) { // si no para de girar cuando esta pausado, CAMBIAR ACA |
KilianPolkov | 0:8519ab8e8a30 | 122 | showTimeNow(); |
KilianPolkov | 0:8519ab8e8a30 | 123 | ACTUADOR_Step(); // maquina de estados para activar/desactivar el calentador |
KilianPolkov | 0:8519ab8e8a30 | 124 | } |
KilianPolkov | 0:8519ab8e8a30 | 125 | } |
KilianPolkov | 0:8519ab8e8a30 | 126 | } |
KilianPolkov | 0:8519ab8e8a30 | 127 | |
KilianPolkov | 0:8519ab8e8a30 | 128 | /* -----contador que se decrementa cada milisegundo----- */ |
KilianPolkov | 0:8519ab8e8a30 | 129 | void miliSegundo() { |
KilianPolkov | 0:8519ab8e8a30 | 130 | if(PULS_tout > 0) PULS_tout--; |
KilianPolkov | 0:8519ab8e8a30 | 131 | } |
KilianPolkov | 0:8519ab8e8a30 | 132 | |
KilianPolkov | 0:8519ab8e8a30 | 133 | /* -----cada segundo se decrementa el valor del temporizador(si no esta pausado) y tambien se lee el valor de temperatura del LM35----- */ |
KilianPolkov | 0:8519ab8e8a30 | 134 | void segundo() { |
KilianPolkov | 0:8519ab8e8a30 | 135 | readSensor(); |
KilianPolkov | 0:8519ab8e8a30 | 136 | if(isWashing()) tiempoActual--; |
KilianPolkov | 0:8519ab8e8a30 | 137 | } |
KilianPolkov | 0:8519ab8e8a30 | 138 | |
KilianPolkov | 0:8519ab8e8a30 | 139 | /* -----guarda en el vector de la fila1 el tiempoActual----- */ |
KilianPolkov | 0:8519ab8e8a30 | 140 | void showTimeNow() { |
KilianPolkov | 0:8519ab8e8a30 | 141 | strcpy(fila1, "TIME ACTUAL:xxs "); |
KilianPolkov | 0:8519ab8e8a30 | 142 | fila1[12] = (tiempoActual / 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 143 | fila1[13] = (tiempoActual % 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 144 | } |
KilianPolkov | 0:8519ab8e8a30 | 145 | |
KilianPolkov | 0:8519ab8e8a30 | 146 | /* -----vuelve al menu principal MENU_MODO----- */ |
KilianPolkov | 0:8519ab8e8a30 | 147 | void detectForBack() { |
KilianPolkov | 0:8519ab8e8a30 | 148 | if(PULS_Step(PULSOK, PULSOK_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_MODO; // cuando se presiona el pulsador vuelve al menu principal |
KilianPolkov | 0:8519ab8e8a30 | 149 | } |
KilianPolkov | 0:8519ab8e8a30 | 150 | |
KilianPolkov | 0:8519ab8e8a30 | 151 | /* -----lee 10 valores y saca el promedio del sensor LM35----- */ |
KilianPolkov | 0:8519ab8e8a30 | 152 | void readSensor(void) { |
KilianPolkov | 0:8519ab8e8a30 | 153 | promedio = 0; |
KilianPolkov | 0:8519ab8e8a30 | 154 | for(i = 0; i < 10; i++){ |
KilianPolkov | 0:8519ab8e8a30 | 155 | sensado[i] = LM35.read(); |
KilianPolkov | 0:8519ab8e8a30 | 156 | } |
KilianPolkov | 0:8519ab8e8a30 | 157 | for(i = 0; i < 10; i++){ |
KilianPolkov | 0:8519ab8e8a30 | 158 | promedio += sensado[i]/10; |
KilianPolkov | 0:8519ab8e8a30 | 159 | } |
KilianPolkov | 0:8519ab8e8a30 | 160 | temperaturaActual = (promedio*3.25*100); |
KilianPolkov | 0:8519ab8e8a30 | 161 | } |
KilianPolkov | 0:8519ab8e8a30 | 162 | |
KilianPolkov | 0:8519ab8e8a30 | 163 | /* -----devuelve true si esta lavando, sino false----- */ |
KilianPolkov | 0:8519ab8e8a30 | 164 | char isWashing() { |
KilianPolkov | 0:8519ab8e8a30 | 165 | if(LAVADO_estado == ENJUAGADO || LAVADO_estado == ENJABONADO || LAVADO_estado == SUAVIZADO || LAVADO_estado == DESAGOTE || LAVADO_estado == CENTRIFUGADO) return 1; // devuelve true |
KilianPolkov | 0:8519ab8e8a30 | 166 | return 0; // si no se cumple la sentencia if, devuelve false |
KilianPolkov | 0:8519ab8e8a30 | 167 | } |
KilianPolkov | 0:8519ab8e8a30 | 168 | |
KilianPolkov | 0:8519ab8e8a30 | 169 | /* -----se ejecuta una sola vez al inicializar el microcontrolador----- */ |
KilianPolkov | 0:8519ab8e8a30 | 170 | void initMCU(void) { |
KilianPolkov | 0:8519ab8e8a30 | 171 | pc.printf("PROGRAMA INICIALIZADO\n"); |
KilianPolkov | 0:8519ab8e8a30 | 172 | |
KilianPolkov | 0:8519ab8e8a30 | 173 | /* PWM */ |
KilianPolkov | 0:8519ab8e8a30 | 174 | pwm.period_ms(10); |
KilianPolkov | 0:8519ab8e8a30 | 175 | pwm.pulsewidth_ms(RPM_OFF); |
KilianPolkov | 0:8519ab8e8a30 | 176 | pc.printf("pwm set to %.2f %%\n", pwm.read() * 100); |
KilianPolkov | 0:8519ab8e8a30 | 177 | |
KilianPolkov | 0:8519ab8e8a30 | 178 | /* TIMER */ |
KilianPolkov | 0:8519ab8e8a30 | 179 | PULS_tout = TIEMPO_OFF; |
KilianPolkov | 0:8519ab8e8a30 | 180 | timerMili.attach(&miliSegundo, 0.001); // timer en 1ms |
KilianPolkov | 0:8519ab8e8a30 | 181 | timerSeg.attach(&segundo, 1); // timer en 1s |
KilianPolkov | 0:8519ab8e8a30 | 182 | |
KilianPolkov | 0:8519ab8e8a30 | 183 | /* SELECTOR_Step */ |
KilianPolkov | 0:8519ab8e8a30 | 184 | SELECTOR_estado = MENU_MODO; |
KilianPolkov | 0:8519ab8e8a30 | 185 | |
KilianPolkov | 0:8519ab8e8a30 | 186 | /* LAVADO_Step */ |
KilianPolkov | 0:8519ab8e8a30 | 187 | LAVADO_estado = OFF; |
KilianPolkov | 0:8519ab8e8a30 | 188 | tiempoCentrifugado = TIEMPO_OFF; // se inicializa en 0s por si no se configura el centrifugado, se puede modificar |
KilianPolkov | 0:8519ab8e8a30 | 189 | tiempoEnjuague = TIEMPO_MIN; // se inicializa en 5s, se puede modificar |
KilianPolkov | 0:8519ab8e8a30 | 190 | tiempoEnjabonado = TIEMPO_MIN; // se inicializa en 5s, se puede modificar |
KilianPolkov | 0:8519ab8e8a30 | 191 | tiempoSuavizado = TIEMPO_MIN; // se inicializa en 5s, se puede modificar |
KilianPolkov | 0:8519ab8e8a30 | 192 | tiempoDesagote = TIEMPO_MIN; // se inicializa en 5s, se puede modificar |
KilianPolkov | 0:8519ab8e8a30 | 193 | vecesEnjuagado = 1; // se inicializa en 1, despues se incrementa hasta 3 porque es la cantidad maxima de enjuagues |
KilianPolkov | 0:8519ab8e8a30 | 194 | |
KilianPolkov | 0:8519ab8e8a30 | 195 | /* MODO_Step */ |
KilianPolkov | 0:8519ab8e8a30 | 196 | MODO_estado = ALGODON; |
KilianPolkov | 0:8519ab8e8a30 | 197 | |
KilianPolkov | 0:8519ab8e8a30 | 198 | /* CENTRIFUGADO_Step */ |
KilianPolkov | 0:8519ab8e8a30 | 199 | CENTRIFUGADO_estado = RPM_OFF; |
KilianPolkov | 0:8519ab8e8a30 | 200 | rpmSeteado = RPM_OFF; // se inicializa en 0rps, se puede modificar |
KilianPolkov | 0:8519ab8e8a30 | 201 | |
KilianPolkov | 0:8519ab8e8a30 | 202 | /* TEMP_Step */ |
KilianPolkov | 0:8519ab8e8a30 | 203 | TEMP_estado = TEMP_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 204 | |
KilianPolkov | 0:8519ab8e8a30 | 205 | /* TIEMPO_Step */ |
KilianPolkov | 0:8519ab8e8a30 | 206 | TIEMPO_estado = TIEMPO_FINAL_BAJO; |
KilianPolkov | 0:8519ab8e8a30 | 207 | tiempoActual = tiempoDiferido = tiempoSeteado = TIEMPO_FINAL_BAJO; // se inicializa en 40s, se puede modificar |
KilianPolkov | 0:8519ab8e8a30 | 208 | |
KilianPolkov | 0:8519ab8e8a30 | 209 | /* PULSADORES */ |
KilianPolkov | 0:8519ab8e8a30 | 210 | PULSOK_estado = PULS_NO_APRETADO; |
KilianPolkov | 0:8519ab8e8a30 | 211 | PULSUP_estado = PULS_NO_APRETADO; |
KilianPolkov | 0:8519ab8e8a30 | 212 | PULSDOWN_estado = PULS_NO_APRETADO; |
KilianPolkov | 0:8519ab8e8a30 | 213 | |
KilianPolkov | 0:8519ab8e8a30 | 214 | /* ACTUADOR_Step */ |
KilianPolkov | 0:8519ab8e8a30 | 215 | ACTUADOR_estado = NO_CALENTAR; |
KilianPolkov | 0:8519ab8e8a30 | 216 | CALENTADOR = NO_CALENTAR; |
KilianPolkov | 0:8519ab8e8a30 | 217 | |
KilianPolkov | 0:8519ab8e8a30 | 218 | /* MOTOR_Step */ |
KilianPolkov | 0:8519ab8e8a30 | 219 | MOTOR_estado = NO_GIRAR; |
KilianPolkov | 0:8519ab8e8a30 | 220 | |
KilianPolkov | 0:8519ab8e8a30 | 221 | /* ENJUAGUE_Step */ |
KilianPolkov | 0:8519ab8e8a30 | 222 | ENJUAGUE_estado = TIEMPO_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 223 | } |
KilianPolkov | 0:8519ab8e8a30 | 224 | |
KilianPolkov | 0:8519ab8e8a30 | 225 | /* -----maquina de estados principal----- */ |
KilianPolkov | 0:8519ab8e8a30 | 226 | void SELECTOR_Step() { |
KilianPolkov | 0:8519ab8e8a30 | 227 | switch(SELECTOR_estado) { |
KilianPolkov | 0:8519ab8e8a30 | 228 | default: |
KilianPolkov | 0:8519ab8e8a30 | 229 | case MENU_MODO: |
KilianPolkov | 0:8519ab8e8a30 | 230 | strcpy(fila1, "MENU: "); |
KilianPolkov | 0:8519ab8e8a30 | 231 | strcpy(fila2, "CONFIG MODE "); |
KilianPolkov | 0:8519ab8e8a30 | 232 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_LAVADO; |
KilianPolkov | 0:8519ab8e8a30 | 233 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_TEMPERATURA; |
KilianPolkov | 0:8519ab8e8a30 | 234 | if(PULS_Step(PULSOK, PULSOK_estado) == PULS_FLANCO_1) SELECTOR_estado = CONFIG_MODO; |
KilianPolkov | 0:8519ab8e8a30 | 235 | break; |
KilianPolkov | 0:8519ab8e8a30 | 236 | case MENU_TEMPERATURA: |
KilianPolkov | 0:8519ab8e8a30 | 237 | strcpy(fila2, "CONFIG TEMP "); |
KilianPolkov | 0:8519ab8e8a30 | 238 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_MODO; |
KilianPolkov | 0:8519ab8e8a30 | 239 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_CENTRIFUGADO; |
KilianPolkov | 0:8519ab8e8a30 | 240 | if(PULS_Step(PULSOK, PULSOK_estado) == PULS_FLANCO_1) SELECTOR_estado = CONFIG_TEMPERATURA; |
KilianPolkov | 0:8519ab8e8a30 | 241 | break; |
KilianPolkov | 0:8519ab8e8a30 | 242 | case MENU_CENTRIFUGADO: |
KilianPolkov | 0:8519ab8e8a30 | 243 | strcpy(fila2, "CONFIG RPM "); |
KilianPolkov | 0:8519ab8e8a30 | 244 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_TEMPERATURA; |
KilianPolkov | 0:8519ab8e8a30 | 245 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_TIEMPO; |
KilianPolkov | 0:8519ab8e8a30 | 246 | if(PULS_Step(PULSOK, PULSOK_estado) == PULS_FLANCO_1) SELECTOR_estado = CONFIG_CENTRIFUGADO; |
KilianPolkov | 0:8519ab8e8a30 | 247 | break; |
KilianPolkov | 0:8519ab8e8a30 | 248 | case MENU_TIEMPO: |
KilianPolkov | 0:8519ab8e8a30 | 249 | strcpy(fila2, "CONFIG TIME "); |
KilianPolkov | 0:8519ab8e8a30 | 250 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_CENTRIFUGADO; |
KilianPolkov | 0:8519ab8e8a30 | 251 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_ENJUAGUE; |
KilianPolkov | 0:8519ab8e8a30 | 252 | if(PULS_Step(PULSOK, PULSOK_estado) == PULS_FLANCO_1) SELECTOR_estado = CONFIG_TIEMPO; |
KilianPolkov | 0:8519ab8e8a30 | 253 | break; |
KilianPolkov | 0:8519ab8e8a30 | 254 | case MENU_ENJUAGUE: |
KilianPolkov | 0:8519ab8e8a30 | 255 | strcpy(fila2, "CONFIG ENJUAGUE "); |
KilianPolkov | 0:8519ab8e8a30 | 256 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_TIEMPO; |
KilianPolkov | 0:8519ab8e8a30 | 257 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_LAVADO; |
KilianPolkov | 0:8519ab8e8a30 | 258 | if(PULS_Step(PULSOK, PULSOK_estado) == PULS_FLANCO_1) SELECTOR_estado = CONFIG_ENJUAGUE; |
KilianPolkov | 0:8519ab8e8a30 | 259 | break; |
KilianPolkov | 0:8519ab8e8a30 | 260 | case MENU_LAVADO: |
KilianPolkov | 0:8519ab8e8a30 | 261 | strcpy(fila2, "COMENZAR "); |
KilianPolkov | 0:8519ab8e8a30 | 262 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_ENJUAGUE; |
KilianPolkov | 0:8519ab8e8a30 | 263 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) SELECTOR_estado = MENU_MODO; |
KilianPolkov | 0:8519ab8e8a30 | 264 | if(PULS_Step(PULSOK, PULSOK_estado) == PULS_FLANCO_1) { |
KilianPolkov | 0:8519ab8e8a30 | 265 | SELECTOR_estado = LAVANDO; |
KilianPolkov | 0:8519ab8e8a30 | 266 | LAVADO_estado = ENJUAGADO; |
KilianPolkov | 0:8519ab8e8a30 | 267 | tiempoSeteado -= tiempoEnjuague; //primer ciclo de lavado |
KilianPolkov | 0:8519ab8e8a30 | 268 | } |
KilianPolkov | 0:8519ab8e8a30 | 269 | break; |
KilianPolkov | 0:8519ab8e8a30 | 270 | case CONFIG_MODO: |
KilianPolkov | 0:8519ab8e8a30 | 271 | MODO_Step(); |
KilianPolkov | 0:8519ab8e8a30 | 272 | detectForBack(); |
KilianPolkov | 0:8519ab8e8a30 | 273 | break; |
KilianPolkov | 0:8519ab8e8a30 | 274 | case CONFIG_TEMPERATURA: |
KilianPolkov | 0:8519ab8e8a30 | 275 | TEMP_Step(); |
KilianPolkov | 0:8519ab8e8a30 | 276 | detectForBack(); |
KilianPolkov | 0:8519ab8e8a30 | 277 | break; |
KilianPolkov | 0:8519ab8e8a30 | 278 | case CONFIG_CENTRIFUGADO: |
KilianPolkov | 0:8519ab8e8a30 | 279 | CENTRIFUGADO_Step(); |
KilianPolkov | 0:8519ab8e8a30 | 280 | detectForBack(); |
KilianPolkov | 0:8519ab8e8a30 | 281 | break; |
KilianPolkov | 0:8519ab8e8a30 | 282 | case CONFIG_TIEMPO: |
KilianPolkov | 0:8519ab8e8a30 | 283 | TIEMPO_Step(); |
KilianPolkov | 0:8519ab8e8a30 | 284 | detectForBack(); |
KilianPolkov | 0:8519ab8e8a30 | 285 | break; |
KilianPolkov | 0:8519ab8e8a30 | 286 | case CONFIG_ENJUAGUE: |
KilianPolkov | 0:8519ab8e8a30 | 287 | ENJUAGUE_Step(); |
KilianPolkov | 0:8519ab8e8a30 | 288 | detectForBack(); |
KilianPolkov | 0:8519ab8e8a30 | 289 | break; |
KilianPolkov | 0:8519ab8e8a30 | 290 | case LAVANDO: |
KilianPolkov | 0:8519ab8e8a30 | 291 | LAVADO_Step(); |
KilianPolkov | 0:8519ab8e8a30 | 292 | if(PULS_Step(PULSOK, PULSOK_estado) == PULS_FLANCO_1) { |
KilianPolkov | 0:8519ab8e8a30 | 293 | LAVADO_estado = OFF; // pone en OFF, es decir, deja de lavar en LAVADO_Step |
KilianPolkov | 0:8519ab8e8a30 | 294 | SELECTOR_estado = PAUSADO; // va al estado PAUSADO del SELECTOR_Step |
KilianPolkov | 0:8519ab8e8a30 | 295 | } |
KilianPolkov | 0:8519ab8e8a30 | 296 | break; |
KilianPolkov | 0:8519ab8e8a30 | 297 | case PAUSADO: |
KilianPolkov | 0:8519ab8e8a30 | 298 | strcpy(fila2, "PAUSADO... "); |
KilianPolkov | 0:8519ab8e8a30 | 299 | if(PULS_Step(PULSOK, PULSOK_estado) == PULS_FLANCO_1){ |
KilianPolkov | 0:8519ab8e8a30 | 300 | LAVADO_estado = LAVADO_ultimoEstado; // vuelve al ultimo estado de LAVADO_estado |
KilianPolkov | 0:8519ab8e8a30 | 301 | SELECTOR_estado = LAVANDO; // vuelve al estado LAVANDO del SELECTOR_Step |
KilianPolkov | 0:8519ab8e8a30 | 302 | } |
KilianPolkov | 0:8519ab8e8a30 | 303 | break; |
KilianPolkov | 0:8519ab8e8a30 | 304 | } |
KilianPolkov | 0:8519ab8e8a30 | 305 | } |
KilianPolkov | 0:8519ab8e8a30 | 306 | |
KilianPolkov | 0:8519ab8e8a30 | 307 | /* -----maquina de estados lavado----- */ |
KilianPolkov | 0:8519ab8e8a30 | 308 | void LAVADO_Step() { |
KilianPolkov | 0:8519ab8e8a30 | 309 | switch(LAVADO_estado) { |
KilianPolkov | 0:8519ab8e8a30 | 310 | default: |
KilianPolkov | 0:8519ab8e8a30 | 311 | case OFF: |
KilianPolkov | 0:8519ab8e8a30 | 312 | tiempoSeteado = tiempoActual = tiempoDiferido; |
KilianPolkov | 0:8519ab8e8a30 | 313 | vecesEnjuagado = 1; |
KilianPolkov | 0:8519ab8e8a30 | 314 | CALENTADOR = NO_CALENTAR; |
KilianPolkov | 0:8519ab8e8a30 | 315 | SELECTOR_estado = MENU_MODO; |
KilianPolkov | 0:8519ab8e8a30 | 316 | break; |
KilianPolkov | 0:8519ab8e8a30 | 317 | case ENJUAGADO: |
KilianPolkov | 0:8519ab8e8a30 | 318 | strcpy(fila2, "ENJUAGANDO... "); |
KilianPolkov | 0:8519ab8e8a30 | 319 | /* finaliza tiempo enjuagado */ |
KilianPolkov | 0:8519ab8e8a30 | 320 | if(tiempoActual == tiempoSeteado) { |
KilianPolkov | 0:8519ab8e8a30 | 321 | switch(vecesEnjuagado) { |
KilianPolkov | 0:8519ab8e8a30 | 322 | case 1: /* finaliza primer enjuague */ |
KilianPolkov | 0:8519ab8e8a30 | 323 | tiempoSeteado -= tiempoEnjabonado; // segundo ciclo de lavado |
KilianPolkov | 0:8519ab8e8a30 | 324 | LAVADO_estado = ENJABONADO; |
KilianPolkov | 0:8519ab8e8a30 | 325 | break; |
KilianPolkov | 0:8519ab8e8a30 | 326 | case 2: /* finaliza segundo enjuague, despues del enjabonado */ |
KilianPolkov | 0:8519ab8e8a30 | 327 | tiempoSeteado -= tiempoSuavizado; // cuarto ciclo de lavado |
KilianPolkov | 0:8519ab8e8a30 | 328 | LAVADO_estado = SUAVIZADO; |
KilianPolkov | 0:8519ab8e8a30 | 329 | break; |
KilianPolkov | 0:8519ab8e8a30 | 330 | case 3: /* finaliza tercer enjuague, despues del suavizado */ |
KilianPolkov | 0:8519ab8e8a30 | 331 | tiempoSeteado -= tiempoDesagote; // sexto ciclo de lavado |
KilianPolkov | 0:8519ab8e8a30 | 332 | LAVADO_estado = DESAGOTE; |
KilianPolkov | 0:8519ab8e8a30 | 333 | break; |
KilianPolkov | 0:8519ab8e8a30 | 334 | } |
KilianPolkov | 0:8519ab8e8a30 | 335 | } |
KilianPolkov | 0:8519ab8e8a30 | 336 | LAVADO_ultimoEstado = ENJUAGADO; |
KilianPolkov | 0:8519ab8e8a30 | 337 | break; |
KilianPolkov | 0:8519ab8e8a30 | 338 | case ENJABONADO: |
KilianPolkov | 0:8519ab8e8a30 | 339 | strcpy(fila2, "ENJABONANDO... "); |
KilianPolkov | 0:8519ab8e8a30 | 340 | /* finaliza tiempo enjabonado */ |
KilianPolkov | 0:8519ab8e8a30 | 341 | if(tiempoActual == tiempoSeteado) { |
KilianPolkov | 0:8519ab8e8a30 | 342 | vecesEnjuagado++; |
KilianPolkov | 0:8519ab8e8a30 | 343 | tiempoSeteado -= tiempoEnjuague; // tercer ciclo de lavado |
KilianPolkov | 0:8519ab8e8a30 | 344 | LAVADO_estado = ENJUAGADO; |
KilianPolkov | 0:8519ab8e8a30 | 345 | } |
KilianPolkov | 0:8519ab8e8a30 | 346 | LAVADO_ultimoEstado = ENJABONADO; |
KilianPolkov | 0:8519ab8e8a30 | 347 | break; |
KilianPolkov | 0:8519ab8e8a30 | 348 | case SUAVIZADO: |
KilianPolkov | 0:8519ab8e8a30 | 349 | strcpy(fila2, "SUAVIZANDO... "); |
KilianPolkov | 0:8519ab8e8a30 | 350 | /* finaliza tiempo suavizado */ |
KilianPolkov | 0:8519ab8e8a30 | 351 | if(tiempoActual == tiempoSeteado) { |
KilianPolkov | 0:8519ab8e8a30 | 352 | vecesEnjuagado++; |
KilianPolkov | 0:8519ab8e8a30 | 353 | tiempoSeteado -= tiempoEnjuague; // quinto ciclo de lavado |
KilianPolkov | 0:8519ab8e8a30 | 354 | LAVADO_estado = ENJUAGADO; |
KilianPolkov | 0:8519ab8e8a30 | 355 | } |
KilianPolkov | 0:8519ab8e8a30 | 356 | LAVADO_ultimoEstado = SUAVIZADO; |
KilianPolkov | 0:8519ab8e8a30 | 357 | break; |
KilianPolkov | 0:8519ab8e8a30 | 358 | case DESAGOTE: |
KilianPolkov | 0:8519ab8e8a30 | 359 | strcpy(fila2, "DESAGOTANDO... "); |
KilianPolkov | 0:8519ab8e8a30 | 360 | /* finaliza tiempo desagote */ |
KilianPolkov | 0:8519ab8e8a30 | 361 | if(tiempoActual == tiempoSeteado && rpmSeteado != RPM_OFF) { |
KilianPolkov | 0:8519ab8e8a30 | 362 | tiempoSeteado -= tiempoCentrifugado; // septimo ciclo de lavado, se ejecuta solo si queres centrifugar |
KilianPolkov | 0:8519ab8e8a30 | 363 | LAVADO_estado = CENTRIFUGADO; |
KilianPolkov | 0:8519ab8e8a30 | 364 | } |
KilianPolkov | 0:8519ab8e8a30 | 365 | LAVADO_ultimoEstado = DESAGOTE; |
KilianPolkov | 0:8519ab8e8a30 | 366 | if(tiempoActual == 0) LAVADO_estado = OFF; |
KilianPolkov | 0:8519ab8e8a30 | 367 | break; |
KilianPolkov | 0:8519ab8e8a30 | 368 | case CENTRIFUGADO: |
KilianPolkov | 0:8519ab8e8a30 | 369 | strcpy(fila2, "CENTRIFUGANDO..."); |
KilianPolkov | 0:8519ab8e8a30 | 370 | LAVADO_ultimoEstado = CENTRIFUGADO; |
KilianPolkov | 0:8519ab8e8a30 | 371 | if(tiempoActual == 0) LAVADO_estado = OFF; |
KilianPolkov | 0:8519ab8e8a30 | 372 | break; |
KilianPolkov | 0:8519ab8e8a30 | 373 | } |
KilianPolkov | 0:8519ab8e8a30 | 374 | } |
KilianPolkov | 0:8519ab8e8a30 | 375 | |
KilianPolkov | 0:8519ab8e8a30 | 376 | /* -----maquina de estados para setear modo o programa (algodon, sintetico, etc)----- */ |
KilianPolkov | 0:8519ab8e8a30 | 377 | void MODO_Step() { |
KilianPolkov | 0:8519ab8e8a30 | 378 | strcpy(fila1, "CONFIG: "); |
KilianPolkov | 0:8519ab8e8a30 | 379 | switch(MODO_estado) { |
KilianPolkov | 0:8519ab8e8a30 | 380 | default: |
KilianPolkov | 0:8519ab8e8a30 | 381 | case ALGODON: |
KilianPolkov | 0:8519ab8e8a30 | 382 | strcpy(fila2, "MODO:ALGODON "); |
KilianPolkov | 0:8519ab8e8a30 | 383 | temperaturaSeteada = TEMP_BAJA; |
KilianPolkov | 0:8519ab8e8a30 | 384 | tiempoEnjuague = TIEMPO_MAX; //15s tiempo enjuague |
KilianPolkov | 0:8519ab8e8a30 | 385 | if(rpmSeteado) |
KilianPolkov | 0:8519ab8e8a30 | 386 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_ALTO; //70s tiempo total, 10s tiempo centrifugado |
KilianPolkov | 0:8519ab8e8a30 | 387 | else |
KilianPolkov | 0:8519ab8e8a30 | 388 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_MEDIO; //60s tiempo total, 0s tiempo centrifugado |
KilianPolkov | 0:8519ab8e8a30 | 389 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) MODO_estado = PESADO; |
KilianPolkov | 0:8519ab8e8a30 | 390 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) MODO_estado = SINTETICO; |
KilianPolkov | 0:8519ab8e8a30 | 391 | break; |
KilianPolkov | 0:8519ab8e8a30 | 392 | case SINTETICO: |
KilianPolkov | 0:8519ab8e8a30 | 393 | strcpy(fila2, "MODO:SINTETICO "); |
KilianPolkov | 0:8519ab8e8a30 | 394 | temperaturaSeteada = TEMP_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 395 | tiempoEnjuague = TIEMPO_NORMAL; //10s tiempo enjuague |
KilianPolkov | 0:8519ab8e8a30 | 396 | if(rpmSeteado) |
KilianPolkov | 0:8519ab8e8a30 | 397 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_MEDIO; //60s tiempo total, 15s tiempo centrifugado |
KilianPolkov | 0:8519ab8e8a30 | 398 | else |
KilianPolkov | 0:8519ab8e8a30 | 399 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_NORMAL; //50s tiempo total, 0s tiempo centrifugado |
KilianPolkov | 0:8519ab8e8a30 | 400 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) MODO_estado = ALGODON; |
KilianPolkov | 0:8519ab8e8a30 | 401 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) MODO_estado = RAPIDO; |
KilianPolkov | 0:8519ab8e8a30 | 402 | break; |
KilianPolkov | 0:8519ab8e8a30 | 403 | case RAPIDO: |
KilianPolkov | 0:8519ab8e8a30 | 404 | strcpy(fila2, "MODO:RAPIDO "); |
KilianPolkov | 0:8519ab8e8a30 | 405 | temperaturaSeteada = TEMP_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 406 | tiempoEnjuague = TIEMPO_MIN; //5s tiempo enjuague |
KilianPolkov | 0:8519ab8e8a30 | 407 | if(rpmSeteado) |
KilianPolkov | 0:8519ab8e8a30 | 408 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_BAJO; //40s tiempo total, 10s tiempo centrifugado |
KilianPolkov | 0:8519ab8e8a30 | 409 | else |
KilianPolkov | 0:8519ab8e8a30 | 410 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_MIN; //30s tiempo total, 0s tiempo centrifugado |
KilianPolkov | 0:8519ab8e8a30 | 411 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) MODO_estado = SINTETICO; |
KilianPolkov | 0:8519ab8e8a30 | 412 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) MODO_estado = PROGRAMA_BEBE; |
KilianPolkov | 0:8519ab8e8a30 | 413 | break; |
KilianPolkov | 0:8519ab8e8a30 | 414 | case PROGRAMA_BEBE: |
KilianPolkov | 0:8519ab8e8a30 | 415 | strcpy(fila2, "MODO:BEBE "); |
KilianPolkov | 0:8519ab8e8a30 | 416 | temperaturaSeteada = TEMP_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 417 | tiempoEnjuague = TIEMPO_MAX; //15s tiempo enjuague |
KilianPolkov | 0:8519ab8e8a30 | 418 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_MAX; //80s tiempo total, 20s tiempo centrifugado |
KilianPolkov | 0:8519ab8e8a30 | 419 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) MODO_estado = RAPIDO; |
KilianPolkov | 0:8519ab8e8a30 | 420 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) MODO_estado = PESADO; |
KilianPolkov | 0:8519ab8e8a30 | 421 | break; |
KilianPolkov | 0:8519ab8e8a30 | 422 | case PESADO: |
KilianPolkov | 0:8519ab8e8a30 | 423 | strcpy(fila2, "MODO:PESADO "); |
KilianPolkov | 0:8519ab8e8a30 | 424 | temperaturaSeteada = TEMP_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 425 | tiempoEnjuague = TIEMPO_MIN; //5s tiempo enjuague |
KilianPolkov | 0:8519ab8e8a30 | 426 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_NORMAL; //50s tiempo total, 20s tiempo centrifugado |
KilianPolkov | 0:8519ab8e8a30 | 427 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) MODO_estado = PROGRAMA_BEBE; |
KilianPolkov | 0:8519ab8e8a30 | 428 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) MODO_estado = ALGODON; |
KilianPolkov | 0:8519ab8e8a30 | 429 | break; |
KilianPolkov | 0:8519ab8e8a30 | 430 | } |
KilianPolkov | 0:8519ab8e8a30 | 431 | } |
KilianPolkov | 0:8519ab8e8a30 | 432 | |
KilianPolkov | 0:8519ab8e8a30 | 433 | /* -----maquina de estados para setear centrifugado (configura las RPM, si esta en 0 RPM es que no centrifuga)----- */ |
KilianPolkov | 0:8519ab8e8a30 | 434 | void CENTRIFUGADO_Step() { |
KilianPolkov | 0:8519ab8e8a30 | 435 | strcpy(fila1, "CONFIG: "); |
KilianPolkov | 0:8519ab8e8a30 | 436 | strcpy(fila2, "RPM SET:xx "); |
KilianPolkov | 0:8519ab8e8a30 | 437 | fila2[8] = (rpmSeteado / 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 438 | fila2[9] = (rpmSeteado % 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 439 | switch(CENTRIFUGADO_estado) { |
KilianPolkov | 0:8519ab8e8a30 | 440 | default: |
KilianPolkov | 0:8519ab8e8a30 | 441 | case RPM_OFF: |
KilianPolkov | 0:8519ab8e8a30 | 442 | rpmSeteado = RPM_OFF; |
KilianPolkov | 0:8519ab8e8a30 | 443 | pwm.pulsewidth_ms(RPM_OFF); |
KilianPolkov | 0:8519ab8e8a30 | 444 | tiempoCentrifugado = TIEMPO_OFF; |
KilianPolkov | 0:8519ab8e8a30 | 445 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) CENTRIFUGADO_estado = RPM_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 446 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) CENTRIFUGADO_estado = RPM_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 447 | break; |
KilianPolkov | 0:8519ab8e8a30 | 448 | case RPM_MIN: |
KilianPolkov | 0:8519ab8e8a30 | 449 | rpmSeteado = RPM_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 450 | pwm.pulsewidth_ms(RPM_MIN); |
KilianPolkov | 0:8519ab8e8a30 | 451 | tiempoCentrifugado = TIEMPO_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 452 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) CENTRIFUGADO_estado = RPM_OFF; |
KilianPolkov | 0:8519ab8e8a30 | 453 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) CENTRIFUGADO_estado = RPM_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 454 | break; |
KilianPolkov | 0:8519ab8e8a30 | 455 | case RPM_NORMAL: |
KilianPolkov | 0:8519ab8e8a30 | 456 | rpmSeteado = RPM_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 457 | pwm.pulsewidth_ms(RPM_NORMAL); |
KilianPolkov | 0:8519ab8e8a30 | 458 | tiempoCentrifugado = TIEMPO_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 459 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) CENTRIFUGADO_estado = RPM_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 460 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) CENTRIFUGADO_estado = RPM_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 461 | break; |
KilianPolkov | 0:8519ab8e8a30 | 462 | case RPM_MAX: |
KilianPolkov | 0:8519ab8e8a30 | 463 | rpmSeteado = RPM_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 464 | pwm.pulsewidth_ms(RPM_MAX); |
KilianPolkov | 0:8519ab8e8a30 | 465 | tiempoCentrifugado = TIEMPO_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 466 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) CENTRIFUGADO_estado = RPM_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 467 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) CENTRIFUGADO_estado = RPM_OFF; |
KilianPolkov | 0:8519ab8e8a30 | 468 | break; |
KilianPolkov | 0:8519ab8e8a30 | 469 | } |
KilianPolkov | 0:8519ab8e8a30 | 470 | } |
KilianPolkov | 0:8519ab8e8a30 | 471 | |
KilianPolkov | 0:8519ab8e8a30 | 472 | /* -----maquina de estados para setear temperatura (para configurar manualmente la temperatura en vez de utilizar los modos o programas)----- */ |
KilianPolkov | 0:8519ab8e8a30 | 473 | void TEMP_Step() { |
KilianPolkov | 0:8519ab8e8a30 | 474 | strcpy(fila1, "TEMP NOW:xxg "); |
KilianPolkov | 0:8519ab8e8a30 | 475 | fila1[9] = (temperaturaActual / 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 476 | fila1[10] = (temperaturaActual % 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 477 | fila1[11] = 0xDF; // para el simbolo de grado |
KilianPolkov | 0:8519ab8e8a30 | 478 | strcpy(fila2, "TEMP SET:xxg "); |
KilianPolkov | 0:8519ab8e8a30 | 479 | fila2[9] = (temperaturaSeteada / 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 480 | fila2[10] = (temperaturaSeteada % 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 481 | fila2[11] = 0xDF; // para el simbolo de grado |
KilianPolkov | 0:8519ab8e8a30 | 482 | switch(TEMP_estado) { |
KilianPolkov | 0:8519ab8e8a30 | 483 | default: |
KilianPolkov | 0:8519ab8e8a30 | 484 | case TEMP_MIN: |
KilianPolkov | 0:8519ab8e8a30 | 485 | temperaturaSeteada = TEMP_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 486 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 487 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_BAJA; |
KilianPolkov | 0:8519ab8e8a30 | 488 | break; |
KilianPolkov | 0:8519ab8e8a30 | 489 | case TEMP_BAJA: |
KilianPolkov | 0:8519ab8e8a30 | 490 | temperaturaSeteada = TEMP_BAJA; |
KilianPolkov | 0:8519ab8e8a30 | 491 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 492 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 493 | break; |
KilianPolkov | 0:8519ab8e8a30 | 494 | case TEMP_NORMAL: |
KilianPolkov | 0:8519ab8e8a30 | 495 | temperaturaSeteada = TEMP_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 496 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_BAJA; |
KilianPolkov | 0:8519ab8e8a30 | 497 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_ALTA; |
KilianPolkov | 0:8519ab8e8a30 | 498 | break; |
KilianPolkov | 0:8519ab8e8a30 | 499 | case TEMP_ALTA: |
KilianPolkov | 0:8519ab8e8a30 | 500 | temperaturaSeteada = TEMP_ALTA; |
KilianPolkov | 0:8519ab8e8a30 | 501 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 502 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 503 | break; |
KilianPolkov | 0:8519ab8e8a30 | 504 | case TEMP_MAX: |
KilianPolkov | 0:8519ab8e8a30 | 505 | temperaturaSeteada = TEMP_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 506 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_ALTA; |
KilianPolkov | 0:8519ab8e8a30 | 507 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TEMP_estado = TEMP_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 508 | break; |
KilianPolkov | 0:8519ab8e8a30 | 509 | } |
KilianPolkov | 0:8519ab8e8a30 | 510 | } |
KilianPolkov | 0:8519ab8e8a30 | 511 | |
KilianPolkov | 0:8519ab8e8a30 | 512 | /* -----maquina de estados para setear el tiempo diferido (cuando finaliza el ciclo de lavado)----- */ |
KilianPolkov | 0:8519ab8e8a30 | 513 | void TIEMPO_Step() { |
KilianPolkov | 0:8519ab8e8a30 | 514 | strcpy(fila1, "CONFIG: "); |
KilianPolkov | 0:8519ab8e8a30 | 515 | strcpy(fila2, "TIME SET:x "); |
KilianPolkov | 0:8519ab8e8a30 | 516 | fila2[9] = (tiempoDiferido / 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 517 | fila2[10] = (tiempoDiferido % 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 518 | switch(TIEMPO_estado) { |
KilianPolkov | 0:8519ab8e8a30 | 519 | default: |
KilianPolkov | 0:8519ab8e8a30 | 520 | case TIEMPO_FINAL_BAJO: |
KilianPolkov | 0:8519ab8e8a30 | 521 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_BAJO; |
KilianPolkov | 0:8519ab8e8a30 | 522 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 523 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 524 | break; |
KilianPolkov | 0:8519ab8e8a30 | 525 | case TIEMPO_FINAL_NORMAL: |
KilianPolkov | 0:8519ab8e8a30 | 526 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 527 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_MEDIO; |
KilianPolkov | 0:8519ab8e8a30 | 528 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_BAJO; |
KilianPolkov | 0:8519ab8e8a30 | 529 | break; |
KilianPolkov | 0:8519ab8e8a30 | 530 | case TIEMPO_FINAL_MEDIO: |
KilianPolkov | 0:8519ab8e8a30 | 531 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_MEDIO; |
KilianPolkov | 0:8519ab8e8a30 | 532 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_ALTO; |
KilianPolkov | 0:8519ab8e8a30 | 533 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 534 | break; |
KilianPolkov | 0:8519ab8e8a30 | 535 | case TIEMPO_FINAL_ALTO: |
KilianPolkov | 0:8519ab8e8a30 | 536 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_ALTO; |
KilianPolkov | 0:8519ab8e8a30 | 537 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 538 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_MEDIO; |
KilianPolkov | 0:8519ab8e8a30 | 539 | break; |
KilianPolkov | 0:8519ab8e8a30 | 540 | case TIEMPO_FINAL_MAX: |
KilianPolkov | 0:8519ab8e8a30 | 541 | tiempoSeteado = tiempoActual = tiempoDiferido = TIEMPO_FINAL_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 542 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_BAJO; |
KilianPolkov | 0:8519ab8e8a30 | 543 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) TIEMPO_estado = TIEMPO_FINAL_ALTO; |
KilianPolkov | 0:8519ab8e8a30 | 544 | break; |
KilianPolkov | 0:8519ab8e8a30 | 545 | } |
KilianPolkov | 0:8519ab8e8a30 | 546 | } |
KilianPolkov | 0:8519ab8e8a30 | 547 | |
KilianPolkov | 0:8519ab8e8a30 | 548 | /* -----maquina de estados para setear ciclos de enjuague----- */ |
KilianPolkov | 0:8519ab8e8a30 | 549 | void ENJUAGUE_Step() { |
KilianPolkov | 0:8519ab8e8a30 | 550 | strcpy(fila1, "CONFIG: "); |
KilianPolkov | 0:8519ab8e8a30 | 551 | strcpy(fila2, "TIME ENJUAGUE:xx"); |
KilianPolkov | 0:8519ab8e8a30 | 552 | fila2[14] = (tiempoEnjuague / 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 553 | fila2[15] = (tiempoEnjuague % 10) + 0x30; |
KilianPolkov | 0:8519ab8e8a30 | 554 | switch(ENJUAGUE_estado) { |
KilianPolkov | 0:8519ab8e8a30 | 555 | default: |
KilianPolkov | 0:8519ab8e8a30 | 556 | case TIEMPO_MIN: |
KilianPolkov | 0:8519ab8e8a30 | 557 | tiempoEnjuague = TIEMPO_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 558 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) ENJUAGUE_estado = TIEMPO_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 559 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) ENJUAGUE_estado = TIEMPO_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 560 | break; |
KilianPolkov | 0:8519ab8e8a30 | 561 | case TIEMPO_NORMAL: |
KilianPolkov | 0:8519ab8e8a30 | 562 | tiempoEnjuague = TIEMPO_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 563 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) ENJUAGUE_estado = TIEMPO_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 564 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) ENJUAGUE_estado = TIEMPO_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 565 | break; |
KilianPolkov | 0:8519ab8e8a30 | 566 | case TIEMPO_MAX: |
KilianPolkov | 0:8519ab8e8a30 | 567 | tiempoEnjuague = TIEMPO_MAX; |
KilianPolkov | 0:8519ab8e8a30 | 568 | if(PULS_Step(PULSUP, PULSUP_estado) == PULS_FLANCO_1) ENJUAGUE_estado = TIEMPO_MIN; |
KilianPolkov | 0:8519ab8e8a30 | 569 | if(PULS_Step(PULSDOWN, PULSDOWN_estado) == PULS_FLANCO_1) ENJUAGUE_estado = TIEMPO_NORMAL; |
KilianPolkov | 0:8519ab8e8a30 | 570 | break; |
KilianPolkov | 0:8519ab8e8a30 | 571 | } |
KilianPolkov | 0:8519ab8e8a30 | 572 | } |
KilianPolkov | 0:8519ab8e8a30 | 573 | |
KilianPolkov | 0:8519ab8e8a30 | 574 | /* -----maquina de estados para activar/desactivar el calentadorl----- */ |
KilianPolkov | 0:8519ab8e8a30 | 575 | void ACTUADOR_Step() { |
KilianPolkov | 0:8519ab8e8a30 | 576 | switch(ACTUADOR_estado) { |
KilianPolkov | 0:8519ab8e8a30 | 577 | default: |
KilianPolkov | 0:8519ab8e8a30 | 578 | case NO_CALENTAR: |
KilianPolkov | 0:8519ab8e8a30 | 579 | CALENTADOR = NO_CALENTAR; |
KilianPolkov | 0:8519ab8e8a30 | 580 | if(temperaturaActual < temperaturaSeteada) ACTUADOR_estado = CALENTAR; |
KilianPolkov | 0:8519ab8e8a30 | 581 | break; |
KilianPolkov | 0:8519ab8e8a30 | 582 | case CALENTAR: |
KilianPolkov | 0:8519ab8e8a30 | 583 | CALENTADOR = CALENTAR; |
KilianPolkov | 0:8519ab8e8a30 | 584 | if(temperaturaActual >= temperaturaSeteada) ACTUADOR_estado = NO_CALENTAR; |
KilianPolkov | 0:8519ab8e8a30 | 585 | break; |
KilianPolkov | 0:8519ab8e8a30 | 586 | } |
KilianPolkov | 0:8519ab8e8a30 | 587 | } |
KilianPolkov | 0:8519ab8e8a30 | 588 | |
KilianPolkov | 0:8519ab8e8a30 | 589 | /* -----maquina de estados para activar/desactivar el motor----- */ |
KilianPolkov | 0:8519ab8e8a30 | 590 | void MOTOR_Step() { |
KilianPolkov | 0:8519ab8e8a30 | 591 | switch(MOTOR_estado) { |
KilianPolkov | 0:8519ab8e8a30 | 592 | default: |
KilianPolkov | 0:8519ab8e8a30 | 593 | case NO_GIRAR: |
KilianPolkov | 0:8519ab8e8a30 | 594 | MOTOR = NO_GIRAR; |
KilianPolkov | 0:8519ab8e8a30 | 595 | break; |
KilianPolkov | 0:8519ab8e8a30 | 596 | case GIRAR: |
KilianPolkov | 0:8519ab8e8a30 | 597 | MOTOR = GIRAR; |
KilianPolkov | 0:8519ab8e8a30 | 598 | break; |
KilianPolkov | 0:8519ab8e8a30 | 599 | } |
KilianPolkov | 0:8519ab8e8a30 | 600 | } |
KilianPolkov | 0:8519ab8e8a30 | 601 | |
KilianPolkov | 0:8519ab8e8a30 | 602 | /* -----maquina de estados para detectar el flanco de los pulsadores----- */ |
KilianPolkov | 0:8519ab8e8a30 | 603 | BYTE PULS_Step(BYTE PULSADOR, BYTE& estado) { |
KilianPolkov | 0:8519ab8e8a30 | 604 | switch(estado){ |
KilianPolkov | 0:8519ab8e8a30 | 605 | default: |
KilianPolkov | 0:8519ab8e8a30 | 606 | case PULS_NO_APRETADO: |
KilianPolkov | 0:8519ab8e8a30 | 607 | if(PULSADOR == APRETADO && PULS_tout == 0){ |
KilianPolkov | 0:8519ab8e8a30 | 608 | estado = PULS_FLANCO_1; |
KilianPolkov | 0:8519ab8e8a30 | 609 | PULS_tout = 5; // 5ms de espera |
KilianPolkov | 0:8519ab8e8a30 | 610 | } |
KilianPolkov | 0:8519ab8e8a30 | 611 | break; |
KilianPolkov | 0:8519ab8e8a30 | 612 | case PULS_FLANCO_1: |
KilianPolkov | 0:8519ab8e8a30 | 613 | if(PULSADOR == APRETADO && PULS_tout == 0){ |
KilianPolkov | 0:8519ab8e8a30 | 614 | estado = PULS_APRETADO; |
KilianPolkov | 0:8519ab8e8a30 | 615 | PULS_tout = 5; // 5ms de espera |
KilianPolkov | 0:8519ab8e8a30 | 616 | } |
KilianPolkov | 0:8519ab8e8a30 | 617 | if(PULSADOR == NO_APRETADO && PULS_tout == 0){ |
KilianPolkov | 0:8519ab8e8a30 | 618 | estado = PULS_NO_APRETADO; |
KilianPolkov | 0:8519ab8e8a30 | 619 | PULS_tout = 5; // 5ms de espera |
KilianPolkov | 0:8519ab8e8a30 | 620 | } |
KilianPolkov | 0:8519ab8e8a30 | 621 | break; |
KilianPolkov | 0:8519ab8e8a30 | 622 | case PULS_APRETADO: |
KilianPolkov | 0:8519ab8e8a30 | 623 | if(PULSADOR == NO_APRETADO && PULS_tout == 0){ |
KilianPolkov | 0:8519ab8e8a30 | 624 | estado = PULS_NO_APRETADO; |
KilianPolkov | 0:8519ab8e8a30 | 625 | PULS_tout = 5; //5ms de espera |
KilianPolkov | 0:8519ab8e8a30 | 626 | } |
KilianPolkov | 0:8519ab8e8a30 | 627 | break; |
KilianPolkov | 0:8519ab8e8a30 | 628 | } |
KilianPolkov | 0:8519ab8e8a30 | 629 | return estado; |
KilianPolkov | 0:8519ab8e8a30 | 630 | } |
KilianPolkov | 0:8519ab8e8a30 | 631 | |
KilianPolkov | 0:8519ab8e8a30 | 632 | /* -----escribe un byte----- */ |
KilianPolkov | 0:8519ab8e8a30 | 633 | void LCD_wr( BYTE dato ) { |
KilianPolkov | 0:8519ab8e8a30 | 634 | dato = dato & 0xF0; // hace una mascara con 0b11110000 para que queda los 4 MSB |
KilianPolkov | 0:8519ab8e8a30 | 635 | do{ |
KilianPolkov | 0:8519ab8e8a30 | 636 | i2c.start(); |
KilianPolkov | 0:8519ab8e8a30 | 637 | i2c_error = i2c.write( address ); |
KilianPolkov | 0:8519ab8e8a30 | 638 | }while( i2c_error == 0 ); /* espera fin ciclo escritura (ACK polling) */ |
KilianPolkov | 0:8519ab8e8a30 | 639 | /* Primero mando los 4 bits mas significativos */ |
KilianPolkov | 0:8519ab8e8a30 | 640 | i2c.write( dato | 0x09 ); // esta mascara pone BACKLIGHT = 1, ENABLE = 0, RW = 0, RESET = 1 |
KilianPolkov | 0:8519ab8e8a30 | 641 | i2c.write( dato | 0x0D ); // esta mascara pone BACKLIGHT = 1, ENABLE = 1, RW = 0, RESET = 1 |
KilianPolkov | 0:8519ab8e8a30 | 642 | i2c.write( dato | 0x09 ); // esta mascara pone BACKLIGHT = 1, ENABLE = 0, RW = 0, RESET = 1 |
KilianPolkov | 0:8519ab8e8a30 | 643 | /* Mando STOP */ |
KilianPolkov | 0:8519ab8e8a30 | 644 | i2c.stop(); |
KilianPolkov | 0:8519ab8e8a30 | 645 | } |
KilianPolkov | 0:8519ab8e8a30 | 646 | |
KilianPolkov | 0:8519ab8e8a30 | 647 | /* -----escribe 4 MSB, luego 4 LSB, si reset = 1 es porque manda un caracter, si reset = 0 configura registro----- */ |
KilianPolkov | 0:8519ab8e8a30 | 648 | void LCD_send(BYTE data, BYTE reset) { |
KilianPolkov | 0:8519ab8e8a30 | 649 | BYTE DataHIGH, DataLOW; |
KilianPolkov | 0:8519ab8e8a30 | 650 | DataHIGH = data & 0xF0; // hace una mascara con 0b11110000 para que queda los 4 MSB |
KilianPolkov | 0:8519ab8e8a30 | 651 | DataLOW = ( data << 4 ) & 0xF0; // mueve los 4 LSB a la izquierda |
KilianPolkov | 0:8519ab8e8a30 | 652 | do{ |
KilianPolkov | 0:8519ab8e8a30 | 653 | i2c.start(); |
KilianPolkov | 0:8519ab8e8a30 | 654 | i2c_error = i2c.write( address ); |
KilianPolkov | 0:8519ab8e8a30 | 655 | }while( i2c_error == 0 ); /* espera fin ciclo escritura (ACK polling) */ |
KilianPolkov | 0:8519ab8e8a30 | 656 | /* primero mando los 4 bits mas significativos */ |
KilianPolkov | 0:8519ab8e8a30 | 657 | i2c.write( DataHIGH | ( 0x0C | reset ) ); // esta mascara pone BACKLIGHT = 1, ENABLE = 1, RW = 0, RESET = X |
KilianPolkov | 0:8519ab8e8a30 | 658 | i2c.write( DataHIGH | ( 0x08 | reset ) ); // esta mascara pone BACKLIGHT = 1, ENABLE = 0, RW = 0, RESET = X |
KilianPolkov | 0:8519ab8e8a30 | 659 | /* despues mando los 4 bits menos significativos */ |
KilianPolkov | 0:8519ab8e8a30 | 660 | i2c.write( DataLOW | ( 0x0C | reset ) ); // esta mascara pone BACKLIGHT = 1, ENABLE = 1, RW = 0, RESET = X |
KilianPolkov | 0:8519ab8e8a30 | 661 | i2c.write( DataLOW | ( 0x08 | reset ) ); // esta mascara pone BACKLIGHT = 1, ENABLE = 0, RW = 0, RESET = X |
KilianPolkov | 0:8519ab8e8a30 | 662 | i2c.write( DataLOW | 0x0C ); // esta mascara pone BACKLIGHT = 1, ENABLE = 1, RW = 0, RESET = 0 |
KilianPolkov | 0:8519ab8e8a30 | 663 | /* mando STOP */ |
KilianPolkov | 0:8519ab8e8a30 | 664 | i2c.stop(); |
KilianPolkov | 0:8519ab8e8a30 | 665 | } |
KilianPolkov | 0:8519ab8e8a30 | 666 | |
KilianPolkov | 0:8519ab8e8a30 | 667 | /* -----inicializacion LCD----- */ |
KilianPolkov | 0:8519ab8e8a30 | 668 | void LCD_init() { |
KilianPolkov | 0:8519ab8e8a30 | 669 | i2c.frequency(300000); |
KilianPolkov | 0:8519ab8e8a30 | 670 | wait(0.4); |
KilianPolkov | 0:8519ab8e8a30 | 671 | LCD_wr( 0x30 ); |
KilianPolkov | 0:8519ab8e8a30 | 672 | LCD_wr( 0x30 ); |
KilianPolkov | 0:8519ab8e8a30 | 673 | LCD_wr( 0x30 ); |
KilianPolkov | 0:8519ab8e8a30 | 674 | LCD_wr( 0x20 ); /* --- modo 4 bit --- */ |
KilianPolkov | 0:8519ab8e8a30 | 675 | LCD_send( 0x28 , CMND ); /* --- modo 4b - 2 lin - car 5x7 --- */ |
KilianPolkov | 0:8519ab8e8a30 | 676 | LCD_send( 0x08 , CMND ); /* --- apaga display --- */ |
KilianPolkov | 0:8519ab8e8a30 | 677 | LCD_send( 0x01 , CMND ); /* --- clear --- */ |
KilianPolkov | 0:8519ab8e8a30 | 678 | wait(0.2); |
KilianPolkov | 0:8519ab8e8a30 | 679 | LCD_send( 0x0C , CMND ); /* --- disp on - cur off - blink off --- */ |
KilianPolkov | 0:8519ab8e8a30 | 680 | LCD_send( 0x06 , CMND ); /* --- inc - no scroll --- */ |
KilianPolkov | 0:8519ab8e8a30 | 681 | pc.printf("DISPLAY INICIALIZADO\n"); |
KilianPolkov | 0:8519ab8e8a30 | 682 | } |
KilianPolkov | 0:8519ab8e8a30 | 683 | |
KilianPolkov | 0:8519ab8e8a30 | 684 | /* -----muestra string en el display LCD----- */ |
KilianPolkov | 0:8519ab8e8a30 | 685 | void printstr(char* s) { |
KilianPolkov | 0:8519ab8e8a30 | 686 | /* recorre el vector s (el string parametro de la funcion), hasta que llega al final "\0" */ |
KilianPolkov | 0:8519ab8e8a30 | 687 | for (char i = 0; s[i] != '\0'; i++) LCD_send(s[i], DATA); |
KilianPolkov | 0:8519ab8e8a30 | 688 | } |
KilianPolkov | 0:8519ab8e8a30 | 689 | |
KilianPolkov | 0:8519ab8e8a30 | 690 | /* -----muestra en el display LCD los vectores fila1 y fila2----- */ |
KilianPolkov | 0:8519ab8e8a30 | 691 | void LCD_print() { |
KilianPolkov | 0:8519ab8e8a30 | 692 | LCD_send( 0x80 , CMND ); // posiciona en columna de arriba, y en la primer linea |
KilianPolkov | 0:8519ab8e8a30 | 693 | printstr(fila1); // una vez posicionado, muestra el texto en la fila 1 |
KilianPolkov | 0:8519ab8e8a30 | 694 | LCD_send( 0xC0 , CMND ); // posiciona en columna de abajo, y en la segunda linea |
KilianPolkov | 0:8519ab8e8a30 | 695 | printstr(fila2); // una vez posicionado, muestra el texto en la fila 2 |
KilianPolkov | 0:8519ab8e8a30 | 696 | } |