TR

Dependencies:   TextLCD mbed angleandposition

Committer:
POSIPI
Date:
Fri May 20 06:57:35 2016 +0000
Revision:
1:7471900740a2
Parent:
0:6faafff1fb3b
CR Mesure d'?nergie et de Puissance

Who changed what in which revision?

UserRevisionLine numberNew contents of line
POSIPI 0:6faafff1fb3b 1 #include "mbed.h"
POSIPI 0:6faafff1fb3b 2 #include "TextLCD.h"
POSIPI 1:7471900740a2 3 #include "math.h"
POSIPI 1:7471900740a2 4 #include "angleandposition.h"
POSIPI 1:7471900740a2 5
POSIPI 1:7471900740a2 6
POSIPI 1:7471900740a2 7 #define Nmax 200 // nombre d'echantillonnages sur une période
POSIPI 1:7471900740a2 8 #define nb_echantillon_max 10000 // 1s/20ms(temps acquisition pour une période) * Techantillonnage = 50 * 200 = 10 000 soit 10 000 echantillons par seconde
POSIPI 1:7471900740a2 9 #define ID 0x09 // ID commun entre les modules XBEE
POSIPI 0:6faafff1fb3b 10
POSIPI 1:7471900740a2 11 // Entrees/Sorties :
POSIPI 1:7471900740a2 12 AnalogIn Iana(p16); // intensité mesurée
POSIPI 1:7471900740a2 13 AnalogIn Uana(p17); // tension mesurée
POSIPI 1:7471900740a2 14 DigitalOut led_temoin(LED1); // LED témoin (sur la carte)
POSIPI 0:6faafff1fb3b 15
POSIPI 1:7471900740a2 16 // Objets :
POSIPI 1:7471900740a2 17 Serial pc(USBTX, USBRX); // (tx, rx) communication par port serie pour l'aide au débogage
POSIPI 1:7471900740a2 18 TextLCD lcd(p21, p22, p23, p24, p25, p26, TextLCD::LCD16x2); // (d4-d7, rs, e) afficheur LCD
POSIPI 1:7471900740a2 19 Serial xbee(p9, p10); // (tx,rx) module XBee
POSIPI 0:6faafff1fb3b 20
POSIPI 1:7471900740a2 21 // Interruptions :
POSIPI 1:7471900740a2 22 InterruptIn bouton_gauche(p27); // interruption du bouton gauche
POSIPI 1:7471900740a2 23 InterruptIn bouton_droit(p28); // interruption du bouton droit
POSIPI 0:6faafff1fb3b 24
POSIPI 1:7471900740a2 25 // Fonctions d'échantillonnages :
POSIPI 1:7471900740a2 26 Ticker echantillonnage; // déclaration d'un programme d'interruption
POSIPI 1:7471900740a2 27 Ticker echantillonnage_puissance; // déclaration d'un programme d'interruption
POSIPI 1:7471900740a2 28
POSIPI 1:7471900740a2 29 // Fichiers externes :
POSIPI 1:7471900740a2 30 LocalFileSystem local("local"); // fichier créer afin de stocker des valeurs
POSIPI 0:6faafff1fb3b 31
POSIPI 1:7471900740a2 32 // Variables :
POSIPI 1:7471900740a2 33 char pos_menu = 0; // choix du menu à afficher
POSIPI 1:7471900740a2 34 char trame[14]; // tableau servant à l'envoi des trames
POSIPI 1:7471900740a2 35 float U0, U20, U2n_1, Un, U2n, Veff, Ufinal = 0;//variable pour le calcul de la tension
POSIPI 1:7471900740a2 36 float I0, I20, I2n_1, In, I2n, Ieff, Ifinal = 0;//variable pour le calcul de l'intensite
POSIPI 1:7471900740a2 37 float P = 0, S, Q, phi, energie_1 = 0, energie = 0;
POSIPI 0:6faafff1fb3b 38
POSIPI 1:7471900740a2 39 int ancien_en = 0; // La LED s'allume tous les Wh
POSIPI 1:7471900740a2 40 int compteur_echantillonnage = 0;
POSIPI 1:7471900740a2 41
POSIPI 1:7471900740a2 42
POSIPI 1:7471900740a2 43 void calcul() { // fonction qui effectue les calculs (tesion intensite,puissance etc.
POSIPI 1:7471900740a2 44
POSIPI 1:7471900740a2 45 if (compteur_echantillonnage == 0) {
POSIPI 0:6faafff1fb3b 46
POSIPI 1:7471900740a2 47 Veff = 0;
POSIPI 1:7471900740a2 48 Ieff = 0;
POSIPI 1:7471900740a2 49
POSIPI 0:6faafff1fb3b 50 U0 = Uana;
POSIPI 0:6faafff1fb3b 51 U0 = U0 - 0.5;
POSIPI 0:6faafff1fb3b 52 U20 = U0 * U0;
POSIPI 0:6faafff1fb3b 53 U2n_1 = U20;
POSIPI 1:7471900740a2 54
POSIPI 1:7471900740a2 55
POSIPI 0:6faafff1fb3b 56 I0 = Iana;
POSIPI 0:6faafff1fb3b 57 I0 = I0 - 0.5;
POSIPI 0:6faafff1fb3b 58 I20 = I0 * I0;
POSIPI 0:6faafff1fb3b 59 I2n_1 = I20;
POSIPI 1:7471900740a2 60
POSIPI 0:6faafff1fb3b 61 compteur_echantillonnage++;
POSIPI 0:6faafff1fb3b 62 }
POSIPI 0:6faafff1fb3b 63
POSIPI 0:6faafff1fb3b 64
POSIPI 0:6faafff1fb3b 65
POSIPI 0:6faafff1fb3b 66 if (compteur_echantillonnage > 0 && (compteur_echantillonnage < nb_echantillon_max)) {
POSIPI 1:7471900740a2 67
POSIPI 0:6faafff1fb3b 68 Un = Uana;
POSIPI 0:6faafff1fb3b 69 Un = Un - 0.5;
POSIPI 0:6faafff1fb3b 70 U2n = Un * Un;
POSIPI 1:7471900740a2 71
POSIPI 1:7471900740a2 72 Veff = (U2n + U2n_1) / 2 + Veff;
POSIPI 1:7471900740a2 73 U2n_1 = U2n;
POSIPI 1:7471900740a2 74
POSIPI 1:7471900740a2 75
POSIPI 0:6faafff1fb3b 76 In = Iana;
POSIPI 0:6faafff1fb3b 77 In = In - 0.5;
POSIPI 0:6faafff1fb3b 78 I2n = In * In;
POSIPI 1:7471900740a2 79
POSIPI 0:6faafff1fb3b 80 Ieff = (I2n + I2n_1) / 2 + Ieff;
POSIPI 1:7471900740a2 81 I2n_1 = I2n;
POSIPI 1:7471900740a2 82
POSIPI 0:6faafff1fb3b 83 compteur_echantillonnage++;
POSIPI 0:6faafff1fb3b 84 }
POSIPI 0:6faafff1fb3b 85
POSIPI 0:6faafff1fb3b 86
POSIPI 0:6faafff1fb3b 87
POSIPI 1:7471900740a2 88 if (compteur_echantillonnage >= nb_echantillon_max) {
POSIPI 1:7471900740a2 89
POSIPI 1:7471900740a2 90 Ufinal = 707.1*sqrt(Veff/nb_echantillon_max); // 707.1 = 2*sqrt(2)*250 (250 étant 250V, la tension maximale du secteur)
POSIPI 1:7471900740a2 91 Ifinal = 14.14*sqrt(Ieff/nb_echantillon_max); // 14.14 = 2*sqrt(2)*5 (5 étant 5A, l'intensité maximale du secteur)
POSIPI 1:7471900740a2 92
POSIPI 1:7471900740a2 93 S = Veff*Ieff; // puissance apparente
POSIPI 1:7471900740a2 94 phi = acos(P/S);
POSIPI 1:7471900740a2 95 Q = P * tan(phi); // puisance réactive
POSIPI 1:7471900740a2 96 }
POSIPI 1:7471900740a2 97
POSIPI 1:7471900740a2 98 }
POSIPI 1:7471900740a2 99
POSIPI 1:7471900740a2 100 void puissance() { // calcul de la puissance toutes les secondes par interruption
POSIPI 1:7471900740a2 101
POSIPI 1:7471900740a2 102 compteur_echantillonnage = 0; // réinitialisation du compteur pour la fonction calcul()
POSIPI 1:7471900740a2 103
POSIPI 1:7471900740a2 104 P = Ufinal * Ifinal; // puissance
POSIPI 1:7471900740a2 105 energie_1 = (energie_1 + P) / 3600; // énergie en Ws et non en Wh
POSIPI 1:7471900740a2 106 energie = energie + energie_1; // calcul de l'énergie consommée au total depuis le démarrage du microcontroleur
POSIPI 1:7471900740a2 107
POSIPI 1:7471900740a2 108 if(energie > ancien_en + 1) { // si l'énergie augmente d'un Wh
POSIPI 1:7471900740a2 109
POSIPI 1:7471900740a2 110 led_temoin = 1; // allumer la LED
POSIPI 1:7471900740a2 111 wait_ms(500);
POSIPI 1:7471900740a2 112 led_temoin = 0; // éteindre la LED
POSIPI 1:7471900740a2 113
POSIPI 1:7471900740a2 114 ancien_en = energie; // on garde en mémoire l'ancienne valeur de l'énergie
POSIPI 1:7471900740a2 115
POSIPI 1:7471900740a2 116 FILE* pfile = fopen ("/local/log.txt",""); // ouverture du fichier log.txt
POSIPI 1:7471900740a2 117 fprintf(pfile,"En = %.4f Wh\n", energie); // écriture sur le fichier de l'énergie
POSIPI 1:7471900740a2 118 fclose(pfile); // fermeture du fichier
POSIPI 0:6faafff1fb3b 119 }
POSIPI 0:6faafff1fb3b 120 }
POSIPI 0:6faafff1fb3b 121
POSIPI 1:7471900740a2 122 void menu() { // affichage de l'écran
POSIPI 1:7471900740a2 123
POSIPI 1:7471900740a2 124 lcd.cls(); // on efface les anciennes donnees
POSIPI 1:7471900740a2 125
POSIPI 1:7471900740a2 126 switch(pos_menu) {
POSIPI 1:7471900740a2 127
POSIPI 1:7471900740a2 128 case 0:
POSIPI 1:7471900740a2 129 lcd.printf("En = %.4f Wh\n",energie); // on affiche 4 nombres après la virgule
POSIPI 1:7471900740a2 130 break;
POSIPI 1:7471900740a2 131 case 1:
POSIPI 1:7471900740a2 132 lcd.printf("Ueff = %.4f V\n",Ufinal);
POSIPI 1:7471900740a2 133 lcd.printf("Ieff = %.4f A\n",Ifinal);
POSIPI 1:7471900740a2 134 break;
POSIPI 1:7471900740a2 135 case 2:
POSIPI 1:7471900740a2 136 lcd.printf("P = %.4f W\n",P);
POSIPI 1:7471900740a2 137 lcd.printf("Q = %.4f Var\n",Q);
POSIPI 1:7471900740a2 138 break;
POSIPI 1:7471900740a2 139 case 3:
POSIPI 1:7471900740a2 140 lcd.printf("S = %.4f VA\n",S);
POSIPI 1:7471900740a2 141 lcd.printf("cos(phi)= %.0f deg\n",cos(phi));
POSIPI 1:7471900740a2 142 break;
POSIPI 1:7471900740a2 143 default:
POSIPI 1:7471900740a2 144 lcd.printf("En = %.4f Wh\n",energie);
POSIPI 1:7471900740a2 145 break;
POSIPI 1:7471900740a2 146 }
POSIPI 1:7471900740a2 147
POSIPI 1:7471900740a2 148 wait_ms(200); // délai afin que l'affichage des nouvelles valeurs soit suffisament lent pour être lisible
POSIPI 1:7471900740a2 149 }
POSIPI 1:7471900740a2 150
POSIPI 1:7471900740a2 151
POSIPI 1:7471900740a2 152 void interupt_btn_gauche() { // interruption lors d'un appui sur le bouton gauche
POSIPI 1:7471900740a2 153
POSIPI 1:7471900740a2 154 wait_ms(10); // délai d'attente pour que les parasites, liés à la pression du bouton, ne redéclanchent la fonction
POSIPI 1:7471900740a2 155
POSIPI 1:7471900740a2 156 if(pos_menu == 0) { // si l'on arrive à la position 0 du menu
POSIPI 1:7471900740a2 157 pos_menu = 4; // on retournes à la 3ème position du menu (max)
POSIPI 1:7471900740a2 158 } else pos_menu--; // on passe à l'affichage de gauche
POSIPI 1:7471900740a2 159 }
POSIPI 1:7471900740a2 160
POSIPI 1:7471900740a2 161
POSIPI 1:7471900740a2 162 void interupt_btn_droit() { // interruption lors d'un appui sur le bouton droit
POSIPI 1:7471900740a2 163
POSIPI 1:7471900740a2 164 wait_ms(10); // délai d'attente pour que les parasites, liés à la pression du bouton, ne redéclanchent la fonction
POSIPI 0:6faafff1fb3b 165
POSIPI 1:7471900740a2 166 if(pos_menu == 3) { // si l'on arrive à la 3ème position du menu (max)
POSIPI 1:7471900740a2 167 pos_menu = 0; // on retournes à la position 0
POSIPI 1:7471900740a2 168 } else pos_menu++; // on passe à l'affichage de droite
POSIPI 1:7471900740a2 169 }
POSIPI 1:7471900740a2 170
POSIPI 1:7471900740a2 171
POSIPI 1:7471900740a2 172 void envoi() {//fonction qui cree et envoie une trame au module Xbee
POSIPI 1:7471900740a2 173 uint16_t trame_4 = (Ufinal*100);
POSIPI 1:7471900740a2 174 uint16_t trame_6 = (Ifinal*100);
POSIPI 1:7471900740a2 175 uint16_t trame_8 = (P*100);
POSIPI 1:7471900740a2 176 uint16_t trame_10 = (energie*100);
POSIPI 1:7471900740a2 177 char sum;
POSIPI 1:7471900740a2 178
POSIPI 1:7471900740a2 179
POSIPI 1:7471900740a2 180 trame[1] = 0x55;
POSIPI 1:7471900740a2 181 trame[2] = ID;
POSIPI 1:7471900740a2 182 trame[3] = Ufinal*100;
POSIPI 1:7471900740a2 183 trame[4] = trame_4 >> 8;
POSIPI 1:7471900740a2 184 trame[5] = Ifinal*100;
POSIPI 1:7471900740a2 185 trame[6] = trame_6 >> 8;
POSIPI 1:7471900740a2 186 trame[7] = P*100;
POSIPI 1:7471900740a2 187 trame[8] = trame_8 >> 8;
POSIPI 1:7471900740a2 188 trame[9] = energie*100;
POSIPI 1:7471900740a2 189 trame[10] = trame_10 >> 8;
POSIPI 1:7471900740a2 190 trame[11] = trame_10 >> 16;
POSIPI 1:7471900740a2 191 trame[12] = trame_10 >> 24;
POSIPI 1:7471900740a2 192 for(int i = 1; i < 13; i++) { sum = sum + trame[i]; };// checksum
POSIPI 1:7471900740a2 193 sum = sum ;
POSIPI 1:7471900740a2 194 trame[13] = sum;
POSIPI 1:7471900740a2 195
POSIPI 1:7471900740a2 196 for(int i = 1; i < 14; i++) {
POSIPI 1:7471900740a2 197
POSIPI 1:7471900740a2 198 xbee.putc(trame[i]);
POSIPI 1:7471900740a2 199 wait(0.01);
POSIPI 1:7471900740a2 200 pc.printf("%d \t",trame[i]);
POSIPI 1:7471900740a2 201 }
POSIPI 1:7471900740a2 202 pc.printf("\r");
POSIPI 1:7471900740a2 203
POSIPI 1:7471900740a2 204 }
POSIPI 1:7471900740a2 205
POSIPI 1:7471900740a2 206 int main() {
POSIPI 1:7471900740a2 207
POSIPI 1:7471900740a2 208 bouton_gauche.mode(PullUp);
POSIPI 1:7471900740a2 209 bouton_droit.mode(PullUp);
POSIPI 1:7471900740a2 210
POSIPI 1:7471900740a2 211 bouton_gauche.fall(&interupt_btn_gauche);
POSIPI 1:7471900740a2 212 bouton_droit.fall(&interupt_btn_droit);
POSIPI 1:7471900740a2 213
POSIPI 1:7471900740a2 214 led_temoin = 0; // la LED témoin est éteinte
POSIPI 1:7471900740a2 215
POSIPI 1:7471900740a2 216 echantillonnage.attach(&calcul, 0.0001); // interruption toutes les 100µs
POSIPI 1:7471900740a2 217 echantillonnage_puissance.attach(&puissance, 1); // interruption toutes les 1s
POSIPI 1:7471900740a2 218 envoi();
POSIPI 1:7471900740a2 219 while(1) { // boucle infinie
POSIPI 1:7471900740a2 220
POSIPI 1:7471900740a2 221 menu(); // fonction d'affichage
POSIPI 1:7471900740a2 222 envoi(); // fonction d'envoi des trames
POSIPI 1:7471900740a2 223 wait(10);
POSIPI 0:6faafff1fb3b 224 }
POSIPI 0:6faafff1fb3b 225 }