Go Down

Topic: LCD unbemerkt aktualisieren (Read 1 time) previous topic - next topic

strohhirn

Hallo,

vielleicht kennt einer mein mein Problem:

Das LCD soll mir werte von Sensoren ausgeben. Nun steigt der Wert mal und mal sinkt er. Wenn er steigt kommen stellen dazu und der wert sinkt den bleiben die neuen stellen da und verschwinden nicht.
z.B. Wert = 50, Wert steigt auf 113 , den sinkt er auf 60 und es steht 603, weil ja die zugefügte stelle nicht entfernt wird.

Wenn ich jetzt jede sekunde lcd.clear() mache den flakert mein LCD die ganze zeit. Kann ich das nicht irgendwie verhindern?
Oder gibt es irgend eine möglichkeit diese Stellen automatisch entfernen zu lassen?

Mfg

strohhirn
Gruß

strohhirn

Marcus W

Ich hab das immer so gemacht, dass ich mir beide Zeilen des LCDs in ein Char-Array geschrieben habe, und die jeweiligen positionen mit werten bzw leerstellen gefüllt habe.

uwefed

Einfach, wenn weniger Stellen sind, Leerzeichen vorher ausgeben.
Angenommen Du hast Zahlen bis 999:

Code: [Select]
if (val <100) LCD.print(" ");
if (val <10) LCD.print(" ");
LCD.print(val,DEC);


Grüße Uwe


jurs

#3
Mar 16, 2013, 12:52 pm Last Edit: Mar 16, 2013, 01:00 pm by jurs Reason: 1

Wenn ich jetzt jede sekunde lcd.clear() mache den flakert mein LCD die ganze zeit. Kann ich das nicht irgendwie verhindern?
Oder gibt es irgend eine möglichkeit diese Stellen automatisch entfernen zu lassen?


Einfach immer an derselben Position des Displays immer dieselbe Stellenanzahl ausgeben, also bei kürzeren Messwerten mit Leerzeichen auffüllen.

Hier mal ein bischen Testcode, der flackerfrei an sechs Stellen auf dem Display im Viertelsekundenabstand einen (zufälligen) "Messwert" aktualisiert und rechtsbündig anzeigt.

Code: [Select]

void messwertAnzeigen(int spalte, int zeile, int wert, int stellen)
{
 char buf[7];
 lcd.setCursor(spalte,zeile);
 itoa (wert,buf,10);
 for (int i=0;i<stellen-strlen(buf);i++)
   lcd.print(" ");
 lcd.print(wert);  
}

void loop() {
 // put your main code here, to run repeatedly:
 int zeile,spalte,messwert;
 zeile=random(2);
 spalte=random(3)*5;
 messwert=random(0,10000);
 messwertAnzeigen(spalte,zeile,messwert,5);
 delay(250);
}


Das Löschen des kompletten LCD-Displays vor dem Anzeigen eines einzelnen Messwertes ist ja insbesondere auch dann nicht ratsam, wenn im Programm auf demselben Display mehrere Messwerte angezeigt werden sollen, die zu unterschiedlichen Zeitpunkten aktualisiert werden.

spaceball

#4
Mar 16, 2013, 02:50 pm Last Edit: Mar 16, 2013, 02:52 pm by spaceball Reason: 1
Hallo,
meine Lösung schaut so aus:
Code: [Select]
void Leerstellen ( long Wert, int i, boolean Null)
{
 long k = 10;
 for (int j = 1; j<i;j++)
 {
   if (Wert<k)
   { if ( Null == 0 )
     { lcd.print(" "); }
     else
     { lcd.print("0"); }
   }
   k*=10;
 }
 lcd.print(Wert);
}

Wert: zu schreibender Wert
i:       Anzahl der Stellen, in die die Zahl rechtsbündig geschrieben wird
Null:  Vor die Zahl werden entweder Nullen oder Leerstellen geschrieben

Gruß
Reinhard

PS.: damit ist clear nicht nötig und es fällt nicht auf, wenn drüber geschrieben wird

strohhirn

Danke für die Antworten,
doch ich bin mal wieder wie immer etwas dämlich und versteh die sketchteile nicht und kriege sie nicht in meinen sketch eingefügt.

Könnte bitte jemand einen der sketche auf mein Beispiel übertragen sodass ich vllt das ganze besser verstehe.

Hier mein Beispiel:
Code: [Select]
#include <LiquidCrystal.h>

int backLight = 29;
LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);

int ledPin = 12;// LED connected to digital pin 12
float fade;
int poti = 10;
void setup()  {
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);

int myEraser = 7;             // this is 111 in binary and is used as an eraser
TCCR1B &= ~myEraser;   // this operation (AND plus NOT),  set the three bits in TCCR2B to 0

int myPrescaler = 2;         // this could be a number in [1 , 6]. In this case, 3 corresponds in binary to 011.   
TCCR1B |= myPrescaler;  //this operation (OR), replaces the last three bits in TCCR2B with our new value 011

}

void loop()  {
 
fade = analogRead (poti);
fade = map(fade, 0 , 1023, 0, 255);

  analogWrite(ledPin, fade);
  lcd.setCursor(0, 0);
    lcd.print(fade);
 
}


Bei diesem sketch wird ein poti benutzt um per PWM eine LED zu steuern. Dabei wird der PWM wert auf dem LCD augegeben, wenn ich denn poti voll aufdrehe und denn wieder zurück, so bleibt die hunderter und zehner stelle stehe. Das möchte ich beispielsweise beheben. Doch ich verstehe leider eure sketchteile nicht.
Deswegen wäre es schön wenn jemand so nett wär einen der sketche auf meinen zu übertragen, damit ich einen ansatz habe.

Mfg

strohhirn
Gruß

strohhirn

jurs


Könnte bitte jemand einen der sketche auf mein Beispiel übertragen sodass ich vllt das ganze besser verstehe.


Wenn Du meine Funktion "messwertAnzeigen" zusätzlich in Deinen Sketch reinkopierst, dann würdest Du außerdem diese zwei Zeilen:
Code: [Select]

  lcd.setCursor(0, 0);
  lcd.print(fade);

ersetzen durch diese Zeile:
Code: [Select]

messwertAnzeigen(0,0,fade,4);


strohhirn

Ahhh ok, Danke. Jetzt klappts und ich hab es etwas besser verstanden.
Geht das ganze auch Linksbündig?

Und was ist das für ein befehl den du hier verwendest:
Code: [Select]
itoa (wert,buf,10);

Was bewirkt dieses itoa und was ist buf?
Gruß

strohhirn

jurs


Geht das ganze auch Linksbündig?


Ja natürlich: Da brauchst Du in der Anzeigefunktion nur die Reihenfolge vertauschen und erst
lcd.print(wert); 
und danach die for-Schleife mit Ausgabe der Leerzeichen ausführen. Dann ist die Ausgabe linksbündig und die Leerzeichen erscheinen rechts vom ausgegebenen Zahlenwert.


Und was ist das für ein befehl den du hier verwendest:
Code: [Select]
itoa (wert,buf,10);

Was bewirkt dieses itoa


http://www.cplusplus.com/reference/cstdlib/itoa/


und was ist buf?


So wie es deklariert ist ein C-String:
char buf[7];

Ich sehe übrigens gerade eine Unsauberkeit in meinem Code, statt der Zeile:
lcd.print(Wert);
setzt Du vielleicht besser:
lcd.print(buf);
(obwohl beides funktioniert)

strohhirn

Vielen Dank. Klappt wunderbar, wie ich es wollte. :)
Gruß

strohhirn

Go Up