Problem mit Schreiben auf das Display

Hallo,
Ich bin neu in der Arduino welt, hab mir schon ein bisschen was angeeignet mit büchern und so, aber komm nicht wirklich weiter jetzt, also:

Hab das Problem dass ich nen error bekomme bein Schreiben einer Temperatur auf das 3,2 LCD display
Hier der Sketch

#include <UTFT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress motorThermometer = { 0x28, 0x15, 0x52, 0xDD, 0x03, 0x00, 0x00, 0xC0 };
DeviceAddress aussenThermometer = { 0x28, 0x93, 0x24, 0xDD, 0x03, 0x00, 0x00, 0x69 };
DeviceAddress oeltempThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };

// Declare which fonts we will be using
extern uint8_t SmallFont[];

UTFT myGLCD(ITDB32S,38,39,40,41);   




void setup(void)
{
  randomSeed(analogRead(0));
  
// Setup the LCD
  myGLCD.InitLCD(LANDSCAPE);
  myGLCD.setFont(SmallFont);
  myGLCD.clrScr();



{
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(motorThermometer, 10);
  sensors.setResolution(aussenThermometer, 10);
  sensors.setResolution(oeltempThermometer, 10);
  }

}

void printTemperature(DeviceAddress deviceAddress)

{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop()
{
  //int buf[318];
  //int x, x2;
  //int y, y2;
  //int r;

// Clear the screen and draw the frame
  //myGLCD.clrScr();

  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRect(0, 0, 319, 13);
  myGLCD.setColor(64, 64, 64);
  myGLCD.fillRect(0, 226, 319, 239);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(255, 0, 0);
  myGLCD.print("* Blonders Arduino *", CENTER, 1);
  myGLCD.setBackColor(64, 64, 64);
  myGLCD.setColor(255,255,0);
  myGLCD.print("Projekt V 0.1 Fuehler Anzeiger", CENTER, 227);

  myGLCD.setColor(0, 0, 255);
  myGLCD.drawRect(0, 14, 319, 225);

// Draw crosshairs
  myGLCD.setColor(0, 0, 255);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.drawLine(159, 15, 159, 224);
  myGLCD.drawLine(1, 119, 318, 119);
  for (int i=9; i<310; i+=10)
    myGLCD.drawLine(i, 117, i, 121);
  for (int i=19; i<220; i+=10)
    myGLCD.drawLine(157, i, 161, i);


  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(255, 0, 0);
  //myGLCD.print("That's it!", CENTER, 93);
  //myGLCD.print("Restarting in a", CENTER, 119);
  //myGLCD.print("few seconds...", CENTER, 132);
  
  myGLCD.setColor(0, 255, 0);
  myGLCD.setBackColor(0, 0, 255);
  myGLCD.print("Runtime: (msecs)", CENTER, 210);
  myGLCD.printNumI(millis(), CENTER, 225);
  

  myGLCD.setColor(0,255,255);
  //myGLCD.print("Hallo", CENTER, 93);
  //myGLCD.print("Nicole", CENTER, 119);
  
  //test
  printTemperature(motorThermometer);
  myGLCD.print(motorThermometer 0, 0);
   
  
  
  
  {
   delay(2000);
   Serial.print("Getting temperatures...\n\r");
   sensors.requestTemperatures();
 
   Serial.print("Motor Temperatur ist: ");
   printTemperature(motorThermometer);
   Serial.print("\n\r");
   Serial.print("Aussen Temperatur ist: ");
   printTemperature(aussenThermometer);
   Serial.print("\n\r");
   Serial.print("Oelt Temperatur is: ");
   printTemperature(oeltempThermometer);
   Serial.print("\n\r\n\r");
 }
  
  
  delay (0);
}

Fehlermeldung:

F_hler_V0_1.ino: In function 'void loop()':
F_hler_V0_1:114: error: expected `)' before numeric constant
F_hler_V0_1:114: error: no matching function for call to 'UTFT::print(uint8_t [8], int)'
C:\Users\Blonder\Desktop\programme\Arduino\Arduino 1.0.5\libraries\UTFT/UTFT.h:140: note: candidates are: void UTFT::print(char*, int, int, int)
C:\Users\Blonder\Desktop\programme\Arduino\Arduino 1.0.5\libraries\UTFT/UTFT.h:141: note:                 void UTFT::print(String, int, int, int)

Normal Schreiben kann ich auf das Display, nur die ausgelesenen Temperaturen nicht :frowning:

Benützt wird ein: Mega 2560, Sainsmart 3,2 TFT Touch, mit 3 Dallas DS1820 Fühler

Bitte um hilfe

Was mir so spontan auffällt, dass in der Zeile:

  myGLCD.print(motorThermometer 0, 0);

ein Komma fehlt nach motorThermometer.

Noch ein Tip:
in den Fehlermeldungen ist auch immer die Zeilenummer angegeben, in der der Compiler den Fehler gefunden hat.
z.B. F_hler_V0_1:114: error: expected `)' before numeric constant bedeutet:
im File F_hler_V0_1 ist in der Zeile 114 der Fehler. (Die Zeile in der der Cursor steht, wird dir in der Arduino-IDE unten links angezeigt:

Zwischenablage01.jpg

Danke für die info, habs nachgetragen, aber dann kommt noch immer leider die fehlermeldung:

F_hler_V0_1.ino: In function 'void loop()':
F_hler_V0_1:114: error: invalid conversion from 'uint8_t*' to 'const char*'
F_hler_V0_1:114: error: initializing argument 1 of 'String::String(const char*)'

Ich kenne nun diese Bibliothek nicht, aber ich denke der Befehl

myGLCD.print erwartet als erstes Argument einen String oder Charakter.

du übergibst ihn aber einen array, das du oben definiert hast.

DeviceAddress motorThermometer = { 0x28, 0x15, 0x52, 0xDD, 0x03, 0x00, 0x00, 0xC0 };

möchtest du denn den Inhalt des Arrays ausdrucken? dann muß das anders definiert werden.
Oder den Text "motorThermometer"? Dann fehlen die Anführungszeichen.

Die ARRAY was ma da sieht ist eigentlich die Adresse von Temperaturfühler, da hab ich nur gefixt dass der fühler der Motorfühler ist,
Ich kann die Temperatur Problemlos am Serial Port ausgeben:
Habe es so probiert wie wenn ich es an Serial port schicke -.-

So ganz verstehe ich es noch nicht:

Was genau möchtest du mit der Zeile myGLCD.print(motorThermometer, 0, 0); machen?

Was soll nachher auf dem Display stehen?

naja auf den display soll dann die temperatur in DEC stehen was ausgelesen wurde auf display position 0, 0 also in der ecke

so funktionierts bein serial port:

void printTemperature(DeviceAddress deviceAddress)

{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

ich weis leider nichtmal in was der Temperaturwert gespeichert wird, obs ne int od double is od so weis ich leider nicht -.-

Blonder:
naja auf den display soll dann die temperatur in DEC stehen was ausgelesen wurde auf display position 0, 0 also in der ecke

so funktionierts bein serial port:

void printTemperature(DeviceAddress deviceAddress)

{
 float tempC = sensors.getTempC(deviceAddress);
 if (tempC == -127.00) {
   Serial.print("Error getting temperature");
 } else {
   Serial.print("C: ");
   Serial.print(tempC);
   Serial.print(" F: ");
   Serial.print(DallasTemperature::toFahrenheit(tempC));
 }
}




ich weis leider nichtmal in was der Temperaturwert gespeichert wird, obs ne int od double is od so weis ich leider nicht -.-

Naja, dann must du halt die Funktion umschreiben:

void printTemperatureTFT(DeviceAddress deviceAddress,int _X, int _Y)

{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    myGLCD.print("Error getting temperature",_X,_Y);
  } else {
    myGLCD.print("C: ",_X,_Y);
    _X += 20;  // Cursor nach rechts verschieben, Wert kenne ich nicht, hängt vom Font ab
    myGLCD.printNumI(tempC,_X,_Y);
    _X += 20;  // Cursor nach rechts verschieben, Wert kenne ich nicht, hängt vom Font ab
    myGLCD.print(" F: ",_X,_Y);
    _X += 20;  // Cursor nach rechts verschieben, Wert kenne ich nicht, hängt vom Font ab
    myGLCD.printNumI(DallasTemperature::toFahrenheit(tempC),_X,_Y);
  }
}

Ich weiß nicht, ob das so funkioniert, aber in der Art sollte es gehen.
Und anstelle
myGLCD.print(motorThermometer 0, 0);
schreibst du jetzt

  • printTemperatureTFT(motorThermometer 0, 0);*

Verstanden?

Der Punkt ist, dass die Funktion printTemperature() ja viel macht:
zuerst wird der Wert geholt, dann "C: " ausgegeben, dann der Wert geschrieben usw.

die Funktion myGLCD.print() dageben gibt letztlich nur einen Text an der angegeben Cursorposition aus.
also eher das, was Serial.print() macht.

Versuchs mal damit, so hab ich es gemacht, ist dann auch gleich formatiert.

String zahl;
i=int(tempC);
j=int((tempC-i)*100);
zahl=""; if (i < 100) zahl +=' '; if (i < 10) zahl +=' '; zahl += String(i)+".";
if (j < 10) zahl +='0';zahl += String(j);
myGLCD.print(zahl,60,60);

@guntherb,

hab das probiert, es kommt kein fehler aber es wird auch nichts an das display mitgeteilt :frowning:

@maverick
äm wo statt was ersetzen, bin da leider noch etwas nooby

Kopier das mal bei dir in den sketch unter
//test
wenn du die Temperatur tempC einliest wird diese so umgeformt, das sie auf dem Display ausgegeben wird.

@ maverick

leider nur error´s

F_hler_V0_1.ino: In function 'void loop()':
F_hler_V0_1:116: error: name lookup of 'i' changed for new ISO 'for' scoping
F_hler_V0_1:90: error: using obsolete binding at 'i'
F_hler_V0_1:116: error: 'tempC' was not declared in this scope
F_hler_V0_1:117: error: 'j' was not declared in this scope

so hab ichs drinstehen:

  //test
  //printTemperature(motorThermometer);
  //myGLCD.print(motorThermometer 0, 0);
   String zahl;
   i=int(tempC);
   j=int((tempC-i)*100);
   zahl=""; if (i < 100) zahl +=' '; if (i < 10) zahl +=' '; zahl += String(i)+".";
   if (j < 10) zahl +='0';zahl += String(j);
   myGLCD.print(zahl,60,60);
  
  
  
  {
   delay(2000);
   Serial.print("Getting temperatures...\n\r");
   sensors.requestTemperatures();

Kriegst denn überhaupt irgendwas auf dem Display angezeigt?

Sorry, habs gerade gesehen:

Blonder:
Normal Schreiben kann ich auf das Display, nur die ausgelesenen Temperaturen nicht :frowning:

Probiers doch mal in einzelschritten:
myGLCD.print("Testtext",0,0); Das geht also?
Geht auch das?

myGLCD.printNumI(99,0,0);

Guntherb

Ja das funktioniert 99 links oben, normal schreiben geht hmm

Was ich rausgelesen hab von der lib Dallas:

 // sends command for all devices on the bus to perform a temperature conversion 
  void requestTemperatures(void);
   
  // sends command for one device to perform a temperature conversion by address
  bool requestTemperaturesByAddress(uint8_t*);

  // sends command for one device to perform a temperature conversion by index
  bool requestTemperaturesByIndex(uint8_t);

  // returns temperature in degrees C
  float getTempC(uint8_t*);

  // returns temperature in degrees F
  float getTempF(uint8_t*);

  // Get temperature for device index (slow)
  float getTempCByIndex(uint8_t);
  
  // Get temperature for device index (slow)
  float getTempFByIndex(uint8_t);

float getTempC(uint8_t*); müsste ein befehl sein was ich benützen müsste?

Die Temperatur vom Sensor kriegst du mit

 float tempC = sensors.getTempC(deviceAddress);

so wie es ja in deiner Funktion printTemperature() schon gemacht wird.

Aber das ist ja nicht dein Problem, oder? Denn die Tempatur kannst du ja auslesen.
Es scheint nur die Ausgabe auf dem Display zu sein.

Probier doch mal das:

myGLCD.printNumF(99.0,0,0);

Das ist die Ausgabe eines Float wertes (ich vorhin die PrintNumI genommen, weil mir nicht gegenwärtig war, das deine Temperatur ein Floatwert ist.

wenn das geht, dann das:

 float tempC = sensors.getTempC(deviceAddress);
myGLCD.printNumF(tempC ,0,0);

EDIT:
ich habe mir gerade mal den Code der Funktion printNumF() angesehen:
wahrscheinlich müssen die Beispiele so aussehen:

myGLCD.printNumF(99.0,2,0,0);

und

 float tempC = sensors.getTempC(deviceAddress);
myGLCD.printNumF(tempC ,2,0,0);

weil die Funktion zwingend 4 Übergabeparameter verlangt:
void printNumF(double num, byte dec, int x, int y, char divider='.', int length=0, char filler=' ');
ich habe leider keine Dokumentation gefunden, aber ich interpretiere die Parameter so:
double num: Der auszugebende Wert
byte dec: Die Anzahl der Ecponentialstellen????? (Must du mal probieren)
int x, int y: die Koordianten, an denen die Ausgabe beginnt
char divider: Das "Kommazeichen", Default als '.' definiert, Angabe Optional
char length: Die minimale Ausgabelänge, Default als 0 definiert, Angabe Optional
char filler: Das Zeichen, mit dem bis zu length aufgefüllt wird Default als ' ' definiert, Angabe Optional

Proier mal das hier
läuft bei mir schon ein Jahr für die Solarsteuerung mit 2 DS1820

//folgende Zeilen sind für Temperaturanzeige
sensors.requestTemperatures(); // Send the command to get temperatures
myGLCD.setFont(DotMatrix_M);
myGLCD.setColor(0,0,100);
myGLCD.setBackColor(211, 211, 211);
/* myGLCD.printNumI(sensors.getTempCByIndex(0),6,129); //Anzeige für Sensor0 wird bei Statusanzeige gesetzt
myGLCD.print("C",52,129);*/

myGLCD.printNumI(sensors.getTempCByIndex(1),6,154); //Anzeige für Sensor1 nur in Automatik
myGLCD.print("C",52,154);

myGLCD.setColor(0,0,100);
myGLCD.drawCircle(45,132,3); // Kreis für Grad
myGLCD.drawCircle(45,157,3); // Kreis für Grad

@guntherb

Danke danke vielmals für den support , hat prima geklappt, statt deviceadress habe ich motorThermometer eingegeben und siehe da es klappt THX

float tempC = sensors.getTempC(motorThermometer);
myGLCD.printNumF(tempC ,2,0,0);

@mattiasve
werd mir deine lösung auch noch zu herzen legen Danke :wink:

schön, dass es klappt!

Und sorry für den Copy and Paste Fehler!

@guntherb

1 hab ich noch wenn ich 2 fühler reproduziere hab ich wieder nen error

code:

myGLCD.setFont(BigFont);

float tempC = sensors.getTempC(motorThermometer);
myGLCD.printNumF(tempC ,2,5,25);

float tempC = sensors.getTempC(aussenThermometer);
myGLCD.printNumF(tempC ,2,5,25);

  
 
 
  myGLCD.setFont(SmallFont);

error:

F_hler_V0_2.ino: In function 'void loop()':
F_hler_V0_2:121: error: redeclaration of 'float tempC'
F_hler_V0_2:118: error: 'float tempC' previously declared here

:slight_smile:

Gelöst DANKE :wink: