Capteur de poids HX711 qui dérive

Bonjour à tous, je viens vous demander de l'aide car j'ai un capteur de poids qui dérive de jour en jour.

Il s'agit d'un capteur monté sur un projet de ruche connecté que je viens de terminé et celui-ci n'a jamais bien fonctionné.
Après réglage par la calibration, je trouve le bon poids et au bout de quelques heures celui-ci dégringole. De 12kg je passe à 2.5kg puis à 5kg pour revenir à 2.5kg...
Bref la configuration est de:

  • 4 capteurs montés en pont de Whegtonmachinchouet.
  • L'amplificateur HX711 est alimenté en 5vdc (j'ai essayer de l'alimenter en 3.3vdc sans succès)
  • Le projet est alimenté par un panneau solaire de 10w batterie lithium. J'ai vérifié la tension elle est stable même lors de l'envoi des données en Lora.
  • Sur l'ampli HX711 j'ai une tension de 4vdc entre E+ et E- mais rien entre A+ et A-.

Auriez-vous une piste à me donner pour avoir enfin un poids correct ?

Il n'y a qu'un seul capteur ?
Comment est réalisée la mécanique support ?

Et quel type de capteur ?
Un vrai pont ?
un demi pont ?
Juste une gauge de déformation ?

Le mieux serait que tu donnes la référence du capteur, on gagnerait du temps.

Il y a 4 capteurs de 50kg dont voici le lien alliexpress (https://fr.aliexpress.com/item/1005002176327047.html?spm=a2g0o.order_list.order_list_main.63.38ce5e5bbSS9JI&gatewayAdapt=glo2fra)

J'ai fait un vrai pont je pense car je me suis appuyé de ce schéma de câblage:
7873d78d03823fb60bf2322e0fa944e0f3f66274

J'ai imprimé un support en 3D qui prend le contour du capteur pour avoir une bonne mesure. Le plancher de la ruche pose directement sur les "picots centraux" de chaque capteur.

Je le pense aussi.

Principe :
La remarque est accessoire, mais ce ne sont pas des capteurs de poids, mais des jauges de déformation. C'est sous l'effet du poids qu'il y a une déformation d'une résistance.

Une jauge est constituée par une résistance formée d'un film métallique long et fin.


Selon le sens de la déformation la résistance va travailler à l'élongation ou a la compression.
A l'élongation la longueur de la résistance augmente et sa section diminue, la résistance augmente, à la compression phénomène inverse, la résistance diminue.

Le capteur est constitué de deux jauges, l'une travaille à la compression et l'autre à l'élongation. Avec 4 capteurs on réalise un double pont.

Le métal est élastique mais pas beaucoup, la valeur des résistances varie très peu, c'est pour cela qu'il faut un CI spécial comme le HX711 et qu'au voltmetre tu ne détecte pas de variation de tension.

Ton probleme :

Déjà il faut être bien d'accord sur la méthode de réglage.
Peux tu expliquer ta méthode étallonage et mesure ?

S'il n'y a pas d'erreur et si le poids change au cours du temps je ne vois que 2 solutions :

  • câblage instable : l'écart de tension a détecter est très faible. Pour bien faire tout doit être soudé, surtout pas de connectique enfichée style Dupont. La connectique vissée est aussi possible, je pense que des petits dominos pour électricité générale conviendront.
  • un capteur serait instable.

Le plus probable AMHA est un câblage instable.
Si après contrôle, amélioration le mauvais fonctionement persiste il va falloir déterminer quel capteur est défaillant.
De mémoire il me semble que les jauges de contrainte font 1 k.
La méthode que je vois :

  • Si tu as un capteur suplémentaire tu intervertis un par un.
  • Si tu n'en a pas tu remplaces un capteur par deux résistances fixes de 1k.
    La mesure ne sera pas aussi juste, ce n'est pas gênant car on cherche juste à savoir si elle sera stable, inutile de refaire l'étalonage sauf si le résultat de mesure est délirant.

En espérant que ce ne soit pas le lot complet de capteur qui soit instable.

Schéma "électronique" du pont :
Relong : jauge de contrainte qui travaille à l'élongation
Rcomp : jauge de contrainte qui travaille à la compression

Bonjour et merci pour tes explication claires et précises!

Déjà je peux virer le connecteur Dupont et refaire des essais ! :slight_smile:

Voici comment j'ai procédé pour la calibration + etallonnage:
J'ai chargé le code calibration suivant:

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/arduino-load-cell-hx711/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

// Calibrating the load cell
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 02;
const int LOADCELL_SCK_PIN = 15;

HX711 scale;

void setup() {
  Serial.begin(9600);
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}

void loop() {

  if (scale.is_ready()) {
    scale.set_scale();    
    Serial.println("Tare... remove any weights from the scale.");
    delay(5000);
    scale.tare();
    Serial.println("Tare done...");
    Serial.print("Place a known weight on the scale...");
    delay(5000);
    long reading = scale.get_units(10);
    Serial.print("Result: ");
    Serial.println(reading);
  } 
  else {
    Serial.println("HX711 not found.");
  }
  delay(1000);
}

//calibration factor will be the (reading)/(known weight)

J'ai attendu que la tare soit faite puis mis un objet dont je connaissais le poids. Le code me renvoi un nombre que j'ai divisé par le poids de l'objet connu. (cf commentaire en bas du code)

D'une fois que j'ai cette valeur de calibration, je l'ajoute à mon code et je le téléverse. Voici mon code principal:


//VERSION FONCTIONNELLE AU 06/05/2023

//Ajout de la fonctionnalitée Deep sleep
// Mise en commentaire du bouton


#include <DFRobot_DHT20.h>
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>  
#include "SSD1306.h" 
#include "images.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include "HX711.h"
#include <soc/rtc.h>


#define SCK     5    // GPIO5  -- SX1278's SCK
#define MISO    19   // GPIO19 -- SX1278's MISnO
#define MOSI    27   // GPIO27 -- SX1278's MOSI
#define SS      18   // GPIO18 -- SX1278's CS
#define RST     14   // GPIO14 -- SX1278's RESET
#define DI0     26   // GPIO26 -- SX1278's IRQ(Interrupt Request)
#define ONE_WIRE_BUS 25
#define DOUT  02
#define CLK  15
#define BAND    8695E5 // Plutôt que 868E6 plus encombrée (868E6 bande de fréquences pour l'Europe)
#define uSc_Sc 1000000  // Facteur de conversion de micro-seconde à seconde
#define Sc_Mn 60 //Facteur de conversion de seconde à minute
#define Time_To_Sleep  15   // Définit le temps d'endormissement en minutes
const uint8_t vbatPin = 35;



OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
HX711 scale;
DFRobot_DHT20 dht20;

unsigned int counter = 0;
float data1E[7];
float poids;
float tempINT;
float tempEXT;
float humEXT;
SSD1306 display(0x3c, 21, 22);
String rssi = "RSSI --";
String packSize = "--";
String packet ;
float VBAT;
int bouton = 0;
int etatbouton = 0;
long temps1;
long temps2;
int memoirebouton;
int Xtime;

void setup() {
  pinMode(bouton, INPUT);
  pinMode(vbatPin, INPUT);
  pinMode(16,OUTPUT);
  digitalWrite(16, LOW); 
  digitalWrite(16, HIGH);   // set GPIO16 low to reset OLED // while OLED is running, must set GPIO16 in high
  temps1 = millis();
  temps2 = millis();
  memoirebouton = 1;
  delay(50); 
  

  rtc_clk_cpu_freq_set(RTC_CPU_FREQ_80M); // ramène la fréquence à 80MHz bien meilleur pour le bon fonctionnement du HX711
  Serial.begin(9600);
  while (!Serial);
  Serial.println();
  Serial.println("LoRa Sender Test");
  scale.begin(DOUT, CLK);
  Serial.println("Demarrage en cours");
  sensors.begin();  // Start up the library
  SPI.begin(SCK,MISO,MOSI,SS);
  LoRa.setPins(SS,RST,DI0);
  if (!LoRa.begin(BAND)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  while(dht20.begin()){
  Serial.println("Initialize sensor failed");
  }
  LoRa.setSpreadingFactor(10); // Facteur d'étalement 7 est la valeur par défaut. Permet de discriminer deux émissions
  Serial.println("LoRa Initial OK!");
 
  display.init();
  void invertDisplay(void);  
  display.setFont(ArialMT_Plain_10);

  //Calibration du pese-ruche
  scale.set_scale(22867); //Cette valeur est obtenue par le programme calibration
  
  
//  *************************** Notice de la tare: ***************************
//Pour la tare:
//- Décommenter scale.tare(); ligne 111 - 114
//- Se mettre en liaison série et relever le "Zero factor: "
//- Mettre le résultat de zero factor dans scale.set_offset(***);
//- Recommenter la ligne scale.tare();
/*
  scale.tare();            // Tare
  Serial.print("Tare faite ");
  Serial.print("Mettre la ruche vide");
  delay(5000);*/
  
  long zero_factor = scale.read_average();
  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);
  scale.set_offset(185452); //fixe le zero (la tare) a partir d'un zero_factor Nouvelle valeur
  // préalablement enregistre avec scale.tare active.
  
  delay(1500);
}

void loop() {
    
  // Prise de la tension
  VBAT = (float)(analogRead(vbatPin)) / 4095*2*3.3*1.1;
  data1E[6] = VBAT;
  Serial.print("Vbat = "); 
  Serial.print(VBAT); 
  Serial.println(" Volts");
  data1E[0] = 1; // numéro de la ruche
  
  //Prise de la température DS180
  
  Serial.print("Requete en cours...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  tempINT = sensors.getTempCByIndex(0);
  data1E[1]  = tempINT ;
  if(tempINT != DEVICE_DISCONNECTED_C) 
  {
    Serial.print("Temperature interieure: ");
    Serial.println(tempINT);
  } 
  else
  {
    Serial.println("Error: Could not read temperature data");
  }

//Prise de la température + hygro DHT20

  tempEXT = dht20.getTemperature();
  Serial.print("temperature DHT20:");
  Serial.print(tempEXT);
  Serial.print("C");
  data1E[2]  = tempEXT;
  humEXT = dht20.getHumidity()*100;
  Serial.print("  humidity DHT20:");
  Serial.print(humEXT);
  Serial.println(" %RH");
  data1E[3]  = humEXT;
  data1E[4]  = counter;

  
  //Pesée
  poids = scale.get_units();
  data1E[5]  = poids ; // met la donnée dans la première ligne (ou colonne) du tableau
  
  Serial.print("Poids=  ");
  Serial.print(poids, 3);
  Serial.print(" kg"); 
  Serial.println();
  
  // send packet
  LoRa.beginPacket();
  LoRa.write((uint8_t*)&data1E, sizeof(data1E)); // &data signifie adresse de data stocké dans la mémoire sous forme unsigned integer
  LoRa.print(counter);
  
  LoRa.endPacket();

  counter++;
  
  esp_sleep_enable_timer_wakeup(uSc_Sc * Sc_Mn * Time_To_Sleep); // Timer d'endormissement en microsecondes
  Serial.print("deepsleep:");
  esp_deep_sleep_start(); // Mise en sommeil durant le temps d'endormissement défini ci-dessus
}

Je décommente les lignes de tare puis je téléverse. La tare se fait, je pose ma ruche sur la balance et je récupère la valeur "zero factor " . Cette valeur me sert à décaler ma tare. C'est un genre d'offset pour que lorsque l'esp32 se réveille, l'offset remplace la tare de la ruche et je ne recommence pas à mesurer de zero.
Du coup je remet en commentaire la tare, rentre la valeur du zero factor et téléverse.

Fin de la manipulation. A partir de ce moment, ma ruche pèse le bon poids mais à fur et à mesure des jours, le poids dégringole jusqu'à 2k.5g.

Voici l'illustration du poids sur 24h:

Je vais quand même essayer de mettre des résistances en ponts comme ton schéma afin de m'assurer que le CI soit OK.

Que veux-tu dire par la ?

Connectique Dupont.
Effet mécanique du aux variations de température par exemple.

Procédure d'étalonnage :
Ce n'est pas un code qui m'intéresse c'est le principe.
Pour étalonner tu as pris un poids connu ?
Tu as pris un poids équivalent à celui de la ruche ou un poids totalement différent ?
Tu as pesé avant la ruche sur une balance et tu as fait des réglages pour avoir la même indication ?

Pour l'étalonnage, j'ai tout d'abord fait avec deux pack de laits afin de maitriser le poids. Après avoir effectué l'étalonnage, je faisais différentes pesées en ajoutant des poids connu et le poids mesuré était le bon.
J'ai fait différent test de pesé en mode lourd (moi, ma compagne) et les résultat était conforme à 300g près.

Du coup pour répondre à ta question, je ne connais pas le poids de la ruche car il est difficile pour moi d'aller la peser. Cependant je suis sûr qu'elle pèse plus de 2.5kg :smile: C'est mon dos qui me le dit !

Pour info, je suis en test depuis hier avec un pont de 8 résistances de 1kohm.
image
J'ai une variation d'1kg...Toujours avec du Dupont . C'est déjà mieux mais il n'y a pas eu un assez grand écart de température encore. Je verrais ça en fin de journée.

Je suis en train de réfléchir comment faire pour me passer des borniers Dupond tout en préservant le côté facile à déconnecter.

Réponse déjà donnée :

Un domino, c'est ça :
L'image correspond à un troupeau de 12 dominos.

Existe en clipsable :

Images obtenues avec un moteur de recherche.

Je n'ai pas l'impression que ces liens ai été cité mais j'ai ça en stock, ça peut peut-être servir à @biker32

https://www.egloff.eu/index.php?option=com_content&view=article&id=77&Itemid=1635&lang=fr

Bonsoir à tous et merci pour vos réponses!

J'avoue que c'est vraiment trop technique pour moi mais j'ai bel et bien vu que la mesure était influencée par la température ambiante.
J'ai donc soudé les connexions directement sur l'amplificateur pour faire des essais. Voici les résultats sur le weekend:

Pas probant du tout ! :woozy_face: Sur les documentations de ProfesseurMephisto, il était questions de quelques grammes. Moi j'ai un delta de 10kg dans la journée! Nous voyons bien l'effet de la température sur les mesures.

J'ai donc racheté un nouveau kit HX711 + les 4 capteurs de poids. Livraison prévue début Juin.... Affaire à suivre !

Là je crois qu'il n'y a pas photo... il y a une belle corrélation entre la température et la mesure.

Plus qu'une corrélation, une causalité est probable. À moins que les abeilles pesent plus de 5 kg dans la ruche en début de saison (aucune idée... peut-être) et quelles décident de rentrer toutes dans la ruche quand il fait chaud et jour et ramènent des copines le dimanche. (là j'ai vraiment un doute même si je n'y connaît rien en apiculture)

Je viens de faire une recherche :
Sujet : jauge de déformation

1er site :

Et je lis :

Coefficient de température du facteur de jauge Le facteur de jauge est donné à température ambiante. Celui-ci évoluera avec le changement de température avec une réponse parfaitement linéaire. Dans le cas de grilles de mesure en constantan, le facteur de jauge est proportionnel à la température. Dans le cas des grilles de mesure en chrome-nickel, le facteur de mesure est inversement proportionnel à la température. Le coefficient de température du facteur de jauge et sa tolérance sont indiqués sur chaque boite.

  1. Une compensation de la réponse avec la température n'est pas exclure.
    Le sens de la correction dépend du métal utilisé dans les jauges.
  2. Reste à valider la nécessité de compenser. Pour cela il faut connaître le coefficient de température et sur des produits bas de gamme ce n'est pas gagné.

Le sujet des ruches a déjà été traités de très nombreuses fois.
As-tu fait une recherche avec le moteur de recherche du forum qui fonctionne très bien si les titres sont bien choisis :smile: ?
Sous entendu est-ce que d'autres ont déjà rencontré le même soucis ?

La suite sur le même site :

hello
pour info voir ICI et éventuellement prendre contact avec Lacuzon

Merci pour tes recherches! Je viens de lire tous ça mais je ne pense pas que mon utilisation soit la même que sur le document car il s'agit de jauge de contrainte pour forte températures. De plus ces jauges sont toutes petites à coller.
En tout cas j'ai bien compris que le principe de fonctionnement est le même! :wink:

Effectivement j'ai fait pas mal de recherche sur ce forum et sur d'autre mais malheureusement je ne trouve pas les mêmes symptômes.

Merci dfgh, je viens de lire tout le post et je lui ai envoyé un message.

Je vous tiens au courant :slight_smile:

Cela signifie peut-être que tu as un défaut dans le matériel si les autres n'ont pas rencontré de problèmes liés à la température.

Yes, c’est pour cela que par précaution j’ai racheté un kit de pesée.

Bonjour à tout le monde. J'ai reçu le kit de pesé et l'ai monté directement pour faire un essai.
NOK => le poids dérive toujours comme avant.

J'ai essayer d'alimenter l'esp32 via une alimentation branchée au secteur au lieu du panneau solaire. Toujours pas bon...

Voici le graphe:


De Samedi 9h à19h30 nous sommes sur panneau.
A partir de Samedi 19h30, le système est sur secteur.

En faisant cela j'écarte le solaire.

Voici les infos du ESP32 TTgo LORA v1.6.1:


Le branchement de l'ampli HX711 se fait entre 02 (DOUT) et 15 (CLK).

Je pense que le problème viens d'un mauvais choix de branchement sur l'ESP32...
Pouvez-vous me dire si c'est le cas ?

Bonjour

Je pense que le problème viens d'un mauvais choix de branchement sur l'ESP32...

ça ne me parait pas flagrant comme explication de la dérive constatée ...
GPIO15 est câblé sur la carte SD (MOSI) mais si cette carte n'est pas utilsée dans le code ça ne devrait pas interférer avec la gestion du HX711 , tour au plus une résistance de pull up est peut être en place sur la carte

L'alimentation du HX711 et la dérive de la tension de référence de son convertisseur analogique numérique prennent leur part dans la dérive