RODRIGUEZ STINA OROPEZA 6ºA

Dependencies:   mbed tsi_sensor DHT11

Committer:
matirodriguez
Date:
Wed Jun 12 18:09:04 2019 +0000
Revision:
0:374ae6cd7a56
EJERCICIO 1 TERMINADO;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
matirodriguez 0:374ae6cd7a56 1 #include "mbed.h"
matirodriguez 0:374ae6cd7a56 2 #include "tsi_sensor.h"
matirodriguez 0:374ae6cd7a56 3 #include "Dht11.h"
matirodriguez 0:374ae6cd7a56 4
matirodriguez 0:374ae6cd7a56 5 #define ELEC0 9
matirodriguez 0:374ae6cd7a56 6 #define ELEC1 10
matirodriguez 0:374ae6cd7a56 7
matirodriguez 0:374ae6cd7a56 8 enum {RESET, // Funcion enum que uso para establecer los estados de la maquina de estados como una palabra
matirodriguez 0:374ae6cd7a56 9 LAZO_ABIERTO,
matirodriguez 0:374ae6cd7a56 10 LAZO_CERRADO
matirodriguez 0:374ae6cd7a56 11 };
matirodriguez 0:374ae6cd7a56 12 enum { NADA, // Funcion enum que uso para establecer los estados de la maquina de estados como una palabra
matirodriguez 0:374ae6cd7a56 13 PULSADO
matirodriguez 0:374ae6cd7a56 14 };
matirodriguez 0:374ae6cd7a56 15
matirodriguez 0:374ae6cd7a56 16 // Prototipos de funciones
matirodriguez 0:374ae6cd7a56 17
matirodriguez 0:374ae6cd7a56 18 void MAQ_cooler(); // Maquina de estados que maneja al cooler en sus modos de funcionamiento
matirodriguez 0:374ae6cd7a56 19
matirodriguez 0:374ae6cd7a56 20 void set_motor(); // Funcion que cada 1 segundo cambia el valor del PWM del motor, para no hacerlo a la velocidad del clock en el main
matirodriguez 0:374ae6cd7a56 21
matirodriguez 0:374ae6cd7a56 22 void interrupcion(); // Funcion que se realiza cada vez que el pin establecido tenga un flanco. Usado para calcular los RPM
matirodriguez 0:374ae6cd7a56 23
matirodriguez 0:374ae6cd7a56 24 void rpm_segundos(); // Funcion que multiplicará las revoluciones por segundo para obtener las RPM
matirodriguez 0:374ae6cd7a56 25
matirodriguez 0:374ae6cd7a56 26 void MAQ_lecturaTSI(); //Prototipo funcion para solo leer 1 vez que se presiona el TSI
matirodriguez 0:374ae6cd7a56 27
matirodriguez 0:374ae6cd7a56 28 void LEER_TSI(); //Prototipo funcion para guardar el valor analogico del TSI en todo momento
matirodriguez 0:374ae6cd7a56 29
matirodriguez 0:374ae6cd7a56 30 void pulsacion_TSI(); //Prototipo funcion para leer 1 solo valor del TSI cada 2.5mseg
matirodriguez 0:374ae6cd7a56 31
matirodriguez 0:374ae6cd7a56 32 void medir_temperatura(); // Funcion para leer el sensor de temperatura, en el tiempo especificado en datasheet
matirodriguez 0:374ae6cd7a56 33
matirodriguez 0:374ae6cd7a56 34
matirodriguez 0:374ae6cd7a56 35 // Configuracion de puertos
matirodriguez 0:374ae6cd7a56 36
matirodriguez 0:374ae6cd7a56 37 TSIAnalogSlider tsi(ELEC0, ELEC1, 40); // TSI
matirodriguez 0:374ae6cd7a56 38
matirodriguez 0:374ae6cd7a56 39 InterruptIn velocidad(PTA13); // Sensor de rpm
matirodriguez 0:374ae6cd7a56 40
matirodriguez 0:374ae6cd7a56 41 PwmOut cooler(PTB3); // Base del transistor que maneja el cooler
matirodriguez 0:374ae6cd7a56 42
matirodriguez 0:374ae6cd7a56 43 AnalogIn pote(PTB0); // Potenciometro
matirodriguez 0:374ae6cd7a56 44
matirodriguez 0:374ae6cd7a56 45 Dht11 sensor(PTD4); // Sensor DHT11 (libreria)
matirodriguez 0:374ae6cd7a56 46
matirodriguez 0:374ae6cd7a56 47 DigitalOut ledrojo(LED_RED); // Led rojo de la placa MBED
matirodriguez 0:374ae6cd7a56 48
matirodriguez 0:374ae6cd7a56 49 DigitalOut ledverde(LED_GREEN); // Led verde de la placa MBED
matirodriguez 0:374ae6cd7a56 50
matirodriguez 0:374ae6cd7a56 51
matirodriguez 0:374ae6cd7a56 52 // Variables globales
matirodriguez 0:374ae6cd7a56 53
matirodriguez 0:374ae6cd7a56 54 int auxiliar_rpm; // Variable que almacena las revoluciones por segundo
matirodriguez 0:374ae6cd7a56 55 int rpm; // Variable que guarda los rpm para medirlos periodicamente
matirodriguez 0:374ae6cd7a56 56
matirodriguez 0:374ae6cd7a56 57 int var_pulsacion = 25; // Variable para contar los 2.5mseg de la funcion pulsacion_TSI()
matirodriguez 0:374ae6cd7a56 58 int teclado = NADA; // Variable que contiene el valor analogico del TSI en todo momento
matirodriguez 0:374ae6cd7a56 59 int ingreso = NADA; // Variable que contiene si se presionó el TSI, que se lee y luego se borra
matirodriguez 0:374ae6cd7a56 60
matirodriguez 0:374ae6cd7a56 61 int estado_maq_cooler = RESET; // Estado de la maquina de estados que maneja el cooler
matirodriguez 0:374ae6cd7a56 62 int estado_maq_tsi = NADA; // Estado de la maquina de estados que maneja el TSI
matirodriguez 0:374ae6cd7a56 63
matirodriguez 0:374ae6cd7a56 64 int auxiliar_temperatura; // Variable que contiene el ultimo valor de temperatura que se midio
matirodriguez 0:374ae6cd7a56 65 float auxiliar_velocidad; // Variable que contiene el numero float (de 0 a 1) para ingresar en el PWM del cooler
matirodriguez 0:374ae6cd7a56 66
matirodriguez 0:374ae6cd7a56 67
matirodriguez 0:374ae6cd7a56 68 // Tickers
matirodriguez 0:374ae6cd7a56 69
matirodriguez 0:374ae6cd7a56 70 Ticker lectura; // Ticker lectura del TSI
matirodriguez 0:374ae6cd7a56 71 Ticker pulsacion; // Ticker para usar la funcion pulsacion_TSI()
matirodriguez 0:374ae6cd7a56 72 Ticker segundo; // Ticker para contar los RPM a partir de las revoluciones por segundo
matirodriguez 0:374ae6cd7a56 73 Ticker pwm_cooler; // Ticker para escribir en la salida PWM cada cierto tiempo
matirodriguez 0:374ae6cd7a56 74 Ticker medir; // Ticker para medir la temperatura
matirodriguez 0:374ae6cd7a56 75
matirodriguez 0:374ae6cd7a56 76 int main(void)
matirodriguez 0:374ae6cd7a56 77 {
matirodriguez 0:374ae6cd7a56 78 medir_temperatura(); // Mido la temperatura así tengo un valor inicial
matirodriguez 0:374ae6cd7a56 79
matirodriguez 0:374ae6cd7a56 80 // Junto los ticker con la funcion que deseo usar con él
matirodriguez 0:374ae6cd7a56 81 lectura.attach(&LEER_TSI,0.1);
matirodriguez 0:374ae6cd7a56 82 pulsacion.attach(&pulsacion_TSI,0.001);
matirodriguez 0:374ae6cd7a56 83 segundo.attach(&rpm_segundos,1);
matirodriguez 0:374ae6cd7a56 84 pwm_cooler.attach(&set_motor,0.3);
matirodriguez 0:374ae6cd7a56 85 medir.attach(&medir_temperatura,2);
matirodriguez 0:374ae6cd7a56 86
matirodriguez 0:374ae6cd7a56 87 // Digo que funcion se realiza cuando el pininterrupt se activa
matirodriguez 0:374ae6cd7a56 88 velocidad.rise(&interrupcion);
matirodriguez 0:374ae6cd7a56 89
matirodriguez 0:374ae6cd7a56 90 while (true) {
matirodriguez 0:374ae6cd7a56 91
matirodriguez 0:374ae6cd7a56 92 // LLamo constantemente a las funciones de las maquinas de estados
matirodriguez 0:374ae6cd7a56 93 MAQ_lecturaTSI();
matirodriguez 0:374ae6cd7a56 94 MAQ_cooler();
matirodriguez 0:374ae6cd7a56 95
matirodriguez 0:374ae6cd7a56 96
matirodriguez 0:374ae6cd7a56 97 }
matirodriguez 0:374ae6cd7a56 98 }
matirodriguez 0:374ae6cd7a56 99
matirodriguez 0:374ae6cd7a56 100 void medir_temperatura()
matirodriguez 0:374ae6cd7a56 101 {
matirodriguez 0:374ae6cd7a56 102 sensor.read(); // Actualizo el valor de temperatura del sensor
matirodriguez 0:374ae6cd7a56 103 auxiliar_temperatura = sensor.getCelsius(); // Guardo el valor de temperatura en la variable correspondiente
matirodriguez 0:374ae6cd7a56 104 }
matirodriguez 0:374ae6cd7a56 105
matirodriguez 0:374ae6cd7a56 106 void MAQ_cooler()
matirodriguez 0:374ae6cd7a56 107 {
matirodriguez 0:374ae6cd7a56 108 int revoluciones; // Variable que usaré para calcular los RPM a partir del valor del PWM
matirodriguez 0:374ae6cd7a56 109
matirodriguez 0:374ae6cd7a56 110
matirodriguez 0:374ae6cd7a56 111 switch(estado_maq_cooler) {
matirodriguez 0:374ae6cd7a56 112
matirodriguez 0:374ae6cd7a56 113 case RESET: // No empiezo en ningun modo asi no se consume corriente recien prendo el micro
matirodriguez 0:374ae6cd7a56 114 if(ingreso == PULSADO) { // Si se tocó el pulsador:
matirodriguez 0:374ae6cd7a56 115 ingreso=NADA; // Limpio la variable
matirodriguez 0:374ae6cd7a56 116 estado_maq_cooler = LAZO_ABIERTO; // Cambio de estado
matirodriguez 0:374ae6cd7a56 117 }
matirodriguez 0:374ae6cd7a56 118 break;
matirodriguez 0:374ae6cd7a56 119 case LAZO_ABIERTO:
matirodriguez 0:374ae6cd7a56 120
matirodriguez 0:374ae6cd7a56 121 auxiliar_velocidad = pote + 0.065; // El valor del PWM será el valor del pote, sumado al valor minimo para que prenda
matirodriguez 0:374ae6cd7a56 122 // el cooler. No uso 200 RPM porque el ventilador no enciende de esa forma.
matirodriguez 0:374ae6cd7a56 123
matirodriguez 0:374ae6cd7a56 124 // Corrigo el valor que hay en la salida si se detecta que bajaron los RPM
matirodriguez 0:374ae6cd7a56 125 if(rpm < (auxiliar_velocidad * 8000)) {
matirodriguez 0:374ae6cd7a56 126 auxiliar_velocidad=auxiliar_velocidad+0.1;
matirodriguez 0:374ae6cd7a56 127 } else {
matirodriguez 0:374ae6cd7a56 128 auxiliar_velocidad=auxiliar_velocidad-0.005;
matirodriguez 0:374ae6cd7a56 129 }
matirodriguez 0:374ae6cd7a56 130
matirodriguez 0:374ae6cd7a56 131 if(auxiliar_velocidad>(float)1) {
matirodriguez 0:374ae6cd7a56 132 auxiliar_velocidad=(float)1;
matirodriguez 0:374ae6cd7a56 133 }
matirodriguez 0:374ae6cd7a56 134
matirodriguez 0:374ae6cd7a56 135 // Transicion de la maquina de estados
matirodriguez 0:374ae6cd7a56 136 if(ingreso == PULSADO) {
matirodriguez 0:374ae6cd7a56 137 ingreso=NADA;
matirodriguez 0:374ae6cd7a56 138 estado_maq_cooler = LAZO_CERRADO;
matirodriguez 0:374ae6cd7a56 139 }
matirodriguez 0:374ae6cd7a56 140
matirodriguez 0:374ae6cd7a56 141 break;
matirodriguez 0:374ae6cd7a56 142
matirodriguez 0:374ae6cd7a56 143 case LAZO_CERRADO:
matirodriguez 0:374ae6cd7a56 144
matirodriguez 0:374ae6cd7a56 145 revoluciones = (auxiliar_temperatura * 8000) / 45; // Regla de 3 para calcular las revoluciones por minuto
matirodriguez 0:374ae6cd7a56 146 // que corresponden para la temperatura medida
matirodriguez 0:374ae6cd7a56 147
matirodriguez 0:374ae6cd7a56 148
matirodriguez 0:374ae6cd7a56 149 if(auxiliar_temperatura<20) { // Cuando la temperatura es mas baja que 20, seteo en el valor minimo del ventilador
matirodriguez 0:374ae6cd7a56 150 auxiliar_velocidad = 0.065;
matirodriguez 0:374ae6cd7a56 151
matirodriguez 0:374ae6cd7a56 152 // Corrigo el valor que hay en la salida si se detecta que bajaron los RPM
matirodriguez 0:374ae6cd7a56 153 if(rpm < (auxiliar_velocidad * 8000)) {
matirodriguez 0:374ae6cd7a56 154 auxiliar_velocidad=auxiliar_velocidad+0.05;
matirodriguez 0:374ae6cd7a56 155 } else {
matirodriguez 0:374ae6cd7a56 156 auxiliar_velocidad=auxiliar_velocidad-0.005;
matirodriguez 0:374ae6cd7a56 157 }
matirodriguez 0:374ae6cd7a56 158 }
matirodriguez 0:374ae6cd7a56 159
matirodriguez 0:374ae6cd7a56 160
matirodriguez 0:374ae6cd7a56 161 if((auxiliar_temperatura>=20)&&(auxiliar_temperatura<45)) { // Dentro de este rango de temperatura, las RPM estan dadas
matirodriguez 0:374ae6cd7a56 162 // por una regla de 3 simple
matirodriguez 0:374ae6cd7a56 163 auxiliar_velocidad = (revoluciones * 1) / (float)8000;
matirodriguez 0:374ae6cd7a56 164
matirodriguez 0:374ae6cd7a56 165 // Corrigo el valor que hay en la salida si se detecta que bajaron los RPM
matirodriguez 0:374ae6cd7a56 166 if(rpm < (auxiliar_velocidad * 8000)) {
matirodriguez 0:374ae6cd7a56 167 auxiliar_velocidad=auxiliar_velocidad+0.075;
matirodriguez 0:374ae6cd7a56 168 } else {
matirodriguez 0:374ae6cd7a56 169 auxiliar_velocidad=auxiliar_velocidad-0.0005;
matirodriguez 0:374ae6cd7a56 170 }
matirodriguez 0:374ae6cd7a56 171
matirodriguez 0:374ae6cd7a56 172 if(auxiliar_velocidad>(float)1) {
matirodriguez 0:374ae6cd7a56 173 auxiliar_velocidad=(float)1;
matirodriguez 0:374ae6cd7a56 174 }
matirodriguez 0:374ae6cd7a56 175
matirodriguez 0:374ae6cd7a56 176 }
matirodriguez 0:374ae6cd7a56 177
matirodriguez 0:374ae6cd7a56 178 if(auxiliar_temperatura >= 45) { // Si la temperatura es mas alta que la maxima, el cooler se encuentra al maximo de potencia
matirodriguez 0:374ae6cd7a56 179 auxiliar_velocidad = 1;
matirodriguez 0:374ae6cd7a56 180 }
matirodriguez 0:374ae6cd7a56 181
matirodriguez 0:374ae6cd7a56 182 // Transicion de la maquina de estados
matirodriguez 0:374ae6cd7a56 183 if(ingreso == PULSADO) {
matirodriguez 0:374ae6cd7a56 184 ingreso=NADA;
matirodriguez 0:374ae6cd7a56 185 estado_maq_cooler = LAZO_ABIERTO;
matirodriguez 0:374ae6cd7a56 186 }
matirodriguez 0:374ae6cd7a56 187 break;
matirodriguez 0:374ae6cd7a56 188 }
matirodriguez 0:374ae6cd7a56 189 }
matirodriguez 0:374ae6cd7a56 190
matirodriguez 0:374ae6cd7a56 191 void interrupcion()
matirodriguez 0:374ae6cd7a56 192 {
matirodriguez 0:374ae6cd7a56 193 auxiliar_rpm++; // Valor para calcular los RPM, contiene las revoluciones por segundo que luego se multiplicarán por 60
matirodriguez 0:374ae6cd7a56 194 }
matirodriguez 0:374ae6cd7a56 195
matirodriguez 0:374ae6cd7a56 196 void rpm_segundos()
matirodriguez 0:374ae6cd7a56 197 {
matirodriguez 0:374ae6cd7a56 198
matirodriguez 0:374ae6cd7a56 199 rpm = auxiliar_rpm * 60; // Las RPM son igual a las revoluciones por segundo * 60 segundos
matirodriguez 0:374ae6cd7a56 200
matirodriguez 0:374ae6cd7a56 201 auxiliar_rpm = 0; // Reseteo la variable para una nueva medicion
matirodriguez 0:374ae6cd7a56 202
matirodriguez 0:374ae6cd7a56 203 // Imprimo en pantalla el valor actual de RPM, la temperatura actual y el modo en el que se está trabajando. Este mismo
matirodriguez 0:374ae6cd7a56 204 // depende del estado de la maquina de estados, asi que aplico ese metodo para imprimir en pantalla. Tambien, prendo un
matirodriguez 0:374ae6cd7a56 205 // led distinto para cada modo de trabajo.
matirodriguez 0:374ae6cd7a56 206
matirodriguez 0:374ae6cd7a56 207 printf("RPM: %i , ",rpm);
matirodriguez 0:374ae6cd7a56 208 printf("T: %i\n",auxiliar_temperatura);
matirodriguez 0:374ae6cd7a56 209
matirodriguez 0:374ae6cd7a56 210 switch(estado_maq_cooler) {
matirodriguez 0:374ae6cd7a56 211 case LAZO_ABIERTO:
matirodriguez 0:374ae6cd7a56 212 printf("Lazo abierto\n");
matirodriguez 0:374ae6cd7a56 213 ledverde = 0;
matirodriguez 0:374ae6cd7a56 214 ledrojo = 1;
matirodriguez 0:374ae6cd7a56 215 break;
matirodriguez 0:374ae6cd7a56 216 case LAZO_CERRADO:
matirodriguez 0:374ae6cd7a56 217 printf("Lazo cerrado\n");
matirodriguez 0:374ae6cd7a56 218 ledverde = 1;
matirodriguez 0:374ae6cd7a56 219 ledrojo = 0;
matirodriguez 0:374ae6cd7a56 220 break;
matirodriguez 0:374ae6cd7a56 221 }
matirodriguez 0:374ae6cd7a56 222
matirodriguez 0:374ae6cd7a56 223 }
matirodriguez 0:374ae6cd7a56 224
matirodriguez 0:374ae6cd7a56 225 void set_motor()
matirodriguez 0:374ae6cd7a56 226 {
matirodriguez 0:374ae6cd7a56 227 // Seteo en la salida PWM el valor que corresponde, que ya se guardó en la maquina de estados
matirodriguez 0:374ae6cd7a56 228 cooler.period(0.5f);
matirodriguez 0:374ae6cd7a56 229 cooler.write(auxiliar_velocidad);
matirodriguez 0:374ae6cd7a56 230
matirodriguez 0:374ae6cd7a56 231 }
matirodriguez 0:374ae6cd7a56 232
matirodriguez 0:374ae6cd7a56 233 void LEER_TSI()
matirodriguez 0:374ae6cd7a56 234 {
matirodriguez 0:374ae6cd7a56 235 float auxiliar = 0;
matirodriguez 0:374ae6cd7a56 236 auxiliar = tsi.readPercentage(); //Guardo de manera auxiliar el valor entre 0 y 1 del TSI
matirodriguez 0:374ae6cd7a56 237
matirodriguez 0:374ae6cd7a56 238 // Asocio el valor del tsi numerico con un color, dividiendo en 4 valores posibles (0, <0.33, <0.66, <1)
matirodriguez 0:374ae6cd7a56 239 if(auxiliar >= 0) {
matirodriguez 0:374ae6cd7a56 240 teclado = NADA;
matirodriguez 0:374ae6cd7a56 241 }
matirodriguez 0:374ae6cd7a56 242 if((auxiliar > 0.05)&&(auxiliar <= 1)) {
matirodriguez 0:374ae6cd7a56 243 teclado = PULSADO;
matirodriguez 0:374ae6cd7a56 244 }
matirodriguez 0:374ae6cd7a56 245 }
matirodriguez 0:374ae6cd7a56 246
matirodriguez 0:374ae6cd7a56 247 void pulsacion_TSI()
matirodriguez 0:374ae6cd7a56 248 {
matirodriguez 0:374ae6cd7a56 249 if(var_pulsacion > 0) {
matirodriguez 0:374ae6cd7a56 250 var_pulsacion--;
matirodriguez 0:374ae6cd7a56 251 }
matirodriguez 0:374ae6cd7a56 252 }
matirodriguez 0:374ae6cd7a56 253
matirodriguez 0:374ae6cd7a56 254 void MAQ_lecturaTSI()
matirodriguez 0:374ae6cd7a56 255 {
matirodriguez 0:374ae6cd7a56 256 if(var_pulsacion < 1) { // Si se llegaron a los 2.5ms:
matirodriguez 0:374ae6cd7a56 257
matirodriguez 0:374ae6cd7a56 258 var_pulsacion = 25; // Vuelvo a establecer 2.5ms para el proximo ciclo
matirodriguez 0:374ae6cd7a56 259
matirodriguez 0:374ae6cd7a56 260 switch(estado_maq_tsi) {
matirodriguez 0:374ae6cd7a56 261 case NADA:
matirodriguez 0:374ae6cd7a56 262 ingreso = NADA; // La variable ingreso, salvo en el caso especifico, siempre se encontrará en NADA
matirodriguez 0:374ae6cd7a56 263
matirodriguez 0:374ae6cd7a56 264 if(teclado==PULSADO) {
matirodriguez 0:374ae6cd7a56 265 estado_maq_tsi = PULSADO;
matirodriguez 0:374ae6cd7a56 266 ingreso = PULSADO; // El valor del TSI lo cambio en la transicion entre estados para asegurarme que solo se pueda leer 1 vez
matirodriguez 0:374ae6cd7a56 267 }
matirodriguez 0:374ae6cd7a56 268 break;
matirodriguez 0:374ae6cd7a56 269
matirodriguez 0:374ae6cd7a56 270 case PULSADO:
matirodriguez 0:374ae6cd7a56 271 if(teclado == NADA) {
matirodriguez 0:374ae6cd7a56 272 estado_maq_tsi = NADA;
matirodriguez 0:374ae6cd7a56 273 }
matirodriguez 0:374ae6cd7a56 274 break;
matirodriguez 0:374ae6cd7a56 275 }
matirodriguez 0:374ae6cd7a56 276 }
matirodriguez 0:374ae6cd7a56 277 }