MII1SistElec / Mbed 2 deprecated Proyecto

Dependencies:   TextLCD mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "TextLCD.h"
00003 #include "eeprom.h"
00004 #include <ctype.h>
00005 #define tamvector 100
00006 #define dato_v  6.2357e+03
00007 #define dato_i  9.7128 //((3,3*2000/(2^16*Rburn))^2)*(1/100)
00008 #define dato_p 202.6327
00009 #define dato_e 0.02/3600000.0 //diferencia de tiempo entre muestras en segundos 
00010 #define dato_pr 0,12143 // precio €/kWh
00011 uint16_t VirtAddVarTab[NB_OF_VAR] = {0x5555, 0x6666, 0x7777};
00012 
00013 
00014 Serial bluetooth (D10,D2);
00015 Serial pc(SERIAL_TX,SERIAL_RX);
00016 TextLCD lcd(D8,D9,D3,D4,D5,D6,TextLCD::LCD16x2); //rs,e,d4-d7
00017 InterruptIn pulsador(PC_13);
00018 float muestrasA[tamvector];
00019 float muestrasB[tamvector];
00020 float muestrasC[tamvector];
00021 float muestrasD[tamvector];
00022 
00023 AnalogIn tension (A0);
00024 AnalogIn tensioncontinua (A1);
00025 AnalogIn intensidad (A4);
00026 AnalogIn intensidadcontinua (A5);
00027 float Vcont;
00028 float Icont;
00029 int contador=0;
00030 int contadorIntensidad=0;
00031 int bufferlleno;
00032 int nbuffer;
00033 Ticker timerMuestro;
00034 Ticker timerVisualizacion;
00035 int i;
00036 float Vrms;
00037 float Irms;
00038 float PotenciaActiva;
00039 float PotenciaReactiva;
00040 float PotenciaAparente;
00041 float FactorPotencia;
00042 float EnergiaActiva;
00043 float EnergiaReactiva=0;
00044 int mostrardato=0;
00045 float precio;
00046 
00047 void temporizador ()
00048 {
00049     if(nbuffer) {
00050         muestrasA[contador]=(tension.read()-Vcont);
00051         muestrasC[contador]=(intensidad.read()-Icont);
00052     } else {
00053         muestrasB[contador]=(tension.read()-Vcont);
00054         muestrasD[contador]=(intensidad.read()-Icont);
00055     }
00056     contador++;
00057     if(contador==tamvector) {
00058         contador=0;
00059         nbuffer=!nbuffer;
00060         bufferlleno=1;
00061     }
00062 }
00063 
00064 void boton()
00065 {
00066     mostrardato++;
00067     if (mostrardato>8)
00068         mostrardato=0;
00069 }
00070 
00071 void Write_Float_Eeprom(uint16_t address, float data) // parte de la memoria eeprom
00072 { 
00073     uint16_t *punteroDato;
00074     punteroDato=(uint16_t *)(&data);
00075     EE_WriteVariable(address  , *punteroDato);
00076     punteroDato++;
00077     EE_WriteVariable(address +2 , *punteroDato);
00078  
00079 } 
00080 
00081 float Read_Float_Eeprom(uint16_t address) // parte de la memoria eeprom
00082 { 
00083 
00084    float data; 
00085    uint16_t *punteroDato;
00086    punteroDato=(uint16_t *)(&data);
00087    EE_ReadVariable(address,punteroDato); 
00088    punteroDato++;
00089    EE_ReadVariable(address+2,punteroDato); 
00090    return data; 
00091 } 
00092 
00093 void mostrar ()
00094 {
00095     lcd.cls();
00096     switch(mostrardato) {
00097         case 0:
00098             lcd.printf("Vrms:\n %f V",Vrms);
00099             pc.printf("Vrms:\n %f V",Vrms);
00100             break;
00101         case 1:
00102             lcd.printf("Irms:\n %f A",Irms);
00103             pc.printf("Irms:\n %f A",Irms);
00104             break;
00105         case 2:
00106             lcd.printf("F.pot:\n %f ",FactorPotencia);
00107             pc.printf("F.pot:\n %f ",FactorPotencia);
00108             break;
00109         case 3:
00110             
00111             lcd.printf("P.Act:\n %f W",PotenciaActiva);
00112             pc.printf("P.Act:\n %f W",PotenciaActiva);
00113             break;
00114         case 4:
00115             lcd.printf("P.React:\n %f VAr",PotenciaReactiva);
00116             pc.printf("P.React:\n %f VAr",PotenciaReactiva);
00117             break;
00118         case 5:
00119             lcd.printf("P.Apa:\n %f VA",PotenciaAparente);
00120             pc.printf("P.Apa:\n %f VA",PotenciaAparente);
00121             break;
00122         case 6:
00123             lcd.printf("E.Act:\n %f kWh",EnergiaActiva);
00124             pc.printf("E.Act:\n %f kWh",EnergiaActiva);
00125             break;
00126         case 7:
00127             lcd.printf("E.React:\n %f kWh",EnergiaReactiva);
00128             pc.printf("E.React:\n %f kWh",EnergiaReactiva);
00129             break;
00130         case 8:
00131             lcd.printf("Precio:\n %f ",precio);
00132             pc.printf("Precio:\n %f ",precio);
00133             break;
00134     }
00135     bluetooth.printf("%f | %f | %f | %f | %f \n",Vrms,Irms,PotenciaActiva,PotenciaReactiva,PotenciaAparente);
00136     Write_Float_Eeprom(0x5555, EnergiaActiva);   // parte de la memoria eeprom
00137     Write_Float_Eeprom(0x6666, EnergiaReactiva); // parte de la memoria eeprom
00138 }
00139 
00140 int main ()
00141 {
00142     float suma;
00143     float sumapotenciaactiva=0;
00144     float sumaIntensidad;
00145     float dato;
00146     float datoIntensidad;
00147 
00148 
00149     HAL_FLASH_Unlock(); // parte de la memoria eeprom
00150 
00151     EE_Init();          // parte de la memoria eeprom
00152 
00153     timerMuestro.attach_us(&temporizador,200);
00154     timerVisualizacion.attach(&mostrar,1);
00155     pulsador.rise(&boton);
00156     Vcont=0;
00157     Icont=0;
00158     for (i=0; i<8; i++) {
00159         Vcont=Vcont+tensioncontinua.read();
00160         Icont=Icont+intensidadcontinua.read();
00161     }
00162     Vcont=Vcont/8.0;
00163     Icont=Icont/8.0; 
00164 
00165     EnergiaActiva=Read_Float_Eeprom(0x5555);    // parte de la memoria eeprom
00166     EnergiaReactiva=Read_Float_Eeprom(0x6666);  // parte de la memoria eeprom
00167 
00168     while (1) {
00169         if (bufferlleno) {
00170             bufferlleno=0;
00171             suma=0;
00172             sumaIntensidad=0;
00173             sumapotenciaactiva=0;
00174             for (i=0; i<100; i++) {
00175                 if(nbuffer==1) {
00176                     dato=muestrasA[i];
00177                     datoIntensidad=muestrasC[i];
00178                 } else {
00179                     dato=muestrasB[i];
00180                     datoIntensidad=muestrasD[i];
00181                 }
00182                 suma=suma+dato*dato;
00183                 sumaIntensidad=sumaIntensidad+datoIntensidad*datoIntensidad;
00184                 sumapotenciaactiva=sumapotenciaactiva+dato*datoIntensidad;
00185             }
00186             Vrms=(sqrt(suma*dato_v));
00187             Irms=(sqrt(sumaIntensidad*dato_i));
00188             PotenciaActiva=dato_p*sumapotenciaactiva;
00189             PotenciaAparente=Vrms*Irms;
00190             PotenciaReactiva=(sqrt((PotenciaAparente*PotenciaAparente)-(PotenciaActiva*PotenciaActiva)));
00191             EnergiaActiva=EnergiaActiva+PotenciaActiva*dato_e;
00192             EnergiaReactiva=EnergiaReactiva+PotenciaReactiva*dato_e;
00193             FactorPotencia=PotenciaActiva/PotenciaAparente;
00194             precio=EnergiaActiva*dato_pr;
00195         }
00196     }
00197 }