Le forum a un nouveau style !


Faites-nous part de vos impressions et signalez-nous les problèmes ICI

Warré 2.0

Ici on palrle de tout et de rien, dans la convivialité et la bonne humeur.
C'est aussi le lieu idéal pour donner votre avis sur le forum et proposer des idées sur son fonctionnement.
tautin25
Messages : 135
Localisation : Longevelle sur Doubs (25)
Contact :

Re: Warré 2.0

Message#121 » ven. mars 24, 2017 8:50 am

Loic a écrit :Quelqu'un a déjà réussi à le faire tourner?

Salut,
J'utilise la librairie MySensors sans aucun problème. L'intérêt de cette librairie est d'intégrer nativement la fonction répéteur.

https://easydomoticz.com/domoticz-raspb ... -partie-1/

https://www.mysensors.org/

Tu peux aussi regarder le Carnet du Maker qui traite en détail l'utilisation de ce modules avec une librairie plus basique.

https://www.carnetdumaker.net/articles/communiquer-sans-fil-avec-un-module-nrf24l01-la-bibliotheque-mirf-et-une-carte-arduino-genuino/

Je pense que tu devrais trouver ton bonheur avec ça :wink:

Claude

Avatar de l’utilisateur
Loic
Messages : 568
Localisation : Sophia Antipolis - Alpes Maritimes (06)

Re: Warré 2.0

Message#122 » ven. mars 24, 2017 10:19 am

Super merci, je teste ça ce soir!

Avatar de l’utilisateur
barbichou
Modérateur
Messages : 4187
Localisation : Ronchamp - Haute-Saône (70)
Contact :

Re: Warré 2.0

Message#123 » dim. avr. 16, 2017 11:07 pm

Salut,

Je ne trouvais rien de précis alors j'ai réécrit entièrement les fichiers pour étalonner, tarer et peser une ruche de manière précise.

Il faut encore compenser la température, mais ça se fait ailleurs dans mon code, c'est une simple compensation linéaire. Le creed sur une seule gauge est assez sensible mais au bout d'une heure devient négligeable, avec un pont complet, on peut même se passer de compensation de température et de creed.

Fichier 1 : étalonnage

usage : on met en route puis dès que les valeurs apparaissent, on place un objet dont on connait le poids précis sur le plateau et on ajuste.
Au début il faut tâtonner pour trouver la bonne valeur et ça va plus vite de rentrer de nouvelles valeurs pour approcher le poids et reuploader le fichier.
L'ajustement fin est réalisé avec les touches + et -.

Code : Tout sélectionner

#include "HX711.h" //https://github.com/bogde/HX711

#define DT  3
#define SLK  2

HX711 poids(DT, SLK);

int etalonnage = 103; //changer la valeur ici et re-uploader le fichier, l'ajustement précis se fait avec les touches + et -

void setup() {
  Serial.begin(9600); 
  poids.set_scale();
  poids.tare();
  Serial.println("Ajustement: "); 
}

void loop() {

  poids.set_scale(etalonnage);
  Serial.print("Poids : ");
  Serial.print(poids.get_units(100), 2); //réalisation d'une moyenne de 100 mesures
  Serial.print(" g  -  Valeur d'");
  Serial.print(char(233));
  Serial.print("talonnage actuelle : ");
  Serial.print(etalonnage);
  Serial.println();
  delay(1000);

  if(Serial.available()) //ajustement précis de l'étalonnage
  {
    char touche = Serial.read();
    if(touche == '+')
      etalonnage += 1;
    else if(touche == '-')
      etalonnage -= 1;
  }
}


Fichier 2 : calcul de la tare de mesure en continue ou point 0

usage : on envoie le fichier et quelques secondes plus tard on obtient la valeur...

Code : Tout sélectionner

#include "HX711.h" //https://github.com/bogde/HX711

#define DT  3
#define SLK  2

unsigned char i = 0;
float tab[10];

HX711 poids(DT, SLK);

int etalonnage = 103; //mettre la valeur trouvée avec le fichier d'étalonnage

