Mon expérience de connexion du LPS331AP à Omega Onion2

Bonjour, Habrovsk!

Brève introduction


L'autre jour, je suis devenu l'heureux propriétaire de l'un des plus petits payeurs uniques travaillant sur LEDE, et la première chose que je voulais faire (après avoir clignoté la LED) était une station météo domestique, accessible depuis n'importe où. La première étape consistait à recueillir des données sur la température, l'humidité et la pression. Pour cela, les capteurs DHT11 et LPS3311AP achetés précédemment ont été sélectionnés (photo sous la coupe).

Photos pour les intéressés
image

Après un court google, il s'est avéré que si la première famille est bien documentée et possède de nombreuses bibliothèques pour le travail, alors le baromètre que j'ai choisi n'est pas si populaire, sauf pour la bibliothèque auto-écrite (bien que de très haute qualité) pour le magasin Arduino où le capteur a été acheté (pas de publicité, juste un hommage), rien n'a pu être trouvé.

Quel choix reste?

  1. Récupérez la couche sur le microcontrôleur ATmega328, flashez-la, remplissez le code fini et lisez-le. Très excitant, mais cela ressemble à essayer d'assembler un vélo pour une utilisation ultérieure comme béquille.
  2. Lire "manuellement" avec I2C, en s'appuyant sur la fiche technique officielle . J'ai essayé, c'est possible, mais je ne voulais pas produire de scripts bash et ne semblait pas méthodologiquement correct.
  3. Écrivez une bibliothèque pour travailler avec le capteur comme vous le souhaitez.

Si vous êtes intéressé par la façon dont cela est arrivé et ce qui en est arrivé, alors bienvenue chez cat.

La première question que j'ai rencontrée est le choix de la langue. De ce qui fonctionne sur ce single-board sans danser avec un tambourin - C ++ et Python. Puisqu'à l'avenir je souhaite mettre ce projet au cœur d'une maison intelligente pour moi, le choix s'est porté sur cette dernière.

En raison de l'effet de caneton, je n'ai pas posé la question suivante (quelle version) et j'ai immédiatement mis le python3 léger et la bibliothèque pour travailler avec le bus I2C.

Puis il y a eu des heures de fumage, d'abord une fiche technique , puis un guide logiciel du constructeur. Ils ont permis de préparer rapidement le capteur pour son fonctionnement (bien que le guide du logiciel se soit avéré plus complet, y compris en ce qui concerne les recommandations pour vérifier la fin de la mesure et «réinitialiser» le capteur pour une collecte plus précise.

La première difficulté que j'ai rencontrée est la lecture des données. Étant donné que les données du thermomètre sont transmises en deux octets et la pression en trois, il est nécessaire d'obtenir plusieurs octets et de les combiner en un seul grand nombre. Mais python convertira hex en int par défaut, et la concaténation simple ne fonctionne pas. La conversion de int en hexa renvoie une chaîne parfaitement concaténée mais non convertie en nombre. Sortir? Il serait possible de connecter la prise en charge des types C, mais je ne voulais pas déranger, ainsi que le colmatage de la mémoire avec une bibliothèque supplémentaire, il a donc été décidé d'écrire une fonction sur 7 (en fait 8, si nous comptons le dictionnaire) lignes pour traduire la chaîne de pseudo-octets en un nombre.

Hex contenant une chaîne en entier
s_t_h = { '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4, '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9, 'a' : 10, 'b' : 11, 'c' : 12, 'd' : 13, 'e' : 14, 'f' : 15 } def __string_to_int(self, hex_string): l = len(hex_string) - 1 res = 0 for h in hex_string: res += s_t_h[h] * (16 ** l) l -= 1 return res 

Je crois que la question «pourquoi lire le dictionnaire?» Peut être raisonnablement posée ici. La réponse est simple - il ne m'est pas venu à l'esprit de prendre des décisions évidentes sur la conversion de type, si les experts ont une réponse à cette question, je serai heureux d'apporter des modifications.

La deuxième difficulté qui m'a dérouté est l'interprétation des données. Les deux documents ci-dessus donnent des formules de conversion très simples:

Pout(mbar)=(PRESS_OUT_H & PRESS_OUT_L & PRESS_OUT_XL)[dec] / 4096 pour la pression;
T(degC) = 42.5 + (Temp_OUTH & TEMP_OUT_L)[dec] / 480 pour la température.

Ce qui plaît, ils proposent immédiatement un système métrique.

Cependant, la première approche m'a obstinément donné le résultat 0x2F8000, ce qui signifie 760 millibars ou environ 585 mmHg. Art. Pour une hauteur de 130 mètres au-dessus du niveau de la mer, ce n'est clairement pas suffisant. Revérifier le code, relire les informations sur la mesure de pression, redémarrer le capteur et jouer avec précision n'a rien donné. Mais l'étude répétée de la directive a aidé - une stabilité de 760 mbar est interprétée comme un signal indiquant que le capteur est défectueux. Les lecteurs qui ont regardé attentivement la photo jointe au début de l'article peuvent s'assurer que le capteur, en outre, est en principe absent sur la puce :) Heureusement, j'en ai rapidement acheté deux à la fois.

Photo d'une puce qui fonctionne et de son bon fonctionnement


Le petit carré noir au centre est la plaque de mesure HCLGA-16L, le «cœur» du capteur.

image

Après cette découverte, il est devenu évident qu'un bilan de santé devait être fait. La fonction est donc née:

working_check
 BROKEN_MARKER = 0x2f8000/4096 def __working_check(self, address): c1 = self.__read_pressure(address) c2 = self.__read_pressure(address) c3 = self.__read_pressure(address) if c1 == c2 == c3 == BROKEN_MARKER: return True else: return False 

Afin d'éviter un cas rare, mais toujours potentiellement probable de faux positifs, des lectures sont prises trois fois et seulement après qu'un verdict d'inopérabilité est émis. Il est possible d'utiliser excessivement une constante dans un tel code, mais un bon ton doit être observé chaque fois que possible.

Immédiatement, une idée m'est venue à l'esprit qu'il ne serait pas mauvais lors de l'initialisation de vérifier si l'adresse sur le bus est correcte, et la fonction __deviceAdressCheck a été ajoutée, qui vérifie le registre WHO_AM_I et s'attend à recevoir le précieux numéro 0xBB.

Sur ce point, il semble qu'il n'y ait plus de points intéressants. Le code complet est disponible sur le github et peut être utilisé et modifié.

Source: https://habr.com/ru/post/fr471232/


All Articles