Programmation : Comment calculer l'énergie?

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)....

dbrion06:
@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)....

Je vais essayer ça après.
Mais dans le cas de la mesure du voltage d'une batterie

float voltage = (analogRead(A0)*0,5/1023);

La mesure sera plutôt précise ??

Vous ne faites que deux divisions, pas une infinité/ un grand nombre d'additions de nombres ayant des ordres de grandeur différents ( il fait comme si vous étiez un peu paresseux et additionniez disons 10000000 et 0.1....).

Votre opération (je retire le 0.5 du calcul) consistera à diviser sur 24 bits le voltage, bien cadre; la division ne sera pas pire qu'en 24 bits... mettre à joiur l'exposant (une soustraction exacte); recadrer... (essayez de diviser 100000 et 0.1....)Fonctionnement d'un ordinateur/Les circuits de calcul flottant — Wikilivres
L'operation peut être plus rapide que du calcul en 32 bits. j'avais fait des estimations des temps pour diverses représentations, mais je ne les ai pas retenues et je ne me souviens pas où j'ai mis le sketch).
.

dbrion06:
Vous ne faites que deux divisions, pas une infinité/ un grand nombre d'additions de nombres ayant des ordres de grandeur différents ( il fait comme si vous étiez un peu paresseux et additionniez disons 10000000 et 0.1....).

Votre opération (je retire le 0.5 du calcul) consistera à diviser sur 24 bits le voltage, bien cadre; la division ne sera pas pire qu'en 24 bits... mettre à joiur l'exposant (une soustraction exacte); recadrer... (essayez de diviser 100000 et 0.1....)Fonctionnement d'un ordinateur/Les circuits de calcul flottant — Wikilivres
L'operation peut être plus rapide que du calcul en 32 bits. j'avais fait des estimations des temps pour diverses représentations, mais je ne les ai pas retenues et je ne me souviens pas où j'ai mis le sketch).
.

D'accord, d'accord ! C'est très intéressant, mais étant une bille en électronique théorique, je me contente d'une vulgaire vulgarisation :smiley:
Merci pour ces précisions

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

C'est quand même hallucinant de demander un projet informatique sans avoir étudié le langage !
Deux hypothèses:

  • le prof est un je-m-en-foutiste ?
  • Il y a eu un cours de programmation, mais l'élève l'a passé avec son téléphone à la main ?

Tu te poses encore la question ?
Ils sont nombreux, surtout à quelques jours de la remise de l'écrit, ceux qui pleurent que leur prof ne leur a pas appris à programmer.
Sauf qu'au brevet 3 ans plus tôt ils ont eu une épreuve où ils devaient expliquer un petit programme écrit en scratch.
Ils se fichent de nous et j'espère que leur prof bien nul lit ce forum et qu'ils vont avoir un bon oral musclé, c'est tout ce qu'ils méritent.

Ou ils ont un sens curieux de l'humour, en se faisant passer pour des lycéens en détresse.... (je ne sais vraiment pas, tant c'est énorme)
A noter que

a) wikipedia, la providence des cancres, a fait un gros effort pour diffuser des notions de programmation.

b) toute la connaissance informatique nécessaire est à portée de menu (exemples) dans l'IDE arduino (pas besoin d'être connecté, ni d'écumer le ouaibe pour ramasser n'importe quoi -un chiffonnier peut faire le tri; je crois que, dans le cas de ce fil, le crochet a ramené un bout de code pour mesurer la puissance dans une résistance en courant alternatif, et qu'il a té collé sans prendre soin de vérifier que c'était adapté)

c) il est très difficile de chiffre le prix du plagiat, pour pouvoir taxer d'incompétence:

  • un droit d'entrée dans une société de sevices est de l'irdre de quelques centaines d'euros -un edevis pour une réparation de routine -dévirussage- est de 50 euros.
  • les conseils -par courrier electonique, fort traçables ... - pour l'écriture d' une thèse de 300 pages en économie (il doit y avoir quelques experts en chiffrement dans ce domaine) se sont traduits, hors Europe, par une promotion (avec augmentation de salaire à l'appui Turkish Finance Minister Albayrak’s ‘thesis writer’ elected BIST board chairman - Stockholm Center for Freedom) : là, sur une période de 10 ans -espèrance minimale de vie politique du bénéficiare du plagiat https://en.wikipedia.org/wiki/Berat_Albayrak|/url]
    -, ce sont des transferts de dizaines de milliers d'euros ; Je suppose qu'un rapport fait 10 fois moins de pages, et une simple règle de trois aboutit à une taxation de l'ordre de quelques milliers d'euros....
float Voltage = 0;
float Current = 0;
float Power = 0;


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;
  if(Voltage <= 0.00001); {
   Current = 0;
   }
  Power = Current * Voltage;
 Serial.print("\n Voltage (V) = "); 
 Serial.print(Voltage,2);
 Serial.print("\t Current (A) = ");
 Serial.print(Current,2);
 Serial.print("\t Power (W) = ");
 Serial.print(Power,2);
 delay(1000);

Nous avons utilisé juste le capteur d'intensité ACS712 qui a la particulariter de relever aussi le voltage avec une formule

ProjetSTI2D:
Nous avons utilisé juste le capteur d'intensité ACS712 qui a la particulariter de relever aussi le voltage avec une formule

???????

Ça m’étonnerait beaucoup!