Appel fonction par moniteur série

Bonsoir

J'ai un capteur de charge avec la bibliothèque DFrobot.

Je dois d'abord mettre dans mon programme l'étalonnage puis dès que j'ai mon facteur d'étalonnage je mets le programme pour faire fonctionner ma balance

Je voudrais mettre la fonction étalonnage dans un onglet, et la lancer en cas de besoins lorsque je la demande en tapant "étalonnage" sur moniteur série.

Comment faire?

Merci par avance.
Bonne soirée

Hello
Si hx711, voir les exemples de la librairie

L'abus d'utilisation du blog d'Eskimon est fortement recommandé.

Bonjour ducat42
Mets ton programme en ligne.
Il est vrai que pouvoir changer des paramètres, sans recompiler, c'est super :wink:

Cordialement
jpbbricole

#include "HX711.h"

#define DOUT  3
#define CLK  2

HX711 scale;

float calibration_factor = 12790

void setup() {
  Serial.begin(115200);


  scale.begin(DOUT, CLK);
  scale.set_scale();
  scale.tare(); //Reset the scale to 0

  long zero_factor = scale.read_average(); //Get a baseline reading
  Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
  Serial.println(zero_factor);
}

void loop() {

scale.set_scale(calibration_factor); //Adjust to this calibration factor

  Serial.print("Reading: ");
Serial.print(scale.get_units(), 1);
  Serial.print(" kg"); 
  Serial.print(" calibration_factor: ");
Serial.print(calibration_factor);
  Serial.println();

  if(Serial.available())
  {
    char temp = Serial.read();
    if(temp == '+' || temp == 'a')
      calibration_factor += 10;
    else if(temp == '-' || temp == 'z')
      calibration_factor -= 10;
  }
}

Merci de ton aide 🙂

Il faut mettre ton code entre balise < code/>
Cela permettra de rendre plus lisible ton code et de facilité la vie des intervenants :slight_smile:

N'hésite pas non plus à faire un ctr+T aussi pour auto formater ton code l'IDE Arduino si tu utilise celui-ci.

Si tu peux te permettre de bloquer la fonction loop, le plus simple est d'utiliser la fonction Serial.readStringUntil en spécifiant le caractère '\n'

Tu pourra alors tester la chaine de caractère retourné par cette fonction pour savoir à quel commande elle correspond.

Ok je te remercie.

Puis je appeler cette fonction void etalonnage?

La mettre dans un onglet ?

Merci

Non, tu n'a pas modifié la mise en forme de ton code, tant que tu ne l'aura pas fait, ton Arduino refusera de fonction correctement :slight_smile:

Je ne sais pas ce que tu appels "onglets" et refuse de lire ton code tant qu'il n'est pas lisible "à mes yeux" :slight_smile:
Mais je ne vois pas trop ce qui t'empêcherais de faire ce que tu souhaite.

Bonjour ducat42

Pour la bonne tenue de ton fil, mets ton sketch entre les balises, pour ce faire, édites ton post, sélectionne le texte du sketch et clique sur la balise code.

J'ai une solution pour toi mais...

A+
Cordialement
jpbbricole

Merci à toi

Bonjour ducat42

Super la correction :+1:

Ce n'est pas nécessaire, tel que je te présente la chose, il suffit de taper Calib 1234.56, n'importe quand if(Serial.available()) ne "mange pas de pain" tant que tu ne tapes pas Enter dans le moniteur.

Cette possibilité de "commander" ton programme et toujours aux aguets dans loop()
Remplaces tout la condition if(Serial.available()) par:

