Capteur inductif sans fil pour compteur d’eau avec « cyble » – Partie 3 : Finalisation
A la fin de la partie 2, j’avais un prototype sur breadboard plutôt fonctionnel. Mais il restait encore plein d’améliorations pour avoir un circuit propre et fonctionnel.
- Quel mode de transmission des données (quel module radio ?)
- Quelle alimentation (quel type d’accu ?)
- Améliorer le code pour économiser au maximum l’accu.
Pistes d’améliorations
Choix de l’accu
Le choix sera assez simple, ça sera un accu lithium-fer-phosphate (LiFePO4). J’aime beaucoup les accus LiFePO4 pour les petits projets comme ça car niveau sécurité ils sont plus sûrs que les lithium-ion. De plus, leur tension d’environ 3.3V une fois la charge terminée permet d’alimenter un circuit nécessitant 3.3V sans passer par un régulateur de tension. Néanmoins la tension de charge étant de 3.6V, on ne peut pas la charger en place sans une gestion de charge adaptée. De plus, l’auto-décharge est assez faible.
Le module de transmission
J’ai réalisé un certain nombre de circuits pour la domotique de mon logement basés sur le célèbre Nrf24l01+. Ils fonctionnent très bien pour les capteurs de température par exemple dans un environnement intérieur avec des cloisons et un nombre de murs porteurs limité.
Les compteurs d’eau sont parfois dans des endroits plus difficiles d’accès, sous une trappe au bout du jardin, à l’autre bout du couloir en immeuble et dans ces circonstances le Nrf24 et sa bande de fréquence dans les 2.4GHz peuvent rapidement montrer leurs limites.
Pour ce projet, le choix se portera sur un module LoRa SX1278 qui utilise une fréquence dans la bande des 433MHz et qui aura donc une meilleur portée.
Amélioration du code
Stockage de l’index : il sera sauvegardé dans l’eeprom du microcontrôleur. Pour pallier au nombre maximum de cycles d’écriture, un buffer circulaire est utilisé.
Calibration : dans le prototype, les valeurs limites entre présence ou non de la cyble étaient en dur. Ici, un bouton permettra d’entrer en mode calibration pour calculer la valeur adéquat directement sur le compteur.
Économie d’énergie : La plupart du temps le capteur ne fait rien (un cycle de mesure prend environ 1ms), donc l’atmega sera en power down la majorité du temps. De plus, le nombre de mesure est réduit quand le compteur ne tourne plus.
Cycles de mesure : Pour respecter des timing précis et reproductibles sur les deux inductions, cette portion du code manipule directement les registres de l’atmega. Pas de pinMode ou de digitalWrite à ces endroits, mais DDRx (le registre de direction) et PORTx (pour positionner à haut ou bas). Idem pour faire une impulsion d’à peine plus de 1µs, pas de delay, mais quelques instruction assembleur nop.
Circuit final
Le schéma et le circuit imprimé sont disponibles ici : https://oshwlab.com/SanglierLab/lora-cyble-water-meter-sensor
Le programme arduino ici : InductiveWaterCounter, il est compilé avec https://github.com/MCUdude/MiniCore pour utiliser un atmega328p en mode standalone. La configuration à utiliser est l’horloge interne 8MHz (il n’y a pas de quartz sur le circuit).
Et ensuite ?
Maintenant, j’ai un compteur d’eau différent, où le disque n’a quasiment aucun effet sur l’oscillation. Mais il est effet miroir sur un fond noir, je suppose donc que celui-ci est prévu pour une lecture optique. La prochaine étape sera une modification du circuit pour remplacer les oscillateurs par des capteurs optiques réflectifs, comme ceux qui servent aux robots arduino à suivre des lignes.