Go Down

Topic: LCD Display (Read 569 times) previous topic - next topic

Gerlitschka

Hallo, hab ein kleines Problem, wollte meine Temperaturen von 3 Sensoren auf dem Display anzeigen. Klappt soweit auch ganz gut, aber er setzt immer wieder den aktuellen zustand hinten dran, und allgemein, alles immer zusammen.

Code: [Select]
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#define ONE_WIRE_BUS 12


OneWire oneWire(ONE_WIRE_BUS);
LiquidCrystal lcd(10, 11, 5, 4, 3, 2);

DallasTemperature sensors(&oneWire);

DeviceAddress Thermometer_1 = { 0x28, 0xC0, 0x8B, 0xDB, 0x02, 0x00, 0x00, 0xE0 };
DeviceAddress Thermometer_2 = { 0x28, 0x51, 0xE0, 0xB6, 0x02, 0x00, 0x00, 0xA };
DeviceAddress Thermometer_3 = { 0x28, 0x27, 0x7B, 0xDB, 0x02, 0x00, 0x00, 0xEA };

void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
  lcd.begin(20, 4);
  sensors.setResolution(Thermometer_1, 10);
  sensors.setResolution(Thermometer_2, 10);
  sensors.setResolution(Thermometer_3, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00)
  {
    Serial.print("Error getting temperature");
    lcd.print("Error getting temperature");
  }
  else
  {
    Serial.print("C: ");
    Serial.print(tempC);
    lcd.print("C: ");
    lcd.print(tempC);
  }
}

void loop(void)
{
  delay(2000);
  Serial.print("Getting temperatures...\n\r");
  sensors.requestTemperatures();
 
  Serial.print("Temp. 1: ");
  lcd.print("Temp. 1: ");
  printTemperature(Thermometer_1);
  Serial.print("\n\r");
 
 
  Serial.print("Temp. 2: ");
  lcd.print("Temp. 2: ");
  printTemperature(Thermometer_2);
  Serial.print("\n\r");
 
 
  Serial.print("Temp. 3: ");
  lcd.print("Temp. 3: ");
  printTemperature(Thermometer_3);
  Serial.print("\n\r\n\r");

}



hätte gerne das die Temperatur in 3 Zeilen je eine Temperatur angezeigt wird und dass dann auch nicht einfach hinten dran gesetzt wird, sondern dauerhaft von vorne erscheint.
Was mach ich falsch, wer kann helfen'?

danke schonmal, Timo


Gerlitschka

Achja, mir fällt gerade noch auf, dass die Zeilen auch in einer falschen Reihenfolge kommen.

Zeile 1
Zeile 3
Zeile 2
Zeile 4

Beispiel:
Zeile 1 = Hal
Zeile 2 = e geht
Zeile 3 = lo wi
Zeile 4= s?

MaFu

#2
Jul 29, 2011, 11:04 pm Last Edit: Jul 29, 2011, 11:06 pm by MaFu Reason: 1
Du musst vor jeder Temperaturausgabe erst den Cursor positionieren.
Die seltsame Reihenfolge der Zeilen kommt häufiger bei vierzeiligen Displays vor. Ist aber mit der Cursorpositionierung kein Problem.

Du kannst den Code auch noch vereinfachen in dem Du die komplette Displayausgabe in eine Funktion packst:
Code: [Select]
...

void ausgabe(char *text)
{
 lcd.print(text);
 Serial.print(text);
}

void printTemperature(uint8_t row, char *num, DeviceAddress deviceAddress)
{
 lcd.setCursor(0, row);
 ausgabe("Temp. ");
 ausgabe(num);
 ausgabe(": ");
 float tempC = sensors.getTempC(deviceAddress);
 if (tempC == -127.00)
 {
   ausgabe("Error getting temperature");
 }
 else
 {
   ausgabe("C: ");
   ausgabe(tempC);
    // Wenn nach der Anzeige einer zweistelligen Temp. eine einstellige Temp. angezeigt wird,
    // würde ein Wert der alten Temp. stehen bleiben. Daher sicherheitshalber noch Leerzeichen anhängen
   ausgabe("  "); 
 }
}

void loop(void)
{
 delay(2000);
 Serial.print("Getting temperatures...\n\r");
 sensors.requestTemperatures();
 
 printTemperature(0, "1", Thermometer_1);
 Serial.print("\n\r");
 
 printTemperature(2, "2", Thermometer_2);
 Serial.print("\n\r");
 
 printTemperature(1, "3", Thermometer_3);
 Serial.print("\n\r\n\r");

}
_______
Manfred

Kickboxer

Hallo Ihr !

Du solltest auf jeden Fall den Delay rausnehmen. Ist schlechter Programmierstil ;-) Für 2 Sekunden macht der Controller sonst beispielsweise garnichts. Nutze Zeitfunktionen falls Du Pausen brauchst oder Zeiten messen möchtest oder Delays benötigst. Dann könnte beispielsweise ein Schalter weiterhin zu Reaktionen führen oder auch eine Zeit weiterhin im Sekundentakt angezeigt werden.
Meiner Meinung nach sollte man die Delay Funktion aus der Programmierwelt streichen und ich wundere mich, warum viele sie noch immer nutzen...
In der professionellen Automation existiert solch ein Befehl garnicht.

Nette Grüße

Jörg
Mein erstes Tutorial für Anfänger:

youtube.com/watch?v=mRwV4UxsSGI

Gurkengraeber

Quote
Du solltest auf jeden Fall den Delay rausnehmen. Ist schlechter Programmierstil ;-)


Yo ! - Programmier-Stil -> Das Wort hab ich seit 1994 nicht mehr gehört !
Aber beim Arduino ist es doch wieder angebracht.

Ich gebe Jörgs Begründung 100 % Recht, aber wie soll ein Programmier-Anfänger Zeit-funktional programmieren können ?

ein Anfänger ist froh wenn:
LED3 an ist
LED3 aus ist
LED3 an ist
LED3 aus ist

Jörg erkennt sofort das Blinken, ein Anfänger nicht.

MfG



Go Up