ESP32 - SPS30 & anderen Sensoren an I²C verliert ab und zu die Verbindung

OP #7409309
Lesenswert?

Hallo liebe Foren-Gemeinde,

ich versuche eine Wetterstation zu bauen (der Weg ist das Ziel. Das ein oder andere Problem habe ich schon gelöst, bei folgendem stehe ich auf dem Schlauch:

Verbaut habe ich:

  • ESP 32
  • Sensirion SPS30
  • SHT31D (Adafruit)
  • DPS310 (Adafruit)
  • LTC4311 I2C Extender / Active Terminator (Adafruit)

Die Verkabelung ist so erfolgt, dass ich die qwiic Kabel mit Stecker benutzt habe. Bzw. eins durchgeschnitten, an das eine Ende den ESP angelötet, am anderen Ende den SPS.

Dann ist die SDA und SDL jeweils mit einem 10K an 5V verbunden.

Der Sketch kommt mit Arduino IDE auf dem Controller. Der verbindet zum WiFi, MQTT und fragt dann der Reihe nach die Sensoren ab und verschickt die Daten per MQTT und geht dann für 5min schlafen. So, soweit läuft das alles. Vielleicht mal als Hinweis. Ich habe mich da mühevoll reingearbeitet und natürlich sehr oft aus den Beispielsketchen kopiert. Vermutlich geht das alles besser und sauberer, aber ich weiß es halt nicht besser.

So, wie geschrieben eigentlich gehts. Aber eigentlich und scheiße sind nah beieinander, manchmal bleibt der Sketch hier hängen:

1
  while (sps30_probe() != 0) {
2
    Serial.print("SPS sensor probing failed\n");
3
    delay(500);
4
  }

Das tut er aber für mich nicht nachvollziehbar. Das passiert manchmal nach 1h, manchmal nach 5 Tagen, auch schon mal nach 2 Wochen.... Einmal kurz den Stecker ziehen (ESP) und neu starten behebt das Problem und alles läuft wieder. (Ist natürlich lästig und das eigene Ego will natürlich das es läuft).

Ich habe jetzt sehr viele Foren durchsucht, finde aber weder (ich gehe davon aus das ich falsch suche weil ich es nicht besser weiß) ähnliche Probleme noch eine herangehensweise das Problem zu beheben.

Hat zufällig da draußen jemand eine Idee wo/was man da mal nachgucken oder ausprobieren kann?

Grüße Stefan

Beitrag #7409345 wurde von einem Moderator gelöscht.
#7409357
Lesenswert?

Vielleicht noch eine Idee:

Wenn der i2c bus hängt, dann trenne nacheinander die anderen Bus-Teilnehmer ab, vielleicht fängt sich der SPS30. Wenn du den Störenfried identifiziert hast, dann lass ihn mal weg.

Clock-Stretching ist eine beliebte Fehlerursache. Der SPS30 verwendet das wohl nicht, aber vielleicht andere Bus-Teilnehmer.

Michael

OP #7409364
Lesenswert?

Erstmal schon mal herzlichen Dank an alle die geantwortet haben nach so kurzer Zeit.

@nospam2000 Ich teile gerne weitere Informationen wenn ich weiß welche. Am Clock Speed vom I²C habe ich nichts geändert, werde aber gleich mal gucken wie das geht und dann auf max. 100kHz runter gehen

Müsste das mit dem Clock Streching dann nicht als Problem regelmäßig und nachvollziehbar auftreten ? Denn die Intervalle in denen das passiert würde ich als "willkürlich" beschreiben.

@klara Was würdest Du denn sagen das als Clock-Speed reicht?

#7409402
Lesenswert?

Stefan schrieb:

Ich teile gerne weitere Informationen wenn ich weiß welche.

Ein Bild sagt mehr als tausend Worte :-)

Das würde z.B. zeigen, wie die Komponenten miteinander verbunden sind (in Linie oder Stern), wie lange sind die Kabel, wo sitzen die Pullup Widerstände, etc..

Der ESP32 ist eine 3,3V MCU, du solltest daher alles mit 3,3V betreiben oder ggf. "Levelshifter" verwenden. Eine Pullup-Spannung von 5V passt da nicht dazu.

Die Adafruit DPS310 und SHT31-D Boards unterstützen wohl beide Spannungen, der SDS30 auch, d.h. du solltest den Pullup mit 3,3V verbinden.

Wozu ist der LTC4311 drin? Jedes Bauelement macht die Schaltung komplizierter.

Was würdest Du denn sagen das als Clock-Speed reicht?

So langsam wie nötig, solange man Probleme hat. Du kannst mal bis 20 kHz oder sogar weiter runtergehen.

Michael

#7409404
Lesenswert?

