Uno R3 mit SR04T auf I2C OLED 0,96 Zoll

Hallo liebe Leute,

ich befasse mich aktuell mit der Messung der Entfernung mit einem SR04T (was auch wunderbar klappt) und möchte nun die Daten auf ein 0,96 Zoll I2C OLED Display ausgeben um damit die Wasserspeichermenge abzulesen.

Die Messung ohne Display funktioniert, auch die Ausgabe auf das Display mit einfachem Text ohne SR04T.

Wenn aber beides angeschlossen ist und zusammen Arbeiten soll bleibt das Display schwarz. Irgendwie habe ich wohl murks zusammengeschrieben, so das nichts angezeigt wird.

Es sollte eigentlich in Zeile 1 die gemessene Entfernung mit einem folgendem L und in Zeile 2 die Prozent (nicht berechnet, nur so etwa mit festgelegten Schritten) gefolgt von einem % und dahinter noch eine Batterieanzeige angezeigt werden.

Ich weiß das der Code ziemlich umständlich aussieht aber ich wollte das es erstmal einfach nur funktioniert.

Kann mir eventuell jemand einen Hinweis geben wie ich die Messungen auf dem Display ausgegeben bekomme und ich den Code eventuell besser gestalten könnte?

1000 Dank schon mal im Voraus.

...Sketch anbei...

Code.txt (21.7 KB)

Beim groben drüber schauen ergibt sich:
Die if-Blöcke machen ja eigentlich immer das Gleiche, nur der Wert ist anders. Da bietet es sich an, eine Funktion zu bauen, der nur der Wert übergeben wird. Das macht den Code viel übersichtlicher.

Gruß Tommy

Hi

In ... 152, 166, 180, 194, 208, 222, 236, 250, 264, 278, 292, 306, 320, 334 fehlt ein Komma

Ne, ist mir jetzt zu blöd, bei dem C&P-Mist jedes blöde Komma nachzureichen.

Wie wäre Es, wenn der Sketch zumindest ohne ERROR kompiliert?

MfG

Vielen Dank Tommy für den Hinweis. Wenn es läuft werde ich mich mal ans Kürzen machen.

Danke auch Postmaster für den Kommatipp. Werde ich direkt korrigieren und hoffe das es dann läuft. Ich weiß zwar nicht was du mit Copy&Paste Mist meinst aber das hat sicherlich nichts mit meiner Frage zu tun.

Der Sketch kompiliert bei mir ohne Fehler.

VG

Hi

Dann wäre ich dafür, daß Du DIESEN Sketch hier in Code-Tags zur Anschau einstellst.
Das Ding hier drüber kompiliert bei Dir mit Sicherheit nämlich ebenfalls nicht, da in jedem der Blöcke in der gleichen Zeile ein Komma fehlt.
Diese Blöcke wurden von Dir kopiert (Copy) und eingefügt (Paste), ohne den Fehler bemerkt zu haben - kein Problem, wir sind Alles nur Menschen.
Aber der Sketch kompiliert mit diesen Syntax-Fehlern halt nicht - und DAS wäre schon Mal das Wenigste, was Dein Sketch machen müsste, damit man schauen kann, wo Dein Fehler sitzt.

C&P-Mist hat insofern mit Deiner Frage zu tun, daß es in den Tiefen des WWW (nahezu) unendlich viele Sketche gibt, Die Alle das tollste und geilste überhaupt machen und sogar mit Videos beworben werden - aber unterm Strich mit Mühe und Not auf nur 3 Zylindern vor sich hin dümpeln.
So Zeug wird sehr gerne vom unbedarftem Volk genommen - man will ja diese Funktionalität haben - und nicht zum Laufen gebracht.
Wo Es da krankt, ist dem Anfänger nicht klar - woher auch - damit sich Das ändert, wird Er hier, meist, auf Google hingewiesen :wink:

... aber ich schweife ab ...

Kompiliert Dein Sketch mittlerweile auch so, daß Er Das auch bei mir machen würde?

MfG

Danke Postmaster-ino,

jetzt weiß ich auf was du hinaus wolltest (hoffe es zumindest).

Habe mal den Code soweit gekürzt und geändert, das mir (wie ich hoffte) zumindest auf dem Display etwas ausgegeben wird. Unter 0cm und über 200cm den Fehler und alle anderen Entfernungen als Angabe.

Aber irgendwie mag er nicht.

Wenn ich folgenden Sketch hochlade bekomme ich zumindest keine Fehlermeldung.

#include <Arduino.h>
#include <U8g2lib.h>

