Ruche(s) connectée(s)

J’ai un petit rucher chez moi mais aussi dans un champ à 800 m. J’aimerais suivre le poids la température et l’hygrométrie de mes ruches (2 ruches à portée de wifi et 5 ruches sur les cotes).

J’ai déjà un plan pour la balance électronique avec un Arduino et des petits pesons mais je suis totalement inculte sur la transmission et le stockage des données pour les rendre accessible sur le Web.

J’ai besoin d’aide si il y en a quelques-uns où quelqu’un es qui veulent me filer un coup de main pour transmettre les données en lorawan ou en sigfox ou bien un autre moyen de transmission de données je suis preneur.

D’autre part si il y en a qui veulent découvrir comment fonctionne un rucher vous êtes les bienvenus.
Jean-matthieu

Salut à tous !
Voilà un sujet qui m’intéresse aussi !
Même problème pour moi !
Pas pour des ruches mais pour mon compteur d’eau.
Pourrait-on proposer une formation là-dessus ?
je suis sûr que pas mal de gens sont intéressés par le sujet !

Je suis interesse par la visite du rucher si tu en organises une.
J’ai pas mal bossé sur le WIFI/arduino avec mon projet de volets (que j’ai fini par passer sur Pi finalement pour un Pb de mémoire). Pas d’expérience sur présentation des données et sur Lorawan (sauf la formation Lorawan d’il y a 2 ans environ).

Je suis aussi intéressé pour visiter les ruches et discuter bzzz bzzz

Après discussion avec mon collègue, il utilise InfluxDB pour le stockage des données. Pour la visualisation Grafana.

Pour remplir la base de données avec des données issues du réseau LoraWAN

La couverture réseau sur Clermont

Pour la partie Hardware, on avait proposé ça lors de l’atelier LoraWAN

C était pas pour tes poules ? (Pour savoir si tu as de oeufs)

Bonsoir, J’ai pris contact avec paul Pinault qui semble-t-il avait fait la formation Lora la dernière fois.Il serait d’accord pour refaire cette formation et peut-être même la rendre plus pratique avec un projet bien particulier. Dans un deuxième temps J’ai aussi pris contact avec Jérôme Ravel qui a déjà pas mal travaillé sur le sujet des ruches connectées .J’ai récupéré une carte Laura Nano mode que je vais essayer de faire fonctionner avec le Modo que m’a renvoyé Paul.Pour l’instant mes balances fonctionnent bien mais je les ai pas encore installé sous mes ruches. Pour ce qui est de la visite des ruches. La prochaine fois que je programme une visite un samedi ou un dimanche je vous fais signe.

Non non, pour mes poules, c’est un autre projet : O/F automatique de la porte de l’abri
Et pour les œufs, les pov bébêtes n’ont que 6 semaines… Faudra attendre un peu :wink:
Mon projet « connecté », c’était la retransmission des tops compteur d’eau pour détecter une éventuelle fuite d’eau entre le compteur et la maison.

Bon mon projet avance, j’ai une carte lora node v2 alimenté en 7,2v(piles),sur le réseau hélium, elle a 2 entrées numériques et 2 analogiques.(les autres sont pour le lorawan). Ma balance nécessite 2 d’entrée numérique (module hx711) mais je n’ai plus d’entrée libre pour mon capteur température/humidité (dht22).

Question : Comment est-ce que je peux capter la température et l’humidité sur les deux ports analogique ?

Je te passe ce doc, tu devrais trouver ton bonheur.
Article_Hygrometrie_Sols.pdf (1,9 Mo)

Comme ça je dirais en mettant un Ardunio entre les deux pour l’utiliser en convertisseur 1Wire-Analog. Au prendre un capteur qui sort directement de l’analogique.

Aurais tu une référence plus précise ? Pour voir s’il n’y aurait pas une autre approche possible ?

La carte est la suivante
Lora Radio Node V.1 je fais tourner LMIC dessus pour l’envoie de données
Car je suis un tuto de Paul
Il décrit la carte sur cette page :