Stefan schrieb:

@klara Was würdest Du denn sagen das als Clock-Speed reicht?

Bei einem D1 Mini konnte ich bis auf 10 kHz heruntergehen. Prinzipiell kannst Du noch tiefere Frequenzen verwenden. Das macht aber wohl der Treiber nicht mit. Der Treiber unterstützt auch Clock-Stretching und dadurch wird wohl eine mindest Frequenz nötig sein. Für den Progammierer war es eben einfacher.

Eine Halbierung der Taktfrequenz verdoppelt die Reichweite. Ich konnte einen PCF8754 über 100 m 4x0,6 Telefonkabel betreiben. Aber frag mich nicht nach der Frequenz. Das ist schon länger her. Es könnte 1 kHz gewesen sein. mfg klaus

OP #7409684
Lesenswert?

Dann werde ich den LTC4311 mal rausnehmen und die Pull-Ups an 3,3V klemmen und den Clock Speed reduzieren :-D Wird allerdings ein paar Tage dauern da ich beruflich gerade unterwegs bin. Und ein Foto kann ich auch nachreichen. Wobei ich sagen muss das es durch das ganze "gebastel" mit den Widerständen eher wie kraut und rüben am ESP aussieht....

#7409693
Lesenswert?

Stefan schrieb:

Das tut er aber für mich nicht nachvollziehbar. Das passiert manchmal nach 1h, manchmal nach 5 Tagen, auch schon mal nach 2 Wochen.... Einmal kurz den Stecker ziehen (ESP) und neu starten behebt das Problem und alles läuft wieder. (Ist natürlich lästig und das eigene Ego will natürlich das es läuft).

Du könntest Die Fehlerbehandlung so umschreiben, dass es ein Reset gibt, wenn z.B. nach 100 Fehlern es immer noch kein Erfolg gibt. So ist es ja nur eine Endlosschleife.

Und schau auch mal nach den Pullup-Widerständen auf den beteiligten Sensor-Modulen (falls Du solche benutzt). Oft bringt jedes Modul seine eigenen Pullups mit.

Also: Schaltplan und Aufbau sowie Software zeigen :-)

#7410030
Lesenswert?

Stefan schrieb:

Hat zufällig da draußen jemand eine Idee wo/was man da mal nachgucken oder ausprobieren kann?

Ohne den Schaltplan und ein Bild vom Aufbau gesehen zu haben rate ich mal: Die Verkabelung ist zu lang und nicht vor Einstreuung von Störungen geschützt. Der I2C Bus ist hochohmig und daher sehr empfindlich auf alle Arten von Leitungsbeeinflussungen.

"Unbedarfte" User sind der Meinung mit I2C könnte man alles machen, so wie es die vielen Maker-Seiten auch vormachen. Dabei reicht z.B. ein einfacher Klacks eines Relais um alles mögliche an Fehlern zu verursachen.

Dann noch die übliche Geschichte mit den Abblock-Kondensatoren, von denen viele Anfänger und Maker-Seiten-Betreiber nichts wissen (wollen).

OP #7411867
Lesenswert?

So, eine erste Rückmeldung.

Nachdem ich im Sketch eingebaut habe, dass der I²C Bus "nur" noch mit 20kHz läuft und nicht mehr mit 100kHz (Standard), ist das Problem nicht mehr aufgetreten.

Lange Kabel habe ich versucht zu vermeiden, wobei ich im zusammen gebauten Zustand auf unter 50cm komme (geschätzt), dass dürften aber eher deutlich weniger sein. Ich bin aber ganz bei Dir, dass ich keine Ahnung habe, wie ich das Ding vor der beeinflußung durch Störungen schützen kann.

Ich bin mir auch relativ sicher, dass man mit I²C nicht alles machen kann, aber es war für meine herangehensweise erst mal das einfachste. Das hat also nicht den anspruch, eine gute Lösung zu sein. Abblockkondensatoren habe ich auch noch nie gehört, weiß aber jetzt zumindest mal, dass es sowas gibt und kann zumindest versuchen mir das anzulesen.

Bei den Makerseiten bin ich auch ganz bei Dir. Ich versuche auch, den kompletten Bauplan, Sketch usw. online zu stellen: https://nothnagel.org/wetterstation/ Mein Anspruch ist jedoch, dass das auch später anstandslos klappt. Daher gibts auch unten einen Punkt "Fails" bei dem man dann zumindest die Change hat auch mal zu lesen, wie sich das alles entwickelt hat.

Fotos und Schaltplan werde ich nachreichen damit das dann hier auch komplett ist.

Ich kann also nur noch herzlich Danke sagen und hoffe, dass es wirklich an der Frequenz vom Bus lag.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren