Afin d'allier électronique, informatique, radio et apiculture, le projet démarre mi-mai 2015...

Projet nommé APAGUARD, "Apa" est la traduction corse d'abeille et "guard" de garder. Le nom est sufisamment évocateur pour être compris dans de nombreuses langues... ;-)

Cahier des charges :

  • Système autonome alimenté par batterie 12 Volts.
  • Mesure de la météo au rucher (température et humidité de l'air, pression barométrique, tension de la batterie)
  • Surveillance du poids et d'une température au choix (ambiante, intérieure ou couvain) de plusieurs ruches.
  • Transmission des données recueillies vers un site Web pour archivage et consultation.
  • Alertes par SMS en cas de baisse brutale du poids de la ruche. (vol, essaimage, chute...) et du seuil critique de la tension batterie.
  • Coût le plus réduit possible.

Choix des technologies :

Compte-tenu de sa large communauté, de son faible coût et des nombreuses extensions disponibles, le développement à l'aide d'une platine Arduino est choisie.

Pour la mesure des grandeurs physiques et leur transmission, les composants suivants ont été choisis :

  • Température de la ruche : Sonde de température étanche DS18B20
  • Température et humidité de l'air : Sonde DHT22
  • Pression barométrique : Sonde BMP180
  • Platine GPRS:  à base d'un module SIM900
  • Sonde de poids : ZEMIC L6E 150 kg max.
  • Dialogue entre les ruches et la base : Câbles ou modules NRF24L01 transmission radio en 2,4 GHz ?
  • Horodatage à l'aide d'une horloge RTC autonome DS3231
  • EEPROM pour sauvegarder certains paramètres ?? A définir

Pour la visualisation des données sur Internet :

  • La librairie Dygraphs pour les tableaux
  • Une base de données MySQL
  • Quelques scripts php et l'hébergement sur mon site

23/05/15

Premier problème à réception de ma platine Arduino. Le driver série refuse de s'installer ! 
Après pas mal de tentatives infructueuses, il s'avère que le chip USB utilisé sur le clône n'est pas compatible avec celui de l'Arduino et qu'il faut installer un pilote dédié pour ce chip CH340G !
Pilote trouvé ici et suite à installation sans problème, la platine est reconnue par l'IDE d'Arduino.
Chargement d'un logiciel (appelé sketch chez Arduino) et tout roule !

24/05/15

Ecriture d'un petit bout de programme pour lire une tension avec l'entrée A0 (Analog Input 0). Tout fonctionne, la tension utilisée pour le test le 3,3V présent sur la platine. Les mesures donnent 3,45V en moyenne avec pas mal de fluctuations.
Il s'avère que la routine de mesure utilise la tension d'alimentation théorique de 5V comme référence... Pas terrible !
Utiliser la tension de référence interne de 1,1V ne donne pas de meilleurs résultats, cette tension est donnée pour une précision de +/- 10% ! Certes plus stable que la tension d'alimentation, mais il faudrait alors effectuer une correction logicielle.
On peut également utiliser une référence EXTERNE qui elle garantirait une précision bien meilleure. Le jeu en vaut-il la chandelle ?

La conversion de la valeur digitale lue en une valeur décimale lisible ( 3,47 ) utilise une variable du type FLOAT (virgule flottante) et consomme 2 octets. Avec le tout petit bout de logiciel, la mémoire est déjà utilisée à 14% !
Peut-être serait-il sage d'effectuer la conversion côté site Web avant affichage afin d'économiser des variables, ce qui permettrait également de corriger l'erreur de mesure de la tension ?

Prévoir un diviseur de tension sur l'alimentation batterie pour amener la tension nominale de 12V vers 3,5V.

Lire mon article sur Arduino - divagation sur la mesure de tensions avec l'Arduino

Semaine du 25 au 30 mai 2015

Ecriture des scripts php + MySQL pour affichage et insertion automatique des futures données sur mon site Web.
Les tables MySQL
L'utilisation des scripts Javascript  Dygraphs et FlexGauge est un peu capricieuse, mais le résultat est plus que correct. Les scripts permettent de choisir l'affichage des données d'un rucher (temp. et humidité externes, pression atmosphérique, tension batterie, qualité signal GSM, temp. sonde pression) et d'une ruche (poids, température). Les 2 graphes peuvent être synchronisés ou non.

Lien vers la page de test

Commande des différents matériels sur ebay et Aliexpress : sondes de poids 150kg, sondes de températures étanches, sonde mixte de température et humidité, sonde de pression atmosphérique, module GSM, modules radio 2,4 Ghz...

A la réception de la sonde de pression, test d'un sketch pour lire la pression et la température de la sonde.... ca marche !!

Semaine du 1 au 7 juin 2015

Réception du capteur DHT22 et de la platine RTC. Tests avec les exemples, tout fonctionne.
Début d'écriture du sketch Apaguard_base. La fonction de mesure correcte de la tension ne se révèle pas si évidente ! 
Lire : Divagation sur la lecteur d'une tension avec l'Arduino
Pour le moment, abandon de l'option transmission entre ruches et base via 2,4 GHz. A la lecture des différents forums, ces modules sont d'une utilisation critique et nécessitent de trop nombreuses pin de l'Arduino. La transmission se fera par fils dans l'immédiat.

Semaine du 8 au 14 juin 2015

Réception du shield GSM. Tests des différentes fonctions, lecture CSQ, envoi SMS, envoi requête HTTP. Tests OK.
Réception le 15/06 des capteurs de poids. Il manque la platine HX711 et les convertisseurs DC/DC.

Semaine du 15 au 21 juin 2015

Ecriture des différentes fonctions : lecture des capteurs, SMS et HTTP GSM. Construction d'une boucle qui a permis de tout tester.

Tout semble fonctionner. A améliorer cependant et rajouter la mise en veille.

Semaine du 22 au 28  juin 2015

Remplacement de l'horloge RTC DS1307 commandée initialement par une DS3231, plus précise et possédant deux alarmes qui permettront de réveiller l'Arduino qui sera mis en veille pour économiser l'énergie.
La première difficulté a été de mettre à jour l'horloge. Les sketch trouvés utilisent pour la plupart l'heure de compilation du sketch qui est donc toujours en retard par rapport à l'heure vraie.

Après pas mal de recherches et essais, j'ai adopté la solution proposée ici. Il s'agit d'un logiciel qui tourne sur le PC et d'un sketch à charger sur l'Arduino. Les 2 dialoguent entre eux et l'horloge RTC est mise à jour par rapport à l'horloge du PC.

Afin de gagner de la place, j'ai d'abord commencé par écrire mes propres fonctions pour lire l'heure, écrire des alarmes, etc ... Mais à la fin, je suis arrivé à peu de choses près à ce que propose cette librairie, que j'ai donc fini par adopter.
Il a cependant fallu la modifier pour corriger un bug dans la gestion des années 1900 - 2000...

J'ai adapté l'exemple donné pour un réveil toutes les 5 minutes. Mon sketch lit donc toutes les 5min le poids de la ruche uniquement et s'il n'y a pas eu de perte de poids anormale depuis la dernière mesure, se remet en veille. Dans le cas contraire, il envoie un SMS d'alerte. Toutes les heures pleines tous les capteurs sont lus et les informations sont transmises via le GPRS sur mon site Web.

Ré-écriture de la boucle principale pour gérer la nouvelle horloge  DS3231et la mise en veille par l'interruption. Les premiers essais sont encourageants. L'horloge est bien plus précise que le timer de l'Arduino et tout semble fonctionner parfaitement.

 Semaine du 29 juin au 5 juillet 2015

La maquette fonctionne parfaitement, et mis à part quelques problèmes lors de l'envoi sur mon site Web, la stabilité est parfaite. Le site est bien alimenté et les tests d'envoi de SMS sont concluants.

Le sketch a été amélioré afn de le rendre plus compact.

Les sondes DS18B20 utilisées pour la lecture de la température interne des ruches ont été rajoutées et tout semble bien fontionner.

Il ne reste plus qu'à implémenter la mesure de poids. Malheureusement le colis contenant les platines HX711 semble s'être perdu entre Roissy et la Corse !

J'envisage de rajouter une sauvegarde des mesures dans l'EEPROM qui est installée sur la platine DS3231. Je vais également réfléchir comment être certain que l'envoi des données est bien parvenue sur le serveur et prévoir un nouvel envoi si nécessaire.

Semaine du 6 au 12 juillet

Ajout d'une fonction qui permet de s'assurer que le requête envoyée au serveur Web a bien été reçue et exécutée. Le serveur Web envoie RRR lorsque l'écriture dans les tables SQL s'est bien déroulée. Si le sketch ne reçoit pas cette réponse, il programme un nouvel envoi 5 min plus tard, jusqu'à ce que la requête aboutisse.

Modification des scripts php et du sketch pour traiter les données des 2 ruches.

Il reste à concevoir et réaliser les châssis de la balance, et terminer la fonction lecture des sondes de poids à l'aide des DAC HX711...

Semaine du 13 au 20 juillet 2015

Réception d'une nouvelle commande des HX711. Test de raccordement d'une sonde L6E. Tout fonctionne, mais il me faut réaliser la mécanique d'une balance pour effectuer des tests en charge.
Voir mon article Arduino - mesure de poids avec HX711

Août 2015

 

J'ai profité de l'arrêt dans mon projet en attente de la réalisation du chassis de la balance pour m'initier au logiciel Sketchup.

J'ai dessiné toutes les pièces nécessaires à la réalisation de l'ensemble.

Septembre 2015

Le prototype fonctionne 24/24 depuis plusieurs semaines sans aucun problème, le logiciel semble donc au point. Je vais enfin pouvoir commencer à tester la partie pesée, mon frère m'ayant réalisé un chassis d'après mes plans ci-dessus. (Merci frangin)

Le premier test avec une platine HX711 d'origine et l'alimentation à l'aide du port USB du PC donne déjà des résultats au-delà de mes espérances. Il a fait cependant apparaitre une grande influence de la tension d'alimentation sur la mesure mesurée et une grande sensibilité de la platine HX711 aux éléments externes (température, effet de main, etc...) (voir l'article sur la mesure du poids pour plus de précision)

Il semble évident qu'il va falloir traiter ces problèmes pour fiabiliser les mesures. L'ensemble plateau + sonde n'offre pas assez de stabilité mécanique du fait de la souplesse du capteur...

Remplacement des capteurs DHT22 et BMP180 par un BME280 qui englobe les mêmes fonctions. Commande de quelques composants, transistors, etc...

Tests des graphiques avec la librairie Highstocks.  Les premiers résultats encourageants sont ici.

Rajout d'une entrée "alarme" qui utilise la 2ème interruption laissée libre. Une mise à la masse d'un pin déclenche une interruption qui active une pin de sortie qui pourra être utilisée pour activer une sirène ou autre, et envoie un SMS d'alerte.

Février - Mars 2016

Après plusieurs mois de tests sur le bureau, réalisation d'un prototype sur plaquette VEROBOARD autour d'un UNO PRO MINI. Modification de quelques lignes de codes, réaménagement des pins pour faciliter la réalisation d'un futur circuit imprimé.

- Mesures et optimisation de la consommation. Activation de l'alimentation des sondes HX711 pour économie d'énergie. Alimentation par une platine d'alimentation à découpage. Suppression de l'EEPROM, des réseaux de résistances, de la diode de charge de l'accu sur la platine horloge temps réel. Cette platine + sonde BME280 sur IC consomment 90 uA, il n'y a pas nécessité de couper l'alimentation tant que les régulateurs consommeront plus ...
- Ajout d'un script de calibration des balances, par mise à la masse d'une pin de l'Arduino. On entre alors dans la phase de calibration.
- Changement du mode de fonctionnement du BME280 qui donnait des mesures de température optimistes, passage du mode Snormal au mode Sforced et des paramètres de oversampling.
- Saisie du schéma sous KICAD.
- Installation de la sonde BME280 à l'extérieur sous un abri météo commandé en Allemagne sur Internet.

Avril 2016
Tests divers sur plusieurs semaines. Il s'avère que l'alimentation à découpage utilisée pour convertir le 12V en 5V est une vraie catastrophe. L'oscilloscope laisse apparaître des pics ainsi que du bruit importants, ce qui pourrait expliquer les variations de poids à vide, même sans les sondes de poids. Remplacement provisoire par un régulateur 5V LM2931A que j'avais sous la main. Nette amélioration des variations et diminution sensible de la consommation, bien meilleure que celle obtenue avec le step-down ! J'aurais dû commencer par là...

Il subsiste toujours des variations de poids alors que les entrées A+ et A- sont débranchées ! On note une "forte" dépendance à la température... Je ne vois qu'une variation de la tension d'alimentation. Les entrées des HX711 sont à la masse !

HX711 derive thermique vignette
 Variations de poids en fonction de la température

J'ai fini par débrancher totalement la sonde, y compris les 2 fils E+ et E-. Il subsiste encore des variations... Il ne reste que la sensibilité à la température du HX711 et des composants autour. Je suspecte le transistor et le pont diviseur qui alimente la sonde.

- Rajout d'un délai de 500ms après alimentation des HX711 et avant de faire les mesures. Les valeurs semblent plus stables... Confirmé par les graphiques !
Dommage, la ligne de code existait, mais je l'avais commentée, ayant constaté que dans la librairie HX711, il y avait déjà un contrôle de réception des données... Ce fut une erreur !
- Amélioration des scripts d'affichage. Ça commence à ressembler à quelque chose de sympa.

mai 2016
Dans le but de remplacer les platines d'origine chinoises très mal conçues (pistes longues, capas de découplages éloignées des pins d'alimentation des circuits, pas de plans de masse), réalisation d'une platine comportant un régulateur de tension 5V faible bruit et faible chute de tension LT1761 qui alimente la partie analogique des 2 circuits HX711 et qui est dissociée de la partie numérique.
Ma platine ne comporte donc aucune autre source de dérive thermique que celles des circuits intégrées. J'ai mis des plans de masses dissociés pour les parties analogiques et numériques de l'ADC.
Les premiers tests sont très encourageants. Il n'y a plus de dérive thermique avec les entrées reliées à la masse. C'est presque trop beau pour être vrai.. A confirmer par d'autres tests et examens du montage pour vérifier que je n'ai pas fait d'erreurs...

Finalement, il s'avère que les dérives thermiques n'ont lieu que quand il n'y a pas de tension sur l'entrée du HX711. J'ai en effet testé en appliquant une tension fixe délivrée par un pont de résistances à 1% sur l'entrée du HX711. La sortie est alors parfaitement stable dans le temps !
Probablement que l'ampli atteint ses limites (bruit) lorsqu'il n'y a aucune tension sur l'entrée. Encore une erreur d'analyse...

Le raccordement de la sonde de poids avec une charge de 50 kgs confirme que finalement, tout fonctionne parfaitement ! Il y a une légère variation de moins de 10 grammes qui reste à confirmer. Une fois la calibration effectuée, les mesures sont parfaitement linéaires avec des poids étalons de 10 à 50 kgs ! C'est parfait... La routine de calibration fonctionne parfaitement.

23/05/16
- Modification de la librairie du HX711 pour faire une moyenne par fenêtre glissante afin d'améliorer encore les mesures.
- Modification du logiciel afin de pouvoir raccorder au choix une ou deux sonde de poids.
- Modification de la structure de la base de données et des scripts php afin de n'avoir plus qu'une seule base.
- Modification du schéma afin d'alimenter la partie numérique des HX711 à partir du 3,3V et coupure de l'alimentation de la partie analogique et des sondes de poids.
- Modification du fonctionnement des pins ALARME et CALIBRATION. Elles ne sont désormais plus alimentées en PULLUP afin d'économiser encore quelques micro-Ampères, mais fonctionnent maintenant sur des signaux positifs.

Toucherais-je finalement au but ? ;-)