`	if(Serial.available())
	{
		String calibRx = Serial.readStringUntil('\n');     // Mettre au moins nouvelle ligne dans le moniteur.
		calibRx.trim();     // Nettoyage des 2 bouts de la chaîne https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/trim/
		calibRx.replace(" ", "");     // Supprimer les espaces
		calibRx.replace(",", ".");     // Remplacer la virgule par le point
		calibRx.toUpperCase();     // En majuscules

		if (calibRx.startsWith("CALIB"))     // Si c'est une cvommande de calibration
		{
			calibration_factor = calibRx.substring(5).toFloat();     // On extrait la valeur de la commande CALIB12345.44 et la transformer en float
		}
		else if (calibRx.startsWith("AUTRE"))
		{
			// ici que faire avec la commande AUTRE
		}
		else
		{
			Serial.println(F("Commande inconnue !!!"));
			delay(3000);
		}
	}
`

Ainsi tu peux développer d'autre commandes, je mets ça, systématiquement dans les programmes que je développe ou dans les programmes terminés pour les "diriger"

A+
Cordialement
jpbbricole

Merci, je vais essayer.

Je voulais le mettre dans un onglet, pour que le programme principal soit plus clair...

Après avoir trouvé mon facteur d'étalonnage, je mettre ce code dans mon programme pour faire fonctionner ma balance. En fait c'est pour cela, que j'aimerais garder ce I sous le coude en cas de besoins pour changer le facteur sans recopier le code...

#include "HX711.h"

#define calibration_factor -7050.0 //This value is obtained using the SparkFun_HX711_Calibration sketch

#define DOUT 3
#define CLK 2

HX711 scale;

void setup() {
  Serial.begin(115200);
  Serial.println("HX711 scale demo");

  scale.begin(DOUT, CLK);
  scale.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
  scale.tare(); //Assuming there is no weight on the scale at start up, reset the scale to 0

  Serial.println("Readings:");
}

void loop() {
  Serial.print("Reading: ");
  Serial.print(scale.get_units(), 1); //scale.get_units() returns a float
  Serial.print(" lbs"); //You can change this to kg but you'll need to refactor the calibration_factor
  Serial.println();
}

Bonsoir ducat42

Je suis aussi partisant de cette méthode :wink:

Alors, l'autre option est de créer une fonction (commandeRecue()) qui est appelée depuis loop() dès que enter est pressé dans le moniteur.

Dans loop()

	if(Serial.available())
	{
		commandeRecue();
	}

En fin de sketch:


void commandeRecue()
{
	String calibRx = Serial.readStringUntil('\n');     // Mettre au moins nouvelle ligne dans le moniteur.
	calibRx.trim();     // Nettoyage des 2 bouts de la chaîne https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/trim/
	calibRx.replace(" ", "");     // Supprimer les espaces
	calibRx.replace(",", ".");     // Remplacer la virgule par le point
	calibRx.toUpperCase();     // En majuscules

	if (calibRx.startsWith("CALIB"))     // Si c'est une cvommande de calibration
	{
		calibration_factor = calibRx.substring(5).toFloat();     // On extrait la valeur de la commande CALIB12345.44 et la transformer en float
	}
	else if (calibRx.startsWith("AUTRE"))
	{
		// ici que faire avec la commande AUTRE
	}
	else
	{
		Serial.println(F("Commande inconnue !!!"));
		delay(3000);
	}
}

A la fin de la condition if (calibRx.startsWith("CALIB")) il faut sauver le variable en EEPROM
Comme cette variable fait plus que que 8 bits, il faut utiliser les fonctions put() et get()

Dans loop:

	if(Serial.available())     // Si enter a été pressé
	{
		commandeRecue();
	}

En fin de programme:

void commandeRecue()
{
	String calibRx = Serial.readStringUntil('\n');     // Mettre au moins nouvelle ligne dans le moniteur.
	calibRx.trim();     // Nettoyage des 2 bouts de la chaîne https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/trim/
	calibRx.replace(" ", "");     // Supprimer les espaces
	calibRx.replace(",", ".");     // Remplacer la virgule par le point
	calibRx.toUpperCase();     // En majuscules

	if (calibRx.startsWith("CALIB"))     // Si c'est une cvommande de calibration
	{
		calibration_factor = calibRx.substring(5).toFloat();     // On extrait la valeur de la commande CALIB12345.44 et la transformer en float
		// Sauver calibration_factor
	}
	else if (calibRx.startsWith("AUTRE"))
	{
		// ici que faire avec la commande AUTRE
	}
	else
	{
		Serial.println(F("Commande inconnue !!!"));
		delay(3000);
	}
}

Une toute belle soirée à toi!
Cordialement
jpbbricole

Je viens de comprendre ce que tu appels un onglet.
Tu veux dire en faite créer un fichier qui contient tes fonctions.
C'es tout à fait possible, mais je ne suis pas sûre que cela vraiment necessaire, si tu veux quand même le faire, on peut t'expliquer comment faire.

Merci à tous les 2. J'ai dit onglet je pensais que c'était le mieux !

Je débute en programme.
Je veux juste que la partie pour trouver mon facteur d'étalonnage soit présente en cas de besoins.
Car normalement des que j'ai trouvé le facteur, plus besoins , je peux le supprimer et remplacer par ce que j'ai mis en dernier
Mais si un jour j'en ai besoins que je puisse l'avoir sous la main !

Bonne journée

Tu n'a pas tord, c'est moi qui suis long à la détente :slight_smile:

Je ne sais pas ce qu'en pense @jpbbricole mais pour moi je vois deux, voir trois directions:

  1. Tu fais deux programmes distinct, le premier permet de déterminer le facteur, le deuxième possède le facteur en dur dans le code.
    L'avantage c'est qu'il n'y a pas à gérer plusieurs chose qui ne participe pas vraiment à la logique de ton programme.
    L'inconvénient, c'est si il faut recalibrer régulièrement, cela devient pénible.
    Dans ce cas le fait d'avoir deux onglets(fichiers) pourrait avoir un intérêt.
  2. Tu fais un seul programme, qui écoute le moniteur série et sur une commande détermine ton facteur pour le sauver dans une EEPROM.
    L'avantage est que tu n'a pas à charger plusieurs programme dans ta carte de developpement.
    L'inconvénient est qu'il faut le brancher à ton ordinateur et taper la commande dans l'interface de la liaison série, donc par exemple ouvrir ton IDE Arduino et utiliser le moniteur série.
    Personnellement je ne vois pas trop l'avantage par rapport au 1, si tu as une seul commande de ce type.
    ET bien sûre il faut que tu code gère la lecture/écriture dans l'EPPROM de carte si elle en possède ou en ajouter si ce n'est pas le cas.
  3. Ce point est si ton programme peux déterminer tout seul son facteur(auto-calibration)?
    tu fais un seul programme et tu rajoutes un bouton qui permet d'entrer dans une auto-calibration.
    Il faudra bien sûre aussi sauver dans une EEPROM, ta valeur.
    Comme je n'ai pas bien compris comment tu détermine ton facteur, mais je ne connais pas le HX711, pour moi, il n'y avait pas d'intervention extérieur, mais une auto calibration au démarrage pour déterminer le 0.

Je serai partant pour les 2 1ère options. Laquelle prendrai plus de place ?
Normalement je ne devrais pas y recalibrer souvent. Pas de soucis si il faut se reconnecter au pc.

Merci

Bonjour

Moi aussi, on est des rapides :wink:

La 2 me plais bien.
Une autre solution, le Bluetooth et smartphone pour introduire la valeur.

Cordialement
jpbbricole

tu as des problèmes de place ?
la première sans aucun doute, puisque celui-ci n'a aucun code pour gérer un dialogue entre ton PC et le programme.

Mais je ne suis pas sûre que ce soit la bonne question à ce poser, si tu n'a pas de problème de place.
Pour moi comme tu es débutant, la bonne question est ce qui le plus simple à "coder".
donc implémenter uniquement les fonctionnalité que tu as besoin.

Quitte au final à devoir rajouter plus tard ce dialogue entre ton PC(Smartphone) et ton Arduino, car tes besoins auront évolués.

Il ne fait pas beau vieillir :see_no_evil: