Demirci William / Mbed 2 deprecated calcul_Ueff2

Dependencies:   TextLCD angleandposition 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 "math.h"
00004 #include "angleandposition.h"
00005 
00006 
00007 #define Nmax 200 // nombre d'échantillonnages sur une période
00008 #define nb_echantillon_max 10000 // 1s/20ms(temps acquisition pour une période) * Techantillonnage = 50 * 200 = 10 000 soit 10 000 éhantillons par seconde
00009 #define ID 0x09 // ID commun entre les modules XBEE
00010 
00011 // Entrées :
00012 AnalogIn  Iana(p16); // intensité mesurée
00013 AnalogIn  Uana(p17); // tension mesurée
00014 
00015 // Sorties :
00016 DigitalOut led_temoin(LED1); // LED témoin (sur la carte)
00017 
00018 // Objets :
00019 Serial pc(USBTX, USBRX); // (tx, rx) communication par port serie pour l'aide au débogage
00020 TextLCD lcd(p21, p22, p23, p24, p25, p26, TextLCD::LCD16x2); // (d4-d7, rs, e) afficheur LCD
00021 Serial xbee(p9, p10); // (tx,rx) module XBee
00022 
00023 // Interruptions :
00024 InterruptIn bouton_gauche(p27); // interruption du bouton gauche
00025 InterruptIn bouton_droit(p28); // interruption du bouton droit
00026 
00027 // Fonctions d'échantillonnages :
00028 Ticker echantillonnage; // déclaration d'un programme d'interruption
00029 Ticker echantillonnage_puissance; // déclaration d'un programme d'interruption
00030 
00031 // Fichiers externes :
00032 LocalFileSystem local("local"); // fichier créer afin de stocker des valeurs
00033 
00034 // Variables :
00035 char pos_menu = 0; // choix du menu à afficher
00036 char trame[14]; // tableau servant à l'envoi des trames
00037 
00038 float U0,  U20, U2n_1, Un, U2n, Veff, Ufinal = 0;
00039 float I0,  I20, I2n_1, In, I2n, Ieff, Ifinal = 0;
00040 float P = 0, S, Q, phi, energie_1 = 0, energie = 0;
00041 
00042 int ancien_en = 0; // on utilise un INT car la LED s'allume tous les Wh. Avec un float, la LED s'allume tous les 1,XXX Wh
00043 int compteur_echantillonnage = 0;
00044 
00045 
00046 void calcul() { // fonction de calcul
00047 
00048     if (compteur_echantillonnage == 0) {
00049         
00050         
00051         Veff = 0;
00052         Ieff = 0;
00053         U0 = Uana;
00054         
00055         U0 = U0 - 0.5;
00056         U20 = U0 * U0; // U0²
00057         U2n_1 = U20;
00058 
00059 
00060         I0 = Iana;
00061         I0 = I0 - 0.5;
00062         I20 = I0 * I0; // I0²
00063         I2n_1 = I20;
00064 
00065         compteur_echantillonnage++;
00066     }
00067 
00068 
00069 
00070     if (compteur_echantillonnage > 0 && (compteur_echantillonnage < nb_echantillon_max)) {
00071 
00072         Un = Uana;
00073         Un = Un - 0.5;
00074         U2n = Un * Un;
00075 
00076         Veff = (U2n + U2n_1) / 2 + Veff;
00077         U2n_1 = U2n;
00078 
00079 
00080         In = Iana;
00081         In = In - 0.5;
00082         I2n = In * In;
00083 
00084         Ieff = (I2n + I2n_1) / 2 + Ieff;
00085         I2n_1 = I2n;
00086 
00087         compteur_echantillonnage++;
00088     }
00089 
00090 
00091 
00092     if (compteur_echantillonnage >= nb_echantillon_max) {
00093         
00094         Ufinal = 707.1*sqrt(Veff/nb_echantillon_max); // 707.1 = 2*sqrt(2)*250 (250 étant 250V, la tension maximale du secteur)
00095         Ifinal = 14.14*sqrt(Ieff/nb_echantillon_max); // 14.14 = 2*sqrt(2)*5 (5 étant 5A, l'intensité maximale du secteur)
00096 
00097         S = Ufinal * Ifinal; // puissance apparente
00098         phi = acos(P/S);
00099         Q = P * tan(phi); // puisance réactive
00100     }
00101 }
00102 
00103 void puissance() { // calcul de la puissance active toutes les secondes par interruption
00104     
00105     compteur_echantillonnage = 0; // réinitialisation du compteur pour la fonction calcul()
00106         
00107     P = Veff * Ieff; // puissance active
00108     energie_1 = (energie_1 + P) / 3600; // énergie en Ws et non en Wh
00109     energie = energie + energie_1;  // calcul de l'énergie consommée au total depuis le démarrage du microcontroleur
00110     
00111     if(energie > ancien_en + 1) { // si l'énergie augmente d'un Wh
00112         
00113         led_temoin = 1;  // allumer la LED
00114         wait_ms(500);
00115         led_temoin = 0;  // éteindre la LED
00116 
00117         ancien_en = energie;    // on garde en mémoire l'ancienne valeur de l'énergie
00118 
00119         FILE* pfile = fopen ("/local/log.txt",""); // ouverture du fichier log.txt
00120         fprintf(pfile,"En = %.4f Wh\n", energie);   // écriture sur le fichier de l'énergie
00121         fclose(pfile); // fermeture du fichier
00122         
00123     }
00124 }
00125 
00126 void menu() { // affichage de l'écran
00127     
00128     lcd.cls(); // clear de l'écran
00129 
00130     switch(pos_menu) {
00131         
00132         case 0:
00133             lcd.printf("En = %.4f Wh\n",energie); // on affiche 4 nombres après la virgule
00134             break;
00135         case 1:
00136             lcd.printf("Ueff = %.4f V\n",Ufinal);
00137             lcd.printf("Ieff = %.4f A\n",Ifinal);
00138             break;
00139         case 2:
00140             lcd.printf("P = %.4f W\n",P);
00141             lcd.printf("Q = %.4f Var\n",Q);
00142             break;
00143         case 3:
00144             lcd.printf("S = %.4f VA\n",S);
00145             lcd.printf("cos(phi)= %.0f deg\n",cos(phi));
00146             break;
00147         default:
00148             lcd.printf("En = %.4f Wh\n",energie);
00149             break;
00150     }
00151 
00152     wait_ms(200); // délai afin que l'affichage des nouvelles valeurs soit suffisament lent pour être lisible
00153 }
00154 
00155 
00156 void interupt_btn_gauche() { // interruption lors d'un appui sur le bouton gauche
00157     
00158     wait_ms(20); // délai d'attente pour que les parasites, liés à la pression du bouton, ne redéclanchent la fonction
00159     
00160     if(pos_menu == 0) { // si l'on arrive à la position 0 du menu
00161         pos_menu = 4;   // on retournes à la 3ème position du menu (max)
00162     } else pos_menu--; // on passe à l'affichage de gauche
00163 }
00164 
00165 
00166 void interupt_btn_droit() { // interruption lors d'un appui sur le bouton droit
00167     
00168     wait_ms(20); // délai d'attente pour que les parasites, liés à la pression du bouton, ne redéclanchent la fonction
00169     
00170     if(pos_menu == 3) { // si l'on arrive à la 3ème position du menu (max)
00171         pos_menu = 0;   // on retournes à la position 0
00172     } else pos_menu++; // on passe à l'affichage de droite
00173 }
00174 
00175 
00176 void envoi() {
00177     uint16_t trame_4 = (Ufinal*100);
00178     uint16_t trame_6 = (Ifinal*100);
00179     uint16_t trame_8 = (P*100);
00180     uint16_t trame_10 = (energie*100);
00181     char sum;
00182     
00183     //trame[0] = 0x55;
00184     trame[1] = 0x55;            // synchronisation du récepteur
00185     trame[2] = ID;              // octet d'identification
00186     trame[3] = Ufinal*100;      // octet de poids fort de la tension efficace
00187     trame[4] = trame_4 >> 8;    // octet de poids faible de la tension efficace
00188     trame[5] = Ifinal*100;      // octet de poids fort de l'intensité efficace
00189     trame[6] = trame_6 >> 8;    // octet de poids faible de l'intensité efficace
00190     trame[7] = P*100;           // octet de poids fort de la puissance active
00191     trame[8] = trame_8 >> 8;    // octet de poids faible de la puissance active
00192     trame[9] = energie*100;     // octet de poids fort de la valeur du compteur d'énergie
00193     trame[10] = trame_10 >> 8;  // second octet de poids fort de la valeur du compteur d'énergie
00194     trame[11] = trame_10 >> 16; // troisième octet de poids fort de la valeur du compteur d'énergie
00195     trame[12] = trame_10 >> 24; // octet de poids faible de la valeur du compteur d'énergie
00196     for(int i = 1; i < 13; i++) { sum = sum + trame[i]; };  // calcul du check sum
00197     trame[13] = sum;            // Check sum
00198     
00199     for(int i = 1; i < 14; i++) {// boucle d'envoi des trames
00200         
00201         xbee.putc(trame[i]);
00202         wait(0.01);
00203         pc.printf("%d \t",trame[i]);
00204     }
00205     pc.printf("\r");
00206     
00207 }
00208 
00209 int main() {
00210     
00211     bouton_gauche.mode(PullUp);
00212     bouton_droit.mode(PullUp);
00213 
00214     bouton_gauche.fall(&interupt_btn_gauche);
00215     bouton_droit.fall(&interupt_btn_droit);
00216     
00217     led_temoin = 0; // la LED témoin est éteinte
00218 
00219     echantillonnage.attach(&calcul, 0.0001); // interruption toutes les 100µs
00220     echantillonnage_puissance.attach(&puissance, 1); // interruption toutes les 1s
00221  
00222     while(1) { // boucle infinie
00223         
00224         menu(); // fonction d'affichage
00225         envoi(); // fonction d'envoi des trames
00226         //wait(5);
00227     }
00228 }