27/05/16 - Pas vraiment... Si l'ensemble fonctionne fonctionne plus que correctement, il s'avère que la consommation est élevée ! La coupure des alimentations AVDD et DVDD du HX711 provoquent des problèmes. La tension présente au repos sur la pin PD_SCK "remonte" à travers le HX711 et ressort sur les pins AVDD et DVDD, ce qui provoque une consommation anormale...
La solution est peut-être de forcer la pin PD_SCK à l'état bas une fois que tout est coupé ou de modifier le système d'alimentation de la platine HX711.

J'ai également testé de couper l'alimentation DVDD en veille, mais à la remise en marche, l'Arduino reboote, ce qui provoque une boucle et le programme ne démarre jamais !

En attendant d'autres tests, j'ai remis une platine non modifiée pour tester la consommation de l'ensemble en mode powerdown(). Bilan 1,4 mA.
J'ai alors supprimé le régulateur 5V qui alimentait l'Arduino et je l'ai alimenté directement en 12V, bilan : 0,420 mA ! Pourquoi faire compliqué ?

juin 2016

La platine d'origine montrant toujours les mêmes défauts de stabilité en température, j'ai fait un autre test.
J'ai conservé la platine d'origine, mais l'ai modifié afin que la sortie du régulateur de tension intégré ne fasse que commander la pin SHDN du régulateur LT1761.
De cette manière, je conserve les avantages du mode powerdown() du HX711 et la bien meilleure régulation du LT1761.
La consommation en veille est identique à celle du HX711 seule, mais il s'avère que la pin AVDD du HX711 consomme à elle seule 20 mA !! Pourquoi ? Mystère !