El_clan_zoncillo / Mbed 2 deprecated Proyecto_final

Dependencies:   mbed TextLCD

plantilla_copy.cpp

Committer:
freind00
Date:
2018-12-20
Revision:
5:c638ff4bd841
Parent:
4:c9f7e9a96324

File content as of revision 5:c638ff4bd841:

#include "mbed.h"
#include "math.h"
#include "TextLCD.h"

#define datoTension 725.331071
#define datoIntensidad 29.4943123
#define constanteTension 1.4709e-06
#define constanteIntensidad 1.423595702690060e-09
#define vectormuestras 100
#define offsetTension 0.50369472
#define offsetIntensidad 0.5040785
#define eps 2.220446049250313e-016

TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7
Serial pc(USBTX, USBRX); // tx, rx

InterruptIn button(PC_13); 
AnalogIn tension(A0);
AnalogIn intensidad(A1);


struct Vectores{
    float  vTensionA[vectormuestras];
    float  vTensionB[vectormuestras];
    
    float  iIntensidadA[vectormuestras];
    float  iIntensidadB[vectormuestras];
}

struct Medidas{
    float medidaTension;
    float medidaIntensidad;
}

int contador=0;
int pulsador=0;
int bufferActivo=0;
int flag=0;
int16_t measV=0;
int16_t measI=0;
int32_t producto=0;
int64_t sumatorioV=0;
int64_t sumatorioI=0;
int64_t sumatorioPA=0;

float VRMS=0;
float IRMS=0;
float P_activa=0;
float P_reactiva=0;
float P_aparente=0;
float Consumo_Pact=0;
float Consumo_Preact=0;
float FP=0;

//Captura de valores mediante muestreo
void captura() //función muestreo
{
    float medidaTension=tension.read();
    medidaTension=medidaTension-offsetTension*datoTension;
    
    float medidaIntensidad=intensidad.read();
    medidaIntensidad=medidaIntensidad-offsetIntensidad*datoIntensidad;
    
    if(bufferActivo==1) {
        vTensionA[contador] = medidaTension;
        vIntensidadA[contador] = medidaIntensidad;
        
    } else {
        vTensionB[contador] = medidaTension;
        vIntensidadB[contador] = medidaIntensidad;
    }
    
    contador++;
    if(contador==vectormuestras){
        contador=0;
        bufferActivo=!bufferActivo;
        flag=1;//buffer lleno
    }
}

void calculos()//Cálculo de los valores
{
    while(1) {//bucle para siempre
        if(flag) {//mira si el buffer esta lleno
            flag=0;//Borra la variable buffer lleno
            measV=0;
            measI=0;
            producto=0;
            sumatorioV=0;
            sumatorioI=0;
            sumatorioPA=0;

            for (int b=0; b<muestras; b++) {//VRMS
                if (!bufferActivo) {
                    measV=vTensionA[b];
                    measI=vIntensidadA[b];
                } else {
                    measV=vTensionB[b];
                    measI=vIntensidadB[b];
                }
                producto=measV*measV;
                sumatorioV+=producto;//calcula el valor VPP
                producto=measI*measI;
                sumatorioI+=producto;
                producto=measV*measI;
                sumatorioPA+=producto;
            }

            VRMS=sqrt(constanteTension*sumatorioV);        
            IRMS=sqrt(constanteIntensidad*sumatorioI);
            P_activa=sqrt(constanteTension*constanteIntensidad)*sumatorioPA;
            P_aparente=VRMS*IRMS;
            P_reactiva=sqrt(P_aparente*P_aparente)-(P_aparente*P_aparente);
            Consumo_Pact=Consumo_Pact+P_activa*20e-3/(3600*1000);
            Consumo_Preact=Consumo_Preact+P_reactiva*20e-3/(3600*1000);
            FP=P_activa/(P_aparente+eps);
        }
    }          
}

//Visualización por pantalla
void visualizacion()//función mostrar
{
    lcd.cls();
    if(pulsador==0){
        lcd.printf("VRMS:\n %3.4f", VRMS);
    }
    
    else if pulsador ==1 {
        lcd.printf("IRMS:\n %3.4f", IRMS);
    }
        
    else if pulsador ==2 {
        lcd.printf("Pot. activa:\n %3.4f", P_activa);
    }
    
    else if pulsador ==3 {
        lcd.printf("Pot. reactiva:\n %3.4f", P_reactiva);
    }
    
    else if pulsador ==4 {
        lcd.printf("Pot. aparente:\n %3.4f", P_aparente);
    }
    
    else if pulsador ==5 {
        lcd.printf("Consumo Pot. A:\n %3.4f", Consumo_Pact);
    }
    
    else if pulsador ==6 {
        lcd.printf("Consumo Pot. R:\n %3.4f", Consumo_Preact);
    }
    
    else if pulsador ==7 {
        lcd.printf("Factor de potencia:\n\r %3.4f", FP);
    }
    
}

//Cambio de boton
void cambio_boton() 
{ 
    pulsador++; 
    if(pulsador>8) { 
    pulsador=0;
   } 
} 

int main()
{
    Ticker timerCaptura;
    pc.printf("comienzo\n\r");
    calculos();//Llamar a la función de cálculos ¿Llamar antes de visualizar?
    Ticker timerVisualizacion;
    timerCaptura.attach_us(&captura,200);//Hace que la función muestreo se ejecute cada 200us
    timerVisualizacion.attach(&visualizacion,1.0);//Hace que la función mostrar se ejecute cada segundo
    button.rise(&cambio_boton);//Hace que la función boton se ejecute cada vez que se pulse el botón
       
}