Pegelstand Brunnen mit MS5541C und Arduino

Guten Morgen miteinander,

ich bin schon recht lange stiller Mitleser in diesem Forum, komme aber gerade gedanklich und auch technisch an meine Grenzen bei einem Projekt und dachte mir, dass es nun ein geeigneter Zeitpunkt wäre sich hier anzumelden.

Zu meinem Vorhaben:

Ich will in einem Brunnen den Pegelstand alle 5 Sekunden abfragen und dies soll mittels einem MS5541C Absolut-Druckmesser geschehen. War die (gedacht) einfachste Variante, da die Bohrung lediglich 150mm im Durchmesser hat und der Brunnen etwa 10 Meter tief ist. Der Wasserstand variiert zwischen 3-7 Metern.
Ich wollte auf Bubbler (Differenzdruckmesser mit Membranpumpe) oder den überteuerten Chinaschrott aus der Bucht (Differenzdruckmesser mit Kapillare zur Erdoberfläche und Messung mittels Stromfluss) verzichten. Der MS5541C schien mir dynamisch genug und liefert neben Druck auch gleich die Temperatur mit.

=> Datenblatt des Sensors

**Zu meinem Problem: **

Der Sensor hat eine SPI-Schnittstelle und wie ich gelesen habe, darf diese maximal einen Meter lang sein. Ich muss aber mindestens 13 Meter überbrücken. Meine Idee war es, den Arduino ebenfalls mit im Brunnen zu versenken.. Die Frage hier: wie komme ich an meine Daten? – Ich wollte den aktuellen Pegelstand etc. auf einem kleinen Display anzeigen lassen und nicht extra noch mit Webserver etc. anfangen. Zudem wäre ein Arduino Nano hier natürlich perfekt, weil die Größe natürlich eine Rolle spielt. Zudem würde ich gerne Zugriff auf den Arduino haben, sofern ich mal etwas an der Funktion verändern wollen würde; dies ist aber weit untergeordnet. Erstmal die Daten von ganz unten nach ganz oben bekommen :slight_smile:

Mein(e) Idee / Hirngespinst:

Ein Arduino Nano mit dem Sensor im wasserdichten Gehäuse mit Epoxy vergossen, direkt im Brunnen versenkt auf etwa 9 Meter Tiefe. Dieser soll die Daten des Sensors auslesen und über ein Cat7 Kabel an einen zweiten Arduino an der Oberfläche senden (vllt. über I2C?!), der die Daten anzeigt und evtl. ein Relais ansteuert.
Quasi ein Arduino als Sender (quasi Daten-Bereitsteller) und ein anderer als Empfänger.

Nun zur alles entscheidenden Frage: geht sowas? – Ich bin blutiger Anfänger was die Programmierung angeht und weiß ehrlich gesagt nicht, nach welchen Schlagworten ich am besten suchen soll. Um Hinweise, Tipps, Unterstützung wäre ich sehr dankbar :slight_smile:

Vielen, vielen Dank schon einmal im Voraus und viele Grüße,

Basti

Nimm' ein Telefonkabel oder RJ45 Kabel, die haben mindestens 4 Adern. 2 davon nimmst du für die Spannungsversorgung vom versenten Nano, die anderen 2 für Serial Data. Serielle Übertragung solltest du aber langsam machen (9600 bauf oder weniger). Wenn du zu viele Störungen bei der Übertragung hast, dann musst du halt auf Differenzsignale und Stromschleife gehen, CAN etc, aber probier's mal einfacher :slight_smile:

Hi

Da hätte ich mehr Bedenken bei I²C (Inter IC-Bus), als bei SPI.
Hatte damals auch überlegt, ob ich I²C nicht über RS485 langstreckenfähig machen will - geht mit 4 RS485 Modulen (2 pro Seite) und meine je einem 4-fach NOR (müsste nachschauen).
Ähnliches bietet aber CAN schon 'am Stück' - mit der Sicherheit, daß die ankommenden Daten auch passen, mit dem Zusatz-Schmankerl, daß ich nicht eine 1:1-Verbindung, sondern einen Multi-Master-Bus betreiben kann.
Wenn Du noch ein CAN-Modul mit eingiest?
RS485 ginge auch, aber bei CAN hast Du direkt Fehlersicherheit ect.pp. mit drin.
Da sind zig Meter kein Problem - müsste durchrechnen, auf wie viele Meter ich hier komme - bisher spuken hier aber nur einige Dutzend Messwerte rum. Da ich nicht nur seriell, sondern auch sternförmig verkabelt habe, habe ich viele Hin-Rückwege, da CAN 'eine Linie' sein muß - denke, 100m Kabelweg kommen wohl zusammen.
An den Enden des Busses müssen die Terminatoren gesetzt werden (Widerstände 120Ω, sind auf den CAN-Modulen aktivierbar) - vergossen kommst Du Da ja nicht mehr dran :wink:

