Carte velleman avec dev c++

Fermé
retyry Messages postés 49 Date d'inscription mardi 22 janvier 2013 Statut Membre Dernière intervention 5 octobre 2016 - Modifié par mamiemando le 15/06/2013 à 12:04
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 15 juin 2013 à 12:17
Bonjour,

Je réalise un petit programme avec une carte velleman. Le principe est de récupérer des informations grâce à la carte velleman, de calculer, mettre les informations calculées à la fin dans un fichier. Plus précisément je dois récupérer une tension et un courant, calculer la puissance puis l'énergie. Pendant 5 min et une relève des mesures toutes les 5s. Je dois mettre la puissance et l'énergie à la fin dans un fichier csv. Après je doit calculer l'énergie moyenne sur 1 min donc 5 moyennes ( une moyenne de chaque minutes soit 12 données par minutes) et les mettre sur un nouveau fichier csv.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h> // pour la fonction Sleep de la tempo
#include "vm110.h"
#include "K8055D_C.h"
//Carte Puissance et E

int i,A,B,P,E,U,I,M;

int conversionA(U){
    U = A/40;
    return U;
}

int conversionB(I){
    I = B/8.5;
    return I;
}

int main(int argc, char *argv[])
{
    FILE* fichier = NULL;
    
    fichier = fopen("test1.txt", "r+");
    
    if(fichier != NULL)
    {
            OpenDevice(0);

            for(i=1;i<10;i++){
                                         
                A= ReadAnalogChannel(1);
                B= ReadAnalogChannel(2);
            
                printf("Voici U:%d\n",A);
                printf("Voici I:%d\n",B);
            
                P = A*B;
            
                printf("Voici la puissance: %d\n",P);
                sleep(5000);
            
                E= P*5*i;
                printf("Voici l'energie: %d\n",E);
                fprintf(fichier,"%d",P);
                fprintf(fichier,":");
                fprintf(fichier,"%d\n",E);

            }
            CloseDevice(0);
            fclose(fichier);
            return 0;
            
    }
}



Avec ce programme j'ai réussi la première partie, soit récupérer U et I, calculer P et E et les mettre sur un fichier csv. Maintenant je voudrais avoir une piste pour faire la moyenne de l'énergie toutes les minutes car je n'ai aucune idée comment faire.

Merci par avance :)
A voir également:

1 réponse

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
Modifié par mamiemando le 15/06/2013 à 12:25
Une petite erreur pour commencer, ton "return 0" devrait être juste avant la dernière accolade du programme.

Ensuite truc qui ne va pas (mais qui ne remet pas en cause le fait que le code marche) toutes tes variables sont globales ce qui est une TRÈS mauvaise habitude, et il manque le type des paramètres de tes fonctions pour tes fonctions de conversion. Ce devrait être :

int conversionA(int A){
    int U = A/40;
    return U;
}

int conversionB(int B){
    int I = B/8.5;
    return I;
}

int main(int argc, char *argv[])
{
    int i,A,B,P,E,U,I,M;
    ...
    I = conversionB(A);
    ...
    return 0;
}


Note que dans tes fonctions de conversion tu pourrais même directement écrire :

int conversionA(int A){
    return A / 40;
}


Voilà donc sinon n'oublie pas que ces divisions seront arrondies puisque ce sont des divisions entières. Par ailleurs si ces entiers sont forcément positifs ce serait mieux d'utiliser des "unsigned int" (aussi notés "unsigned").

Pour revenir à ton problème, pour calculer tes moyennes, tu dois mémoriser ton échantillon de valeur. Pour cela le plus simple c'est de les stocker dans un tableau. Si la taille de ton tableau peut-être déterminée à la compilation (c'est à dire qu'elle ne dépend pas de la manière dont se déroule le programme) tu peux faire une allocation statique, sinon tu dois faire une allocation dynamique (voir malloc).

Allocation statique :

void f() {
  int tab[3]; // 3 est une constante

  // Pour remplir le tableau
  tab[0] = 10;
  tab[1] = 20;
  tab[2] = 5;
}


Allocation dynamique :

#include <stdlib.h>
#include <stdio.h>

void f() {
  size_t n = 3; // n est une variable !
  int *tab = malloc(sizeof(int) * n);

  if (!tab) {
    fprintf(stderr, "Not enough memory\n");
    return;
  }

  // Pour remplir le tableau
  tab[0] = 10;
  tab[1] = 20;
  tab[2] = 5;

  // Désalloue le tableau de la mémoire, il ne sera plus utilisable après
  // A chaque malloc correspond un free
  // On déclenche le free quand le tableau n'est plus utilisé
  free(tab);
}


Ensuite pour calculer ta moyenne, voici à quoi ça ressemble :

#include <stdlib.h>
#include <stdio.h>

double mean(int * values, size_t num_values) {
  double sum = 0;
  size_t i;

  for(i = 0; i < num_values; ++i) {
    sum += values[i];
  }

  return sum / num_values;
}

int main() {
  size_t n = 3; // n est une variable !
  int *tab = malloc(sizeof(int) * n);

  if (!tab) {
    fprintf(stderr, "Not enough memory\n");
    return EXIT_FAILURE;
  }

  tab[0] = 10;
  tab[1] = 20;
  tab[2] = 5;
  printf("mean = %lf\n", mean(tab, n));

  return EXIT_SUCCESS;
}


Cet exemple donne à l'exécution :

mean = 11.666667


Bonne chance
0