Go Down

Topic: Calcul variation de poids dans le temps (Read 204 times) previous topic - next topic

BigOlive

Bonjour,

Je débute sur arduino et j'aurai besoin que l'on me guide sur la structure du code pour réaliser une mesure de variation de poids dans le temps (toutes les 15mins).

Poids à temps t
Poids à temps t+15min
VariationPoids = (temps t +15) - (temps t)

Et on recommence dans 15 mins...

Si vous avez un exemple ou une "trame" à me proposer.

Merci pour votre aide


Marc_Bresson

initialisez poids2 = 0

ensuite, vous pouvez utiliser la loop

- print(mesure du poids à t - poids2 )
- poids2 = mesure du poids à t
- delay(15 min ( a convertir en milliseconde))

J4l13n

Bonjour 

Poids à temps t
Poids à temps t+15min
VariationPoids = (temps t +15) - (temps t)

Et on recommence dans 15 mins...

"On recommence dans 15mins" à calculer la variation du Poids des par rapport a celle de l'instant t ou à la prise du poids de 15min ?
@+
while(success!=found){
   try++;
   if(fail){
        tryAgain();
}}

BigOlive

Bonjour et merci pour votre réponse

"On recommence dans 15mins" à calculer la variation du Poids des par rapport a celle de l'instant t ou à la prise du poids de 15min ?

à la prise de poids de 15min

Cdt

68tjs

Evites l'utilisation de delay().
Delay() c'est fastoche mais c'est bloquant : le micro est arrêté tout le temps du delais et il ne peut rien faire d'autre.

Utilise plutôt millis().
Pour savoir comment utiliser millis() regarde le code de l'exemple "Blink without delay".

J-M-L

#5
Aug 28, 2019, 02:51 pm Last Edit: Aug 28, 2019, 02:51 pm by J-M-L
d'un autre côté si c'est tout ce que fait l'arduino, faire une delay() c'est OK... de toutes façons l'Arduino ne fait rien d'autre de productif.

dans le setup()
Code: [Select]
mesure1 = effectuer une mesure

dans la loop()
 
Code: [Select]
  delay(15 minutes)
  mesure2 = effectuer une mesure
  imprimer (mesure2 - mesure1)
  mesure1 = mesure2; // la nouvelle devient l'ancienne


pas très compliqué
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

BigOlive

Mon début de code ci-dessous..
J'arrive pas à trouver comment mettre à jour les poids.....
Merci pour votre aide

Code: [Select]
#define TEMPO 5 // = 5 secondes for test

unsigned long DUREE_ECOULEE, TOP_CHRONO;
float Poids1; // valeur de poids actuelle
float Poids2; // Valeur de Poids après 15min
float DeltaPoids; // Delta entre Poids2 et Poids1
int x;

void setup()
{
  Poids1 = 1; //for test
  Serial.begin(115200);

  TOP_CHRONO = millis() / 1000; // Temps depuis power ON convertit en sec.
}

void loop()
{
  x = x+1;
 
  Poids2 = Poids1 + x; // pour tester augmentation de poids
  Serial.print("Poids1= ");
  Serial.println(Poids1);
  Serial.print("Poids2= ");
  Serial.println(Poids2);
 
  Traiter_toutes_les_15_minutes(); // Appel sous programme
}

void Traiter_toutes_les_15_minutes()
{
  DUREE_ECOULEE = (millis() / 1000) - TOP_CHRONO; // Test si 15 mins écoulée
  if (DUREE_ECOULEE == TEMPO)
  {
    Poids2 = 10; // for test
    DeltaPoids = Poids2 - Poids1;
    Serial.print("Calcul variation de poids = ");
    Serial.println(DeltaPoids);
    TOP_CHRONO = millis() / 1000; // on initialise TOP_CHRONO
    Poids2 = Poids1;
    delay (3000);// pour test
       
  }
}

J-M-L

#7
Aug 28, 2019, 05:11 pm Last Edit: Aug 28, 2019, 05:20 pm by J-M-L
Pourquoi vous embêter à convertir en secondes? faites les comparaisons en ms directement

en pratique quand on veut tester si un temps est écoulé, il vaut mieux éviter de tester l'égalité
Code: [Select]
  if (DUREE_ECOULEE == TEMPO) et regarder si c'est plus grand ou égal. comme cela si votre programme a raté la seconde pile (parce qu'il était coincé ailleurs), vous déclenchez quand même. On fait donc
