Primer cambio codigo 20/01/2020

Dependencies:   mbed TextLCD

main.cpp

Committer:
javicas95
Date:
2020-01-20
Revision:
0:0a17318c9c22
Child:
1:873f8f9b7f69

File content as of revision 0:0a17318c9c22:

void visualizar();

#include "mbed.h"
#define buffer_length 2000

Ticker tMuestrear;
Ticker tVisualizar;
#include "TextLCD.h"

//PARA LA PLACA LCD
InterruptIn button(PC_13); 
//Inicializas el interruptor
TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7
Serial pc(USBTX, USBRX); 
// tx, rx esto es para que vaya más rápido, para que procese más rápido
Serial bluetooth(PC_0, PC_1); //ESTA SE QUITA
// tx, rx esto es para inicializar los pines para conectar el bluetooth
AnalogIn adc_in(A0); //datos de tensión
AnalogIn adc_in_in(A2); //datos de intensidad
AnalogIn adc_in_dos(A1); //datos de continua (la salida del LM 358)
void muestrear();
void visualizar();
int flag=0;
int contador=0;
int contador_boton=0;
bool buffer_activo=0;
struct buffer {
    int16_t vA[buffer_length];
    int16_t iA[buffer_length];
    int16_t vB[buffer_length];
    int16_t iB[buffer_length];
};
buffer buffers;
struct estr_medidas
{
    float vrms;
    float irms;
    float pot_activa;
    float pot_reactiva;
    float pot_aparente;
    float en_consumida;
    float fact_potencia;
};
estr_medidas medidas;
void proces(int16_t *datosV, int16_t *datosI, int longi, estr_medidas *medidas)
{
    int64_t b=0.0;
    int64_t c=0;
    int64_t d=0;
 for(int j=0;j<longi;j++)
 {
    b = b + datosV[j]*datosV[j]; //calcula el sumatorio de v^2
    c = c + datosI[j]*datosI[j]; //calcula el sumatorio de i^2
    d = d + datosV[j]*datosI[j]; //calcula el sumatorio de v*i
 }
 //el puntero *medidas apunta la dirección de los distitntos vectores de la estructura
 //guardamos los resultados en la dirección de memoria que apunta *medidas para cada uno de los resultados
 medidas->vrms=0.011812328729925*sqrt(((float)b)/longi);
 medidas->irms=0.000842270393376366*sqrt(((float)c)/longi);
 medidas->pot_activa=(9.949174801697868320688107085e-6*d)/longi;
 medidas->pot_aparente=medidas->vrms*medidas->irms;
 medidas->pot_reactiva=sqrt((medidas->pot_aparente*medidas->pot_aparente)-(medidas->pot_activa*medidas->pot_activa));
 medidas->fact_potencia=((float)medidas->pot_activa)/medidas->pot_aparente;
 medidas->en_consumida+=0.001*medidas->pot_activa*longi;

// Se lleva la cuenta,mediante un contador, del número de veces que se ha 
//pulsado el pulsador para saber qué dato se deberá visualizar. Una vez que el 
//contador llegue al número máximo de datos, éste vuelve a cero y comienza de 
//nuevo la cuenta.
}
void flip() {
 contador_boton++;
 if (contador_boton==8)
 {
 contador_boton=0;
 }
}
int main()
{
    pc.baud(115200);
    bluetooth.baud(9600); //ESTA SE QUITA
    tMuestrear.attach_us(&muestrear, 200);
    tVisualizar.attach(&visualizar, 1);
    button.rise(&flip); // attach the address of the flip function to the rising edge
    while(1) {
        if(flag==1) {
 // pc.printf("1");
            flag=0;

            if(buffer_activo) {

                procesado((int16_t *) buffers.vA, (int16_t *)buffers.iA, buffer_length, &medidas);

            } else {
                procesado((int16_t *)buffers.vB,(int16_t *)buffers.iB, buffer_length, &medidas);

 }


 }
 //wait_us(1);
 }
 }
void muestrear()
{
    int16_t datov=(int16_t)(adc_in.read_u16()^0x8000);
    int16_t datoi=(int16_t)(adc_in_in.read_u16()^0x8000);
    int16_t continua=(int16_t)(adc_in_dos.read_u16()^0x8000);
    if (bufferActivo==0) {
        buffers.vA[contador]=datov-continua;
        buffers.iA[contador]=datoi-continua;

    } else {
        buffers.vB[contador]=datov-continua;
        buffers.iB[contador]=datoi-continua;

    }
    contador++;
    if(contador==buffer_length) {
 //pc.printf("2");
        contador=0;
        flag=1;
        buffer_activo=!buffer_activo;
 }
}
void visualizar(){

 //printf("**** Datos calculados en %d us ****\n",timer.read_us());
    pc.printf("**** El valor Vrms es %f ****\n",medidas.vrms);
    pc.printf("**** El valor Irms es %f ****\n",medidas.irms);
    pc.printf("**** La potencia activa es %f ****\n",medidas.pot_activa);
    pc.printf("**** La potencia reactiva es %f ****\n",medidas.pot_reactiva);
    pc.printf("**** La potencia aparente es %f ****\n",medidas.pot_aparente);
    pc.printf("**** La energia consumida es %f ****\n",medidas.en_consumida);
    pc.printf("**** El factor de potencia es es %f ****\n\n",medidas.fact_potencia);

    switch (contador_boton){
        case 1:

            lcd.cls();
            lcd.printf("Vrms:\n%3.4f V\n", medidas.vrms);
        break;

        case 2:

            lcd.cls();
            lcd.printf("Irms:\n%3.2f A\n", medidas.irms);
        break;

        case 3:

            lcd.cls();
            lcd.printf("Pot activa\n%3.2f W\n", medidas.pot_activa);
        break;
        case 4:

            lcd.cls();
            lcd.printf("Pot reactiva\n%3.2f VAr\n", medidas.pot_reactiva);
        break;

        case 5:

            lcd.cls();
            lcd.printf("Pot aparente\n%3.2f VA\n", medidas.pot_aparente);
        break;
        case 6:

            lcd.cls();
            lcd.printf("E. consumida\n%3.2f kW\n", medidas.en_consumida);
        break;
        case 7:

            lcd.cls();
            lcd.printf("Factor potencia\n%3.2f\n", medidas.fact_potencia);
        break;
        default:
            lcd.cls();
            lcd.printf("Pulsa el boton");
    }
    bluetooth.printf("%3.2f|%3.2f|%3.2f|%3.2f|%3.2f|%3.2f|%3.2f|\n",medidas.vrms,
 medidas.irms,medidas.potenciaActiva,medidas.potenciaReactiva,
 medidas.potenciaAparente,medidas.energiaConsumida,medidas.factorDePotencia);
}
// TODO ESTO SE QUITA