RODRIGUEZ STINA OROPEZA 6ºA

Dependencies:   mbed tsi_sensor DHT11

Files at this revision

API Documentation at this revision

Comitter:
matirodriguez
Date:
Wed Jun 12 18:09:04 2019 +0000
Commit message:
EJERCICIO 1 TERMINADO;

Changed in this revision

DHT11.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
tsi_sensor.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DHT11.lib	Wed Jun 12 18:09:04 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/fossum_13/code/DHT11/#5da6f6de3e42
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jun 12 18:09:04 2019 +0000
@@ -0,0 +1,277 @@
+#include "mbed.h"
+#include "tsi_sensor.h"
+#include "Dht11.h"
+
+#define ELEC0 9
+#define ELEC1 10
+
+enum {RESET,    // Funcion enum que uso para establecer los estados de la maquina de estados como una palabra
+      LAZO_ABIERTO,
+      LAZO_CERRADO
+     };
+enum { NADA,    // Funcion enum que uso para establecer los estados de la maquina de estados como una palabra
+       PULSADO
+     };
+
+// Prototipos de funciones
+
+void MAQ_cooler();  // Maquina de estados que maneja al cooler en sus modos de funcionamiento
+
+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
+
+void interrupcion();    // Funcion que se realiza cada vez que el pin establecido tenga un flanco. Usado para calcular los RPM
+
+void rpm_segundos();    // Funcion que multiplicará las revoluciones por segundo para obtener las RPM
+
+void MAQ_lecturaTSI();  //Prototipo funcion para solo leer 1 vez que se presiona el TSI
+
+void LEER_TSI();    //Prototipo funcion para guardar el valor analogico del TSI en todo momento
+
+void pulsacion_TSI();   //Prototipo funcion para leer 1 solo valor del TSI cada 2.5mseg
+
+void medir_temperatura();   // Funcion para leer el sensor de temperatura, en el tiempo especificado en datasheet
+
+
+// Configuracion de puertos
+
+TSIAnalogSlider tsi(ELEC0, ELEC1, 40);  // TSI
+
+InterruptIn velocidad(PTA13);   // Sensor de rpm
+
+PwmOut cooler(PTB3);    // Base del transistor que maneja el cooler
+
+AnalogIn pote(PTB0);    // Potenciometro
+
+Dht11 sensor(PTD4); // Sensor DHT11 (libreria)
+
+DigitalOut ledrojo(LED_RED);    // Led rojo de la placa MBED
+
+DigitalOut ledverde(LED_GREEN); // Led verde de la placa MBED
+
+
+// Variables globales
+
+int auxiliar_rpm;   // Variable que almacena las revoluciones por segundo
+int rpm;    // Variable que guarda los rpm para medirlos periodicamente
+
+int var_pulsacion = 25;     // Variable para contar los 2.5mseg de la funcion pulsacion_TSI()
+int teclado = NADA;         // Variable que contiene el valor analogico del TSI en todo momento
+int ingreso = NADA;         // Variable que contiene si se presionó el TSI, que se lee y luego se borra
+
+int estado_maq_cooler = RESET;  // Estado de la maquina de estados que maneja el cooler
+int estado_maq_tsi = NADA;  // Estado de la maquina de estados que maneja el TSI
+
+int auxiliar_temperatura;   // Variable que contiene el ultimo valor de temperatura que se midio
+float auxiliar_velocidad;   // Variable que contiene el numero float (de 0 a 1) para ingresar en el PWM del cooler
+
+
+// Tickers
+
+Ticker lectura; // Ticker lectura del TSI
+Ticker pulsacion;   // Ticker para usar la funcion pulsacion_TSI()
+Ticker segundo; // Ticker para contar los RPM a partir de las revoluciones por segundo
+Ticker pwm_cooler;  // Ticker para escribir en la salida PWM cada cierto tiempo
+Ticker medir;   // Ticker para medir la temperatura
+
+int main(void)
+{
+    medir_temperatura();    // Mido la temperatura así tengo un valor inicial
+
+    // Junto los ticker con la funcion que deseo usar con él
+    lectura.attach(&LEER_TSI,0.1);
+    pulsacion.attach(&pulsacion_TSI,0.001);
+    segundo.attach(&rpm_segundos,1);
+    pwm_cooler.attach(&set_motor,0.3);
+    medir.attach(&medir_temperatura,2);
+
+    // Digo que funcion se realiza cuando el pininterrupt se activa
+    velocidad.rise(&interrupcion);
+
+    while (true) {
+
+        // LLamo constantemente a las funciones de las maquinas de estados
+        MAQ_lecturaTSI();
+        MAQ_cooler();
+
+
+    }
+}
+
+void medir_temperatura()
+{
+    sensor.read();  // Actualizo el valor de temperatura del sensor
+    auxiliar_temperatura = sensor.getCelsius(); // Guardo el valor de temperatura en la variable correspondiente
+}
+
+void MAQ_cooler()
+{
+    int revoluciones;   // Variable que usaré para calcular los RPM a partir del valor del PWM
+
+
+    switch(estado_maq_cooler) {
+
+        case RESET: // No empiezo en ningun modo asi no se consume corriente recien prendo el micro
+            if(ingreso == PULSADO) {    // Si se tocó el pulsador:
+                ingreso=NADA;   // Limpio la variable
+                estado_maq_cooler = LAZO_ABIERTO;   // Cambio de estado
+            }
+            break;
+        case LAZO_ABIERTO:
+
+            auxiliar_velocidad = pote + 0.065;  // El valor del PWM será el valor del pote, sumado al valor minimo para que prenda
+            //                                      el cooler. No uso 200 RPM porque el ventilador no enciende de esa forma.
+
+            // Corrigo el valor que hay en la salida si se detecta que bajaron los RPM
+            if(rpm < (auxiliar_velocidad * 8000)) {
+                auxiliar_velocidad=auxiliar_velocidad+0.1;
+            } else {
+                auxiliar_velocidad=auxiliar_velocidad-0.005;
+            }
+
+            if(auxiliar_velocidad>(float)1) {
+                auxiliar_velocidad=(float)1;
+            }
+
+            // Transicion de la maquina de estados
+            if(ingreso == PULSADO) {
+                ingreso=NADA;
+                estado_maq_cooler = LAZO_CERRADO;
+            }
+
+            break;
+
+        case LAZO_CERRADO:
+
+            revoluciones = (auxiliar_temperatura * 8000) / 45;  // Regla de 3 para calcular las revoluciones por minuto
+            //                                                      que corresponden para la temperatura medida
+
+
+            if(auxiliar_temperatura<20) {  // Cuando la temperatura es mas baja que 20, seteo en el valor minimo del ventilador
+                auxiliar_velocidad = 0.065;
+
+                // Corrigo el valor que hay en la salida si se detecta que bajaron los RPM
+                if(rpm < (auxiliar_velocidad * 8000)) {
+                    auxiliar_velocidad=auxiliar_velocidad+0.05;
+                } else {
+                    auxiliar_velocidad=auxiliar_velocidad-0.005;
+                }
+            }
+
+
+            if((auxiliar_temperatura>=20)&&(auxiliar_temperatura<45)) { // Dentro de este rango de temperatura, las RPM estan dadas
+                //                                                              por una regla de 3 simple
+                auxiliar_velocidad = (revoluciones * 1) / (float)8000;
+
+                // Corrigo el valor que hay en la salida si se detecta que bajaron los RPM
+                if(rpm < (auxiliar_velocidad * 8000)) {
+                    auxiliar_velocidad=auxiliar_velocidad+0.075;
+                } else {
+                    auxiliar_velocidad=auxiliar_velocidad-0.0005;
+                }
+
+                if(auxiliar_velocidad>(float)1) {
+                    auxiliar_velocidad=(float)1;
+                }
+
+            }
+
+            if(auxiliar_temperatura >= 45) { // Si la temperatura es mas alta que la maxima, el cooler se encuentra al maximo de potencia
+                auxiliar_velocidad = 1;
+            }
+
+            // Transicion de la maquina de estados
+            if(ingreso == PULSADO) {
+                ingreso=NADA;
+                estado_maq_cooler = LAZO_ABIERTO;
+            }
+            break;
+    }
+}
+
+void interrupcion()
+{
+    auxiliar_rpm++; // Valor para calcular los RPM, contiene las revoluciones por segundo que luego se multiplicarán por 60
+}
+
+void rpm_segundos()
+{
+
+    rpm = auxiliar_rpm * 60;    // Las RPM son igual a las revoluciones por segundo * 60 segundos
+
+    auxiliar_rpm = 0;   // Reseteo la variable para una nueva medicion
+
+// Imprimo en pantalla el valor actual de RPM, la temperatura actual y el modo en el que se está trabajando. Este mismo
+// depende del estado de la maquina de estados, asi que aplico ese metodo para imprimir en pantalla. Tambien, prendo un
+// led distinto para cada modo de trabajo.
+
+    printf("RPM: %i , ",rpm);
+    printf("T: %i\n",auxiliar_temperatura);
+
+    switch(estado_maq_cooler) {
+        case LAZO_ABIERTO:
+            printf("Lazo abierto\n");
+            ledverde = 0;
+            ledrojo = 1;
+            break;
+        case LAZO_CERRADO:
+            printf("Lazo cerrado\n");
+            ledverde = 1;
+            ledrojo = 0;
+            break;
+    }
+
+}
+
+void set_motor()
+{
+    // Seteo en la salida PWM el valor que corresponde, que ya se guardó en la maquina de estados
+    cooler.period(0.5f);
+    cooler.write(auxiliar_velocidad);
+    
+}
+
+void LEER_TSI()
+{
+    float auxiliar = 0;
+    auxiliar = tsi.readPercentage();    //Guardo de manera auxiliar el valor entre 0 y 1 del TSI
+
+// Asocio el valor del tsi numerico con un color, dividiendo en 4 valores posibles (0, <0.33, <0.66, <1)
+    if(auxiliar >= 0) {
+        teclado = NADA;
+    }
+    if((auxiliar > 0.05)&&(auxiliar <= 1)) {
+        teclado = PULSADO;
+    }
+}
+
+void pulsacion_TSI()
+{
+    if(var_pulsacion > 0) {
+        var_pulsacion--;
+    }
+}
+
+void MAQ_lecturaTSI()
+{
+    if(var_pulsacion < 1) { // Si se llegaron a los 2.5ms:
+
+        var_pulsacion = 25; // Vuelvo a establecer 2.5ms para el proximo ciclo
+
+        switch(estado_maq_tsi) {
+            case NADA:
+                ingreso = NADA; // La variable ingreso, salvo en el caso especifico, siempre se encontrará en NADA
+
+                if(teclado==PULSADO) {
+                    estado_maq_tsi = PULSADO;
+                    ingreso = PULSADO;  // El valor del TSI lo cambio en la transicion entre estados para asegurarme que solo se pueda leer 1 vez
+                }
+                break;
+
+            case PULSADO:
+                if(teclado == NADA) {
+                    estado_maq_tsi = NADA;
+                }
+                break;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Jun 12 18:09:04 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tsi_sensor.lib	Wed Jun 12 18:09:04 2019 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Kojto/code/tsi_sensor/#976904559b5c