Display Darstellungsfehler

Hallo alle miteinander,
ich bin aktuell am programmieren eines kleinen Panels (I2C LCD Display) für meine Hobbyheizungssteuerung, welches nur 2 Aufgaben hat.

  1. Anzeigen von 2 Temperaturen (Zeile 1 & 2) von 2 Sensoren.
  2. Anzeige des Modus in dem sich die externe Steuerung befindet (Zeile 4).

Die Eingangssignale werden von Relais geschaltet und sind mit einem Pull-down Widerstand versehen, wodurch die Signale klar ankommen.
An sich funktioniert alles. Alle Temperaturen werden gut angezeigt und die Modi werden auch gut dargestellt.

Mein Problem ist aber das nach einiger Zeit die Modianzeige (Zeile 4) einfriert, obwohl dieEingangssignale sich ändern und das zufällig Nullen,vereinzelt auf dem Display, auftauchen und verschwinden. Manchmal Verschwinden auch die “C” bei den Grad Celsius hinter der Temperatur. Bislang konnte ich noch kein Muster hinter den Fehlern sehen.

Habe leider keine Bider von dem Bug, kann zurzeit auch keine Machen da ich auf Montage bin.

Hat jemand eine Idee woran das liegen könnte?

/*
   Display Test
*/

// Werte
//-----------------------------------------------------

const int Refreshrate = 500;  //Temperatursensoren Wiederholungsrate

//Eingangssignale
//-----------------------------------------------------

const int I1 = 3; //Modus Anheizen
const int I2 = 4; //Modus Normalmodus
const int I3 = 5; //Modus Herunterfahren
const int I4 = 6; //Nachgelegt
const int I5 = 7; //Uebertemperatur


// Tasterzustände
//-----------------------------------------------------

int I1State = 0;
int I2State = 0;
int I3State = 0;
int I4State = 0;
int I5State = 0;

//Temperatursensoren
//-----------------------------------------------------

float BT1Temp;
float BT2Temp;
int floatlength = 2; //Nachkommastellen

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS_PIN 2

#define TEMPERATURE_PRECISION 9

OneWire oneWire(ONE_WIRE_BUS_PIN);

DallasTemperature sensors(&oneWire);

unsigned long vorher, jetzt;

DeviceAddress BT1 = { 0x28, 0xC2, 0x21, 0x60, 0x05, 0x00, 0x00, 0x7F };
DeviceAddress BT2 = { 0x28, 0xE3, 0xE2, 0x60, 0x05, 0x00, 0x00, 0x92 };


// LCD Display
//-----------------------------------------------------

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Start the LCD display library
LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Belegung für 16x4 LCD-Modul QC2204A
// mit Sainsmart LCD2004 I2C-Controller


void setup() {

  pinMode(I1, INPUT);
  pinMode(I2, INPUT);
  pinMode(I3, INPUT);
  pinMode(I4, INPUT);
  pinMode(I5, INPUT);

  Serial.begin(9600);


  // Starte Temperatursensor
  //------------------------------------------------------------------

  sensors.begin();

  lcd.begin(20, 4);
  lcd.setCursor(1, 1);
  lcd.print("Heizungssteuerung");
  lcd.setCursor(3, 2);
  lcd.print("wird geladen..");
  delay(11000);
  lcd.clear();

}

void loop() {

  I1State = digitalRead(I1);
  I2State = digitalRead(I2);
  I3State = digitalRead(I3);
  I4State = digitalRead(I4);
  I5State = digitalRead(I5);
  unsigned long currentMillis = millis();

  lcd.home();

  sensors.requestTemperatures();


  //Temparutersensoren DS18B20
  //--------------------------------------------------------------

  jetzt = millis();
  if (jetzt - vorher > Refreshrate) { //Sensoren werden nur alle 10 sec gelesen
    sensors.requestTemperatures();
    BT1Temp = sensors.getTempC(BT1);
    BT2Temp = sensors.getTempC(BT2);
    vorher = millis();
  }

  lcd.setCursor(0, 0);
  lcd.print("Vorlauf:");
  lcd.setCursor(0, 1);
  lcd.print("Puffer:");


  // Temperaturen
  //-----------------------------------------------------
  lcd.setCursor(14, 0);
  lcd.print("   ");
  lcd.setCursor(14, 0);
  lcd.print(BT1Temp);
  lcd.setCursor(14, 1);
  lcd.print("   ");
  lcd.setCursor(14, 1);
  lcd.print(BT2Temp);


  // "°C" Symbole
  //-----------------------------------------------------

  lcd.setCursor(18, 0);
  lcd.write(0xDF);
  lcd.setCursor(18, 1);
  lcd.write(0xDF);
  lcd.setCursor(19, 0);
  lcd.print("C");
  lcd.setCursor(19, 1);
  lcd.print("C");


  // Modus
  //-----------------------------------------------------

  if (I1State == 1) {
    lcd.setCursor(0, 3);
    lcd.print("Anheizen           ");
  }

  if (I2State == 1) {
    lcd.setCursor(0, 3);
    lcd.print("Normal             ");
  }

  if (I4State == 1) {
    lcd.setCursor(0, 3);
    lcd.print("    !Nachlegen!   ");
  }

  if (I3State == 1) {
    lcd.setCursor(0, 3);
    lcd.print("Herunterfahren     ");
  }

  if ((I1State == 0) && (I2State == 0) && (I3State == 0) && (I4State == 0) && (I5State == 0)) {
    lcd.setCursor(0, 3);
    lcd.print("Kein Modus     ");
  }

  if (I5State == 1) {
    lcd.setCursor(0, 3);
    lcd.print("Uebertemperatur");
  }


}

Ich vermute ein Hardware-Fehler.

Wie lang sind die I2C-Leitungen ?
Hast du Pullup-Widerstände am I2C ?
Wie hast du I2C verdrahtet ?

HotSystems:
Ich vermute ein Hardware-Fehler.

Wie lang sind die I2C-Leitungen ?
Hast du Pullup-Widerstände am I2C ?
Wie hast du I2C verdrahtet ?

  • Leitung ist ungefähr 35cm lang
  • Nein habe ich noch nicht gemacht.
  • Das Display habe ich nach dieser Anleitung verdrahtet: Anleitung

Vergil820:

  • Leitung ist ungefähr 35cm lang
  • Nein habe ich noch nicht gemacht.
  • Das Display habe ich nach dieser Anleitung verdrahtet: Anleitung

Dann baue noch die Pullups ein, das ist Pflicht bei I2C.
Mit der Verdrahtung meinte ich eher, gesteckt oder gelötet ?
Gesteckte Verbindungen sind langfristig immer schlecht.

HotSystems:
Dann baue noch die Pullups ein, das ist Pflicht bei I2C.
Mit der Verdrahtung meinte ich eher, gesteckt oder gelötet ?
Gesteckte Verbindungen sind langfristig immer schlecht.

Versuchs zuerst mit 4,7kOhm Widerständen, notfalls wechselst Du zu 2,2kOhm.
Grüße Uwe

HotSystems:
Dann baue noch die Pullups ein, das ist Pflicht bei I2C.
Mit der Verdrahtung meinte ich eher, gesteckt oder gelötet ?
Gesteckte Verbindungen sind langfristig immer schlecht.

Achso. Also am Display und auf dem Mikrokontroller sind sie gesteckt.

Anlöten wäre kein Problem. Soll ich es sowohl am Mikrocontroller als auch am Display löten oder nur am Display.
Kann ich das Kabel dann aber auf einer Klemmeleiste zwischen klemmen? Da sich das Display an einer Platte befindet die entfernbar bleiben muss.

uwefed:
Versuchs zuerst mit 4,7kOhm Widerständen, notfalls wechselst Du zu 2,2kOhm.
Grüße Uwe

Danke gleich für die Größenangabe. Werde ich probieren.

Vergil820:
Achso. Also am Display und auf dem Mikrokontroller sind sie gesteckt.

Anlöten wäre kein Problem. Soll ich es sowohl am Mikrocontroller als auch am Display löten oder nur am Display.
Kann ich das Kabel dann aber auf einer Klemmeleiste zwischen klemmen? Da sich das Display an einer Platte befindet die entfernbar bleiben muss.
.....

Eine Steckverbindung ist nur während der Entwicklungszeit gedacht, danach musst du die Vebindungen löten.
Nur so hast du eine dauerhaft saubere Kontaktgabe.
Und das auf beiden Seiten.

Hallo,

HotSystems:
Eine Steckverbindung ist nur während der Entwicklungszeit gedacht, danach musst du die Vebindungen löten.
Nur so hast du eine dauerhaft saubere Kontaktgabe.
Und das auf beiden Seiten.