void setup() {
  Serial.begin(9600);
  poids.set_scale(etalonnage);
  Serial.println("Calcul de la tare pour une mesure en continue : ");
  delay(10000);
  for (i = 0; i < 10; i++) {
    tab[i] = poids.get_units(10);
    delay(50);
  }
  float tmp = 0;
  unsigned char a_trier = 1;
  while (a_trier) {
    a_trier = 0;
    for (i = 0; i < 9; i++) {
      if (tab[i] > tab[i + 1]) {
        tmp = tab[i + 1];
        tab[i + 1] = tab[i];
        tab[i] = tmp;
        a_trier = 1;
      }
    }
  }
  float total = 0;
  for (i = 1; i < 9; i++)  {
    total += tab[i];
  }
  float tare = total / 8;
  Serial.print("La valeur de la tare pour une mesure en continue est de ");
  Serial.print(tare);
}
void loop(){
 
}


dernier fichier, on mesure ce qu'on veut. Il suffit de renseigner dans le fichier les valeurs d'étalonnage et de tare, de modifier le branchement et d'activer ou non les débogages via port série. La valeur à exploiter est mesure_poids générée par la fonction poids_ruche()
Pour la compensation de température, cela se fait dans une fonction à part avec une valeur issue d'une mesure de température extérieure.

Code : Tout sélectionner

#include "HX711.h" //https://github.com/bogde/HX711

// fonctions de débogage à activer ou désactiver selon les besoins
#define DEBUG_POIDS //affiche uniquement le poids final
//#define DEBUG_PROCESS //affiche le process des fonctions

#define etalonnage 103 //résultat de l'étalonnage
#define tare 1094.20 // résultat de la tare de mesure en continue
#define DT  3
#define SLK  2
HX711 poids(DT, SLK);

unsigned char i = 0;
float tab[10];

#if defined(DEBUG_POIDS)
float mesure_poids = 0; // pour le debug uniquement
#else
int mesure_poids = 0;
#endif


void setup() {
#if defined(DEBUG_POIDS) || defined(DEBUG_PROCESS)
  Serial.begin(9600);
#endif
  poids.set_scale(etalonnage);
  poids.power_down();
}

void loop() {
  poids_ruche();
  delay(5000); //pause de 5 secondes entre chaque procédure
}

void poids_ruche() {
  poids.power_up();
  mesure();
  poids.power_down();
  tri(tab, 10);
  float total = 0;
  for (i = 1; i < 9; i++)  {
    total += tab[i];
  }
  mesure_poids = (round((total / 8) - tare));
#if defined(DEBUG_POIDS)
  if (mesure_poids > 1000) {
    Serial.println();
    Serial.print("POIDS : ");
    Serial.print(mesure_poids / 1000, 3);
    Serial.println(" kg");
    Serial.println();
  } else {
    Serial.println();
    Serial.print("POIDS : ");
    Serial.print(mesure_poids);
    Serial.println(" g");
    Serial.println();
  }
#endif
}

void tri(float*t, unsigned char n) { //algo de tri à bulle basique
  float tmp = 0;
  unsigned char a_trier = 1;
  while (a_trier) {
    a_trier = 0;
    for (i = 0; i < n - 1; i++) {
      if (t[i] > t[i + 1]) {
        tmp = t[i + 1];
        t[i + 1] = t[i];
        t[i] = tmp;
        a_trier = 1;
      }
    }
  }
#if defined(DEBUG_PROCESS)
  Serial.println();
  Serial.print("Mesures tri");
  Serial.print(char(233));
  Serial.println("es :");
  Serial.println();
  for (i = 0; i < 10; i++) {
    Serial.print("  - mesure ");
    Serial.print(i + 1);
    Serial.print(" : ");
    Serial.println(tab[i]);
  }
#endif
}

void mesure() { //réalisation de 10 mesures de poids successives 10 fois soit 100 mesures au total
#if defined(DEBUG_PROCESS)
  Serial.print("Mesures non tri");
  Serial.print(char(233));
  Serial.println("es :");
  Serial.println();
#endif
  for (i = 0; i < 10; i++) {
    tab[i] = poids.get_units(10);
#if defined(DEBUG_PROCESS)
    Serial.print("  - mesure ");
    Serial.print(i + 1);
    Serial.print(" : ");
    Serial.println(tab[i]);
#endif
    delay(50); //délai de 50ms entre chaque série de mesures
  }
}


@+ ;)

tautin25
Messages : 135
Localisation : Longevelle sur Doubs (25)
Contact :

Re: Warré 2.0

Message#124 » lun. avr. 17, 2017 10:44 pm

Salut,

Très bien :-bravo mais je n'ai pas saisi l'utilité de la fonction tri pour les mesures :?:

Pour ma part je travaille avec les fonctions standard fournies avec la librairie HX711 et ça marche pas mal.
Le problème avec ce genre d'équipement, c'est la mise en boite. Le moindre bouton étanche coûte aussi cher que l’électronique. J'ai donc limité à un seul bouton pour le reset tare bricolé avec une membrane de souple de boite de derivation. Je fais le reset tare à l'aide de mon élévateur.
Après un hiver dehors, la dérive reste acceptable.

J'ai démonté la première balance et l'ai reconstruite après modification et plus amples vérifications.
J'ai 2 gueuses en fonte de 13kg qui mes servent pour l'étalonnage que je peux l'ajuster au besoin par radio avec stockage en EEPROM.
Après avoir laissé ma balance quelques jours dehors, j'ai ajouté une faible compensation en température mais ce n'est pas indispensable.
J'ai ensuite placé une warré (plancher + 2 éléments + coussin + toit) et observé une dérive jour/nuit d'environ 200g due à l'humidité.
Avec une ruche habitée, il y a une très forte chute vers midi très vite rattrapée environ 1 heure après.

Pour moi la balance connectée est un outil formidable, je suis en cours de construction d'une troisième et j'en ai une autre mobile avec afficheur que je balade sous les autres ruches.

Bon courage pour la suite et à bientôt.

Claude

Avatar de l’utilisateur
barbichou
Modérateur
Messages : 4187
Localisation : Ronchamp - Haute-Saône (70)
Contact :

Re: Warré 2.0

Message#125 » lun. avr. 17, 2017 11:07 pm

Salut,

Le poids est calculé sur une moyenne minimum de 10 mesures successives, chaque mesure faisant elle-même 10 mesures (dans la version "production" on en fait que 10 en une demi-seconde), puis c'est comme au patinage artistique, le code retire la moyenne la plus basse et le plus haute et fait une moyenne des 8 autres, cela permet d'éliminer les mesures parasites.
J'ai testé mon algo de compensation de température et de dérive ce week-end grâce à une thermistor collée sur la gauge, j'arrive à une précision et une dérive maxi de 1g quelles que soient les conditions météo.
Je te montrerai ça plus tard.
Je vais pouvoir fabriquer mon support de ruche en dur, finis les essais et les calculs !

@+ ;)

tautin25
Messages : 135
Localisation : Longevelle sur Doubs (25)
Contact :

Re: Warré 2.0

Message#126 » mar. avr. 18, 2017 7:32 am

barbichou a écrit :c'est comme au patinage artistique, le code retire la moyenne la plus basse et le plus haute et fait une moyenne des 8 autres, cela permet d'éliminer les mesures parasites.



Ah, j'ai regardé un peu trop vite le code et n'avait pas vu la subtilité

Code : Tout sélectionner

  for (i = 1; i < 9; i++)  {
    total += tab[i];
  }

Je pense que je vais l'adopter. :wink:
Est-ce que tes 100 mesures ne prennent pas trop de temps ? Et le temps que la jauge est en powerup , ça consomme.

Pour ce qui est de la compensation température, je ne pense aller jusqu'à la solution du capteur collé sur la jauge pour la raison que la dérive naturelle du bois est très importante.

Avatar de l’utilisateur
barbichou
Modérateur
Messages : 4187
Localisation : Ronchamp - Haute-Saône (70)
Contact :

Re: Warré 2.0

Message#127 » mar. avr. 18, 2017 10:23 am

Salut,

Pour des essais je fais 100 mesures, (durée du process environ 9 sec)

ça se passe ici dans la fonction mesure()

Code : Tout sélectionner

for (i = 0; i < 10; i++) {
    tab[i] = poids.get_units(10);


Pour un appareil en fonction normale, tu changes la valeur dans poids.get_units(10) et dans delay(50) et tu verras que le code tourne à fond la caisse.
Pour la compensation de température et le glissement (creep), je te montre ça ensuite.

@+ ;)

