Guten Tag, Habrovsk!
Kurze Einführung
Neulich wurde ich der glückliche Besitzer eines der kleinsten Einzelzahler, die an LEDE arbeiteten, und das erste, was ich (nach dem Blinken der LED) tun wollte, war eine Wetterstation zu Hause, auf die von überall aus zugegriffen werden kann. Der erste Schritt bestand darin, Daten zu Temperatur, Luftfeuchtigkeit und Druck zu erfassen. Hierzu wurden früher gekaufte
DHT11- und
LPS3311AP- Sensoren ausgewählt (Foto unter dem Schnitt).
Nach einer kurzen Google-Suche stellte sich heraus, dass das von mir gewählte Barometer nicht so beliebt ist, wenn die erste Familie gut dokumentiert ist und viele Bibliotheken für die Arbeit hat, mit Ausnahme der selbstgeschriebenen Bibliothek (wenn auch von sehr hoher Qualität) für das Arduino-Geschäft, in dem der Sensor gekauft wurde (keine Werbung, nur eine Hommage), nichts konnte gefunden werden.
Welche Wahl bleibt?
- Sammeln Sie die Ebene auf dem ATmega328-Mikrocontroller, flashen Sie sie, geben Sie den fertigen Code ein und lesen Sie daraus. Sehr aufregend, aber es klingt wie der Versuch, ein Fahrrad für die spätere Verwendung als Krücke zusammenzubauen.
- Lesen Sie "manuell" mit I2C und verlassen Sie sich dabei auf das offizielle Datenblatt . Ich habe es versucht, es ist möglich, aber ich wollte keine Bash-Skripte erstellen und schien methodisch nicht korrekt zu sein.
- Schreiben Sie eine Bibliothek , um mit dem Sensor nach Ihren Wünschen zu arbeiten.
Wenn Sie daran interessiert sind, wie es kam und was daraus wurde, dann willkommen bei cat.
Die erste Frage, auf die ich gestoßen bin, ist die Wahl der Sprache. Von dem, was auf diesem Single-Board funktioniert, ohne mit einem Tamburin zu tanzen - C ++ und Python. Da ich dieses Projekt in Zukunft für mich selbst in den Mittelpunkt eines Smart Homes stellen möchte, fiel die Wahl auf Letzteres.
Aufgrund des Entlein-Effekts habe ich die nächste Frage (welche Version) nicht gestellt und sofort das leichte Python3 und die Bibliothek für die Arbeit mit dem I2C-Bus eingefügt.
Dann gab es Stunden des Rauchens, zuerst ein
Datenblatt , dann eine
Software-Anleitung des Herstellers. Sie ermöglichten es, den Sensor schnell für den Betrieb vorzubereiten (obwohl sich herausstellte, dass die Softwareanleitung vollständiger war, einschließlich Empfehlungen zur Überprüfung des Messabschlusses und zum „Zurücksetzen“ des Sensors für eine genauere Erfassung.
Die erste Schwierigkeit, auf die ich gestoßen bin, ist das Lesen von Daten. Da die Daten vom Thermometer in zwei Bytes und der Druck in drei Bytes übertragen werden, ist es notwendig, mehrere Bytes zu erhalten und sie zu einer großen Anzahl zu kombinieren. Python konvertiert hex standardmäßig in int, und die einfache Verkettung funktioniert nicht. Das Konvertieren von int in hex gibt eine Zeichenfolge zurück, die perfekt verkettet, aber nicht wieder in eine Zahl konvertiert ist. Ausweg? Es wäre möglich, die Unterstützung für C-Typen zu verbinden, aber ich wollte nicht herumspielen und den Speicher mit einer zusätzlichen Bibliothek verstopfen. Daher wurde beschlossen, eine Funktion in 7 Zeilen (tatsächlich 8, wenn wir das Wörterbuch zählen) zu schreiben, um die Pseudo-Byte-Zeichenfolge in eine Zahl zu übersetzen.
Hex mit String zu ints_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
Ich glaube, dass die Frage „Warum aus dem Wörterbuch lesen?“ Hier vernünftigerweise gestellt werden kann. Die Antwort ist einfach: Es ist mir nicht in den Sinn gekommen, offensichtliche Entscheidungen zur Typkonvertierung zu treffen. Wenn Experten eine Antwort auf diese Frage haben, werde ich gerne Änderungen vornehmen.
Die zweite Schwierigkeit, die mich verblüffte, ist die Interpretation der Daten. Beide oben genannten Dokumente enthalten sehr einfache Formeln für die Konvertierung:
Pout(mbar)=(PRESS_OUT_H & PRESS_OUT_L & PRESS_OUT_XL)[dec] / 4096
für Druck;
T(degC) = 42.5 + (Temp_OUTH & TEMP_OUT_L)[dec] / 480
für die Temperatur.
Was gefällt, bieten sie sofort ein metrisches System.
Der erste Ansatz ergab jedoch hartnäckig das Ergebnis 0x2F8000, was 760 Millibar oder etwa 585 mmHg bedeutet. Art. Für eine Höhe von 130 Metern über dem Meeresspiegel reicht dies eindeutig nicht aus. Das erneute Überprüfen des Codes, das erneute Lesen von Informationen über die Druckmessung, das Neustarten des Sensors und das präzise Spielen haben nichts gebracht. Das wiederholte Studium der Richtlinie hat jedoch geholfen - stabile 760 mbar werden als Signal dafür interpretiert, dass der Sensor fehlerhaft ist. Leser, die sich das beigefügte Foto am Anfang des Artikels genau angesehen haben, können sicherstellen, dass der Sensor im Prinzip nicht auf dem Chip vorhanden ist :) Glücklicherweise habe ich schnell zwei davon gleichzeitig gekauft.
Foto eines funktionierenden Chips und ordnungsgemäßer Betrieb
Das kleine schwarze Quadrat in der Mitte ist die HCLGA-16L-Messplatte, das „Herz“ des Sensors.

Nach dieser Entdeckung wurde klar, dass ein Gesundheitscheck durchgeführt werden sollte. So wurde die Funktion geboren:
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
Um einen seltenen, aber dennoch potenziell wahrscheinlichen Fall von Fehlalarmen zu vermeiden, werden die Messungen dreimal durchgeführt und erst danach wird ein Urteil über die Inoperabilität gefällt. Es ist möglich, eine Konstante in einem solchen Code übermäßig zu verwenden, aber ein guter Ton sollte nach Möglichkeit beobachtet werden.
Sofort kam mir die Idee, dass es während der Initialisierung nicht schlecht wäre, zu überprüfen, ob die Adresse auf dem Bus korrekt ist, und die Funktion
__deviceAdressCheck wurde hinzugefügt, die das
WHO_AM_I- Register überprüft und
erwartet , die geschätzte Nummer 0xBB zu erhalten.
Hierzu gibt es anscheinend keine interessanteren Punkte mehr. Der vollständige
Code ist auf dem Github verfügbar und kann verwendet und geändert werden.