Schon wieder "Füllstandsanzeige mit Ultraschallsensor"

Hallo Arduino Experten!
Ich wollte mir eine neue Frischwasser Tankanzeige in unseren Camper bauen, und dachte es sei ja ganz einfach mit der Anleitung von der Reichelt Seite.
https://www.reichelt.de/magazin/maker-hub/fuellstandsanzeige-mit-ultraschallsensor-hc-sr04/
Allerdings habe ich ein anderes Display verwendet und einen Wasserdichten Ultraschall-Sensor ( A02YYUW)
Ich hatte zuerst alles kurz auf einem Steckbrett getestet und mir dann bei JLPCB Platinen herstellen lassen.
Soweit so Gut.
Jetzt wo ich alles zusammengebaut habe muss ich feststellen dass mein geänderter Sketch nur ein paar Sekunden funktioniert und dann einfriert.
Leider bin ich ein absoluter Neuling auf dem Arduino Gebiet und würde mich über über eure Hilfe freuen.
Es gab schon Themen über diesen Reichelt Sketch, konnte mich aber dort nicht dranhängen, da diese Themen schon zu alt sind.

hier mein abgeänderter Sketch:

#include <NewPing.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

#define LEVELFULL 55  //Hoehe Wassersaeule wenn voll (=100%) in cm
#define LEVELEMPTY 60 //Abstand Boden zu Sensor in cm
#define VOLUME 250   //Volumen des zu messenden Mediums bei 100% in l
#define i2c_Address 0x3c 
#define OLED_RESET -1  
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 


#define trigPin  2        // Trigger Pin
#define echoPin  3        // Echo Pin
#define MAX_DISTANCE 320  // Begrenzung fuer Ultraschallsensor

float duration;
int lefty, distance, levelact, levelpercent, volumeact;

Adafruit_SH1106G display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

NewPing sonar(trigPin, echoPin, MAX_DISTANCE); // NewPing Setup

void setup() {
  Serial.begin(9600); // nur fuer Debugzwecke
    
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(i2c_Address, true)) { 
       Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Endlosschleife
  }  
}

void loop() {
  delay(50); // Wartezeit zwischen Pings (ca. 20 pings/sec). nicht kleiner als 29ms! 
  
  //Messung mit Mittelung
  int iterations = 5;
  duration = sonar.ping_median(iterations);      //duration = sonar.ping() ohne Mittelung
  distance = int((duration / 2) * 0.0343);       //Abstand in cm

  //Fuellstand berechnen
  levelact = (LEVELEMPTY - distance);

  //Fuellstand in Prozent berechnen
  levelpercent = (levelact * 100 / LEVELFULL);
  
  //Berechnung Volumen
  volumeact = ((VOLUME / 100) * levelpercent);

  display.clearDisplay(); // Clear display buffer

  //Ueberschrift
  display.setTextSize(2);      // Schriftgroesse
  display.setTextColor(SH110X_WHITE); // Textfarbe
  display.setCursor(0, 0);     // obere linke Ecke
  display.print("Fr. Wasser");
  
  //Fuellstand in Prozent
  //display.setTextSize(2);      // Schriftgroesse
  //display.setTextColor(SH110X_WHITE); // Textfarbe
  //display.setCursor(50, 24);   // obere linke Ecke
  //display.print(levelpercent);
  //display.print(" %");
  
  //Fuellstand in Litern
  display.setTextSize(3);
  display.setCursor(33, 28);
  display.print(volumeact);
  Serial.println(volumeact);
  display.print(" l");  
  
  //Balkenanzeige
  levelpercent = constrain(levelpercent, 0, 100);  //um nur Werte zwischen 0 und 100 zu erhalten
  lefty = map(levelpercent, 0, 100, 63, 16);       //Hoehe des Balkens ermitteln
  
  //aeusserer Rahmen zeichnen
  display.drawRect(0, 16, 28, 48,SH110X_WHITE);  
 
  //Balken zeichnen
  display.fillRect(0, lefty, 28, 48, SH110X_WHITE);

  //display anzeigen
  display.display();
}

Der Steckbrett-Aufbau hat länger funktioniert?

Flackert das Display nicht eklig, wenn du 20 mal je Sekunde einen kompletten display-Aufbau machst? Oder wird das durch display.display(); glatt gebügelt?

Um Füllstandsschwankungen durch Fahrzeugbewegungen und Wasserschwappen auszumitteln, muss alles deutlich langsamer als 5 * 50 ms sein.

Aber was "einfriert" weiß ich nicht. Daher die Frage nach dem vorigen Test-Aufbau. Was hast du denn am Sketch geändert?

Wie weit sind den Controller und Display auseinander?
Ich tippe mal drauf, das der I2C blockiert.
Wobei dann die Frage ist, ob der Controller nichts mehr macht, oder nur der Display nichts mehr ausgibt.

hier der Originale Sketch

#include <NewPing.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

#define LEVELFULL 55  //Hoehe Wassersaeule wenn voll (=100%) in cm
#define LEVELEMPTY 60 //Abstand Boden zu Sensor in cm
#define VOLUME 250   //Volumen des zu messenden Mediums bei 100% in l
#define i2c_Address 0x3c 
#define OLED_RESET -1  
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 


#define trigPin  2        // Trigger Pin
#define echoPin  3        // Echo Pin
#define MAX_DISTANCE 320  // Begrenzung fuer Ultraschallsensor

float duration;
int lefty, distance, levelact, levelpercent, volumeact;

Adafruit_SH1106G display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

NewPing sonar(trigPin, echoPin, MAX_DISTANCE); // NewPing Setup

void setup() {
  Serial.begin(9600); // nur fuer Debugzwecke
    
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(i2c_Address, true)) { 
       Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Endlosschleife
  }  
}

void loop() {
  delay(50); // Wartezeit zwischen Pings (ca. 20 pings/sec). nicht kleiner als 29ms! 
  
  //Messung mit Mittelung
  int iterations = 5;
  duration = sonar.ping_median(iterations);      //duration = sonar.ping() ohne Mittelung
  distance = int((duration / 2) * 0.0343);       //Abstand in cm

  //Fuellstand berechnen
  levelact = (LEVELEMPTY - distance);

  //Fuellstand in Prozent berechnen
  levelpercent = (levelact * 100 / LEVELFULL);
  
  //Berechnung Volumen
  volumeact = ((VOLUME / 100) * levelpercent);

  display.clearDisplay(); // Clear display buffer

  //Ueberschrift
  display.setTextSize(2);      // Schriftgroesse
  display.setTextColor(SH110X_WHITE); // Textfarbe
  display.setCursor(0, 0);     // obere linke Ecke
  display.print("Fr. Wasser");
  
  //Fuellstand in Prozent
  //display.setTextSize(2);      // Schriftgroesse
  //display.setTextColor(SH110X_WHITE); // Textfarbe
  //display.setCursor(50, 24);   // obere linke Ecke
  //display.print(levelpercent);
  //display.print(" %");
  
  //Fuellstand in Litern
  display.setTextSize(3);
  display.setCursor(33, 28);
  display.print(volumeact);
  Serial.println(volumeact);
  display.print(" l");  
  
  //Balkenanzeige
  levelpercent = constrain(levelpercent, 0, 100);  //um nur Werte zwischen 0 und 100 zu erhalten
  lefty = map(levelpercent, 0, 100, 63, 16);       //Hoehe des Balkens ermitteln
  
  //aeusserer Rahmen zeichnen
  display.drawRect(0, 16, 28, 48,SH110X_WHITE);  
 
  //Balken zeichnen
  display.fillRect(0, lefty, 28, 48, SH110X_WHITE);

  //display anzeigen
  display.display();
}

Im Seriellen Monitor tut sich auch nichts mehr!
Ich wollte die "Steuerung" auf den Tank bauen, und das Display wollte ich mit einem Netzwerkkabel verbinden. Habe dazu RJ45 Stecker auf die Platinen verbaut. im Moment habe ich 50cm LAN-Kabel dazwischen.

Welche PullUp-Widerstände verwendest Du bzw. sind auf dem Display vorhanden. Eventuell in Summe (Parallelschaltung!) auf bis zu 1 kΩ verringern.

Für I2C?
Das wird nix.
I2C ist ein Bus für die interne Verdrahtung in Geräten.
Es gibt Extender etc - aber ich empfehle mal den sensor abzusetzen und controler+Display nah beianander.

Ich dachte Das ist ja "Nur" ein Kabel!
Und da ich ein paar Meter weiter das Display haben möchte sei es dann quasi Plug&Play.
Was benötige ich denn dann für Extender?
Wie gesagt ich bin Newbie. Als Werkzeugmacher ist Elektronik ist nicht ganz so mein Ding!

Ich komm mal mit ner ganz anderen Idee.
Ein ESP hat nen WLAN ggfls. ein Bluetooth on board und das für ganz wenige Euro.
Davon zwei Stück, die können sich unterhalten, schlafen gehen, etc. und Du bis die Kabellei los.

Ansonsten

Die Beschreibung lesen.

Coole Idee! :grinning:
Ich benötige nur leider eine Anleitung für Dummies :thinking:

Alternativ kannst du die Leitung des US-Sensors verlängern. Mit abgeschirmtem Kabel geht das durchaus einige Meter. Bei mir funktioniert es über 4 Meter auch ohne abgeschirmtes Kabel. Den Arduino kannst du dann mit dem Display dort plzieren, wo es Platz hat.

Das hatte ich Ursprünglich auch vor, da der US-Sensor aber ein fertiges Kabel hat, habe ich mich wohl dummerweise dazu entschieden das Display abzukoppeln.
image

Die Idee von [my_xy_projekt] per W-Lan/Blutooth gefällt mir gut, da das Kabel durch den Camper zu legen auch nochmal eine herausforderung mit sich bringt.
Falls mir jemand aufs Pferd helfen kann, bin ich auch gerne bereit etwas per PayPal in die Kaffeekasse zu werfen.

Das kabel kannste in der Mitte zerschneiden, beiderseits lang abisolieren, was 4poliges (Telefonkabel z.B.) ebenfalls so behandeln und dann einmal Schrumpfschlauf über das Gesamtkabel und einmal dünneren Schrumpfschlauch über jede einzelne Ader.
Die Adern verlöten, Schrumpfschlauch drüber.
Wenn alle Adern geschrumpft sind das große drüber - schrumpfen. fertig.

Als Funkvariante mit dem ESP such Dir ein Board mit nem ESP
Ein NodeMCU ist für den Eisntieg sicher nicht falsch.
Allerdings muss ich dann passen, weil selbst nicht in Benutzung - da gibts aber hier noch einige die mitmachen :wink:
[edit: Typo]

Das Problem ist das manche HC wollen nicht mit 3,3V wenigstens meine zwei, sind aber die normale Dinger

Mit WLAN braucht man wohl kein HC mehr, wenn ich den TO richtig verstanden habe. Sonst wäre ein ESP auch eher sinnlos für diese Anwendung.

Gruß Tommy

Kabel zu verlängern ist wohl deutlich einfacher als weitere Controller einzubauen.
Mit Google findet man sicher auch die passenden Buchse/Stecker als Verlängerung.

Habt erst einmal vielen Dank für eure Antworten!
Die Erkenntnis ist dass es so wie ich es gedacht habe, nicht funktioniert, und es per WLAN irgendwie gehen kann.
Es gibt hier ein Video mit einem Temperatur Sensor über WLAN so wie er im Video sagt kann man viele andere Sensoren dort anschließen.

Da werde ich mal gucken ob ich etwas in dieser Richtung herausfinde wie es funktioniert.

Was spricht gegen eine Kabelverlängerung DES SENSORS?
Wo soll das Display (und der Microcontroller) hin?
Wo musst du messen?
Wie lange wird ein Kabel zwischen den beiden Punkten bei ordnungsgemäßer Verkaberlung sein?

Es gibt noch die Möglichkeit mit nRF24 daten Senden und Empfängen schau dir mal das an, ist viel zu lesen aber funktioniert, nur das PRG und die Beschaltung muss angepasst werden.

Grundsätzlich spricht nichts gegen Kabelverlängerung, außer das es vom Wassertank einmal komplett auf die andere Seite zur "Schaltzentrale" des Campers gelegt werden muss.
Da hier noch der HAF (Hausfrauen Akzeptanz Faktor) zum tragen kommt und eine Stelle für das Display in der nähe des Tanks nicht in Frage kommt.

Jetzt wo ich weiß das es auch ohne Kabel geht, wird es dann auch einfacher den Grauwassertank später nachzurüsten.