Pages: [1]   Go Down
Author Topic: Austauschen eines Festen Textes im LCD  (Read 1254 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 4
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
 
 
}
Logged

Offline Offline
God Member
*****
Karma: 10
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


NRW
Offline Offline
Sr. Member
****
Karma: 2
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 4
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen

Ich ahbs jetzt hinbekommen.
Hier mal der relewante Ausschnitt aus meinem Sketch:
Code:
// 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.
Logged

Germany
Offline Offline
Edison Member
*
Karma: 48
Posts: 2338
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dazu solltest du ein Flag setzen, wenn eine Störung auftritt. Erst ein Reset löscht das Flag.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Full Member
***
Karma: 4
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

NRW
Offline Offline
Sr. Member
****
Karma: 2
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 4
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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
Logged

NRW
Offline Offline
Sr. Member
****
Karma: 2
Posts: 372
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:

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

Offline Offline
Full Member
***
Karma: 4
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci es hat geholfen
Logged

Pages: [1]   Go Up
Jump to: