Go Down

Topic: Programmation : Comment calculer l'énergie? (Read 445 times) previous topic - next topic

dbrion06

#15
May 21, 2019, 09:40 am Last Edit: May 21, 2019, 10:17 am by dbrion06
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...

kamill

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

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.

iFrostizz67

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 ?

biggil

Code: [Select]

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

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 https://en.wikipedia.org/wiki/Round-off_error#Accumulation_of_roundoff_error)

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

iFrostizz67

#20
May 21, 2019, 07:17 pm Last Edit: May 21, 2019, 07:18 pm by iFrostizz67
@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 https://en.wikipedia.org/wiki/Round-off_error#Accumulation_of_roundoff_error)

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

Code: [Select]

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


La mesure sera plutôt précise ??

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....)https://fr.wikibooks.org/wiki/Fonctionnement_d%27un_ordinateur/Les_circuits_de_calcul_flottant#Multiplication
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).
.

iFrostizz67

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....)https://fr.wikibooks.org/wiki/Fonctionnement_d%27un_ordinateur/Les_circuits_de_calcul_flottant#Multiplication
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 :D
Merci pour ces précisions

biggil

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 ?

68tjs

#24
May 22, 2019, 09:45 am Last Edit: May 22, 2019, 09:46 am by 68tjs
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.

dbrion06

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 https://stockholmcf.org/turkish-finance-minister-albayraks-thesis-writer-elected-bist-board-chairman/) : là, sur une période de 10 ans -espèrance minimale de vie politique du bénéficiare du plagiat [url]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....

ProjetSTI2D

Code: [Select]
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);

ProjetSTI2D

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

kamill

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!

dbrion06

Bon, au bout d'une semaine, le mystère de l'intensité est partiellement élucidé. Par contre, auriez vous osé, alors que l'arduino a plein de pattes (dont 6 utilisables en analogique), mélanger l'intensité (une voie) et le voltage .
C''est valable sur une charge purement resistive....
cette audace mériterait d'être mise en commentaire: les exemples 'Arduino permettent de reconstituer le câblage.
Et il faudrait l'expliquer dans un rapport  ....

En plus, vous mettez des delais un peu partout, mangeant des millions de cycles (et faisant de l'interfaçage avec d'autres codes un cauchemar).

Vous ne mesurez pas le temps écoulé entre deux mesures , rendant un calcul d'intégrale ....
impossible (alors que les fonctions millis et micros sont bien documentées dans l'aide livrée avec l'IDE d'arduino)
ou
faux (des paris sur la durée entre deux tours de boucle sont faussés par les temps d'impression, les temps d'éxécution d'autres bouts de code...).

Et, avec la "structure" logicielle que vous avez, si vous mesurez des intensités et des voltages positifs, le calcul de la moyenne est faux dès le second tour de loop...(signalé par biggil en post 18)

Go Up