MfG

PS: Wenn die Störungen 'da' sind, ist der Käfer bereits vergossen und so zu Elektronik-Schrott geworden - pack ein CAN-Modul für wenige Euro dran, vor dem Vergießen testen, einharzen und weg damit.

Warum alle 5 sek ablesen ?

Ob du nun I2C oder Seriell verwendest, für beide Techniken brauchst du zusätzliche Hardware.

Ich empfehle da eine RS232, die ist sicher die einfachste Lösung. Ob das für einen Anfänger einfach zu realisieren ist, kann ich nicht sagen. Du brauchst dazu auf jeder Seite einen Serial-RS232-Wandler. Die gibt es schon sehr preiswert und klein.

Was die Kabel betrifft, wurde dir ja schon beschrieben.

Guten Abend zusammen und vielen Dank für die ganzen Rückmeldungen :slight_smile:

Ich hatte auch nochmal ein wenig nachgesehen und bin auf Arduino MasterWriter gestoßen.
Aber auch hier findet die Kommunikation mittels I2C statt. Wobei ich mit I2C eigentlich gute Erfahrungen machen konnte. Habe im Haus etwa 10 Temperatursensoren mittels CAT7 und 1-Wire verteilt und selbst Strecken über 30 Meter sind kein Problem.

Ich werde mich mal über die Vorschläge von euch erkundigen und ein wenig ausprobieren :slight_smile:

Bin halt mit der Programmierung nicht ganz so gut vertraut; aber ich denke, wenn ich jetzt etwas Recherche betreibe, komme ich auf jeden Fall schon weiter :slight_smile:

BASTIBRAND:
Guten Abend zusammen und vielen Dank für die ganzen Rückmeldungen :slight_smile:

Ich hatte auch nochmal ein wenig nachgesehen und bin auf Arduino MasterWriter gestoßen.
Aber auch hier findet die Kommunikation mittels I2C statt. Wobei ich mit I2C eigentlich gute Erfahrungen machen konnte. Habe im Haus etwa 10 Temperatursensoren mittels CAT7 und 1-Wire verteilt und selbst Strecken über 30 Meter sind kein Problem.

Ich werde mich mal über die Vorschläge von euch erkundigen und ein wenig ausprobieren :slight_smile:

Bin halt mit der Programmierung nicht ganz so gut vertraut; aber ich denke, wenn ich jetzt etwas Recherche betreibe, komme ich auf jeden Fall schon weiter :slight_smile:

Du solltest aber OneWire nicht mit I2C verwechseln.
Bei I2C musst du bei der Entfernung unbedingt Bus-Extender einsetzen, da I2C nur für geräteinterne Verbindungen entwickelt wurde.

Guten Abend an alle und vielen Dank für die Rückmeldungen.

War "leider" im Urlaub, sonst hätte ich mich bereits früher zurückgemeldet.
In der Tat habe ich OneWire mit I2C verwechselt. Habe jetzt alle Einzelkomponenten mal durchprobiert.
Werde den Datentransport über RS485 realisieren. Hier habe ich allerdings noch enorme Probleme.
Ich habe MAX485-Platinen die jeweils an die Nanos an RX und TX und Pin 8 für DE/RE angeklemmt; läuft auch soweit. Daten werden gesendet, aber auslesen kann ich sie leider nicht. Die Verkabelung scheint zu stimmen, da für jedes gesendete Paket die LED am Empfänger einmal aufblinkt.

Der Plan sieht aktuell wie folgt aus: Ein Arduino Nano ließt unter Wasser die Werte des MS5541C aus, sendet die zum zweiten Nano an der Oberfläche, wo ein BMP180 und ein Display dranhängt um den Pegel wirklich genau zu messen. Beide Werte sollen also verrechnet werden und auf dem Display ausgegeben.
Wie gesagt: alles im einzelnen klappt. Nur die RS485 tut noch nicht, wie es soll.

Im angehängten Code ist noch der BMP180 als "Test-Sensor" angegeben. Wollte damit einfach die Übertragung testen, wegen der Einfachheit. Aber... löppt nicht. Daher auch noch kein Display-Code.
Gucke mir lediglich über den seriellen Monitor an, was der Nano so aufschnappt.

Ich bedanke mich schonmal im Vorfeld für Hilfe; ich komme hier alleine leider nicht mehr weiter.

Viele Grüße, Basti

Code: Sender

