Pages: [1]   Go Down
Author Topic: LCD Display  (Read 538 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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

Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
...

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");
 
}
« Last Edit: July 29, 2011, 04:06:50 pm by MaFu » Logged

_______
Manfred

Windbergen
Offline Offline
Jr. Member
**
Karma: 0
Posts: 76
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Mein erstes Tutorial für Anfänger:

youtube.com/watch?v=mRwV4UxsSGI

Gurkengraeber
Guest
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Logged

Pages: [1]   Go Up
Jump to: