Programmation : Comment calculer l'énergie?

Bonjour, nous sommes actuellement en projet en utilisation avec l'arduino pour calculer l'énergie avec nos capteurs de courant et de tension.
Pour cela, nous aurions besoin de l'aide d'un expert pour nous aider car cela fait plusieurs mois qu'on arrive pas à avancer.
Merci d'avance.

Pourquoi ne pas lire la tension en analogique sur le port de la carte Arduino directement ?

car on a besoin du courant et du temps pour calculer l'energie E=UxIxt

De combien est la tension et intensité que vous souhaitez mesurer environ ?

on a déja fait des programmes pour connaitre la tension et le courant avec les capteurs. Le problème est qu'on ne sait pas calculer l'energie avec le language arduino.

La puissance moyenne est la moyenne du produit de la tension par l'intensité (est ce vrai?).
L'arduino permet de calculer une puissance instantanée (en admettant que l'intensité et la tension ne varient pas très vite) assez rapidement : les multiplications sont rapides, les cumuls, préalables au calcul de moyenne, aussi. Vous pouvez integrer cette grandeur sur la période que vous voulez... (au bout d'un certain temps, l'énergie sera très grande)

Ce qui pose 3 questions:

  1. quelles sont les ordres de grandeur qui vous interessent (energie d'une lampe, d'un moteur, d'une LED?; temps (toutes les secondes, 10 secondes?)

a) sur quelle période souhaitez vous cumuler?

b) savez vous lire une intensité avec arduino?

c) savez vous lire une tension avec Arduino?

Nota : on peut, même si ça "ne marche pas", pouvoir répondre à ces trois questions (j'ignore si vous les avez déjà posées a votre encadrant, si vous les avez déjà résolues ou tenté de les résoudre -en xx mois, ça doit être faisable, ce sont -partiellement- des questions soit d'intendance, soit de cours) mène à une solution informatique triviale.
Pour ma curiosité: avez vous eu des cours de C++?; d'électricité?
Edité : corrigé confusion énergie/puissance

Arduino Reference - Arduino Reference allez voir à "arithmetic operators", seconde ligne;
faites bien attention aux conversions de type... (lire la page complète peut résoudre la difficulté suivante que vous rencontrerez)

Ma partie du projet est de calculer l'energie que nous produisons avec un rameur. Pour ça j'ai du utiliser un capteur d'intensité et de tension pour trouver U et I. Ainsi essayer de faire la formule E=P*t. Nous savons lire l'intensité et la tension. Il nous reste plus qu'à trouver la formule de l'energie sous language arduino et l'afficher sur un écran avec LiquidCrystal.

Nous avons pas eu de cour C++

Bonjour,

Il faut intégrer la puissance en fonction du temps.
Pour cela tu découpes le temps en petites durée où tu considères que la puissance est constante (par exemple toutes les 10 ms), tu calcules P*Δt et tu additionnes à la valeur d'énergie précédente.

La puissance est donc assez stable (les fluctuations sont petites pendant, disons, 1/10 ième de seconde).

L'énergie n'a pas de limites: la calculer sur une période finie....

Que se passerait il si vous lisiez à cadence régulière l'intensité et le voltage , pendant xxx secondes, affichiez le cumul des produits de l'intensité par la tension (multiplié par le pas d'échantillonnage: s'il est constant, cette multiplication peut avoir lieu juste avant l'affichage).

Je vous conseillerais

a) de tout convertir en floats (c'est ce qu'on fait quand in n'a pas d'ordre de grandeur des grandeurs à mesurer, ou quand elles peuvent devenir arbitairement grandes/petites) et en unités standard...

b) de regarder comment déclencher une action régulièrement blinkWithoutDelay est un exemple fourni avec Arduino .

c) d'essayer d'analyser les erreurs commises avec cette méthode; de cocher cette analyse par écrit.... (note -t-on un truc qui marche/ une analyse des erreurs et limitations du truc -les deux seraient préférables- )

Nota : a priori, mesurer (avec micros() ; dans la référence) le temps entre deux mesures deltat, comme préconisé par kamill, est préférable à faire en sorte que les mesures soient à cadence fixe...

ProjetSTI2D:
Le problème est qu'on ne sait pas calculer l'energie avec le language arduino.

Le langage Arduino est le C++. Savez-vous faire une multiplication en C++ ?

nous savons pas faire une multiplication en C++, puisque nous avons pas fait l'étude du C++

il est donc temps d'apprendre....... les ressources ne manquent pas sur le WEB...

en particulier l'excellent tutoriel conseillé aux débutants........

les nouveaux , ceux qui qui prennent le temps de consulter la 'Règle du Forum' ne peuvent pas passer à côté du lien

p

double Energ = 0;
double Temps = 0;
double Voltage = 0;
double Current = 0;
double DT = 1000;
void setup() {
Serial.begin(9600);

}

void loop() {

for(int i = 0; i < 1000; i++) {
Voltage = (Voltage + (.0049 * analogRead(A0)));
delay(1);
}
Voltage = Voltage /1000;
Current = (Voltage -2.5)/ 0.185;
Serial.print("\n Voltage Sensed (V) = “);
Serial.print(Voltage,2);
Serial.print(”\t Current (A) = ");
Serial.print(Current,2);
delay(1000);

}

Votre solution ne peut se greffer à un bout de code déjà existant (plein de delay, qui rendront la logique de l'ensemble chaotique).
Or, vous dites que c'est une partie d'un travail en équipe.
Trouvez un moyen de mesurer le temps entre deux appels à analogRead. Ce sera le deltat dont parle Kamill en post 8 .
Lisez la documentation de référence de l'arduino, livrée avec l'IDE -et AFAIK, il y a un bouton pour y accèder!-
: la multiplication y est documentée, ainsi que les fonctions millis et micros.

Faites bien attention au fait qu'une différence de temps, du fait des représentations, peut devenir négative (dans le cas de la différence entre l'instant et l'instant d'avant, il y a de quoi tourner en bourrique) et que une différence de floats peut être très réaliste pour des petits floats (au début), mais devenir fausse au bout de quelque temps...

Edité: De quel chapeau vient le lien entre l'intensité et le voltage? (resistance de valeur inconnue? ça mériterait d'être documenté).
Pourquoi peut elle être négative? (ça aussi, ça mériterait des commentaires, si c'est vrai)
fin de Edite

Autre détails: vous faites (à tort ou à raison) des calculs en flottant avec Voltage : déclarez le en float , ce qui est plus lisible....
vous faites des impressions de débugging à 9600 bauds (et la longueur des lignes est variable: vous allez avoir une consommation de temps -ça prend 1 milliseconde pour sortir un caractère- et une variabilité qui peuvent s'avérer désagréables; initialisez votre ligne série à 115200 bauds -universel- pour limiter les dégâts induits par le debugging...

Mets ton code entre balises avant que ton sujet passe à la poubelle.

ProjetSTI2D:
nous savons pas faire une multiplication en C++, puisque nous avons pas fait l'étude du C++

Tu sais quand même faire une multiplication.
Mets déjà tes formules et ton algorithme sur le papier avant de penser à coder.

dbrion06:
et que une différence de floats peut être très réaliste pour des petits floats (au début), mais devenir fausse au bout de quelque temps...

Ça m'intéresse ...
La précision en float baisse en fonction du temps ?
Ou c'est le simple fait d'afficher des float + ou - précis qui sont eux mêmes issus de float + ou - précis ?

ProjetSTI2D:

double Voltage = 0;

…/…
void loop() {
 for(int i = 0; i < 1000; i++) {
   Voltage = (Voltage + (.0049 * analogRead(A0)));
   delay(1);
 }
 Voltage = Voltage /1000;
  …/…
}

il manque la remise à zéro de Voltage dans la loop()

@iFrostizz67
Ma formulation était folklorique, (une energie est une integrale en fonction du temps....).Si vous faites des cumuls, au début les calculs seront très précis; au bout d'un certain temps, ils seront fantaisistes (des petits increments peuvent devenir plus peteits que le nombre que l'on cherche à additionner, du fait de l'ajustement de l'exposant: on trouve une explication moins folklorique dans Round-off error - Wikipedia)

Essayez d'afficher en float 1.0 ....

A noter que la methode de calcul (valable pour la première itération) est affectée d'une erreur systematique de 10% : un delay d'une milliseconde, et un temps de conversion (non comptabilisé... pas plus que le reste, qui est plus négligeable) de 100 microsecondes...) (supposons que vous vous trompez de 10% quand vous avez affaire à un Père Cepteur....: il vous rappelera que lespetits ruiseaux font les grandes rizières). C'est pour ça que mesurer le temps entre deux mesures est beaucoup plus fiable, ne bloque pas pendant 1.1 secondes (au moins) les autres tâches....
Naturellement, ce n'est pas à moi de formaliser de manière sérieuse l'explication de ce choix (travail scolaire)....