le GitHub de la carte est le suivant :

LoRa-Radio-Node-v1.0

A priori, d’après la doc Arduino, tu peux utiliser les pins Analog comme des pins Digital. Donc plus de problème :wink:

Super ca fonctionne aveec la température sur A0 , maintenant j’ai des soucis pour formater ma donnée pour l’envoyer mais je creuse
voici mon code pour ceux qui arrivent à lire le code comme moi les notice ikéa ;), pour l’instant je n’ai branché que le capteur de temperature et hygrométrie pas la balance

#include <lmic.h>
#include <hal/hal.h>
#include <LowPower.h>
#include « HX711.h »
#include « DHT.h »

const lmic_pinmap lmic_pins = {
.nss = 10,.rxtx = LMIC_UNUSED_PIN,
.rst = 9,
.dio = {2, 5, LMIC_UNUSED_PIN},
};

#define TXPERIOD (5*60) // 5 minutes
#define DHTPIN A0 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//balance #define DT 3 //capteur balance1 orange
//balance #define SCK 4 //capteur balance1 jaune

//balance HX711 balance;
DHT dht(DHTPIN, DHTTYPE);

//balance float calibration_factor =-19900; // ma calibration pour mon capteur
//balance float units;

static const u1_t PROGMEM APPEUI[8] = {0x60, 0x81, 0xF9, 0x45, 0xE1, 0x39, 0xC2, 0x59}; //Ma clé de Objet APIEUI
static const u1_t PROGMEM DEVEUI[8] = {0x60, 0x81, 0xF9, 0x76, 0x35, 0x6B, 0x36, 0x87}; //Ma clé d’objet DEVEUI
static const u1_t PROGMEM APPKEY[16] = {0x94, 0x6A, 0xF6, 0x6F, 0x09, 0xCF, 0x8E, 0xD9, 0xBD, 0x97, 0x75, 0x23, 0x6D, 0x57, 0x8D, 0xA4}; //Ma clé API d’opbjet

void os_getArtEui (u1_t* buf) {
for ( int i = 0 ; i < 8 ; i++ ) buf[7-i] = APPEUI[i];
}

void os_getDevEui (u1_t* buf) {
for ( int i = 0 ; i < 8 ; i++) buf[7-i] = DEVEUI[i];
}

void os_getDevKey (u1_t* buf) {
memcpy_P(buf, APPKEY, 16);
}

void setup() {
//balance // Addon Balance
pinMode(A0, INPUT_PULLUP); // transforme le port A0 en port numerique set pull-up on analog pin 0$
Serial.begin(9600);
dht.begin();
//delay(1000);
//balance balance.begin(DT, SCK);
//balance balance.set_scale(calibration_factor);
//balance balance.tare(); //tare la balance: ajustement du zéro
//balance long zero_factor = balance.read_average(); //Obtenez une lecture de base
////balance //Fin addon

os_init(); // Intialisation de la bibliothèque
LMIC_reset();
LMIC_setClockError(MAX_CLOCK_ERROR * 10 / 100); // agrandit la fenetre de reception
LMIC_setAdrMode(0); // desactive le mode ADR

// Configure les canaux utilisables pour les communications
LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI);
LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI);

// Configure la vitesse et la puissance de transmission
LMIC.dn2Dr = SF9;
LMIC_setDrTxpow(DR_SF9,14);
LMIC_setLinkCheckMode(0);
}
//reveille la carte

boolean canSleep = true;
uint32_t temps = TXPERIOD; // transmettre au demarrage
uint8_t data[] = {
0x01, 0x68, 0x00, // canal 1, type de donnée Hygrometrie 1 ut = 0.5%
};

void loop() {
//Mesure temparature et hygrometrie
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F(« Failed to read from DHT sensor! »));
return;
}
//balance balance.set_scale(calibration_factor); //ajuste au facteur de calibration
//balance units = balance.get_units(), 10; //mesure la valeur de la balance dans « units »

// Il faut envoyer units t et H
//balance // Fin mesure balance

if ( temps >= TXPERIOD ) {
canSleep = false; //entre chaque mesure : dodo!

// lecture de la donnée du capteur
// int16_t v = analogRead(A0); // 100 % = 313 | 50% = 678
// enregistrement des données mesurées dans la variable data
data[0] = t;
data[1] = h;
data[2] = f;
Serial.println(h);
Serial.println(temps);
Serial.println(TXPERIOD);
Serial.println(data[0]);
Serial.println(data[1]);
Serial.println(data[2]);
// emission de la valeur
LMIC_setDrTxpow(DR_SF9,14);
lmic_tx_error_t err = LMIC_setTxData2(1, data, sizeof(data), 0);
temps=0;
}

// put your main code here, to run repeatedly:
os_runloop_once();

if ( canSleep ) {
LowPower.powerDown(SLEEP_8S, ADC_OFF,BOD_OFF);
temps += 8;
}
}

void onEvent (ev_t ev) {
switch(ev) {
case EV_JOINED:
LMIC_setLinkCheckMode(0);
break;
case EV_TXCOMPLETE:
canSleep = true;
break;
default:
canSleep = false;
break;
}
}

Bon, ca y est, ca transmet sur le reseau Lorawan Helium et j’arrive à avoir quelques données. Cependant je n’arrive que a avoir les données Température et humidité. Pour transmettre le poids je galère pour formater la donnée correctement selon le protocole ‹ Cayenne Low Power Protocole › Cayenne Docs.
Que je déclare cette donnée de mesure en float ou en int16_t ca ne marche pas. De plus il faut la mettre dans un tableau containeur de type data[] and déclarant 3 choses : le canal : ici 0x03, le type de données : voir liste (0x02 ?? analogic input ?), et la données mesuré (ici appel « units ») et pour les deux dernière je sèche.
Help ?

Le code corrigé donnerai ca mais ca ne marche pas :
#include <lmic.h>
#include <hal/hal.h>
#include <LowPower.h>
#include « HX711.h »
#include « DHT.h »

const lmic_pinmap lmic_pins = {
.nss = 10,.rxtx = LMIC_UNUSED_PIN,
.rst = 9,
.dio = {2, 5, LMIC_UNUSED_PIN},
};

#define TXPERIOD (5*60) // 5 minutes
#define DHTPIN A0 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define DT 3 //capteur balance1 cable orange
#define SCK 4 //capteur balance1 cable jaune

HX711 balance;
DHT dht(DHTPIN, DHTTYPE);

float calibration_factor =-19900; // ma calibration pour mon capteur
float units;

static const u1_t PROGMEM APPEUI[8] = {0x60, 0x81, 0xF9, 0x45, 0xE1, 0x39, 0xC2, 0x59}; //Ma clé de Objet APIEUI
static const u1_t PROGMEM DEVEUI[8] = {0x60, 0x81, 0xF9, 0x76, 0x35, 0x6B, 0x36, 0x87}; //Ma clé d’objet DEVEUI
static const u1_t PROGMEM APPKEY[16] = {0x94, 0x6A, 0xF6, 0x6F, 0x09, 0xCF, 0x8E, 0xD9, 0xBD, 0x97, 0x75, 0x23, 0x6D, 0x57, 0x8D, 0xA4}; //Ma clé API d’objet

void os_getArtEui (u1_t* buf) {
for ( int i = 0 ; i < 8 ; i++ ) buf[7-i] = APPEUI[i];
}

void os_getDevEui (u1_t* buf) {
for ( int i = 0 ; i < 8 ; i++) buf[7-i] = DEVEUI[i];
}

void os_getDevKey (u1_t* buf) {
memcpy_P(buf, APPKEY, 16);
}

void setup() {
// Addon Balance
pinMode(A0, INPUT_PULLUP); // transforme le port A0 en port numerique set pull-up on analog pin 0$
Serial.begin(9600);
dht.begin();
delay(1000);
balance.begin(DT, SCK);
balance.set_scale(calibration_factor);
balance.tare(); //tare la balance: ajustement du zéro
long zero_factor = balance.read_average(); //Obtenez une lecture de base
//Fin programme balance

os_init(); // Intialisation de la bibliothèque
LMIC_reset();
LMIC_setClockError(MAX_CLOCK_ERROR * 10 / 100); // agrandit la fenetre de reception
LMIC_setAdrMode(0); // desactive le mode ADR

// Configure les canaux utilisables pour les communications
LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI);
LMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI);
LMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI);

// Configure la vitesse et la puissance de transmission
LMIC.dn2Dr = SF9;
LMIC_setDrTxpow(DR_SF9,14);
LMIC_setLinkCheckMode(0);
}
//reveille la carte

boolean canSleep = true;
uint32_t temps = TXPERIOD; // transmettre au demarrage
uint8_t data[] = {
0x01, 0x68, 0x00, 0x02, 0x67, 0x00, 0x03, 0x02, 0x00 // canal 1, type de donnée Hygrometrie 1 ut = 0.5%, canal 2, type donnée température, canal 3, type de donnée ??
};

void loop() {
//Mesure temparature et hygrometrie
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
delay(2000);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F(« Failed to read from DHT sensor! »));
return;
}
balance.set_scale(calibration_factor); //ajuste au facteur de calibration
units = balance.get_units(), 10; //mesure la valeur de la balance dans « units »

if ( temps >= TXPERIOD ) {
canSleep = false; //entre chaque mesure : dodo!

// lecture de la donnée du capteur
// enregistrement des données mesurées dans la variable data
data[2] = h;
data[5] = t;
data[8] = units;
// emission de la valeur
LMIC_setDrTxpow(DR_SF9,14);
lmic_tx_error_t err = LMIC_setTxData2(1, data, sizeof(data), 0);
temps=0;
}

// put your main code here, to run repeatedly:
os_runloop_once();

if ( canSleep ) {
LowPower.powerDown(SLEEP_8S, ADC_OFF,BOD_OFF);
temps += 8;
}
}

void onEvent (ev_t ev) {
switch(ev) {
case EV_JOINED:
LMIC_setLinkCheckMode(0);
break;
case EV_TXCOMPLETE:
canSleep = true;
break;
default:
canSleep = false;
break;
}
}

Franchement, quand je vois le protocole, les modules à importer, les configurations à faire, les centaines de lignes de code pour envoyer … 3 octets !!! :rofl: :crazy_face:
Sans compter la débauche de kW qu’il faut (en arrière plan au niveau des serveurs) pour faire fonctionner une liaison de la sorte :upside_down_face:
C’est du grand art :clap: :clap: :clap:
Ça fait du miel bio ??? :rofl: :rofl: :rofl:

Lorawan est interressant les capteurs sont éloigné Physiquement de la zone de traitement des données.
Sinon pour traverser la cour le bluetooth ou wifi sont mieux et moin energievore.

Merci pour l’encouragement, ca fait toujours plaisir… bonne soirée

Perso je comprend pas tout au code publié (manque de temps pour m’y pencher, j’espère cet hiver…), mais du Lora me serais très utile car j’aimerais collecter des données sur tout un réseau de capteurs pas chers et surtout en très basse consommation.

Du coup, les retours d’info sont bon a prendre :smiley:

Tu alimentes par pile ? Batterie ? Panneau Solaire ? (je projette une alimentation avec une cellule Li-Ion ‹ 18650 › + un tout petit panneau solaire)

Bonjour @alex, j’ai été interpellé par ta réponse pour l’alimentation de piles 18650 par panneau solaire. Personnellement, j’ai essayé cette configuration à plusieurs reprises, mais je n’ai jamais pu « réguler » le système correctement, alors maintenant je me suis fait une alimentation avec un panneau et une batterie 12V, ce qui est plus musclé, mais moins portatif…
Je serais intéressé pour savoir quel matériel tu utilises comme panneau solaire - régulateur- et piles ?
Merci.
Eric.