Hallo zusammen,
ich lasse mir vom Arduino Uno eine Entfernung über einen Ultraschall Sensor messen und im seriellen Monitor ausgeben.
Jetzt habe ich mir ein LCD Display mit I2C gekauft um mir den Wert darüber in Prozent ausgeben zu lassen.
Soweit funktioniert auch alles.
Ich habe nur ein Problem. Wenn der Wert 100angezeigt wird und danach runter geht, dann setzt er als Platzhalter immer eine Null hinter den Messwert.
Somit habe ich dann nicht 48% sondern 480%.
Beiliegend der Code:
// Plus des Ultraschall Boards wird an Vin und GND an GND angeschlossen
#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x27, 16, 2); //Hier wird festgelegt um was für einen Display es sich handelt. In diesem Fall eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x27. Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)"
int trigger=2; //Trigger wird an D8 angeschlossen 15
int echo=4; //Echo wird an D7 angeschlossen 13
long dauer=0;
long entfernung=0;
long tankinhalt=0;
int LED=14;
void setup() {
Serial.begin(9600);
pinMode(trigger, OUTPUT); //Pin für Trigger Output
pinMode(echo, INPUT); //Pin für Echo Input
pinMode(LED, OUTPUT);
lcd.init(); //Im Setup wird der LCD gestartet
lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus).
}
void loop() {
digitalWrite(trigger, LOW); //Trigger wird Low geschaltet
delay(5);
digitalWrite(trigger, HIGH); //Trigger wird High geschaltet
delay(10);
digitalWrite(trigger, LOW); //Trigger wird Low geschaltet
dauer = pulseIn(echo, HIGH); //Echo wird abgefragt
entfernung = (dauer/2) * 0.03432; //Umrechnung auf cm
tankinhalt= map(entfernung, 20, 160, 100, 0); //Umrechnung von cm auf Prozent 20=20cm untergrenze, 160=160cm Obergrenze, 100=100% bei 20cm mindestabstand, 0=0% bei max Abstand von Tank Obergrenze zum Boden
//if (tankinhalt<=20) //Led steuerung wenn der Tankinhalt unter 20% fällt geht die rote Led an
// {digitalWrite(LED,HIGH);
// }
// else //Wenn der Tankinhalt größer als 20% ist geht die rote Led aus
// {
// digitalWrite(LED,LOW);
// }
Serial.println(tankinhalt); //Der umgerechnete Wert wird im seriellen Monitor ausgegeben
// Serial.println("%"); // Prozent wird im seriellen Monitor ausgegeben
delay(1000);
lcd.setCursor(0, 0);//Hier wird die Position des ersten Zeichens festgelegt. In diesem Fall bedeutet (0,0) das erste Zeichen in der ersten Zeile.
lcd.print("Tankinhalt");
lcd.setCursor(0, 1);// In diesem Fall bedeutet (0,1) das erste Zeichen in der zweiten Zeile.
lcd.print(tankinhalt);
//lcd.setCursor(3, 1);
//lcd.print("%");
Nein, er setzt da nichts. Die Null hast Du vorher dahingeschrieben.
Wenn kleiner als 100 musst Du die letzte Stelle löschen (mit einem Leerzeichen/Space).
Wenn kleiner als 10 die letzten beiden Stellen löschen .
EDIT: Oder vor jedem Schreibvorgang das ganze LCD mit clear löschen.
Finde ich persönlich nicht schön und ändere nur die Stellen auf dem Display, die sich ändern.
// Plus des Ultraschall Boards wird an Vin und GND an GND angeschlossen
#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x27, 16, 2); //Hier wird festgelegt um was für einen Display es sich handelt. In diesem Fall eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x27. Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)"
int trigger = 2; //Trigger wird an D8 angeschlossen 15
int echo = 4; //Echo wird an D7 angeschlossen 13
long dauer = 0;
long entfernung = 0;
long tankinhalt = 0;
int LED = 14;
void setup() {
Serial.begin(9600);
pinMode(trigger, OUTPUT); //Pin für Trigger Output
pinMode(echo, INPUT); //Pin für Echo Input
pinMode(LED, OUTPUT);
lcd.init(); //Im Setup wird der LCD gestartet
lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus).
}
void loop() {
digitalWrite(trigger, LOW); //Trigger wird Low geschaltet
delay(5);
digitalWrite(trigger, HIGH); //Trigger wird High geschaltet
delay(10);
digitalWrite(trigger, LOW); //Trigger wird Low geschaltet
dauer = pulseIn(echo, HIGH); //Echo wird abgefragt
entfernung = (dauer / 2) * 0.03432; //Umrechnung auf cm
tankinhalt = map(entfernung, 20, 160, 100, 0); //Umrechnung von cm auf Prozent 20=20cm untergrenze, 160=160cm Obergrenze, 100=100% bei 20cm mindestabstand, 0=0% bei max Abstand von Tank Obergrenze zum Boden
//if (tankinhalt<=20) //Led steuerung wenn der Tankinhalt unter 20% fällt geht die rote Led an
// {digitalWrite(LED,HIGH);
// }
// else //Wenn der Tankinhalt größer als 20% ist geht die rote Led aus
// {
// digitalWrite(LED,LOW);
// }
Serial.println(tankinhalt); //Der umgerechnete Wert wird im seriellen Monitor ausgegeben
// Serial.println("%"); // Prozent wird im seriellen Monitor ausgegeben
delay(1000);
lcd.setCursor(0, 0);//Hier wird die Position des ersten Zeichens festgelegt. In diesem Fall bedeutet (0,0) das erste Zeichen in der ersten Zeile.
lcd.print("Tankinhalt");
lcd.setCursor(0, 1);// In diesem Fall bedeutet (0,1) das erste Zeichen in der zweiten Zeile.
if (tankinhalt < 100) {
lcd.print(" ");
}
if (tankinhalt < 10 ) {
lcd.print(" ");
}
lcd.print(tankinhalt);
//lcd.setCursor(3, 1);
lcd.print("%");
}
Es geht auch schöner, für Anfang reicht das.
Du kannst mit lcd.setCursor( x, x ) das aufhübschen
x, x Deine Werte eintragen
@fony
Vielen Dank.
So funktioniert es wie ich es haben wollte.
Eine Frage hätte ich interessehalber noch.
Du hast ja in den Code die if-Bedingung eingefügt.
if (tankinhalt < 100) {
lcd.print(" ");
}
if (tankinhalt < 10 ) {
lcd.print(" ");
}
Dort steht wenn der Wert "tankinhalt" unter 100 ist, dann soll er "lcd.print " ausführen.
In den Klammern steht aber kein Wert.
So etwas habe ich schon öfter gesehen und mich gefragt welchen Wert er dort reinschreibt.
Ich hatte es mal auf Liter eingestellt, allerdings hatte meine Frau etwas dagegen weil sie nicht abschätzen kann wie lange die angezeigten Liter dann noch halten.
da steht ein Wert - ein LEERZEICHEN - (ein Blank). Genaugenommen sind es in der Variante von fony sogar zwei Byte. Ein Leerzeichen und der Nullterminator.
will nur sagen diese sind empfindlich gegen Feuchtigkeit, der Lautsprecher (Sender) und Mikrofon (Empfänger) waren bei mir nach nicht mall einem Jahr defekt, das Gitter total verrostet, und innen alles oxidiert.
Für dauerhafte nutzung am einem Tank würde Wasserdichte nutzen - Beispiel
Die Kapsel ist Sender und Empfänger zu gleich, wird Angesteuert so wie Du das machst. Nachteil die Weite ist kleiner == keine 4Meter und der minimaler Abstand ist ab 10cm
Wenn ich berichtigen darf.
Der kleinste Abstand wird mit 20 cm angegebenen, der max. Abstand ist leider von Händler zu Händler (250 cm bis 500 cm) sehr unterschiedlich. Die 20 cm stimmen aber, das ist in meinem Projekt (Tankfüllstand) exact die min. Entfernung um genaue Angaben zu erhalten.
Das mag stimmen, mit den 500cm, habe nur das geschrieben was ich "damals" und bezahlbares gefunden habe, ist aber im dem Fall, so wie meinen, egal TO 160cm ich 140 max
Habe dass Problem das der Sendekegel wird zum Flachenhals, es bleiben bei mir noch 80l übrig, was aber auch gut ist, wen 10% angezeigt wird, wird meine Frau sparsamer mit Gießen und bei 0 kann ich noch 8 Gießkannen zaubern