Wasserstandsmessung mit Ultraschallsensor und 0,96 oled display

Hallo!

Ich möchte gerne eine Wasserstandsanzeige mit einem Arduino Pro mini, einem HC-SR04 und einem IIC 1306 0,96 zoll Display bauen.
Leider funktioniert es nicht. Hoffentlich kann mir jemand helfen.
Es soll der Wert bis zum Wasser in Zentimeter angegeben werden. Ich weiß nicht, ob die Messung überhaupt funktioniert. Unten findet Ihr mein Programm :wink:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

int trigger=7; 
int echo=6; 
long dauer=0; 
long entfernung=0; 
void setup()   
{                

// initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
display.begin(SSD1306_SWITCHCAPVCC, 0x3c);

pinMode(trigger, OUTPUT); 
pinMode(echo, INPUT); 
}

#define DRAW_DELAY 118
#define D_NUM 47

int i;
void loop()
{
digitalWrite(trigger, LOW); 
delay(5); 
digitalWrite(trigger, HIGH); 
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH); 
entfernung = (dauer/2) * 0.03432; 
if (entfernung >= 500 || entfernung <= 0) 
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(1,0);
display.println("Kein Messwert"); 
}
else 
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(1,0);
Serial.print(entfernung); 
Serial.println(" cm"); 
}
delay(1000); 
}

sketch_jun16a.ino (1 KB)

Und was genau funktioniert nicht ?
So ist die Angabe etwas dürftig.

Ein anderes Problem wird dein US-Sensor werden, der ist dafür nicht geeignet, da dieser nicht Wasserdicht ist und somit schnell ausfallen wird.
Da solltest du unbedingt einen wasserdichten US-Sensor verwenden.
Z.B. diesen: https://www.ebay.de/itm/173200616483

Und setze den Sketch bitte in Code-Tags, damit dieser von allen Usern, auch den Mobilen gut gelesen werden kann.

die Beispiele die ich heute gesucht habe verwenden MICROSEKUNDEN, nicht millis.

  digitalWrite(trigPin, LOW);   // Clears the trigPin
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);  // Sets the trigPin on HIGH state for 10 micro seconds
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

jedenfalls kann ich mit micros meinen auslesen...

noiasca:
die Beispiele die ich heute gesucht habe verwenden MICROSEKUNDEN, nicht millis.
.....

Bei richtiger Programmierung und wenn sonst kein Fehler vorhanden ist, funktioniert das auch mit millis.

Aber der TO sollte mal beschreiben, welchen Fehler er tatsächlich hat.

Hier schweigt er sich ja beharrlich aus.

Ich kann nicht verstehen, warum fast alle Fragesteller immer das wichtigste verschweigen.

Also zu meinem Fehler:

Mein Display bleibt schwarz bzw zeigt nichts an. Somit weiß ich auch nicht, ob die Messung überhaupt funktioniert.

Hallo,

das ist ja doch eigendlich ziemlich einfach.

  1. Verdrahtung kontrollieren, prüfen ob die Hardware zusammen passt 3,3V 5V usw.
  2. Beispiel-Skatch für das Display verwenden und sehen ob das geht.
  3. an den richtigen Stellen Serial.print einbauen und mit dem Monitor nachsehen ob die Messung klappt.

Heinz

mich344:
Also zu meinem Fehler:

Mein Display bleibt schwarz bzw zeigt nichts an. Somit weiß ich auch nicht, ob die Messung überhaupt funktioniert.

Dann zeige doch mal ein Schaltbild, wie du das aufgebaut hast.
Aus deiner Beschreibung können wir nichts ersehen.

Funktioniert das Display mit dem Beispielsketch der Bibliothek?
Grüße Uwe

Hi

Findest Du das Display überhaupt?
Was sagt ein I²C-Scanner?

Mein Display hat kein Reset-Anschluss, weshalb ich Deinen Aufruf selber so noch nicht hatte.

Link zum Display?

Pack serielle Ausgaben in den Sketch und schaue, ob Dein Programm zumindest so abgearbeitet wird, wie Du Dir Das vorgestellt hast.

MfG

PS: zu langsam ... wurde Alles schon gesagt :confused:

Display funktioniert mit Beispielprogramm.
Die Entferungsmessung funktioniert auch mit dem serial monitor.

Also ist der aktuelle Stand, dass der Wert nicht am Display ausgegeben wird.

Aufbau habe ich wie am foto ersichtlich

Danke schonmal für die schnellen Antworten :slight_smile:

mich344:
Display funktioniert mit Beispielprogramm.
Die Entferungsmessung funktioniert auch mit dem serial monitor.

Also ist der aktuelle Stand, dass der Wert nicht am Display ausgegeben wird.

Aufbau habe ich wie am foto ersichtlich

Danke schonmal für die schnellen Antworten :slight_smile:

dann setze doch. wie schon beschrieben, in die einzelnen Messungen ein "Serial.print" rein, dann kannst du feststellen, wo der Sketch Probleme macht.

Hi

Wenn die Beispiel-Sketche funktionieren und bei diesem Sketch so ziemlich Alles, bis auf das Display - wird an der Ansteuerung/Initialisierung des Display irgend etwas falsch laufen.

MfG

mich344:
Also zu meinem Fehler:

Mein Display bleibt schwarz bzw zeigt nichts an. Somit weiß ich auch nicht, ob die Messung überhaupt funktioniert.

Du gibts ja bei Entfernungen zwischen 0 und 500 cm auch nichts auf das Display aus, sondern nur über den seriellen Monitor.
Was zeigt der denn an?

Ja, man sollte schon den kompletten Sketch richtig durchlesen.

Ich jedenfalls hab es überlesen.

Hier :

{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(1,0);
Serial.print(entfernung); 
Serial.println(" cm"); 
}

Hast du ja schon den "Serial.print" drin. Da landet dann nichts auf dem Display.

Bitte mal überprüfen !

Ok, da habe ich es vergessen von serial zu display umzuschreiben.

{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(1,0);
display.println("Kein Messwert");
}

Aber bei "Kein Messwert" habe ich display.printin und es zeigt auch nichts an.

Sorry falls ich nicht gleich verstehe was ihr meint. Bin noch recht neu auf dem Gebiet.

Ok....da ist dann der nächste Fehler.
Dein Display kennt "println" nicht, da sollte nur print stehen.

Warum lässt du nicht die Ausgabe auf Diplay UND seriell?

Ich habe jetzt das Programm von hier: Ein 0,96 Zoll OLED Display I²C mit 128×64 Pixel und ein Arduino | simtronyx – Das Elektronik Blog mit meinem Messprogramm kombiniert und jetzt funktioniert es. Ich muss nurnoch den Text anpassen.
Danke für eure Hilfe :slight_smile:

Mein derzeitiger Sketch mit dem es auf dem Display und im serial Monitor ausgegeben wird:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

int trigger=7; 
int echo=6; 
long dauer=0; 
long entfernung=0; 
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3c);  
Serial.begin (9600); 
pinMode(trigger, OUTPUT); 
pinMode(echo, INPUT); 

// initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
display.begin(SSD1306_SWITCHCAPVCC, 0x3c);

// random start seed / zufälligen Startwert für Random-Funtionen initialisieren
randomSeed(analogRead(0));

}

#define DRAW_DELAY 118
#define D_NUM 47

int i;

void loop()
{

display.clearDisplay();

// set text color / Textfarbe setzen
display.setTextColor(WHITE);
// set text size / Textgroesse setzen
display.setTextSize(1);
// set text cursor position / Textstartposition einstellen
display.setCursor(1,0);
// show text / Text anzeigen
display.println("OLED - Display - Test");
display.setCursor(14,56);
display.println("blog.simtronyx.de");
display.setTextSize(2);
display.setCursor(1,8);
display.println(entfernung);
display.setCursor(30,34);
display.println("World!");
display.display();

display.clearDisplay();

digitalWrite(trigger, LOW); 
delay(5); 
digitalWrite(trigger, HIGH); 
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH); 
entfernung = (dauer/2) * 0.03432; 
if (entfernung >= 500 || entfernung <= 0) 
{
Serial.println("Kein Messwert"); 
}
else 
{
Serial.print(entfernung); 
Serial.println(" cm"); 
}
delay(1000); 
}

Und es fehlen noch die Code-Tags, damit alle es richtig lesen können.

Aber gut, dass es jetzt funktioniert. Glückwunsch. :slight_smile:

Und wenn du beide Sketch vergleichst, kannst du auch erkennen und lernen, was du falsch gemacht hast.
Es fehlte am Ende der Display-Ausgabe die Zeile:
"display.display()", damit wird die Information erst angezeigt.

Eine Frage habe ich jetzt noch: Wie macht man diese Code Tags? :smiley:

Ja, aber aus Fehlern lernt man :wink: