EJERCICIO 1 - TERMINADO - SOTELO - D´ANDREA

Dependencies:   mbed tsi_sensor DHT11

Committer:
feede_dandrea
Date:
Tue Jun 18 13:49:41 2019 +0000
Revision:
0:39a6762ddcc1
EJERCICIO 1 - TERMINADO;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feede_dandrea 0:39a6762ddcc1 1 //TRABAJO PRACTICO 1 - COOLER
feede_dandrea 0:39a6762ddcc1 2
feede_dandrea 0:39a6762ddcc1 3 #include "mbed.h"
feede_dandrea 0:39a6762ddcc1 4 #include <stdlib.h> /* srand, rand */
feede_dandrea 0:39a6762ddcc1 5 #include <time.h> /* time */
feede_dandrea 0:39a6762ddcc1 6 #include "tsi_sensor.h"
feede_dandrea 0:39a6762ddcc1 7 #include "Dht11.h" /* LIBRERIA SENSOR */
feede_dandrea 0:39a6762ddcc1 8
feede_dandrea 0:39a6762ddcc1 9 /* This defines will be replaced by PinNames soon */
feede_dandrea 0:39a6762ddcc1 10 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
feede_dandrea 0:39a6762ddcc1 11 #define ELEC0 9
feede_dandrea 0:39a6762ddcc1 12 #define ELEC1 10
feede_dandrea 0:39a6762ddcc1 13 #elif defined (TARGET_KL05Z)
feede_dandrea 0:39a6762ddcc1 14 #define ELEC0 9
feede_dandrea 0:39a6762ddcc1 15 #define ELEC1 8
feede_dandrea 0:39a6762ddcc1 16 #else
feede_dandrea 0:39a6762ddcc1 17 #error TARGET NOT DEFINED
feede_dandrea 0:39a6762ddcc1 18 #endif
feede_dandrea 0:39a6762ddcc1 19
feede_dandrea 0:39a6762ddcc1 20
feede_dandrea 0:39a6762ddcc1 21
feede_dandrea 0:39a6762ddcc1 22 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
feede_dandrea 0:39a6762ddcc1 23
feede_dandrea 0:39a6762ddcc1 24
feede_dandrea 0:39a6762ddcc1 25 DigitalOut rojo(LED_RED);
feede_dandrea 0:39a6762ddcc1 26 DigitalOut verde(LED_GREEN);
feede_dandrea 0:39a6762ddcc1 27 DigitalOut azul(LED_BLUE);
feede_dandrea 0:39a6762ddcc1 28
feede_dandrea 0:39a6762ddcc1 29 DigitalIn vueltas(PTD2);
feede_dandrea 0:39a6762ddcc1 30
feede_dandrea 0:39a6762ddcc1 31 InterruptIn vuel(PTD4);
feede_dandrea 0:39a6762ddcc1 32
feede_dandrea 0:39a6762ddcc1 33 Dht11 sensor(PTD7);
feede_dandrea 0:39a6762ddcc1 34
feede_dandrea 0:39a6762ddcc1 35
feede_dandrea 0:39a6762ddcc1 36 AnalogIn potenciometro(PTB0);
feede_dandrea 0:39a6762ddcc1 37
feede_dandrea 0:39a6762ddcc1 38 PwmOut cooler(PTB3); //Menos significativo unidad
feede_dandrea 0:39a6762ddcc1 39
feede_dandrea 0:39a6762ddcc1 40 Ticker tiempo;
feede_dandrea 0:39a6762ddcc1 41
feede_dandrea 0:39a6762ddcc1 42 Ticker escritura;
feede_dandrea 0:39a6762ddcc1 43 enum {INICIO,GENERADOR,DETECCION,CHEQUEO};
feede_dandrea 0:39a6762ddcc1 44 enum {COMIENZO,ABIERTO,CERRADO};
feede_dandrea 0:39a6762ddcc1 45 enum {ROJO,VERDE,AZUL,ON,OFF};
feede_dandrea 0:39a6762ddcc1 46
feede_dandrea 0:39a6762ddcc1 47 int estado=0, modo=0,comienza_juego,color=0,segundos=0,giros=0,RPM=0,entrada=0,escritura_hab=OFF;
feede_dandrea 0:39a6762ddcc1 48
feede_dandrea 0:39a6762ddcc1 49 float p=0,incr=0.0005;
feede_dandrea 0:39a6762ddcc1 50
feede_dandrea 0:39a6762ddcc1 51 DigitalOut myled(LED1);
feede_dandrea 0:39a6762ddcc1 52
feede_dandrea 0:39a6762ddcc1 53 void sumav(){
feede_dandrea 0:39a6762ddcc1 54 giros++; //por cada vuelta del cooler incrementa un giro
feede_dandrea 0:39a6762ddcc1 55 }
feede_dandrea 0:39a6762ddcc1 56
feede_dandrea 0:39a6762ddcc1 57
feede_dandrea 0:39a6762ddcc1 58 void segundo_reset() //cada un segundo toma el valor de los giros, predice su valor en RPM, los guarda en otra variable y resetea los giros
feede_dandrea 0:39a6762ddcc1 59 {
feede_dandrea 0:39a6762ddcc1 60 segundos++;
feede_dandrea 0:39a6762ddcc1 61 if(segundos==1) {
feede_dandrea 0:39a6762ddcc1 62 RPM=giros*60;
feede_dandrea 0:39a6762ddcc1 63 giros=0;
feede_dandrea 0:39a6762ddcc1 64 segundos=0;
feede_dandrea 0:39a6762ddcc1 65 }
feede_dandrea 0:39a6762ddcc1 66 }
feede_dandrea 0:39a6762ddcc1 67 void escritura_cooler() //cada cierto tiempo escribe al a salida del PWM
feede_dandrea 0:39a6762ddcc1 68 {
feede_dandrea 0:39a6762ddcc1 69 cooler.period(0.5f);
feede_dandrea 0:39a6762ddcc1 70 cooler.write(p);
feede_dandrea 0:39a6762ddcc1 71 }
feede_dandrea 0:39a6762ddcc1 72 void cooler_automatizado()//funcion principal que controla los modos
feede_dandrea 0:39a6762ddcc1 73 {
feede_dandrea 0:39a6762ddcc1 74 switch(estado) {
feede_dandrea 0:39a6762ddcc1 75 case COMIENZO:
feede_dandrea 0:39a6762ddcc1 76 if(modo==CERRADO) {//se activa el modo cerrado
feede_dandrea 0:39a6762ddcc1 77 printf("MODO CERRADO ACTIVADO\n\r");
feede_dandrea 0:39a6762ddcc1 78 escritura_hab=OFF;
feede_dandrea 0:39a6762ddcc1 79 estado=CERRADO;
feede_dandrea 0:39a6762ddcc1 80 }
feede_dandrea 0:39a6762ddcc1 81 if(modo==ABIERTO) {//se activa el modo abierto
feede_dandrea 0:39a6762ddcc1 82 printf("MODO ABIERTO ACTIVADO\n\r");
feede_dandrea 0:39a6762ddcc1 83 escritura_hab=OFF;
feede_dandrea 0:39a6762ddcc1 84 estado=ABIERTO;
feede_dandrea 0:39a6762ddcc1 85 }
feede_dandrea 0:39a6762ddcc1 86 break;
feede_dandrea 0:39a6762ddcc1 87 case CERRADO:
feede_dandrea 0:39a6762ddcc1 88 sensor.read(); //indica que se va a leer el DHT11
feede_dandrea 0:39a6762ddcc1 89 if(sensor.getCelsius()==20){ //si la temperatura es 20 se mantiene en 3000 RPM
feede_dandrea 0:39a6762ddcc1 90 if(RPM>3000){
feede_dandrea 0:39a6762ddcc1 91 p=p-incr;
feede_dandrea 0:39a6762ddcc1 92 }
feede_dandrea 0:39a6762ddcc1 93 else{
feede_dandrea 0:39a6762ddcc1 94 p=p+incr;
feede_dandrea 0:39a6762ddcc1 95 }
feede_dandrea 0:39a6762ddcc1 96 }
feede_dandrea 0:39a6762ddcc1 97 if((sensor.getCelsius()>20)&&(sensor.getCelsius()<70)){//en el rango de 20 y 70 grados hace una regla de tres y saca el RPM equivalente y trata de llevar su velocidad al RPM indicado
feede_dandrea 0:39a6762ddcc1 98 int cel = sensor.getCelsius();//lee el sensor en celsius
feede_dandrea 0:39a6762ddcc1 99 int resultado = (cel * 10000) / 70;
feede_dandrea 0:39a6762ddcc1 100 printf("TEMP: %d resultado: %d RPM: %d\r\n",cel,resultado,RPM);//
feede_dandrea 0:39a6762ddcc1 101 if(RPM>resultado){
feede_dandrea 0:39a6762ddcc1 102 p=p-(float)0.0005;//disminuye la velocidad
feede_dandrea 0:39a6762ddcc1 103 }
feede_dandrea 0:39a6762ddcc1 104 else{
feede_dandrea 0:39a6762ddcc1 105 p=p+(float)0.0005;//aumenta la velocidad
feede_dandrea 0:39a6762ddcc1 106 }
feede_dandrea 0:39a6762ddcc1 107 if(p>(float)1){
feede_dandrea 0:39a6762ddcc1 108 p=(float)1;//el cooler al maximo
feede_dandrea 0:39a6762ddcc1 109 }
feede_dandrea 0:39a6762ddcc1 110 }
feede_dandrea 0:39a6762ddcc1 111 if(sensor.getCelsius()>=70){
feede_dandrea 0:39a6762ddcc1 112 p=(float)1;//mas de 70c al maximo
feede_dandrea 0:39a6762ddcc1 113 }
feede_dandrea 0:39a6762ddcc1 114 if(escritura_hab==OFF) {
feede_dandrea 0:39a6762ddcc1 115 escritura.attach(&escritura_cooler,0.2);//se acrtualiza la info del duty cada 200ms
feede_dandrea 0:39a6762ddcc1 116 escritura_hab=ON;
feede_dandrea 0:39a6762ddcc1 117 }
feede_dandrea 0:39a6762ddcc1 118 break;
feede_dandrea 0:39a6762ddcc1 119
feede_dandrea 0:39a6762ddcc1 120 case ABIERTO:
feede_dandrea 0:39a6762ddcc1 121 printf("RPM: %d\n\r",RPM);
feede_dandrea 0:39a6762ddcc1 122 if(RPM>=3000){
feede_dandrea 0:39a6762ddcc1 123 p=potenciometro;//si la velocidad es mas grande que la minima le presta atencion al potenciometro
feede_dandrea 0:39a6762ddcc1 124 }
feede_dandrea 0:39a6762ddcc1 125 else{
feede_dandrea 0:39a6762ddcc1 126 p=p+incr;//de lo contrario se incrementa la velocidad
feede_dandrea 0:39a6762ddcc1 127 }
feede_dandrea 0:39a6762ddcc1 128 if(escritura_hab==OFF) {
feede_dandrea 0:39a6762ddcc1 129 escritura.attach(&escritura_cooler,0.2);
feede_dandrea 0:39a6762ddcc1 130 escritura_hab=ON;
feede_dandrea 0:39a6762ddcc1 131 }
feede_dandrea 0:39a6762ddcc1 132 if(p>(float)1){
feede_dandrea 0:39a6762ddcc1 133 p=(float)1;
feede_dandrea 0:39a6762ddcc1 134 }
feede_dandrea 0:39a6762ddcc1 135 break;
feede_dandrea 0:39a6762ddcc1 136 }
feede_dandrea 0:39a6762ddcc1 137 }
feede_dandrea 0:39a6762ddcc1 138
feede_dandrea 0:39a6762ddcc1 139
feede_dandrea 0:39a6762ddcc1 140
feede_dandrea 0:39a6762ddcc1 141
feede_dandrea 0:39a6762ddcc1 142
feede_dandrea 0:39a6762ddcc1 143 int main()
feede_dandrea 0:39a6762ddcc1 144 {
feede_dandrea 0:39a6762ddcc1 145 rojo=1;
feede_dandrea 0:39a6762ddcc1 146 verde=1;
feede_dandrea 0:39a6762ddcc1 147 azul=1;
feede_dandrea 0:39a6762ddcc1 148
feede_dandrea 0:39a6762ddcc1 149 tiempo.attach(&segundo_reset,1);
feede_dandrea 0:39a6762ddcc1 150 vuel.rise(&sumav);
feede_dandrea 0:39a6762ddcc1 151
feede_dandrea 0:39a6762ddcc1 152 while(1) {
feede_dandrea 0:39a6762ddcc1 153 cooler_automatizado();
feede_dandrea 0:39a6762ddcc1 154
feede_dandrea 0:39a6762ddcc1 155 float v = tsi.readPercentage();
feede_dandrea 0:39a6762ddcc1 156
feede_dandrea 0:39a6762ddcc1 157 if((v>(float)0.15)&&(v<(float)0.4)) {
feede_dandrea 0:39a6762ddcc1 158 rojo=0;
feede_dandrea 0:39a6762ddcc1 159 verde=1;
feede_dandrea 0:39a6762ddcc1 160 azul=1;
feede_dandrea 0:39a6762ddcc1 161 estado=COMIENZO;
feede_dandrea 0:39a6762ddcc1 162 modo=ABIERTO;
feede_dandrea 0:39a6762ddcc1 163 v=0;
feede_dandrea 0:39a6762ddcc1 164
feede_dandrea 0:39a6762ddcc1 165 } else if((v>(float)0.3)&&(v<(float)0.6)) {
feede_dandrea 0:39a6762ddcc1 166 rojo=1;
feede_dandrea 0:39a6762ddcc1 167 verde=0;
feede_dandrea 0:39a6762ddcc1 168 azul=1;
feede_dandrea 0:39a6762ddcc1 169 } else if((v>(float)0.5)&&(v<(float)0.9)) {
feede_dandrea 0:39a6762ddcc1 170 rojo=1;
feede_dandrea 0:39a6762ddcc1 171 verde=1;
feede_dandrea 0:39a6762ddcc1 172 azul=0;
feede_dandrea 0:39a6762ddcc1 173 estado=COMIENZO;
feede_dandrea 0:39a6762ddcc1 174 modo=CERRADO;
feede_dandrea 0:39a6762ddcc1 175 v=0;
feede_dandrea 0:39a6762ddcc1 176 } else if((v>=(float)0.9)) {
feede_dandrea 0:39a6762ddcc1 177 rojo=1;
feede_dandrea 0:39a6762ddcc1 178 verde=1;
feede_dandrea 0:39a6762ddcc1 179 azul=1;
feede_dandrea 0:39a6762ddcc1 180 } else if((v<=(float)0.15)) {
feede_dandrea 0:39a6762ddcc1 181 rojo=1;
feede_dandrea 0:39a6762ddcc1 182 verde=1;
feede_dandrea 0:39a6762ddcc1 183 azul=1;
feede_dandrea 0:39a6762ddcc1 184 }
feede_dandrea 0:39a6762ddcc1 185 }
feede_dandrea 0:39a6762ddcc1 186
feede_dandrea 0:39a6762ddcc1 187 }