Fehler: invalid conversion from const char* to unit8_t

Hallo Zusammen

vor einiger Zeit habe ich einen Sketch geschrieben der meine thermische Solaranlage steuert.
Soweit funktioniert dieser auch gut . Doch da mir nun die Pins ausgehen möchte ich die LVD-Ausgabe auf I²C umstellen.
Den Sketch habe ich auch schon angepasst ( siehe unten ).
Doch ieider spuckt mir die IDE noch einige Fehler aus.
Nämlich:invalid conversion from const char* to unit8_t
initialysing argument 1 of virtual size_t LiquidCrystal_I2C :: write(unit8_t)
Das gilt für die unterstrichenen Zeilen (

/*
  Differenztemperatursteuerung Sonnenkolektor mit 1XPT100 im Kollektor
                                                  1XDS18B20 im Speicher 1
                                                  1XDS18B20 im Speicher 2
*/

// Laden der Libary:
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>

LiquidCrystal_I2C lcd(0x27,20,4); 
//                                       
#define ONE_WIRE_BUS A3

///char buffer[20] = "";                                     // Speicherbereich für Datenkonvertierung

OneWire oneWire(ONE_WIRE_BUS);                            // Library für Datenleitung des Tempatursensors Dallas DS18xx 
DallasTemperature sensors(&oneWire);


//die Variablen deklarieren

float tempK;
float tempS1;
float tempS2;
int tempPin1 = 1;                 //Hier ist der analoge Eingang der Temperaturproportionalen Spannung (0-5V)
int SpeichertempPin1 = A3;        //Temperaturdaten der Speichersensoren werden an Analogpin3 angeschlossen

int Pumpe1 = 13;
int Pumpe2 = 12;

int DifferenztemperaturS1 = 0;      //Hier nichts eingeben
int DifferenztemperaturS2 = 0;      //Hier nichts eingeben
int Schalttemperatur = 14;          //Hier die Schalttemperatur der Differenz Kolektor -> Speicher, bei der die Pumpe gestartet wird, eingeben
int SpeicherTempMax = 85;           //Hier die Maxtemperatur des Speichers, bei der die Pumpe ausgeschaltet wird und eine Fehlermeldung ausgegebeb wird ( muss quittiert werden ) eingeben
int KolektorTempMax = 130;          //Hier die Maxtemperatur des Kolektors, bei der die Pumpe ausgeschaltet wird  und eine Fehlermeldung ausgegebeb wird ( muss quittiert werden ) eingeben
int KolektorTempMaxHysterese = 2;   //Hier die Hysterese der Ausschaltemperatur des Kolektors, bei der die Pumpe wieder eingeschaltet wird, eingeben
int SpeicherTempUnplausibel = 8 ;   //Unter 8°C ist Meßwert im Speicher unplausibel
int TempSpeicher35 = 35;            //Dient für die Stufenbestimmung
int TempSpeicher50 = 50;            //Dient für die Stufenbestimmung
int TempSpeicher75 = 75;            //Dient für die Stufenbestimmung
int TempSpeicher85 = 85;            //Dient für die Stufenbestimmung

int Stufe;                          //Für die Stufenweiterverarbeitung
int StufeSpeicher1;                 //Für die Stufenweiterverarbeitung
int SicherheitSpeicher1iO;          //Für die Stufenweiterverarbeitung
int StufeSpeicher2;                 //Für die Stufenweiterverarbeitung
int SicherheitSpeicher2iO;          //Für die Stufenweiterverarbeitung

int FehlereldungSpeicher1MaxVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicher2MaxVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicher1UnplausibelVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicher2UnplausibelVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet

#define ONE_WIRE_BUS A3  // Datendraht an Pin A3

//Achtung die jeweilige Adresse des nicht angeschlossenen Sensors deaktivieren  

//DeviceAddress SensorS1 = { 0x28, 0xB2, 0x4B, 0xA1, 0x03, 0x00, 0x00, 0x2C }; //Sensor 1 Experimentier Anschluss
DeviceAddress SensorS1 = { 0x28, 0x27, 0xB0, 0xC0, 0x03, 0x00, 0x00, 0xBF }; //Sensor 1 im Speicher 1

//DeviceAddress SensorS2 = { 0x28, 0xF2, 0x75, 0xA1, 0x03, 0x00, 0x00, 0x7F }; //Sensor 2 Experimentier Anschluss
DeviceAddress SensorS2 = { 0x28, 0x9B, 0xFC, 0x8B, 0x03, 0x00, 0x00, 0x79 }; //Sensor 2 im Speicher 2

void setup(){
 lcd.init(); 
  byte addr[8];  
  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(SensorS1, 10); //Die Auflösung des DS18B20-Sensors heraufsetzen
  sensors.setResolution(SensorS2, 10); //Die Auflösung des DS18B20-Sensors heraufsetzen
  pinMode (Pumpe1, OUTPUT);
  pinMode (Pumpe2, OUTPUT);
}

void loop(){  
  //Start Abfrage DS18B20
  sensors.requestTemperatures();  
  //Temperaturen DS18B20 in Variable ablegen
  float tempS1 = sensors.getTempC(SensorS1); //zwischenspeichern in Variable tempS1
  float tempS2 = sensors.getTempC(SensorS2); //zwischenspeichern in Variable tempS2   
  sensors.requestTemperatures();   
   lcd.begin(20, 4);//LCD hat 20 Zeichen und 4 Spalten  
}

Den Sketch musste ich leider einkürtzen.

Hat das eventuell mit der metode die Texte ins LCD zu schreiben zu tun ?
Muss ich da eventuell eine andere Technik anwenden?

Vielen Dank für Eure Hilfe Rudi

Den Sketch musste ich leider einkürtzen.

Dabei ist wohl was verlorengegangen. Ich seh jedenfalls kein lcd.write()

Und in einem [ code ] Block kann man leider keine weitere Formatierung anbringen ...
Aber du könnest an deinen problematischen lcd.write einen Kommentar schreiben.

"lcd.begin(20, 4);//LCD hat 20 Zeichen und 4 Spalten" im loop() ist etwas fehl am platze.

Bitte schicke als Anlage den gesamten Sketch und auch alle Fehlermeldugen die Dir genau dieser Sketch gibt..
Grüße Uwe

Hallo

Danke für die Hilfen
Den Sketch habe ich mal angehängt gibt es eine Möglichkeit die Fehlermeldungen irgendwie zu Kopieren ( ähnlich Drag and Drop)?
Damit ich diese nicht immer abtippen muss?

_22_LCD_auf_I_C_Test1.ino (13.4 KB)

Hallo Rudi,
warum benutzt du an einigen Stellen lcd.write statt lcd.print? z.B. Zeile 162
Das Grad Zeichen ist lcd.write (223)

hi,

Du kannst die fehlermeldungen mit der maus markieren und dann mit Strg C kopieren. nur die rechte maustaste geht nicht...

gruß stefan

lcd.print() ist ASCII und geht damit nur bis 127. Der Display Zeichensatz enthält aber allerlei Sonderzeichen, die nicht im ASCII Satz sind. Diese werden über write() angesprochen, welches Binärdaten sendet.

Siehe Seite Seite 17. Links ist die ASCII Tabelle ASCII. Rechts sind weitere Zeichen (vor allem japanische):

Da sind vor allem Umlaute und das Grad Zeichen relevant

EDIT:
Geht aber glaube ich auch so: lcd.print("\223")
So kann man auch größere Werte direkt in Strings einbetten

Hi

Vielen Dank jetzt hab ich`s gepackt.
So habe ichs gelöst:

lcd.setCursor(0, 3);
     lcd.write(83); //Zeichen S
     lcd.write(101);//Zeichen e
     lcd.write(110);//Zeichen n
     lcd.write(115);//Zeichen s
     lcd.write(111);//Zeichen o
     lcd.write(114);//Zeichen r
     lcd.write(45); //Zeichen -
     lcd.write(70); //Zeichen F
     lcd.write(101);//Zeichen e
     lcd.write(104);//Zeichen h
     lcd.write(108);//Zeichen l
     lcd.write(101);//Zeichen e
     lcd.write(114);//Zeichen r
     lcd.write(45); //Zeichen -
     lcd.write(83); //Zeichen S
     lcd.write(112);//Zeichen p
     lcd.write(49); //Zeichen 1
     lcd.write(32); //Leerzeichen
     lcd.write(32); //Leerzeichen
     lcd.write(32); //Leerzeichen

das ist sehr aufwendig aber zuletzt funktionierts ja.

Ein Problem war dass ich den Wert der in der Klammer eingegeben wird nicht dem Zeichen zuordnen konnte wie zum Beispiel:
Das Grad Zeichen ist lcd.write (223).
Duch Probieren hab ich jetzt die ganzen Werte herausbekommen.

Vielen Dank nochmals für die Hilfe

PS die Tastatur-Kombination STRG-C für Coppy kenne ich und das hat leider auch nicht funktioniert. Eventuell ligt es daran dass ich Ubuntu verwende.

Ich glaube der Fehler war einfach das hier:

  lcd.write("C");
  lcd.setCursor (19, 3);
  lcd.write(" ");

write() will ein Byte. Keinen String. Für Strings gibt es print(). Mit write() kannst du einzelne chars schicken. Also entweder über char oder Integer Literale (' ' oder 0x20 für das Leerzeichen z.B.). write() ist für das Grad Zeichen ok. Für den Rest gibt es print().

Das könnte auch gehen:

char buf[] = { 223, 'C', '\0'  };
lcd.print(buf);

Oder vielleicht:

lcd.print("\223C ");

Aber nicht ausprobiert. Geht auch mit Hex-Werten so, aber da muss man dann aufpassen, das man die von Buchstaben trennt, die in Hex-Zahlen vorkommen:

lcd.print("\xDF" "C ");    //nur x, kein 0x!