![](/media/cache/profiles/42b1053064ffd7d2256ccb14f4b93884.jpg.50x50_q85.jpg)
TR
Dependencies: TextLCD mbed angleandposition
main.cpp@1:7471900740a2, 2016-05-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |