
Un nouveau programme pour ma balance SigFox
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 !
Bonjour
Déjà merci de partager avec nous vos projets…
Serai t il possible de nous partager des photos du support bois pour les capteurs, voir même un plan ?
Merci Thierry
oui, c’est prévu en fin de saison. J’aurai un peu plus de temps.
Merci de votre patience.
Bonjour
Encore un gros merci pour ce tuto, grâce a vous je fais mes premiers pas en programmation (même si le travail est bien mâché). Mais du coup j’ai besoin d’aide pour récupérer les infos sur Sigfox, j’arrive a récupérer les infos sur la température mais pas le poids. Pouvez-vous faire un petit auto sur comment remplir le callbacks de Sigfox? car je pense que c’est ici que je but. Encore un gros MERCI pour votre travaille.
Bonjour,
Merci pour ce tuto qui m’a été précieux pour la réalisation de ma première ruche connectées.
J’aurais juste une question au sujet de l’alimentation. Vous ne mettez pas la carte sigfox en veille dans votre code. Quelle la source d’alimentation utilisez vous pour cette balance ?
Cordialement
J’utilise un boitier à piles avec 2 piles alkalines au format AA d’1,5V chacune.
Je mets bien la carte en veille :
LowPower.sleep(15 * 60 * 1000);
C’est à la fin de la boucle générale.