cooler

Dependencies:   mbed tsi_sensor DHT11

Revision:
0:488e4bd141d5
diff -r 000000000000 -r 488e4bd141d5 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jun 04 13:43:28 2019 +0000
@@ -0,0 +1,154 @@
+#include "mbed.h"
+#include "Dht11.h"
+#include "tsi_sensor.h"
+
+#define m 0.04
+#define b -0.6
+
+//tsi
+#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
+#define ELEC0 9
+#define ELEC1 10
+#elif defined (TARGET_KL05Z)
+#define ELEC0 9
+#define ELEC1 8
+#else
+#error TARGET NOT DEFINED
+#endif
+TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
+
+//funciones y maquinas de estado
+void me_modo();
+void timer();
+
+enum me_modo_estados {abierto,cerrado};
+enum me_modo_estados me_modo_estado=abierto;
+
+//entradas y salidas
+Dht11 sensor(PTB3);
+AnalogIn preset(PTB2);
+DigitalIn rpm(PTD4);
+
+PwmOut cooler(PTC2);
+
+
+Ticker t;
+
+//variables utilizadas
+int pres, pres_ant=0;
+int tmo=0, tmo1=0, tmo2, rebote=0;
+int primera=0;
+int flanco=0;
+int rpm_ant=0;
+int revoluciones=0;
+
+int main()
+{
+    //llamo a la funcion timer() cada 0.01 seg
+    t.attach(&timer,0.01);
+    while(1) {
+        me_modo();
+    }
+}
+//timer 
+void timer()
+{
+    if(tmo!=0) {
+        tmo--;
+    }
+    if(tmo1!=0) {
+        tmo1--;
+    }
+    if(tmo2!=0) {
+        tmo2--;
+    }
+    if(rebote!=0)
+        rebote--;
+}
+//maquina de estado del modo
+void me_modo()
+{
+    switch(me_modo_estado) {
+
+        case abierto:
+            if(primera==0) {
+                printf("Lazo abierto\n");
+                primera=1;
+            }
+            pres=preset*50;
+            //detenccion de flancos descendentes
+            if(rpm==0 && rpm_ant==1) {
+                flanco++;
+                rpm_ant=0;
+            }
+            if(rpm==1 && rpm_ant==0) {
+                rpm_ant=1;
+            }
+            //calculo las RPM a partir de los flancos medidos en 1 seg 
+            if(tmo==0) {
+                tmo=100;
+                revoluciones=flanco*60;
+                printf("RPM= %i \n",revoluciones);
+                flanco=0;
+                //mido el preset cada 1 seg para no variar el duty de salida constantemente
+                if(preset.read()<0.1)
+                    cooler=0.1;
+                else
+                    cooler=preset.read();
+
+            }
+            //tsi sin rebote. Para cambiar al lazo cerrado
+            if(tsi.readPercentage() && rebote==0) {
+                me_modo_estado=cerrado;
+                rebote=100;
+                primera=0;
+            }
+
+            break;
+
+        case cerrado:
+
+            if(primera==0) {
+                printf("Lazo cerrado\n");
+                primera=1;
+            }
+            //actualizo la informacion del sensor y mido las RPM cada 1 seg. 
+            if(tmo1==0) {
+                tmo1=100;
+                sensor.read();
+                revoluciones=flanco*60;
+                printf("RPM= %i  TEMP= %i\n",revoluciones, sensor.getCelsius());
+                flanco=0;
+            }
+            //Deteccion de flancos descendentes
+            if(rpm==0 && rpm_ant==1) {
+                flanco++;
+                rpm_ant=0;
+            }
+            if(rpm==1 && rpm_ant==0) {
+                rpm_ant=1;
+            }
+            //transformo la informacion de temperatura y la entrego al cooler
+            if(tmo2==0) {
+                tmo2=100;
+                //se hace hasta 50 porque es el maximo que soporta el sensor
+                if(sensor.getCelsius()>20 && 50>sensor.getCelsius()) {
+                    //recta que vincula la temperatura sensada entre 20 y 50 con el puerto de salida PWM
+                    cooler = sensor.getCelsius() * m + b;
+                }
+                //casos extremos de temperatura
+                if(20>=sensor.getCelsius())
+                    cooler=0.1;
+                if(sensor.getCelsius()>=50)
+                    cooler=1;
+            }
+            //tsi sin rebote. Para cambiar al lazo abierto
+            if(tsi.readPercentage() && rebote==0) {
+                me_modo_estado=abierto;
+                rebote=100;
+                primera=0;
+            }
+            break;
+
+    }
+}