Un nouveau programme pour ma balance SigFox

Un nouveau programme pour ma balance SigFox

26 août 2020 5 Par Philippe

Suite à l’article sur ma balance pour ruche connectée via le réseau Sigfox, disponible ici : http://miel.givet.ovh/index.php/2020/05/13/une-balance-connectee-au-reseau-sigfox/ j’ai reçu de nombreuses questions et commentaires. Je vais essayer d’être le plus explicite possible pour vous aider à réaliser vous-aussi, votre balance connectée Sigfox pour votre ruche. Je vais commencer par le code du programme, puis ferai un second article sur la partie électronique.

On commence par les bibliothèques :

#include <SigFox.h>
#include <ArduinoLowPower.h>
#include <HX711.h>

Les bibliothèques sont disponibles sur internet et se chargent depuis le logiciel Arduino pour votre ordinateur.

Ensuite les définitions et le démarrage du module convertisseur :

#define DOUT 3
#define CLK 2
HX711 scale;
float facteur_calibration = -7050;

DOUT et CLK correspondent aux ports utilisés sur le module Arduino pour connecter le module convertissuer HX711.

Le facteur de calibration est obtenu grâce à un autre script, utilisé une fois pour calibrer la balance. Voir en bas de cet article.

Mesure de la température et du poids :

int8_t tempfloat = SigFox.internalTemperature()+ 6; //mesure temperature sur capteur interne (+6 correction apres calibration, a modifier avec votre valeur)
float poids = (scale.get_units(5))*0.453592; // moyenne de 5 mesures de poids en kg

On utilise le capteur intégré à la carte Arduino pour mesurer la température. Le mien est « décalé » de -6°C dans la plage de 0°C à 30°C, c’est pourquoi j’ai ajouté un « +6 » pour obtenir une température correcte. A noter que la précision utilisée ici est de l’ordre du degré, je n’utilise pas de décimale (déclaration de valeur comme un entier naturel codé sur 8 bits « int8_t »).

Le poids est lui mesuré avecune décimale. (« float »). La valeur est obtenue par une moyenne de 5 mesures successives pour plus de précision.

Voici le code complet :

#include <SigFox.h>
#include <ArduinoLowPower.h>
#include <HX711.h>

#define DOUT 3
#define CLK 2
HX711 scale; 
float facteur_calibration = -7050; ///chiffre a changer, obtenu apres calibration

void reboot() {
NVIC_SystemReset();
while (1);
}


void setup() {
scale.begin(DOUT,SCK);
scale.set_scale(facteur_calibration); 
SigFox.begin (); //initialisation du module Sigfox
}

void loop() {

int8_t tempfloat = SigFox.internalTemperature()+ 6; //mesure temperature sur capteur interne (+6 correction apres calibration, a modifier avec votre valeur)
float poids = (scale.get_units(5))*0.453592; // moyenne de 5 mesures de poids en kg

if (!SigFox.begin()) {
reboot();  //redemarrage module Sigfox si erreur 
}

SigFox.beginPacket();
SigFox.write ( tempfloat );  //envoi de la temperature
SigFox.write (poids );   //envoi du poids
SigFox.endPacket ();


//Mise en veille pour 15 minutes
LowPower.sleep(15 * 60 * 1000);
}

Et la calibration ?

Pour calibrer la balance, j’ai utilisé le script suivant :

#include "HX711.h"

#define DOUT  3
#define CLK  2

HX711 scale;

float calibration_factor = -7050; 
scale setup

void setup() {
  Serial.begin(9600);
  Serial.println("HX711 programme de calibration");
  Serial.println("Retirez tous les poids de la balance");
  Serial.println(Apres lecture ajouter un poids de masse connue sur la balance");
  Serial.println("Taper + ou a pour augmenter le facteur de calibration");
  Serial.println("Taper - ou z pour diminuer le facteur de calibration");

  scale.begin(DOUT, CLK);
  scale.set_scale();
  scale.tare(); //Remise a zero de la balance

  long zero_factor = scale.read_average(); 
  Serial.print("Zero factor: "); 
  Serial.println(zero_factor);
}

void loop() {

  scale.set_scale(calibration_factor); 

  Serial.print("Lecture : ");
  Serial.print((scale.get_units())*0.453592);
  Serial.print(" kg"); 
  Serial.print(" facteur de calibration : ");
  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;
  }
}

Bon amusement !