Code: [Select]
if (millis() - topChrono >= tempsDattente) {...
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

BigOlive


J-M-L

#9
Aug 28, 2019, 05:20 pm Last Edit: Aug 28, 2019, 06:15 pm by J-M-L
on a aussi pour habitude de mettre les #define en majuscule effectivement mais les variables commencent par une minuscule (convention)

utiliser ul pour marquer qu'un nombre doit être traité comme unsigned long

prenez l'habitude de mettre les fonctions avant que vous ne les utilisiez. (l'IDE va faire des manips pour vous mais un jour ça vous jouera des tours)

ça ressemblerait à cela:
Code: [Select]
const unsigned long tempsDattente =  5000ul; // = 5 secondes for test. 900000ul pour 15 minutes
unsigned long topChrono;

float poidsDebut; // valeur de poids actuelle
float poidsFin; // Valeur de Poids après 15min

void Traiter_toutes_les_15_minutes()
{
  if (millis() - topChrono >= tempsDattente) { // est-ce que le délai est écoulé ?
    poidsFin = 10; // for test
    Serial.print("Calcul variation de poids = ");
    Serial.println(poidsFin - poidsDebut);
    poidsDebut = poidsFin;
    topChrono = millis();
  }
}

void setup()
{
  Serial.begin(115200);
  poidsDebut = 1; // for test
  topChrono = millis();
}

void loop()
{
  Traiter_toutes_les_15_minutes();

  // ici on peut faire autre chose
}
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

dbrion06

#10
Aug 28, 2019, 05:30 pm Last Edit: Aug 28, 2019, 05:56 pm by dbrion06
Code: [Select]

#define TEST
float oldPoids , nouveauPoids, deltaPoids;
uint32_t lastLu=0;
#ifdef TEST
const uint32_t deltaT = 5UL*1000UL; //toutes les conversions sont explicites
#else
const uint32_t deltaT = 15UL*60UL*1000UL; // on detaille les calculs 15 minutes/60 seconds *1000 ms
#endif
void lirePoids() {
#ifdef TEST
  Poids2 = (float) millis;
#else
// code plus réaliste
#endif
}
void setup() {
  lirePoids();
  oldPoids = nouveauPoids; // sinon, la première valeur est fausse
  Serial.begin(115200);
}
void loop() {
  uint32_t dateMs = millis();
  lirePoids(); // met à jour nouveauPoids
  if (dateMs >= (lastLu + deltaT)) {
    lastLu=dateMs ; // met à jour la date du calcul precedent
    deltaPoids = nouveauPoids - oldPoids; // fait le calcul
    oldPoids = nouveauPoids ; // met à jour ancien poids
    Serial.print(" deltaPoids :");
    Serial.println(deltaPoids );
 }
}
   

(non testé)
Edité: j'ai vu le code de JML, et quelque chose m'a intrigué:
Quote
utiliser **ul** pour marquer qu'un nombre doit être traité comme unsigned long
Même si ça doit compiler et générer les bonnes constantes , et que c'est compatible avec la casse de "unsigned long", j'ai plutôt tendance (pour éviter que l ne soit confondu avec 1 ou I) à écrire "UL" -c'est laid, mais lisible sans ambiguité-  et https://fr.wikibooks.org/wiki/Programmation_C/Types_de_base#Constantes_num%C3%A9riques_enti%C3%A8res ne connaît que cette notation.....

J-M-L

#11
Aug 28, 2019, 06:11 pm Last Edit: Aug 28, 2019, 06:12 pm by J-M-L
La spec dit qu'on peut utiliser arbitrairement des minuscules ou des majuscules (y compris pour les nombre en hexa), et même panacher sauf pour LL
Quote
Letters in the integer literals are case-insensitive: 0xDeAdBeEfU and 0XdeadBEEFu represent the same number (one exception is the long-long-suffix, which is either ll or LL, never lL or Ll)
Perso j'utilise une police de caractère assez grande et où le 1 et le l sont assez différents donc j'utilise soit des minuscules, soit des majuscules suivant l'humeur :) mais vous avez raison, ça fait partie effectivement des standard de bonne pratique de code de plusieurs institutions (par exemple pour le SEI).


Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up