Avatar de l’utilisateur
barbichou
Modérateur
Messages : 4187
Localisation : Ronchamp - Haute-Saône (70)
Contact :

Re: Warré 2.0

Message#128 » mar. avr. 18, 2017 11:38 am

Salut,

Voici le résultat de mes recherches sur l'effet de glissement ou dérive lorsque l'on réalise des mesures en continue sans effectuer de tare entre chaque mesure. Quand on pose une ruche sur le support, on n'a pas à refaire la tare, les erreurs de l'électronique, la dérive (creep dans les données constructeurs des gauges) et les variations de température doivent être corrigées pour avoir des mesures précises pendant plusieurs saisons.

C'est assez subtil sur des variations faibles. Ici on entrevoit, si on fait varier la température dans une fourchette de 0.5°C, de légères variations de poids accentuées par la dérive (ou effet de glissement)
en bleu température mesurée par variation de 0.5°C, en orange effet de dérive du à la jauge + effet du à la température.

Image

Pour bien mettre en évidence le phénomène, il faut augmenter la précision de l'ensemble. A la place de monitorer la température, j'utilise une thermistor (même modèle qui me permet de ne pas recharger une batterie par grand froid ou une batterie défectueuse ou trop chaude et de ne pas cramer tout l'ensemble, voire la ruche)

Du coup on voit bien les variations et la corrélation linéaire entre les mesures de la thermistor qui mesure les variations de température de l'aluminium de la jauge et les différentes dérives dues au matériel et aux variations de température.

Image

Image

Là tout devient limpide que ce soit en en augmentant la température par petits à-coups ou en la baissant de façon assez linéaire.

Une simple fonction avec la variable données par la thermistor (courbe bleue) permet de compenser les dérives (courbe orange)

@+ ;)

tautin25
Messages : 135
Localisation : Longevelle sur Doubs (25)
Contact :

Re: Warré 2.0

Message#129 » mer. avr. 19, 2017 7:45 am

Salut,
Je ne sais pas quelle est l'échelle des graphiques mais ça paraît en effet évident.
Je n'utilise pas les mêmes cellules que toi, les miennes sont des 50 et 75kg sur support acier zingué, et je n'ai pas l'impression d'avoir la même dérive. Il va falloir que je reface mes tests.

À bientôt
Claude

Avatar de l’utilisateur
barbichou
Modérateur
Messages : 4187
Localisation : Ronchamp - Haute-Saône (70)
Contact :

Re: Warré 2.0

Message#130 » mer. avr. 19, 2017 10:08 am

Salut,

Il est évident que la dérive dépend des jauges, les miennes sont des jauges bas prix pour coller à mon cahier des charges. L'échelle est très petite, variation de 1 g, variation de 1°C voir moins. J'ai des courbes avec des variations de plusieurs degrés et une charge de 45%... A partir de là, c'est à chacun de calibrer son matériel en fonction de ses besoins. Pour rendre le phénomène bien visible, je n'utilise qu'une jauge, sur un pont complet avec 4 jauges, le phénomène est largement atténué.

@+ ;)

Avatar de l’utilisateur
Loic
Messages : 568
Localisation : Sophia Antipolis - Alpes Maritimes (06)

Re: Warré 2.0

Message#131 » mer. avr. 19, 2017 6:00 pm

C'est de belles courbes!
J'ai tenté de faire le test, j'ai mis une charge de 25.4Kg sur la balance pendant 20h, récupéré les poids et températures.
J'ai fait les moyennes des poids par température, et j'ai fait une courbe... Bah je suis pas trop avancé..
On dirait qu'il y a effectivement une baisse linéaire entre 17.5° et 12.2°, par contre, pour les températures <12°... ???
Je n'arrive pas a sortir quelque chose de ça.

Image

Avatar de l’utilisateur
barbichou
Modérateur
Messages : 4187
Localisation : Ronchamp - Haute-Saône (70)
Contact :

Re: Warré 2.0

Message#132 » mer. avr. 19, 2017 8:44 pm

Salut,

Si tu veux avancer, essaie déjà une courbe avec un poids et une température à peu près constante.
Si ça ne bouge pas trop, ça te donne une idée de la dérivé de glissement.
Si ça bouge dans tous les sens, ça vient de l'électronique : branchement, alimentation parasitée, câble pas assez blindé

@+ ;)

Avatar de l’utilisateur
Loic
Messages : 568
Localisation : Sophia Antipolis - Alpes Maritimes (06)

Re: Warré 2.0

Message#133 » mer. avr. 19, 2017 8:50 pm

Ok. je vais tester ça. Merci!

Avatar de l’utilisateur
barbichou
Modérateur
Messages : 4187
Localisation : Ronchamp - Haute-Saône (70)
Contact :

Re: Warré 2.0

Message#134 » sam. avr. 22, 2017 9:43 pm

Salut,

Pour info, voici mon algo pour compenser le creep (effet de glissement donné par le constructeur) et l'influence des variations de température avec atténuation des erreurs par des méthodes statistiques simples. Le code est relativement optimisé au maximum.
La fonction renvoie une mesure du poids de la ruche corrigée en fonction de ces effets. Il tourne comme une horloge.

Code : Tout sélectionner

#include "HX711.h" //https://github.com/bogde/HX711

#define etalonnage 101.210 //résultat de l'étalonnage
#define tare 1118 // résultat de la tare de mesure en continue
#define const_thermistor 554 //valeur de référence de la thermistor lors des précédentes mesures d'étalonnage
#define correction 1.0004 //valeur de correction température et glissement

#define DT  3
#define SLK  2
#define THERMISTOR A0

HX711 poids(DT, SLK);

float mesure_poids = 0;

void setup() {
  Serial.begin(9600);
  poids.set_scale(etalonnage);
  poids.power_down();
}

void loop() {
  poids_ruche();
  Serial.println(round(mesure_poids));//arrondi
  delay(898829); //pause de X secondes entre chaque procédure
}

void poids_ruche() {
  unsigned char i = 0;
  float tab[2][10] = {{0}, {0}};
  float tmp[2][10] = {{0}, {0}};
  bool a_trier = 1;
  float poids_total = 0;
  float resistance_total = 0;
  poids.power_up();
  for (i = 0; i < 10; i++) {
    tab[0][i] = poids.get_units();
    tab[1][i] = analogRead(THERMISTOR);
  }
  poids.power_down();
  while (a_trier) {
    a_trier = 0;
    for (i = 0; i < 9; i++) {
      if (tab[0][i] > tab[0][i + 1]) {
        tmp[0][i] = tab[0][i + 1];
        tmp[1][i] = tab[1][i + 1];
        tab[0][i + 1] = tab[0][i];
        tab[0][i] = tmp[0][i];
        tab[1][i] = tmp[1][i];
        a_trier = 1;
      }
    }
  }
  for (i = 1; i < 9; i++)  {
    poids_total += (tab[0][i] - tare);
    resistance_total += tab[1][i];
  }
  mesure_poids = ((poids_total / 8) * (pow(correction, ((resistance_total / 8) - const_thermistor)))) ;
}


Les variables constantes peuvent être stockées dans l'eeprom comme beaucoup d'autres données pour alléger la mémoire de la puce lorsqu'on intègre le tout dans ses fichiers de production.

@+ ;)

tautin25
Messages : 135
Localisation : Longevelle sur Doubs (25)
Contact :

Re: Warré 2.0

Message#135 » mer. avr. 26, 2017 10:27 am

Salut,

Dans ton code
mesure_poids = ((poids_total / 8 ) * (pow(correction, ((resistance_total / 8 ) - const_thermistor)))) ;

la valeur restance_total (somme des 8 valeurs lues par analogRead(THERMISTOR) représentent une valeur en degrés ?

Si c'est une température exprimée en degrés (-20 à +40) , ça ne marche pas avec les températures négatives puisqu'une puissance mathématique est toujours positive.

Pour ma part, je travaille avec un capteur DS18B20 que j'ai placé contre une jauge et j'ai donc des degrés. J'ai donc un coefficient multiplicateur simple. La fonction puissance est-elle indispensable ?

A bientôt
Claude

Retourner vers « Au coin du feu »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Faites glisser l'icône de la Ruche Warré sur la barre des tâches pour épingler le site !

Ou cliquez ici par l'ajouter au menu démarrer ou à la liste des applications.