TR
Dependencies: TextLCD mbed angleandposition
Revision 1:7471900740a2, committed 2016-05-20
- Comitter:
- POSIPI
- Date:
- Fri May 20 06:57:35 2016 +0000
- Parent:
- 0:6faafff1fb3b
- Commit message:
- CR Mesure d'?nergie et de Puissance
Changed in this revision
angleandposition.lib | Show annotated file Show diff for this revision Revisions of this file |
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 6faafff1fb3b -r 7471900740a2 angleandposition.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/angleandposition.lib Fri May 20 06:57:35 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/teams/BioRobotics1/code/angleandposition/#2dc21bf3f3a0
diff -r 6faafff1fb3b -r 7471900740a2 main.cpp --- a/main.cpp Thu May 19 13:56:14 2016 +0000 +++ b/main.cpp Fri May 20 06:57:35 2016 +0000 @@ -1,150 +1,225 @@ #include "mbed.h" -#include <stdlib.h> -#include <stdio.h> #include "TextLCD.h" +#include "math.h" +#include "angleandposition.h" + + +#define Nmax 200 // nombre d'echantillonnages sur une période +#define nb_echantillon_max 10000 // 1s/20ms(temps acquisition pour une période) * Techantillonnage = 50 * 200 = 10 000 soit 10 000 echantillons par seconde +#define ID 0x09 // ID commun entre les modules XBEE - DigitalOut led1(LED1); - Serial pc(USBTX, USBRX); // tx, rx - TextLCD lcd(p21, p22, p23, p24, p25, p26, TextLCD::LCD20x4); // rs, e, d4-d7 - LocalFileSystem local("local");//enregistrement en local - - Ticker echantillonnage; +// Entrees/Sorties : +AnalogIn Iana(p16); // intensité mesurée +AnalogIn Uana(p17); // tension mesurée +DigitalOut led_temoin(LED1); // LED témoin (sur la carte) - AnalogIn Uana(p16); - AnalogIn Iana(p17); +// Objets : +Serial pc(USBTX, USBRX); // (tx, rx) communication par port serie pour l'aide au débogage +TextLCD lcd(p21, p22, p23, p24, p25, p26, TextLCD::LCD16x2); // (d4-d7, rs, e) afficheur LCD +Serial xbee(p9, p10); // (tx,rx) module XBee - int compteur_echantillonnage = 0; - unsigned char n = 200; // nb d'échantillonnage sur une période +// Interruptions : +InterruptIn bouton_gauche(p27); // interruption du bouton gauche +InterruptIn bouton_droit(p28); // interruption du bouton droit - #define Nmax 200 // nombre d'échantillonnages sur une période - #define nb_echantillon_max 10000 // 1s/20ms(temps acquisition) * Techantillonnage = 50 * 200 = 10 000 +// Fonctions d'échantillonnages : +Ticker echantillonnage; // déclaration d'un programme d'interruption +Ticker echantillonnage_puissance; // déclaration d'un programme d'interruption + +// Fichiers externes : +LocalFileSystem local("local"); // fichier créer afin de stocker des valeurs - float U0, U20, U2n_1, Un, U2n; - float Veff = 0; - float Ufinal=0; - float I0, I20, I2n_1, In, I2n; - float Ieff = 0; - float Ifinal=0; - float P = 0; - float energie = 0; - float energie2 = 0; - float Cpt = 0; - float stock = 0; - int flag=0; - int caractereActuel = 0; +// Variables : +char pos_menu = 0; // choix du menu à afficher +char trame[14]; // tableau servant à l'envoi des trames +float U0, U20, U2n_1, Un, U2n, Veff, Ufinal = 0;//variable pour le calcul de la tension +float I0, I20, I2n_1, In, I2n, Ieff, Ifinal = 0;//variable pour le calcul de l'intensite +float P = 0, S, Q, phi, energie_1 = 0, energie = 0; -void calcul() -{ - if (compteur_echantillonnage == 0) - { +int ancien_en = 0; // La LED s'allume tous les Wh +int compteur_echantillonnage = 0; + + +void calcul() { // fonction qui effectue les calculs (tesion intensite,puissance etc. + + if (compteur_echantillonnage == 0) { + Veff = 0; + Ieff = 0; + U0 = Uana; U0 = U0 - 0.5; U20 = U0 * U0; U2n_1 = U20; - + + I0 = Iana; I0 = I0 - 0.5; I20 = I0 * I0; I2n_1 = I20; - + compteur_echantillonnage++; } if (compteur_echantillonnage > 0 && (compteur_echantillonnage < nb_echantillon_max)) { - + Un = Uana; Un = Un - 0.5; U2n = Un * Un; - + + Veff = (U2n + U2n_1) / 2 + Veff; + U2n_1 = U2n; + + In = Iana; In = In - 0.5; I2n = In * In; - - Veff = (U2n + U2n_1) / 2 + Veff; - U2n_1 = U2n; - + Ieff = (I2n + I2n_1) / 2 + Ieff; - I2n_1 = I2n; - + I2n_1 = I2n; + compteur_echantillonnage++; } - if (compteur_echantillonnage >= nb_echantillon_max) - { - Ufinal = 707*sqrt(Veff/nb_echantillon_max)*0.97; // 707=2*sqrt(2)*250; 8 offset of 17/03/2016 - Ifinal = 14*sqrt(Ieff/nb_echantillon_max); // 14=2*sqrt(2)*5; - P = Ufinal * Ifinal; - flag=1; + if (compteur_echantillonnage >= nb_echantillon_max) { + + Ufinal = 707.1*sqrt(Veff/nb_echantillon_max); // 707.1 = 2*sqrt(2)*250 (250 étant 250V, la tension maximale du secteur) + Ifinal = 14.14*sqrt(Ieff/nb_echantillon_max); // 14.14 = 2*sqrt(2)*5 (5 étant 5A, l'intensité maximale du secteur) + + S = Veff*Ieff; // puissance apparente + phi = acos(P/S); + Q = P * tan(phi); // puisance réactive + } + +} + +void puissance() { // calcul de la puissance toutes les secondes par interruption + + compteur_echantillonnage = 0; // réinitialisation du compteur pour la fonction calcul() + + P = Ufinal * Ifinal; // puissance + energie_1 = (energie_1 + P) / 3600; // énergie en Ws et non en Wh + energie = energie + energie_1; // calcul de l'énergie consommée au total depuis le démarrage du microcontroleur + + if(energie > ancien_en + 1) { // si l'énergie augmente d'un Wh + + led_temoin = 1; // allumer la LED + wait_ms(500); + led_temoin = 0; // éteindre la LED + + ancien_en = energie; // on garde en mémoire l'ancienne valeur de l'énergie + + FILE* pfile = fopen ("/local/log.txt",""); // ouverture du fichier log.txt + fprintf(pfile,"En = %.4f Wh\n", energie); // écriture sur le fichier de l'énergie + fclose(pfile); // fermeture du fichier } } -int main() -{ +void menu() { // affichage de l'écran + + lcd.cls(); // on efface les anciennes donnees + + switch(pos_menu) { + + case 0: + lcd.printf("En = %.4f Wh\n",energie); // on affiche 4 nombres après la virgule + break; + case 1: + lcd.printf("Ueff = %.4f V\n",Ufinal); + lcd.printf("Ieff = %.4f A\n",Ifinal); + break; + case 2: + lcd.printf("P = %.4f W\n",P); + lcd.printf("Q = %.4f Var\n",Q); + break; + case 3: + lcd.printf("S = %.4f VA\n",S); + lcd.printf("cos(phi)= %.0f deg\n",cos(phi)); + break; + default: + lcd.printf("En = %.4f Wh\n",energie); + break; + } + + wait_ms(200); // délai afin que l'affichage des nouvelles valeurs soit suffisament lent pour être lisible +} + + +void interupt_btn_gauche() { // interruption lors d'un appui sur le bouton gauche + + wait_ms(10); // délai d'attente pour que les parasites, liés à la pression du bouton, ne redéclanchent la fonction + + if(pos_menu == 0) { // si l'on arrive à la position 0 du menu + pos_menu = 4; // on retournes à la 3ème position du menu (max) + } else pos_menu--; // on passe à l'affichage de gauche +} + + +void interupt_btn_droit() { // interruption lors d'un appui sur le bouton droit + + wait_ms(10); // délai d'attente pour que les parasites, liés à la pression du bouton, ne redéclanchent la fonction - echantillonnage.attach(&calcul, 0.0001); // 100µs -// lcd.printf("debut"); - while(1) - { - if (flag==1) - { -// Ufinal = 707*sqrt(Veff/nb_echantillon_max); // 707=2*sqrt(2)*250; -// Ifinal = 14*sqrt(Ieff/nb_echantillon_max); // 14=2*sqrt(2)*5; - wait(1); - lcd.cls(); - pc.printf("Ueff = %.2f V\r\n",Ufinal); - lcd.printf("Ueff = %.2f V\n",Ufinal); - pc.printf("Ieff = %.2f A\r\n",Ifinal); - lcd.printf("Ieff = %.2f A\n",Ifinal); -// pc.printf("Pn = %.2f\r\n",Pn); -// lcd.printf("Pn = %.2f\n",Pn); - compteur_echantillonnage = 0; - Veff=0; - Ieff=0; - flag=0; - Cpt++; -// pc.printf("Cpt = %.2f\r\n",Cpt); - if (Cpt == 1)//toutes les secondes - { - - char ligne[20]; - FILE* File2 = fopen("/local/datafile.txt","r"); - fputs(ligne,File2); - //on coupe de 11 à 18 - //on convertit string en float - // on marque les(s) équalisté nécessaire(s) - fclose(File2); - - energie = energie + P; - energie = energie; -// EEPROM.write(500, energie);//eeprom hard? - energie2 = energie2 + P; //energie en joule - energie2 = energie2 / 3600; //energie en wattheure - wait(1); - lcd.cls(); - pc.printf("P = %.2f W\r\n",P); - lcd.printf("P = %.2f W\n",P); - pc.printf("E = %.0f J\r\n",energie); - lcd.printf("E = %.0f J\n",energie); - Cpt = 0; - stock = energie; - stock = energie / 3600; - if (energie2 >= 1) - { - led1 = 1; - wait(0.5); - led1 = 0; - energie2 = energie2 - 3600; - } - FILE* File1 = fopen("/local/datafile.txt","w"); - fprintf(File1, "[energie] %.6f Wh", stock ); - fclose(File1); - } - - } + if(pos_menu == 3) { // si l'on arrive à la 3ème position du menu (max) + pos_menu = 0; // on retournes à la position 0 + } else pos_menu++; // on passe à l'affichage de droite +} + + +void envoi() {//fonction qui cree et envoie une trame au module Xbee + uint16_t trame_4 = (Ufinal*100); + uint16_t trame_6 = (Ifinal*100); + uint16_t trame_8 = (P*100); + uint16_t trame_10 = (energie*100); + char sum; + + + trame[1] = 0x55; + trame[2] = ID; + trame[3] = Ufinal*100; + trame[4] = trame_4 >> 8; + trame[5] = Ifinal*100; + trame[6] = trame_6 >> 8; + trame[7] = P*100; + trame[8] = trame_8 >> 8; + trame[9] = energie*100; + trame[10] = trame_10 >> 8; + trame[11] = trame_10 >> 16; + trame[12] = trame_10 >> 24; + for(int i = 1; i < 13; i++) { sum = sum + trame[i]; };// checksum + sum = sum ; + trame[13] = sum; + + for(int i = 1; i < 14; i++) { + + xbee.putc(trame[i]); + wait(0.01); + pc.printf("%d \t",trame[i]); + } + pc.printf("\r"); + +} + +int main() { + + bouton_gauche.mode(PullUp); + bouton_droit.mode(PullUp); + + bouton_gauche.fall(&interupt_btn_gauche); + bouton_droit.fall(&interupt_btn_droit); + + led_temoin = 0; // la LED témoin est éteinte + + echantillonnage.attach(&calcul, 0.0001); // interruption toutes les 100µs + echantillonnage_puissance.attach(&puissance, 1); // interruption toutes les 1s + envoi(); + while(1) { // boucle infinie + + menu(); // fonction d'affichage + envoi(); // fonction d'envoi des trames + wait(10); } } \ No newline at end of file