// Include Sensor and libraries:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;


int sensorvalue1 = 0.0; 
int sensorvalue2 = 0.0; 
char input[62]; 
static int sendlength; 

void setup()
{

  Serial.begin(9600);
  if (!bmp.begin()) {
  Serial.println("Could not find a valid BMP085 sensor, check wiring!");
  while (1) {}
  }
  Serial.println(" ready");  

}

void loop()
{
    sprintf("%d,%d", sensorvalue1, sensorvalue2);

    Serial.print("sensorvalue1 is ");
    Serial.println(bmp.readPressure());
    Serial.print("sensorvalue2 is ");
    Serial.println(bmp.readTemperature());

    sendlength = 62; 

    delay(1000); 

    (Serial.write(input, sendlength));
    sendlength = 0; 
    
    }

Code: Empfänger

// Include libraries:
#include <Wire.h>
#include <SPI.h>

int sensorvalue1received;
int sensorvalue2received;
char msg [63]; 

void setup()
{
  Serial.begin(9600);
  Serial.println(" ready");  
  pinMode(8, OUTPUT); // DE/RE RS-485
  }

void loop()
{
  static char sendbuffer[62];
  static int sendlength = 0;

  if (Serial.available() > 0)
  {
    char input = Serial.read();

   if (input != '\r') 
   {
     sendbuffer[sendlength] = input;
     sendlength++;
   }

    if ((input == '\r') || (sendlength == 61)) 
    {
      

    sscanf(msg, "%d, %d", &sensorvalue1received, &sensorvalue2received);
    Serial.print("msg[0] is ");
    Serial.println(msg[0]);
    Serial.print("sensorvalue1 is ");
    Serial.println(sensorvalue1received);
    Serial.print("sensorvalue2 is ");
    Serial.println(sensorvalue2received);
   }
}}

Wenn du die RS485 Module an RX und TX (D0, D1) angeschlossen hast, dann kannst du die Daten auch nicht am seriellen Monitor auslesen, da für den seriellen Monitor sowie zum Flashen auch RX und TX verwendet werden.

Du musst dann für die RS485 SoftwareSerial verwenden.

HotSystems:
Wenn du die RS485 Module an RX und TX (D0, D1) angeschlossen hast, dann kannst du die Daten auch nicht am seriellen Monitor auslesen, da für den seriellen Monitor sowie zum Flashen auch RX und TX verwendet werden.

Du musst dann für die RS485 SoftwareSerial verwenden.

Hey Dieter, danke für die Rückmeldung. Das hatte ich bereits gelesen gehabt und das war mir soweit geläufig.
Ich hatte einen Test gemacht, mit einem Programm um die Übertragung resp. Leitungslänge zu prüfen und da funktionierte es. Es wurde einfach nur ein Paket im PingPong-System hin- und hergespielt. Da konnte ich über den seriellen Monitor sehen, was die Arduinos machen. Lediglich beim Flashen musste ich die RS485 Module abkoppeln, weil das Hochladen sonst scheiterte.

Ich denke, dass ich hier eher von der Programmierung her einen Fehler mache.. Gerade was die Auswertung angeht. Das, was beim Sender rausgeht, sieht über den seriellen Monitor recht vielversprechend aus.

Danke schonmal :slight_smile:

BASTIBRAND:
Hey Dieter, danke für die Rückmeldung. Das hatte ich bereits gelesen gehabt und das war mir soweit geläufig.
Ich hatte einen Test gemacht, mit einem Programm um die Übertragung resp. Leitungslänge zu prüfen und da funktionierte es. Es wurde einfach nur ein Paket im PingPong-System hin- und hergespielt. Da konnte ich über den seriellen Monitor sehen, was die Arduinos machen. Lediglich beim Flashen musste ich die RS485 Module abkoppeln, weil das Hochladen sonst scheiterte.

Ich denke, dass ich hier eher von der Programmierung her einen Fehler mache.. Gerade was die Auswertung angeht. Das, was beim Sender rausgeht, sieht über den seriellen Monitor recht vielversprechend aus.

Danke schonmal :slight_smile:

Auch wenn es im Test jetzt funktioniert, solltest du das ändern.

Nur wenn du die Pins D0 und D1 (RX u. TX) nicht anders nutzt, wird es sicher funktionieren.
Auch der serielle Monitor nutzt diese Pins und stört dabei die Übertragung.

Die UART (serielle Schnittstelle) ist kein Bus, somit darfst du da nur einen Partner anschließen.

Guten Abend,

ich hatte ein bisschen Zeit zum Testen und jetzt laufen ALLE Bestandteile des Projektes.
Also jeder Sensor für sich und jedes Display, wie auch die Kommunikation über ein sehr langes Kabel klappen wunderbar. Das einzige was mir jetzt schlussendlich fehlt ist der Weg, wie ich die Sensordaten über die RS485-Schnittstelle auf den anderen Arduino bekomme um sie dort weiterzuverarbeiten.

Für die RS485 Übertragung bin ich folgendem Tutroial gefolgt: GitHub - RalphBacon/RS485-Serial-Data-Transmission: RS485 Serial Data Transmission on wires

Wie gesagt: wie bekomme ich nun die ausgelesenen Sensordaten (2 Werte) über RS485 auf den anderen Arduino?

Mir fehlt leider das Wissen dafür und jedes Tutorial, was ich finde schlägt gefühlt eine ganz andere Richtung ein; ich benötige hier tatsächlich mal Code-Technisch jemanden, der mir den Weg weist :slight_smile:

Kleiner Appendix: Der MS5541C Sensor am Arduino #1 soll permanent die zwei Werte (Druck, Temp) an #2 übermitteln. Also quasi alle 1-2 Sekunden. Ein Anforderung-Antwort-Szenario benötige ich nicht. Arduino #2 soll diese Werte dann umrechnen und auf nem Display ausgeben. Mehr soll nicht passieren.
Aktuell scheitert es einfach daran, wie ich diese zwei Werte versende und empfange. Leider.

Vielen Dank schon einmal im Voraus :slight_smile:

Hi

Wer kommuniziert über welches lange Kabel?
Deine Ausführungen sind akut noch recht schwammig, um damit auch nur einen Hauch einer Idee nennen zu können.

  • WAS hast Du?
  • WAS fehlt? (ok ok ... die Kommunikation zwischen den Arduinos ...)

Was funktioniert jetzt und wie habe ich mir den aktuellen Ablauf vorzustellen und wie soll sich Dieser von dem gewünschten Ablauf unterscheiden?

MfG

Wenn du nur die 2 Werte laufend senden willst, und es drahtlos sein soll, nimm nrf24lo1 oder ESP8266 per Udp. Beide gibt es in Ausführungen mit externer Antenne, den nrf sogar in einer PA Version für Reichweite hunderte von Metern.

Wenn Kabel, dann rs232 bis 20-30 Meter, darüber rs485. Kannst dir auch das Leben schwerer machen und I2C mit P82B96 Range Expandern machen.

postmaster-ino:
Hi

Wer kommuniziert über welches lange Kabel?
Deine Ausführungen sind akut noch recht schwammig, um damit auch nur einen Hauch einer Idee nennen zu können.

  • WAS hast Du?
  • WAS fehlt? (ok ok ... die Kommunikation zwischen den Arduinos ...)

Was funktioniert jetzt und wie habe ich mir den aktuellen Ablauf vorzustellen und wie soll sich Dieser von dem gewünschten Ablauf unterscheiden?

MfG

Nabend :slight_smile: Ja, stimmt. Meine Ausführungen sind in der Tat etwas schwammig.
Also: ich habe jede einzelne Komponente mal am Arduino dran gehabt um den Code zu testen.
Sowohl den MS5541C als auch den BMP180 und natürlich das LC-Display.

Da ich ja zwangsläufig alles um die RS485 aufbauen muss, dachte ich mir, dass es einfacher ist damit zu starten und erst DANN die Sensoren final in den Code einfließen zu lassen. Aktuell besteht der Aufbau aus zwei Arduino Nanos, verbunden über MAX485 Shields mit etwa 30m Kabel an den im Tutorial genannten Pins (D2-4). Das klappt ja auch soweit. (Tutorial im vorherigen Posting befolgt)

Jetzt kämen eben die Werte des Sensors ins Spiel an Arduino #1 (Sender), die an Arduino #2 (Empfänger) übertragen werden sollen. Und genau hier ist der Knackpunkt: ich weiß nicht wie ich das einbinde...
Arduino #1 soll die zwei Werte Druck und Temperatur auslesen und über RS485 an Arduino #2 schicken, dass ich sie dort eben aufbereite und über das Display ausgebe.

Das Kommando des Sensors um eine Messung zu triggern ist mir bewusst. Aber was muss mit den Werten geschehen, bzw. was muss noch alles passieren, dass die Werte eben verschickt und auf der anderen Seite ausgelesen werden? – Mir fehlt quasi der Weg nach der Messung bis zum Empfang.

Zur Einfachheit mal eine Block-Grafik (wie gesagt: die Verbindung zwischen beiden Einheiten steht; es fehlen die Operationen rund um die Sensorik und das Versenden/Empfangen dieser Daten)