Je travaille sur un projet de capteur de poid à l’aide d’un module HX711 et d’une Arduino nano 33BLE , je vous joint ci dessous mon programme pour calibrer et mesurer les valeurs renvoyés , mais celui-ci me renvoi tantôt « inf » tantôt « nan ». Je voudrait savoir si mon programme était correct et quoi faire pour l’améliorer ou si le problème viens alors du montage,
Merci, bonne soirée
#include "HX711.h"
HX711 scale;
uint8_t dataPin = 4;
uint8_t clockPin = 5;
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println(" Le module HX711 est connecté ")
Serial.println("Début");
scale.begin(dataPin, clockPin);
Serial.print("UNITS: ");
Serial.println(scale.get_units(10));
Serial.println("\n Initialisation de l'échelle:");
while(Serial.available()) Serial.read();
scale.tare();
Serial.print("UNITS: ");
Serial.println(scale.get_units(10));
Serial.println("\n Put 1000 gram in the scale, press a key to continue");
while(!Serial.available());
while(Serial.available()) Serial.read();
scale.calibrate_scale(1000, 5);
Serial.print("UNITS: ");
Serial.println(scale.get_units(10));
Serial.println("\nScale is calibrated, press a key to continue");
Serial.println(scale.get_scale());
Serial.println(scale.get_offset());
while(Serial.available()) Serial.read();
}
void loop()
{
Serial.println(scale.get_units(10));
delay(1000);
}
Oui, le code tel qu'il est n'est pas bon, il manque des choses.
mais certains éléments sont raisonnables :
Par exemple ceci est le code standard pour l'ouverture de la voie série et l'attente de son établissement si nécessaire
Quand on fait ! Serial on a un opérateur booléen (NOT) sur l'instance Serial. Il se trouve que la classe HardwareSerial surcharge l'opérateur de conversion en booléen et donc quand on fait ! Serial on déclenche cet opérateur. Sur un UNO cette fonction surchargée répond vrai à chaque fois mais sur les arduino USB natif (Leonardo, Micro, Due, Zero, MKR series, Nano 33 IoT, ...) il y a du code exécuté qui attend l'énumération CDC.
Le code habituel de calibration demande à l'utilisateur de mettre des masse connues sur la balance et d'appuyer sur entrée ↲.
Dans le moniteur série, suivant comment il est configuré, quand on valide, ça peut envoyer plusieurs (CR LF) caractères d'un coup.
Le code suivant
est une façon d'espérer vider le buffer d'entrée et d'avaler les 2 caractères (ce n'est pas garanti surtout à 9600 bauds donc le code n'est pas terrible).
L'idée c'est qu'il faut que le buffer d'entrée soit vide pour la prochaine phase d'attente sinon le code passera directement à la suite
OP a peut être eu un accident de copier coller.
Merci beaucoup d'avoir clarifié ce "code" .
Il faut faire attention avec le baudrate:https://github.com/bogde/NEPASCLICQUER/HX711/blob/master/examples/HX711_full_example/HX711_full_example.ino
donne, comme exemple, un baudrate à 57kBds, un autre exemple de la même librairie est à 38kBds... ça peut semer le désordre dans les tentatives de dépannage sur la ligne serie. Vous avez lié vers une source ... moins exotique...
Je ne sais pas combien HX711 a d'homonymes sous github...
edite: et merci pour le lien github d'arduino avr... malgré ma méfiance pour github...
L’alimentation de mon module hx711 se fait via la sortie 5v et le GND de mon Arduino nano elle même branchée mon ordinateur via le Port Micro usb de la nano. Faut-il ajouter une tension d’alimentation externe pour le hx711 ?
normalement non, ça consomme peu - de l'ordre de 1.5 à 2mA de mémoire donc largement dans ce que peut fournir la pin 5V de. votre nano et d'une alim USB.
D’accord, merci. Cependant mon programme marche très bien avec une Arduino mega mais avec ne me renvoi que des zéros avec la nano. J’ai pourtant bien connecté les broches data et sck aux pins A4 (SDA) et A5 (SCL) de ma nano.
#include <Arduino.h>
#include "HX711.h"
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 20;
const int LOADCELL_SCK_PIN = 21;
unsigned long startTime; // Variable pour stocker le temps de début
HX711 scale;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("HX711 Demo");
Serial.println("Initializing the scale");
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
Serial.println("Before setting up the scale:");
Serial.print("read: \t\t");
Serial.println(scale.read());
Serial.print("read average: \t\t");
Serial.println(scale.read_average(20));
Serial.print("get value: \t\t");
Serial.println(scale.get_value(5));
Serial.print("get units: \t\t");
Serial.println(scale.get_units(5), 1);
scale.set_scale(30000);
scale.tare();
Serial.println("After setting up the scale:");
Serial.print("read: \t\t");
Serial.println(scale.read());
Serial.print("read average: \t\t");
Serial.println(scale.read_average(20));
Serial.print("get value: \t\t");
Serial.println(scale.get_value(5));
Serial.print("get units: \t\t");
Serial.println(scale.get_units(5), 1);
Serial.println("Readings:");
startTime = millis();
}
void loop() {
if (millis() - startTime >= 10000) {
return;
}
Serial.print(scale.get_units());
Serial.print(",");
//delay(1000);
}