¡Que majo es Ander Ibabe!

Dependencies:   mbed

main.cpp

Committer:
carlospomar
Date:
2017-12-13
Revision:
1:5ed5c373907b
Parent:
0:6ce5f0c2625c

File content as of revision 1:5ed5c373907b:

#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",Irms);
            pc.printf("Irms:\n3.3f I",Irms);
            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;
        }
    }
}