das würde ich so nicht unterschreiben. Steckverbindungen müssen an Ihren Verwendungszweck entsprechend ausgewählr sein. nach Möglichkeit vermeidet man sie auch, aber nur, wenn es sinnvoll möglich ist.
Für Dupont-Verbinder stimme ich zu, ansonsten würde ich gern auch in Zukunft meine Stehlampe per Stecker/Steckdose anschließen wollen und die Grafikkarte im PC will ich auch nicht unbedingt ein- und auslöten wollen. >:(

Ansonsten können 35cm bei I2C schon sehr grenzwertig sein.

Gruß aus Berlin
Michael

amithlon:
.....
Für Dupont-Verbinder stimme ich zu.....

Ok, die waren auch gemeint.

Bei speziellen Steckverbinder, können die natürlich auch über die Entwicklungszeit bleiben.

Hi

Auch in käuflichen Geräten werden Displays oder Bedieneinheiten durchaus steckbar ausgelegt - ok, nicht mittels Steckbrett, aber SO ist die Aussage nicht wirklich korrekt!
(wurde schon drauf eingegangen - lösche ich jetzt aber nicht mehr)

Was mich etwas an dem Sketch stört, auch, wenn Das keine Auswirkungen haben sollte:
Du liest die Sensoren alle 10 Sekunden ein, gibst die Werte aber hunderte Male die Sekunde ans Display raus.
Dann verschachtelst Du auch noch direkt hintereinander liegende Zeichen zweier Zeilen, daß Du für jedes Zeichen eine Positionierung brauchst - Das ist Alles unnötige Bus-Last.
°C kannst Du sowohl in der ersten Zeile schreiben, wie in der Zweiten und brauchst dafür jeweils nur eine Positionierung.
Dann reicht die Ausgabe auch, wenn neue Werte erst Mal da sein KÖNNEN - also alle 10 Sekunden.

Was Du nicht schreibst ist, ob sich das Display aufhängt (gehe ich von aus), oder ob nur die 4.te Zeile ‘nicht mehr will’ - wobei ich dafür keinen Grund sehe, wie nur die 4.te Zeile betroffen sein kann.

Ich denke, Dein Display ‘verschluckt Sich’ bei der Datenflut, wird dabei ‘umgestellt’ und versteht danach Nichts mehr, reagiert deshalb auch nicht mehr auf die zugesendeten Temperaturen bzw. die laufend einschlagenden anderen Zeichen.

Selber versuche ich mich gerade darin, irgendwie eine Klasse ‘abzuschießen’ - aktuell friert mir eine Dot-Matrix sporadisch ein (MAX7219) - könnte versuchen, die .begin() (o.Ä.) Methode erneut aufzurufen … geht mir gerade so durch den Kopf …

MfG

postmaster-ino:
Hi

Was mich etwas an dem Sketch stört, auch, wenn Das keine Auswirkungen haben sollte:
Du liest die Sensoren alle 10 Sekunden ein, gibst die Werte aber hunderte Male die Sekunde ans Display raus.
Dann verschachtelst Du auch noch direkt hintereinander liegende Zeichen zweier Zeilen, daß Du für jedes Zeichen eine Positionierung brauchst - Das ist Alles unnötige Bus-Last.
°C kannst Du sowohl in der ersten Zeile schreiben, wie in der Zweiten und brauchst dafür jeweils nur eine Positionierung.
Dann reicht die Ausgabe auch, wenn neue Werte erst Mal da sein KÖNNEN - also alle 10 Sekunden

MfG

Das mit den 10 Sekunden steht nur noch als Infotext daneben von der Anleitung von der ich das habe. Mittlerweile soll er alle 500ms (als refreshrate bei mir deklariert) den Sensor abfragen.

Aber hast recht das übereinander gelege kann ich mir sparen. Da muss ich nur eine Nachkommastelle weglassen und schon sollte da nichts mehr über einander liegen.
Danke erstmal.

HotSystems:
Eine Steckverbindung ist nur während der Entwicklungszeit gedacht, danach musst du die Vebindungen löten.
Nur so hast du eine dauerhaft saubere Kontaktgabe.
Und das auf beiden Seiten.

Ok da werde ich das mal anlöten.

Hallo,

Vergil820:
Das mit den 10 Sekunden steht nur noch als Infotext daneben von der Anleitung von der ich das habe. Mittlerweile soll er alle 500ms (als refreshrate bei mir deklariert) den Sensor abfragen.

wo und warum liest man bei einer Heizungssteuerung alle halbe Sekunde Temperaturen aus?
Weil man es kann?

Gruß aus Berlin
Michael

Vergil820:
Das mit den 10 Sekunden steht nur noch als Infotext daneben von der Anleitung von der ich das habe. Mittlerweile soll er alle 500ms (als refreshrate bei mir deklariert) den Sensor abfragen.
.....

Wobei du dir hier das nächste Problem einhandelst.

Die Sensoren brauchen lt. Hersteller min. 0,7 Sek. um den internen Kondensator zu laden.
Da solltest du denen schon minimal 1 Sek. gönnen.

Und wie amithlon schon schrieb, ist selbst das noch zu schnell für die Anwendung.