Comptage d’impulsion – vue d’ensemble

Que ce soit pour la visualisation de la consommation d’eau en temps réel ou celle de la puissance électrique instantanée, le principe de base est le même :

archi

  1. Il y a d’abord un capteur qui fournit l’information recherchée sous forme d’impulsions électroniques.
  2. Un processus activé par interruption logicielle relève ces impulsions aussi vite que possible.
  3. Un autre processus stock tranquillement ces relevés d’impulsion dans une base de données.
  4. Un serveur web anime un mini site internet qui récupère les données et les transforme en informations présentées dans un navigateur.

Les impulsions sont fugitives ; il est important de ne pas les rater et de pouvoir mémoriser l’instant de leur occurrence aussi précisément que possible.

Naturellement, comme dans l’exemple indiquée dans un commentaire sur l’exemple de code pour l’étape 2, une solution simpliste consiste à enregistrer dans un fichier le nombre total d’impulsions comptées et la date et l’ heure de la dernière impulsion.

Cependant, c’est long, relativement à la brièveté d’une impulsion. Il faut en effet : ouvrir le fichier, lire la dernière valeur du compteur, recréer une nouvelle version du fichier avec la nouvelle valeur du compteur et la date et l’heure de la dernière impulsion. Si les impulsions sont trop rapprochées, on pourrait en rater. Par ailleurs, un décalage, d’une valeur plus ou moins aléatoire, s’introduit entre l’impulsion qui déclenche le traitement et le moment où l’heure est relevée.

En plus c’est pauvre : on ne conserve que le nombre total d’impulsions et la date de la dernière occurrence.

C’est pour cela qu’il est préférable de faire le traitement des impulsions en deux étapes : une lecture aussi rapide que possible (étape 2) puis, indépendamment et  sans contrainte de temps d’exécution, le stockage de chaque impulsion dans une base de données (étape 3). Ce traitement est fait à l’initiative de l’étape 4 et, en parallèle, il est aussi fait à intervalles réguliers. Ce qui permet d’avoir l’information la plus récente possible à afficher et éviter qu’un trop grand nombre d’impulsions ne s’accumulent avant d’être stockées en base de données si l’affichage n’est pas sollicité suffisamment souvent.

De plus, le stockage de toutes les impulsions dans une base de données ouvre la voie à de nombreux traitements et analyses.

Mais pourquoi 10 kΩ ?

Pourquoi 10 kΩ ? C’est la question posée par Giome dans son commentaire sur le “module additionnel”. C’est sans doute une question que tout le monde se pose et que personne n’ose poser. Comme d’habitude, c’est une évidence pour ceux qui savent et un mystère pour les autres. Si la réponse apportée ici est satisfaisante, Giome aura rendu un grand service en posant cette question.

Schématiquement, la connexion électronique à un GPIO (General Purpose Input Output c’est à dire port d’entrée sortie d’usage général) est le suivant :

GPIO

A gauche de ce schéma on a le symbole d’un bouton poussoir qui correspond au fonctionnement des capteurs “à impulsion”.  Pour le capteur utilisé sur le compteur d’eau du système de visualisation en temps réel de la consommation d’eau, c’est juste ça. Pour les compteurs utilisés pour le suivi de la consommation d’électricité c’est l’équivalent en version électronique. Dans les deux cas, une impulsion correspond à ce qui ce passerait si on appuyait brièvement sur le bouton poussoir : un court-circuit entre l’entrée GPIO et la masse.

Au niveau de l’entrée GPIO, on veut la traduction de cette impulsion sous forme binaire : un bref passage de 1 à 0, c’est à dire la passage de la tension Ub de 3.3 V à 0 V, puis un retour à 1 (3.3 V).

Si on ne branchait que le bouton poussoir, la valeur lue par le GPIO serait indéterminée (on dit “flottante”). Pour la maintenir à 3.3 V, on la relie à une sortie 3.3 V. C’est ce qu’on appelle un “pull-up” car cela tire la valeur lue par le GPIO vers le haut.

Si on reliait directement le 3.3 V au GPIO, sans résistance intermédiaire, on aurait, lors d’une impulsion, un cour-circuit du 3.3 V vers la masse !

La résistance de pull-up sert donc à protéger la sortie 3.3 V pour éviter de griller le circuit. L’intensité est alors limité à Ua/R. Avec une résistance de 10 kΩ l’intensité est donc de 0.33 mA, largement en dessous de la limite des 16 mA recommandée pour la limite du courant tiré d’un des GPIO. On aurait pu mettre moins que 10 kΩ mais c’est une valeur couramment admise pour une résistance de pull-up. C’est celle utilisée pour la version 1 du capteur de consommation électrique.

Par ailleurs, il est aussi possible d’activer, par une instruction logicielle, une résistance de pull-up interne, une par GPIO, d’une valeur annoncée de 50 kΩ.

Si on active cette résistance de pull-up interne, on peut donc se passer de rajouter une résistance de pull-up externe. C’est le choix fait pour la version 2 du capteur de consommation électrique.

Ce qui simplifie efficacement le montage.

Consommation électrique version 0.2

Chouette c’est le weekend ! Un peu de détente de geek, ça fait du bien…

Améliorations du capteur

Version 1 :el1La version 1 utilise un Raspberry Pi 1, une connexion avec des borniers, des résistances de pull-up de 10 kΩ, un compteur à 1000 imp./kWh. On note que tout ne tient pas dans le cadre de l’objectif tellement c’est encombrant. On cachera les détails, ils ne valent pas la peine d’être montrés.

Version 2 :el2

La version 2 a un bien meilleur WAF. Elle utilise un Raspberry Pi zero, une connexion sans bornier ni pull-up, un compteur à 2000 imp./kWh. L’intérieur est nettement plus élégant.

el2_details

Améliorations du traitement

Techniquement, le plus important est le passage à 2 impulsions par Wattheure : deux fois plus précis et deux fois plus réactif, surtout pour les consommations “faibles”.

Pour la peine, on passe pour le relevé des impulsions du Python au C (invisible à l’œil nu) et on améliore l’UX, nettement plus visible : el2_UX

Le fait que la consommation soit passée de 179 à 247 W est inopiné. C’est juste qu’il y a un ordinateur  portable en charge en plus au moment de la capture d’écran ; ah oui, 68 W pour charger le portable.

Consommation électrique version 0.1

Le commentaire de Mikael BERTHO à propos de l’article sur la consommation d’eau a fourni une piste pour un capteur permettant de suivre également la consommation électrique.

Affichage

Un poste de travail avec deux grands écrans

Le résultat attendu est un peu différent. Là il s’agit de connaître la consommation instantanée pour se rendre compte de la puissance électrique utilisée. Pour l’eau, c’était la quantité cumulée utilisée pour une action donnée mais le principe de base reste le même.

Pour explorer cette possibilité, on installe le capteur sur une vieille rallonge électrique recyclée pour l’occasion :

capteur

ATTENTION : c’est du 220 V ! Ne pas faire ce montage sans parfaitement comprendre et maîtriser les risques qu’il implique.

Et puis on monte un banc de tests :

banc2test

Tout l’intérêt du capteur réside dans sa sortie numérique :

testoutput

Cette sortie est reliée à l’entrée du banc de tests :

testInput

Ici elle est en parallèle avec une entrée manuelle ; un simple bouton permettant de simuler une impulsion et d’en valider la lecture par le Raspberry Pi.

Pour visualiser l’impulsion fournie par le capteur, on installe un oscilloscope digital, version geek :

bitscope

Ce qui permet de capturer une magnifique impulsion :

Impulsion

L’entrée digitale du Raspberry Pi maintenue à l’état “haut” de 3.1 V par une résistance de pull-up passe brutalement à un état bas de 1 V pendant 76 ms lorsque le capteur annonce la consommation d’un wattheure.

Il reste à faire installer par un électricien professionnel le montage du capteur sur le tableau électrique pour avoir une visibilité sur la consommation électrique générale. En attendant, ce simple dispositif permet déjà de prendre conscience de la consommation d’un poste informatique.

En veille, les mêmes équipements consomment nettement moins :

veille

Et en veille encore plus prolongée, encore moins :

veille2

Tiens, cela permettrait donc aussi de donner des indications objectives sur les temps et horaires de travail effectif d’un informaticien…

Oh !