Go Down

Topic: Austauschen eines Festen Textes im LCD (Read 1 time) previous topic - next topic

Rudi01

Hallo Zusammen

Ich bin gerade dabei für meine Warmwassersolaranlage eine Steuerung zu programieren.
Bis jetzt klappt alles soweit nur möchte ich ,dass bei Übertemperatur diese Meldung im Display erscheint .
Da der platz sehr eng ist sollte dieser Text einen anderen überschreiben und wenn die Übertemperatur wieder weg ist soll der alte Text auf dem Display wieder erscheinen.
Ich sollte vieleicht noc erwähnen dass ich in Sachen Arduino sowie bei der Benutzung eines Forums ein relativer Anfänger bin, desshalb bitte ich um etwas Nachsicht für etwaiger Fehler .Bin aber Dankbar für jedenHinweis der zur Verbesserung beiträgt.

Hier mal der Sketch

/*
  Differenztemperatursteuerung Sonnenkolektor mit 2XPT100
 
*/

// Laden der Libary:
#include <LiquidCrystal.h>

// initialisieren der LCD Pins ( Für das Orginal Arduino-Pad )
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//die Variablen deklarieren
float tempK;
float tempS;
int tempPin1 = 1;
int tempPin2 = 2;
int Pumpe = 13;
int Differenztemperatur = 0;      //Hier nichts eingeben
int Schalttemperatur = 8;         //Hier die Schalttemperatur der Differenz Kolektor -> Speicher, bei der die Pumpe gestartet wird, eingeben
int Hysterese = 2;                //Hier die Hysterese der Differenz, bei der die Pumpe abgeschalet wird, eingeben
int SpeicherTempMax = 85;         //Hier die Maxtemperatur des Speichers, bei der die Pumpe ausgeschaltet wird, eingeben
int SpeicherTempMaxHysterese = 2; //Hier die Hysterese der Ausschaltemperatur des Speichers, bei der die Pumpe wieder eingeschaltet wird, eingeben
int KolektorTempMax = 180;        //Hier die Maxtemperatur des Kolektors, bei der die Pumpe ausgeschaltet wird, eingeben
int KolektorTempMaxHysterese = 2; //Hier die Hysterese der Ausschaltemperatur des Kolektors, bei der die Pumpe wieder eingeschaltet wird, eingeben
int GND = 11; //Ersatzweise Masse ( nachher Löschen )

void setup(){
  // Die Festen Texte übermitteln
  lcd.begin(16, 2);
  lcd.print("Kol=");
  lcd.setCursor(0, 1);
  lcd.print("Sp=");
  lcd.setCursor(10, 0);
  lcd.print("Dif") ;
  lcd.setCursor(8, 1);
  lcd.print("Pumpe") ;

  pinMode (Pumpe, OUTPUT);
  pinMode (GND, OUTPUT); //Ersatzweise Masse ( nachher Löschen )
}

void loop(){
  tempK = analogRead(tempPin1);           //lesen des Eingangswertes Pin 1 ( Kolektor )
  tempK = (5.0 * tempK * 50.0)/1024.0-31 ;  //Konvertieren in ein Temperatursignal -20°C bis +220°C


  // das Ergebnis ans Display senden
  lcd.setCursor(4, 0);
  lcd.print(tempK,1); // Die Temperaur des Kolektors wird geschrieben
  lcd.write(0xD0 + 15); // das ° Zeichen wird geschrieben



  tempS = analogRead(tempPin2);           //lesen des Eingangswertes Pin 2 ( Speicher )
  tempS = (5.0 * tempS * 30.0)/1024.0;  //Konvertieren in ein Temperatursignal 0°C bis +100°C
 
  // das Ergebnis ans Display senden

  lcd.setCursor(3, 1);
Hier sollte dann der Text "Übertemp" erscheinen und den Text der nächsten Zeilen überschreiben:
  lcd.print(tempS,1); // Die Temperaur des Speichers wird geschrieben
  lcd.write(0xD0 + 15); // das ° Zeichen wird geschrieben

  Differenztemperatur = tempK - tempS;
 
  lcd.setCursor(13, 0);
  lcd.print(Differenztemperatur,1); // Die Differenztemperatur wird geschrieben
  lcd.print("K ");
 

 
  if(Differenztemperatur > Schalttemperatur && tempS < SpeicherTempMax - SpeicherTempMaxHysterese && tempK < KolektorTempMax - KolektorTempMaxHysterese) // Wenn Diff.temp über Schalttemp. oder Speichertemp nicht über 84°C und Kol.temp nicht über 179°C
  digitalWrite(Pumpe, HIGH); // Pumpe wird eingeschaltet Pin 13

  if(Differenztemperatur < Schalttemperatur - Hysterese || tempS > SpeicherTempMax || tempK > KolektorTempMax) // Abschaltpunkt eingestellte Schalttemperatur - Hysterese oder Speichertemp über 85°C oder Kol.temp. über 180°C
  digitalWrite(Pumpe, LOW); // Pumpe wird ausgeschaltet Pin 13
  lcd.setCursor(13, 1);

lcd.print(digitalRead(Pumpe) == HIGH? "Ein":"Aus"); // Anzeige des Schaltzustandes der Pumpe

  digitalWrite(GND, LOW);//Ersatzweise Masse ( nachher Löschen )
  // sleep...
  delay(100);
 
 
}

Marcus W

Bitte pack den Code in Code-Blocks (das Raute-Zeichen im Texteditor des Forums)

Ohne deinen Sketch durchgesehen zu haben, kann ich dir sagen, dass das Vorgehen folgendermaßen ist:


  • 1. Derzeitigen Text in Variabe schreiben

  • 2. neuen Text in display schreiben

  • 3. abwarten bis die Temperatur wieder normal ist.

  • 4. Variableninhalt wieder ins Display schreiben



am Einfachsten ist es, wenn du dir dafür Methoden schreibst, die du dann aufrufst, also etwa:

Code: [Select]

void speicherDenText()
{
   ...
}

void schreibeWarnung()
{
   ...
}


void checkDieTemperatur()
{
   ...
}

void stelleDenUrsprünglichenInhaltWiederHer()
{
   ...
}



Die Namen sind natürlich total übertrieben, aber so in der Art eben. Auf diese Art und Weise weißt du, was dein Programm wann tut und wo du anpacken musst, wenn es nicht das tut, was du willst

MueThoS

Am einfachsten ist es wenn du deine Alarmmeldung einfach ans ende setzt.
Ist sicher nicht die besten und schönste Variante aber geht.
Schreib den Wert hin und setze danach den Cursor neu und schreib deine Meldung.
Im Programmaplauf würde er dann immer alles schön ausfüllen und im Alarmfall da drüber schreiben.
Besteht dieser Fall nicht mehr schreibt er ganz normal wieder deine Werte

Rudi01

Vielen Dank für die Antworten

ich werde das mal bei Gelegenheit mal ausprobieren.
Zur Zeit bin ich mit dem Bau der Solaranlage beschäftigt.

Rudi01

Hallo zusammen

Ich ahbs jetzt hinbekommen.
Hier mal der relewante Ausschnitt aus meinem Sketch:
Code: [Select]
// Anzeige der Speichertemperatur und der Speicher1 Fehlermeldungen

  if(tempS < SpeicherTempUnplausibel){  // Die Fehlermeldung TempFehl wird geschrieben
  lcd.setCursor(0, 1);
  lcd.write("TempFehl");
 
                                                         
  else {
  lcd.setCursor(0, 1);
  lcd.print("S1=");
  lcd.setCursor(3, 1);
  lcd.print(tempS,1); // Die Temperaur des Speichers wird geschrieben
  lcd.write(0xD0 + 15); // das ° Zeichen wird geschrieben
}
if(tempS > SpeicherTempMax){  // Die Fehlermeldung UebtmpSp wird geschrieben
  lcd.setCursor(0, 1);
  lcd.write("UebtmpSp");}


Das funktioniert jezt wie gewollt, nochmals vielen Dank für die Hilfe.

Doch leider habe ich festgestellt dass der Störungstext nach dem Verschwinden der Störung wieder weggeht.
Es währe aber besser dass er stehenbleibt bis ich Ihn mittels der Resettaste Quittiere.
Hat jemand eine Idee wie sich soetwas bewerkstelligen ließe ,die Suche im Netz und verschiedene Tests mit Sprungbefehlen u.s.w. blieben leider erfolglos.

sth77

Dazu solltest du ein Flag setzen, wenn eine Störung auftritt. Erst ein Reset löscht das Flag.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Rudi01

Hi
Danke für die schnelle Antwort.
Das ist genau das was ich suche. Im Netz habe ich aber keine wirklich guten Infos gefunden.
Kannst Du mir sagen wie ich so ein Flag verwende?

Danke Rudi

MueThoS

Ganz easy:
da wo du deine IF machst und den Text direkt ausgibst machst du folgendes:
Wenn fehler aufgetreten ist dann setze Variable X auf 1
und bei deiner Textausgabe machst du dann nicht eine prüfung auf die Temperatur sondern auf X
Wenn X = 1 dann Text ausgeben.
X deklarierst du natürlich am anfang mit 0
Dadurch wird nach einem Reset immer kein Text ausgegeben und wenn der Fehler auftrit
wird X gesetzt und bleibt erstmal.
Entweder nach einem reset oder (wenn du es noch einbaust) nach einem Tastendruck wird es zurück gesetzt.

Rudi01

Hallo MueThoS

danke für die Antwort.
Ich habs mal probiert. Doch leider hats nicht so recht funktioniert , die Fehlermeldung wurde immer angezeigt.
Ich denke dass ich die Variable "FehlereldungSpeicherMaxVariable" nicht richtig setze






Code: [Select]


int SpeicherTempUnplausibel = 10; //Unter 10°C ist Meßwert im Speicher unplausibel
int FehlereldungSpeicherMaxVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicherUnplausibelVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet




void setup(){
 



// Anzeige der Speichertemperatur und der Speicher1 Fehlermeldungen

lcd.setCursor(0, 1);
  lcd.print("S1=");
  lcd.setCursor(3, 1);
  lcd.print(tempS1,1); // Die Temperaur des Speichers wird geschrieben
  lcd.write(0xD0 + 15); // das ° Zeichen wird geschrieben

  if(tempS1 < SpeicherTempUnplausibel)(  // Die Fehlermeldung TempFehl wird geschrieben
  FehlereldungSpeicherUnplausibelVariable = 1);
 
  if (FehlereldungSpeicherUnplausibelVariable = 1){
  lcd.setCursor(8, 1);
  lcd.write("TempFehl");}
                                                         
 
if(tempS1 > SpeicherTempMax)(  // Die Fehlermeldung UebtmpSp wird geschrieben
FehlereldungSpeicherMaxVariable = 1);
 
  if (FehlereldungSpeicherMaxVariable = 1){
  lcd.setCursor(0, 1);
  lcd.write("UebtmpSp");}
 
 
  sleep...
  delay(1000);
 
 
}


Könntest Du den Code mal durch sehen ?

Danke Rudi01

MueThoS

Das ist nicht der gesamte Coder, oder?
Ich schau mal.
Ich glaube du hast nur ein paar Klammern falsch gesetzt!


Code: [Select]


int SpeicherTempUnplausibel = 10; //Unter 10°C ist Meßwert im Speicher unplausibel
int FehlereldungSpeicherMaxVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicherUnplausibelVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet

void setup(){

---> Hier fehlt was, richtig? <-----
 
// Anzeige der Speichertemperatur und der Speicher1 Fehlermeldungen

lcd.setCursor(0, 1);
  lcd.print("S1=");
  lcd.setCursor(3, 1);
  lcd.print(tempS1,1); // Die Temperaur des Speichers wird geschrieben
  lcd.write(0xD0 + 15); // das ° Zeichen wird geschrieben

  if(tempS1 < SpeicherTempUnplausibel){  // Die Fehlermeldung TempFehl wird geschrieben
     FehlereldungSpeicherUnplausibelVariable = 1);
  }
 

  if (FehlereldungSpeicherUnplausibelVariable == 1){    // hire war nor ein =
  lcd.setCursor(8, 1);
  lcd.write("TempFehl");}
                                                         
 
if(tempS1 > SpeicherTempMax){  // Die Fehlermeldung UebtmpSp wird geschrieben
FehlereldungSpeicherMaxVariable = 1};
 
  if (FehlereldungSpeicherMaxVariable == 1){             // hire war such nor ein =
  lcd.setCursor(0, 1);
  lcd.write("UebtmpSp");}
 
 
  sleep...
  delay(1000);
 
 
}




Ich habe nur die Falschen klammern gefunden.
Der IF-Block kommt in geschweifte Klammern. Du hattest die normalen genommen.
Bei den Textausgaben war es richtig nur bei den Variablen setzen war es falsch.

Ah, noch was:
Bei den IF-Vergleichen mußt du zwei = nehmen.
Sonst setzt du nur die Werte und vergleichst nicht.

So sollte es gehen.


Go Up