Création d'une fonction crête avec un code arduino

Bonjour à toutes et à tous,

Aujourd'hui je vous consulte afin de vous demander quelque chose lié à mon projet de dynamomètre.
Je vous explique la situation: Mon dyanmomètre va lors de l'essai mécanique relever des valeurs d'effort croissantes, puis décroissantes. J'affiche ces valeurs d'effort sur un afficheur LCD 16*2.

J'aimerais sur la ligne du dessus afficher la valeur de l'effort en temps réel, et sur la ligne du dessous, la valeur d'effort la plus élevée relevée pendant l'essai.

J'imagine utiliser une boucle si du style si valeur x> valeur x+1 alors print valeur x+1.

Cependant je pense qu'il faut comparer a un intervalle de temps donné deux valeurs, et je ne sais pas du tout comment procéder. J'utilise la fonction LoadCell.update() qui me permet de récupérer la valeur de l'effort en instantané du capteur, et c'est tout.

Je me dis que peut être en sauvegardant la valeur x dans la mémoire de l'Arduino et en la comparant a la valeur x+1 je peux faire quelque chose, mais d'une part je ne sais pas comment faire, et d'autre part, je ne sais pas si cela marchera.

Des gens ont des avis là dessus ?

Merci.

Tu peux utiliser une variable dans laquelle tu stockés la valeur maximale mesurée durant l'essai.
Tu crées une variable que tu initialises à une valeur très faible voire négative. A chaque mesure tu la compares à la valeur courante. Si elle est inférieure à la mesure tu lui affectes la mesure. Puis tu l'affiches...

lesept:
Tu peux utiliser une variable dans laquelle tu stockés la valeur maximale mesurée durant l'essai.
Tu crées une variable que tu initialises à une valeur très faible voire négative. A chaque mesure tu la compares à la valeur courante. Si elle est inférieure à la mesure tu lui affectes la mesure. Puis tu l'affiches...

Bonjour Lesept,
Je vais essayer de coder cela, et je reviens, merci !

void loop() { 

  lcd.setCursor(1, 0); // set cursor to first row
  lcd.print("Valeur d'effort"); // print out to LCD
  
  LoadCell.update(); // retrieves data from the load cell
  float i = LoadCell.getData(); // get output value
 if (i<0)
 {
  i = i * (-1);
  lcd.setCursor(0, 1);
  lcd.print("-");
 }
 else
 {
  lcd.setCursor(0, 1);
  lcd.print(" ");
 }
  
  lcd.setCursor(1, 1); // set cursor to second row
  lcd.print(i, 1); // print out the retrieved value to the second row
  lcd.print("g ");
  
  //float j = 0; 
  //if (i>j)
  //{
  //  i==j;
  //  lcd.setCursor(1,8);
  //  lcd.print (j,2);
  //}

Bonjour à toutes et à tous, voici le code en question, du moins la partie loop, ou on a i qui est la variable dans laquelle on stocke la valeur de l'effort en temps réel, et j qui est initiée à 0 et qui va ensuite prendre la valeur de i si on a i>j auquel cas on affichera i et j sur l'écran.

Cependant en relisant mon code je me suis rendu compte d'une chose, que j ne sera affichée que si i>j, donc je pense que je dois sortir les instructions d'affichage de la boucle, de plus lorsque le code était testé l'affichage buggait, comme si deux choses voulaient s'afficher en même temps.

Du coup je suis preneur d'avis sur les modestes lignes de code que j'ai rédigé, celles qui sont commentées a la fin du code, pour la fonction de comparaison.

Merci,

Vincent

A chaque fois qu'on entre dans la boucle loop, toutes les variables qui y sont déclarées sont réinitialisées. Pour avoir une valeur persistante entre deux passages dans "loop", il faut la déclarer en dehors de cette boucle, par exemple en tout début du programme. C'est vrai, de manière générale, pour toute fonction : toute variable qui y est déclarée est réservée sur la "pile" du programme, donc sa durée de vie est limitée à l'intervalle entre l'entrée dans la fonction et la sortie.

JiPe38:
A chaque fois qu'on entre dans la boucle loop, toutes les variables qui y sont déclarées sont réinitialisées. Pour avoir une valeur persistante entre deux passages dans "loop", il faut la déclarer en dehors de cette boucle, par exemple en tout début du programme. C'est vrai, de manière générale, pour toute fonction : toute variable qui y est déclarée est réservée sur la "pile" du programme, donc sa durée de vie est limitée à l'intervalle entre l'entrée dans la fonction et la sortie.

Erreur de débutant, merci beaucoup !

Bonjour,

Pour commencer tu donnes des noms explicites à tes variables. Tu n’appelles pas les forces i et j qui sont en général utilisés pour les index, mais par exemple force et forceMax.
Ensuite si tu veux que la force max persiste entre chaque appel de loop il faut la déclarer statique.
Ce qui donne par exemple:

void loop() {
  lcd.setCursor(1, 0); // set cursor to first row
  lcd.print("Valeur d'effort"); // print out to LCD

  LoadCell.update(); // retrieves data from the load cell
  float force = LoadCell.getData(); // get output value
  lcd.setCursor(0, 1);
  if (force >= 0)
    lcd.print(" ");
  lcd.print(force, 1); // print out the retrieved value to the second row
  lcd.print("g ");

  static float forceMax = 0;
  if (force > forceMax)
  {
    forceMax = force;
    lcd.setCursor(8, 1);
    lcd.print (forceMax, 2);
  }
}

Bon, j'ai modifié le code en mettant la variable j dans le void setup, mais je pense que cela ne suffit pas dans la mesure ou j'ai testé le code et l'afficheur LCD reste figé sur 0.

Je dois je pense obligatoirement déclarer i dans le void loop dans la mesure ou on récupère l'effort du capteur toutes les 100ms n'est-ce pas ?

Tu définis ta variable en statique.

kamill:
Tu définis ta variable en statique.

C'est le plus clean. La portée de la variable est limitée à la fonction où elle est définie, tu ne peux pas y accéder depuis l'extérieur de cette fonction, mais elle n'est pas réservée sur la pile, donc rendue persistante. Pour les gros programmes, c'est une cause d'erreurs que d'avoir trop de variable communes accessibles depuis tout le code.

Merci pour votre aide, ça fonctionne !

Excellent que ces conseils t'ont aidé, n'hésite pas si tu as d'autres blocages.

Tout doit être en statique.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.