Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: TextLCD angleandposition mbed
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 }
Generated on Sun Jul 24 2022 10:02:10 by
1.7.2