Moingsen, auch wenn es in der Nacht ist.
Ich habe das Problem, das meine Temp und Feuchte Messung, mit einem
GY-21 Sensor nach ca 16 STD nicht mehr den nachvollziehbaren Wert von um
die 20 Grad anzeigt, sondern -40.
Mit meiner Ahnungslosigkeit vermute ich einen Speicherüberlauf, da ich
es aber nicht weis, frage ich mal euch, was ihr dazu denkt.
Ich nutze die SparkFun_Si7021_Breakout_Library.h um ihn auszulesen und i
die beiden Variablen als:
1
floathumidity=0;
2
floattemp=0;
die ich für die Anzeige auf dem Display konvertiere bzw caste:
Interessieren würde mich ob meine Vermutung stimmt und wenn ja, wie ich
das Problem lösen kann oder der Ursache auf die Schliche komme.
Abendliche Grüße.
Die einfachste Möglichkeit wäre ein JTAG Debugger und gdb.
Wenn du das nicht zur Hand hast gibt es natürlich noch viele weitere
Möglichkeiten. Unter Anderem:
- "temp" nach "sensor.getTemp();" auf einen Festen Wert setzten. Ändert
sich dieser sind evtl die Display Routinen das Problem.
- Alles nicht absolut notwendige auskommentieren und schauen ob das
Problem weiterhin besteht.
- Der Sensor ist sehr einfach anzusprechen, daher kannst du die
Kommunikation auch sehr schnell selbst implementieren.
- Den Code auf deinem PC zum Laufen bringen, durch Ersetzen und/oder
Weglassen der Hardwareabhängigen Teile.
...
Ob es irgendwo einen Speicherüberlauf gibt oder nicht, kann man nicht so
leicht sagen. Kann sein, muss aber nicht. Bei einem PC hat man gute
tools, nach sowas zu suchen (asan, valgrind, etc.) aber auf dem UC ist
das schwieriger, da muss man halt nehmen, was man hat. So oder so wirst
du es aber halt leider altmodisch Debuggen müssen. Nachsehen, was es
macht, überlegen, was es machen sollte, bis du die Quelle gefunden hast.
Und erwarte das unerwartete, am Ende ist vielleicht einfach der Sensor
halb kaputt (ist -40C nicht gerade das minimum für den?) oder was
ähnlich unerwartetes.
In dem aufgeführten Teil ist nichts, was zu Speicherüberlauf führen
könnte.
Und auch das Fehlerbild, wenn bei mir mal so etwas passiert, ist etwas
anderes: nämlich lustige Abstürze.
Man könnte jetzt noch den Sensor und die Oledausgabe einzeln testen, ob
in deren Bibiliotheken Speicher verbraucht wird. Sprich jeweils den
anderen Teil abschalten.
Ich schätze eher an einen I2C Lesefehler, welcher zu dem unteren
Grenzwert interpretiert wird.
PittyJ schrieb:> Ich schätze eher an einen I2C Lesefehler, welcher zu dem unteren> Grenzwert interpretiert wird.
Gemutmaßt habe ich auch schon einen I2C Fehler, dies aber auch wieder
verworfen, weil das Display auch über I2C kommuniziert und neben der
falschen Temperatur weiterhin alle Angaben wie erwartet anzeigt, wie die
Feuchtigkeit und Teile des Menüs. Ich habe mal ein Bild gemacht, damit
man sich eine Vorstellung machen kann.
Im übrigen hat sich gerade gezeigt, beim Versorgen der Schaltung mit
Strom (war die ganze Nacht Stromlos), zeigte sich der Fehler noch immer,
und nach dem Bilder machen war er wieder weg und zeigte 17 Grad an.
kannst du mal Schaltplan und Code posten ?
Hast du ein Oszilloskop zur Hand und kannst dir mal den Bus angucken wie
die Signale aussehen ( pull-up Widerstände am bis vorhanden ? ).
evtl "beißen" sich auch deine Verwendeten libs. Schonmal andere Probiert
?
für Sensor : https://github.com/adafruit/Adafruit_Si7021
für oled :
https://github.com/adafruit/Adafruit-128x64-Monochrome-OLED-PCB
Das sind schonmal zwei libs vom selben Hersteller.
Gruß
Xaver M. schrieb:> Im übrigen hat sich gerade gezeigt, beim Versorgen der Schaltung mit> Strom (war die ganze Nacht Stromlos), zeigte sich der Fehler noch immer,> und nach dem Bilder machen war er wieder weg und zeigte 17 Grad an.
Vielleicht solltest du deine Hardware einmal überprüfen. Was liefert die
Anzeige, wenn du den Sensor entfernst?
Und was soll das alberne "%95" in der Anzeige. Taucht das auch auf, wenn
vernünftige Werte angezeigt werden?
Bring erstmal die Software in Ordnung, bevor du nach einem Speicherleck
suchst.
Vielleicht hetzt du ihn auch einfach nur.
Ich kenne den Code nicht, aber ich würde da zwischen den Messungen immer
etwas Zeit lassen.
Viele Libs die ich bisher genutzt habe laufen einwandfrei wenn man
dazwischen etwas anderes o. halt ein Delay einsetzt.
Schlaumaier schrieb:> Ich kenne den Code nicht, aber ich würde da zwischen den Messungen immer> etwas Zeit lassen.
Das Datenblatt des SHT21 verrät sogar, wie lange der Sensor für die
einzelnen Messungen in Abhängigkeit von der gewählten Auflösung benötigt
(Tab. 7).
Außerdem beträgt die Zeitkonstante des Feuchtesensors 8s, die des
Temperatursensors zwischen 5 und 30s. Da braucht man sowieso Geduld und
hektisches Auslesen bringt einem wenig.
Wolfgang schrieb:> Schlaumaier schrieb:>> Ich kenne den Code nicht, aber ich würde da zwischen den Messungen immer>> etwas Zeit lassen.>> Das Datenblatt des SHT21 verrät sogar, wie lange der Sensor für die> einzelnen Messungen in Abhängigkeit von der gewählten Auflösung benötigt> (Tab. 7).>> Außerdem beträgt die Zeitkonstante des Feuchtesensors 8s, die des> Temperatursensors zwischen 5 und 30s. Da braucht man sowieso Geduld und> hektisches Auslesen bringt einem wenig.
Kann das etwas bringt, eine Zeitfunktion zum Auslesen des Sensors alle
2,3,4,5 min habe ich noch geplant einzufügen. Probiere ich die Tage mal
aus. Mal sehen ob der Fehler dann weg ist, oder dann erst Tage baucht
zum auftauchen.
Xaver M. schrieb:> Veit D. schrieb:>> nimm mal lieber snprintf.>> weil? Wo genau liegen deine Bedenken?
Google einfach mal nach sprintf und snprintf und erkenne den
Unterschied. Generell sollte man bei solchen Buffer Operationen immer
die Bufferlänge mit prüfen. Entweder um Overflows vorzubeugen oder bei
Bedenken auszuräumen.