¡Qué majo es Ander Ibabe!

Dependencies:   TextLCD mbed

Revision:
0:91c7502b70de
Child:
1:7c44bfcec04b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Dec 13 09:47:54 2017 +0000
@@ -0,0 +1,151 @@
+#include "mbed.h"
+#include "math.h"
+#include "TextLCD.h"
+
+Serial bluetooth (D10,D2);
+Serial pc(SERIAL_TX,SERIAL_RX);
+TextLCD lcd(D8,D9,D6,D3,D4,D5,TextLCD::LCD16x2); //rs,e,d4-d7
+InterruptIn pulsador(PC_13);
+float muestrasA[100];
+float muestrasB[100];
+float muestrasC[100];
+float muestrasD[100];
+
+AnalogIn tension (A0);
+AnalogIn tensioncontinua (A1);
+AnalogIn intensisdad (A4);
+AnalogIn intensidadcontinua (A5);
+float Vcont;
+float Icont;
+int contador=0;
+int contadorIntensidad=0;
+int bufferlleno;
+int nbuffer;
+Ticker timerMuestro;
+Ticker timerVisualizacion;
+int i;
+float Vrms;
+float Irms;
+float PotenciaActiva;
+float PotenciaReactiva;
+float PotenciaAparente;
+float FactorPotencia;
+float EnergiaActiva;
+float EnergiaReactiva=0;
+int mostrardato=0;
+float precio;
+
+void temporizador ()
+{
+    if(nbuffer) {
+        muestrasA[contador]=(tension.read()-Vcont)*219.626*3.3f;
+        muestrasC[contador]=(intensidad.read()-Icont)*9.525*3.3f;
+    } else {
+        muestrasB[contador]=(tension.read()-Vcont)*219.626f*3.3f;
+        muestrasD[contador]=(intensidad.read()-Icont)*9.725*3.3f;
+    }
+    contador++;
+    if(contador==100) {
+        contador=0;
+        nbuffer=!nbuffer;
+        bufferlleno=1;
+    }
+}
+
+void boton()
+{
+    mostrardato++;
+    if (mostrardato>8)
+        mostrardato=0;
+}
+
+void mostrar ()
+{
+    lcd.cls();
+    switch(mostrardato) {
+        case 0:
+            lcd.printf("Vrms:\n3.3f V",Vrms);
+            pc.printf("Vrms:\n3.3f V",Vrms);
+            break;
+        case 1:
+            lcd.printf("Irms:\n3.3f I",Vrms);
+            pc.printf("Irms:\n3.3f I",Vrms);
+            break;
+        case 2:
+            lcd.printf("F.pot:\n3.3f ",FactorPotencia);
+            pc.printf("F.pot:\n3.3f ",FactorPotencia);
+            break;
+        case 3:
+            lcd.printf("P.Apa:\n3.3f VA",PotenciaAparente);
+            pc.printf("P.Apa:\n3.3f VA",PotenciaAparente);
+            break;
+        case 4:
+            lcd.printf("P.React:\n3.3f VAr",PotenciaReactiva);
+            pc.printf("P.React:\n3.3f VAr",PotenciaReactiva);
+            break;
+        case 5:
+            lcd.printf("P.Act:\n3.3f W",PotenciaActiva);
+            pc.printf("P.Act:\n3.3f W",PotenciaActiva);
+            break;
+        case 6:
+            lcd.printf("E.Act:\n3.3f kWh",EnergiaActiva);
+            pc.printf("E.Act:\n3.3f kWh",EnergiaActiva);
+            break;
+        case 7:
+            lcd.printf("E.React:\n3.3f kWh",EnergiaReactiva);
+            pc.printf("E.React:\n3.3f kWh",EnergiaReactiva);
+            break;
+    }
+    bluetooth.printf("%3.3f| %3.3f| %3.3f| %3.3f\n",Vrms,Irms,PotenciaActiva,precio);
+}
+
+int main ()
+{
+    float suma;
+    float sumapotenciaactiva=0;
+    float sumaIntensidad;
+    float dato;
+    float datoIntensidad;
+
+    timerMuestro.attach_us(&temporizador,200);
+    timerVisualizacion.attach(&mostrar,1);
+    pulsador.rise(&boton);
+    Vcont=0;
+    Icont=0;
+    for (i=0; i<8; i++) {
+        Vcont=Vcont+tensioncontinua.read();
+        Icont=Icont+intensidadcontinua.read();
+    }
+    Vcont=Vcont/8.0f;
+    Icont=Icont/8.0f;
+
+    while (1) {
+        if (bufferlleno) {
+            bufferlleno=0;
+            suma=0;
+            sumaIntensidad=0;
+            sumapotenciaactiva=0;
+            for (i=0; i<100; i++) {
+                if(nbuffer==1) {
+                    dato=muestrasA[i];
+                    datoIntensidad=muestrasC[i];
+                } else {
+                    dato=muestrasB[i];
+                    datoIntensidad=muestrasD[i];
+                }
+                suma=suma+dato*dato;
+                sumaIntensidad=sumaIntensidad+datoIntensidad*datoIntensidad;
+                sumapotenciaactiva=sumapotenciaactiva+dato*datoIntensidad;
+            }
+            Vrms=(sqrt(suma/100.0f)*1.01449275362f);
+            Irms=(sqrt(sumaIntensidad/100.0f)*0.9869);
+            PotenciaActiva=(sumapotenciaactiva/100.0f)/10.00139f;
+            EnergiaActiva=EnergiaActiva+(PotenciaActiva/180000000.0f);
+            PotenciaAparente=Vrms*Irms;
+            PotenciaReactiva=(sqrt((PotenciaActiva-PotenciaAparente)-(PotenciaActiva*PotenciaActiva)));
+            EnergiaActiva=EnergiaReactiva+(PotenciaReactiva/180000000.0f);
+            FactorPotencia=(PotenciaActiva/PotenciaAparente);
+            precio=EnergiActiva*0.121f;
+        }
+    }
+}