#define U8X8_HAVE_HW_I2C
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

int trigger=7; //Trigger-Pin des Ultraschallsensors an Pin7 des Arduino-Boards 
int echo=6; // Echo-Pim des Ultraschallsensors an Pin6 des Arduino-Boards 
long dauer=0; // Das Wort dauer ist jetzt eine Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
long entfernung=0; // Das Wort „entfernung“ ist jetzt die variable, unter der die berechnete Entfernung gespeichert wird. Info: Anstelle von „int“ steht hier vor den beiden Variablen „long“. Das hat den Vorteil, dass eine größere Zahl gespeichert werden kann. Nachteil: Die Variable benötigt mehr Platz im Speicher.

void setup()
{
Serial.begin (9600); //Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.
pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
u8g2.begin();
}
void loop()
{
digitalWrite(trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); //Dauer: 5 Millisekunden
digitalWrite(trigger, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
digitalWrite(trigger, LOW);//Dann wird der „Ton“ abgeschaltet.
dauer = pulseIn(echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
entfernung = (dauer/2) * 0.03432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
if (entfernung >= 200 || entfernung <= 0) //Wenn die gemessene Entfernung über 200cm oder unter 0cm liegt,…
{
u8g2.clearBuffer();
u8g2.setFontMode(1);  // Transparent
u8g2.setFontDirection(0);
u8g2.setFont(u8g2_font_inr21_mf); //...dann soll der Monitor ausgeben „Kein Messwert“, weil Messwerte in diesen Bereichen falsch oder ungenau sind.
u8g2.drawStr(0, 30, "Fehler");
u8g2.setFont(u8g2_font_inr21_mf); //...dann soll der Monitor ausgeben „keine Daten“, weil Messwerte in diesen Bereichen falsch oder ungenau sind.
u8g2.drawStr(0,54, "Data fail");
}
else //  Ansonsten…
{
entfernung = 248 - entfernung; // 248 weil Zisterne 248cm tief ist
entfernung = entfernung * 26,627; //26,627 weil 4500 Liter Zisterneninhalt geteilt durch 169 cm Höhe von Boden bis voll
}
if (entfernung >= 0 && entfernung <= 4500) // 0 Liter bis 4500 Liter
{
u8g2.clearBuffer();
u8g2.setFontMode(1); // Transparent
u8g2.setFontDirection(0);
u8g2.setFont(u8g2_font_inr21_mf);
u8g2.drawStr(0, 30, entfernung); //Es soll der Wert der Entfernung (=Liter) an den Monitor in Zeile 1 ausgegeben werden.
u8g2.drawStr(87, 30, "L"); // hinter der Literzahl soll L als Maßangabe ausgegeben werden
u8g2.drawStr(0, 54, "XXX"); // Es soll der Wert der entsprechenden Liter in Prozent an den Monitor in Zeile 2 ausgegeben werden.
u8g2.drawStr(87, 54, "%"); // Es soll % hinter den entsprechenden Liter an den Monitor in Zeile 2 ausgegeben werden.
u8g2.setFont(u8g2_font_battery19_tn); //Es soll eine Batterieanzeige am Ende von Zeile 2 ausgegeben werden
u8g2.drawStr(120, 54, "2"); //Anzeige der Battriefüllstandsanzeige (Wert von 0 = leer bis 6 = voll)
}
delay(500); //Wartet die entsprechenden Millisekunden für einen neuen Messwert.
}

Ich hoffe nun den Code richtig eingefügt zu haben :slight_smile: .

Schon jetzt vielen Dank für die Hilfe .

VG
Dave

Hallo Dave,
2 Fragen:

  1. Wenn Du die Messwerte zusätzlich zum Display auch auf dem Seriellen Monitor ausgibst, erhältst Du da Plausible Werte angezeigt?

  2. Wenn Du den Sketch soweit unverändert lässt, den Sensor nur entfernst, und ein "Hallo" nach der initialisierung des Displays darauf ausgibst, erscheint dieses "Hallo" dann auf dem Display?

LG Stefan

Hallo Dave,
Du kannst bei pulseIn(echo, HIGH) noch ein ', 100000' hinzufügen, dann wartet der arduino nicht unendlich auf die Antwort des Sensors, falls dieser (gerade beim testen) zu weit von einem erfassbaren Obijekt entfernt ist.
PulseIn arbeitet blockierend, und unter Umständen wartet der Arduino endlos auf ein gültiges Signal vom Sensor.

Wäre auch noch ne möglichkeit, warum du nix aufs Display bekommst.

LG Stefan