LCD Display geht aus

Hallo liebe Gemeinde

Ich bin dabei eine Luftfeuchtigkeitskontrolle und eine Heizungssteuerung zu bauen. Grundsätzlich läuft es auch, die Sollwerte werden in der Nacht runtergesetzt, das Relay geschaltet... Soweit läuft alles. Später kommen dann noch bis zu 9 weiteren Sensoren und 9 weiteren Ausgängen dazu.

Warum ich hier aber aktiv werde ist ein kleines Problem, mein LCD Display. Es funktioniert eigentlich, aber von Zeit zu Zeit wird es "blind", kein Zeichen mehr zu sehen, dann muss ich den Arduino (Mega 2560) reseten, dann geht es wieder.
Kennt ihr das Problem?

Hier ist mein Code:

#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
#include <DHT.h>
RTC_DS1307 rtc;

#define DHTPIN1 23
#define DHTTYPE DHT11


LiquidCrystal lcd(53, 52, 51, 50, 49, 48);

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int timeValue = 0;

int t1 = 40; //solltemparatur
int hum1 = 50; //sollfeuchtigkeit

int temp = 10;
int tempdiff = 0;
int t1_1 = 0;
int relay1 = 47;
DHT dht1(DHTPIN1, DHTTYPE);
int relaystate1 = 0;

void setup() {
 lcd.begin(16, 4);  // LCD starten
 Serial.begin(9600);  // seielle kommunikation starten 
 if (! rtc.begin()) {  //rtc starten
   Serial.println("Couldn't find RTC");
   while (1);
   }
   if (! rtc.isrunning()) {
   Serial.println("RTC is NOT running!");
   rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   }
 dht1.begin();  // dht starten
 digitalWrite(relay1, HIGH);  //Relay ausschalten
 pinMode(relay1, OUTPUT);
}

void loop() {
 DateTime now = rtc.now();
 float h1 = dht1.readHumidity();   //temperatur auslesen
 float dt1 = dht1.readTemperature() - 2;  // LF auslesen


 timeValue = (now.hour()*100 + now.minute());   //mein 4-stelligen Zeitwert erstellen
//  Serial.println(timeValue);

 lcd.setCursor(0, 0);  // Zeit auf LCD schreiben
 lcd.print(now.hour(), DEC);
 lcd.print(':');
 lcd.print(now.minute(), DEC);
 lcd.print(':');
 lcd.print(now.second(), DEC);
 lcd.print(' ');

if ((timeValue < 600) || (timeValue >= 2100))  //Nachtabsenkung erstellen
 {
   tempdiff = temp - 4;
 }
 else if ((timeValue < 700) || (timeValue >= 2000))
 {
   tempdiff = temp - 3;
 }
 else if ((timeValue < 800) || (timeValue >= 1930))
 {
   tempdiff = temp - 2;
 }
 else if ((timeValue < 900) || (timeValue >= 1900))
 {
   tempdiff = temp - 1;
 }
 else 
 {
   tempdiff = temp;
 }

 t1_1 = t1 - 10 + tempdiff;  // Sollwert mit Nachtabsenkung errechnen

if (dt1 < t1_1) {  // Ausgang schalten
   digitalWrite(relay1, LOW);
   relaystate1 = 1;
 }
 else if (dt1 > t1_1)
 {
   digitalWrite(relay1, HIGH);
   relaystate1 = 0;
 }
 lcd.setCursor(0, 1);
 lcd.print(dt1, 0);
 lcd.print(" ");
 lcd.print(t1_1);
 lcd.print(" ");

 lcd.setCursor(0, 2);
 lcd.print(hum1 - h1, 0);
 lcd.print(" ");

 Serial.print(relaystate1);
 Serial.print("   ");
 Serial.print(t1_1);
 Serial.print("   ");
 Serial.println(dt1);

 delay(200);
}

calmato67:
Ich bin dabei eine Luftfeuchtigkeitskontrolle und eine Heizungssteuerung zu bauen. Grundsätzlich läuft es auch, die Sollwerte werden in der Nacht runtergesetzt, das Relay geschaltet... Soweit läuft alles. Später kommen dann noch bis zu 9 weiteren Sensoren und 9 weiteren Ausgängen dazu.

Warum ich hier aber aktiv werde ist ein kleines Problem, mein LCD Display. Es funktioniert eigentlich, aber von Zeit zu Zeit wird es "blind", kein Zeichen mehr zu sehen, dann muss ich den Arduino (Mega 2560) reseten, dann geht es wieder.
Kennt ihr das Problem?

Einen echten Fehler kann ich im Sketch nicht finden.
Wie hast du das Display mit Spannung versorgt ?
Und mit welcher Spannung betreibst du dein Projekt ?
Wie hast du deinen Aufbau gelöst ?
Steckkontakte sind da sehr fehlerträchtig.

Anmerkung nur zur Info:
Wenn du eine genaue Schaltzeit für deine Heizungssteuerung benötigst, dann bist du mit deiner RTC falsch. Die geht schon mal gerne im Monat einige Minuten verkehrt. Nimm lieber die DS3231 dafür, die ist deutlich genauer.

calmato67:
Warum ich hier aber aktiv werde ist ein kleines Problem, mein LCD Display. Es funktioniert eigentlich, aber von Zeit zu Zeit wird es "blind", kein Zeichen mehr zu sehen, dann muss ich den Arduino (Mega 2560) reseten, dann geht es wieder.
Kennt ihr das Problem?

Mit dem Problem "Hardware wird beim Schalten "induktiver Lasten" mittels mechanischem Relais gestört, weil die entstehenden Schaltimpulse nicht ausreichend gefiltert werden, Stichwort "elektromagnetische Verträglichkeit" schlagen hier im Forum wohl über ein Dutzend Forumsteilnehmer pro Jahr auf.

Lass mich raten: Du schaltest "induktive Last", ja?

Also irgendwas mit Spulenwicklungen? Zum Beispiel Pumpen, Motoren , Elektromagneten, inklusive Magnetventile?

Wenn ja: WAS genau schaltest Du?

Wenn Du "induktive Gleichstromlasten" schaltest, zum Beispiel einen Gleichstrommotor, dann brauchst Du eine "Freilaufdiode" in der Schaltung.

Und beim Schalten "induktiver Wechselstromlasten, zum Beispiel einen Wechselstrommotor, würde ggf. eine sogenannte "Snubber" Löschschaltung helfen, den beim Abschalten des Stroms entstehenden elektromagnetischen Impuls ("Gegeninduktion") zu absorbieren, damit es keine unerwünschten Auswirkungen auf andere Hardwarekomponenten hat, wenn die induktive Last plötzlich abgeschaltet wird, ohne dass Schaltungstechnische Maßnahmen zur Herstellung der "elektromagnetischen Verträglichkeit" vorhanden sind.

Fehlende EMV-Gegenmaßnahmen beim Schalten induktiver Lasten sind typische SCHALTUNGSFEHLER von unbedarften Bastlern, von denen hier mindestens einmal im Monat einer ein "Neues Thema" aufmacht. Das sind in über 10 Jahren Forum sicher weit über 100 Themen alleine im deutschsprachigen Teil des Forums. Plus nochmal soviele im englischsprachigen Teil.

Hallo,
etwas stört mich an Deinem Sketch.

Einmal das:
"LiquidCrystal lcd(53, 52, 51, 50, 49, 48);"

Pin 53, 52, 51, 50 haben auf einem Mega ihre Eigenheiten. Ich würde die nicht
unbedingt für ein Display nehmen.

Was mich noch stört, Dein Sketch rauscht ohne Rücksicht auf Verluste einfach
so durch.
Ich würde Display und DHT etwas Zeit geben, um Ihre Arbeit zu erledigen.

Und dann Dein Relays, das prellt. Das mag der Mega nicht.
Gruß und Glück
Andreas

Also die Hintergrundbeleuchtung geht nicht aus! Nur das geschriebene.

Wie hast du das Display mit Spannung versorgt ?

Ich habe von dem USB Port des Arduino die 5V abgegriffen und versorge so das ganze Projekt.

Und mit welcher Spannung betreibst du dein Projekt ?

Mit 5V von einem hochwertigen USB Netzgerät, das Versorgt den Arduino über den USB Port

Wie hast du deinen Aufbau gelöst?
Steckkontakte sind da sehr fehlerträchtig.

Mit so Stiftleisten und Sockel.
Stiftleiste

Buchsenleiste

Anmerkung nur zur Info:
Wenn du eine genaue Schaltzeit für deine Heizungssteuerung benötigst, dann bist du mit deiner RTC falsch. Die geht schon mal gerne im Monat einige Minuten verkehrt. Nimm lieber die DS3231 dafür, die ist deutlich genauer.

Es muss nicht genau sein, mir reicht es wenn die Temperatur in der Nacht absinkt... Aber ja der wird bei Gelegenheit getauscht.

Lass mich raten: Du schaltest "induktive Last", ja?

Falsch geraten, ich schalte rein ohmische Wiederstände.

Fehlende EMV-Gegenmaßnahmen beim Schalten induktiver Lasten sind typische SCHALTUNGSFEHLER von unbedarften Bastlern, von denen hier mindestens einmal im Monat einer ein "Neues Thema" aufmacht. Das sind in über 10 Jahren Forum sicher weit über 100 Themen alleine im deutschsprachigen Teil des Forums. Plus nochmal soviele im englischsprachigen Teil.

Also betrifft mich dieses Thema nicht?

Einmal das:
"LiquidCrystal lcd(53, 52, 51, 50, 49, 48);"

Pin 53, 52, 51, 50 haben auf einem Mega ihre Eigenheiten. Ich würde die nicht
unbedingt für ein Display nehmen.

InwiefernEigenheiten? kann man das irgendwo nachlesen?

Was mich noch stört, Dein Sketch rauscht ohne Rücksicht auf Verluste einfach
so durch.
Ich würde Display und DHT etwas Zeit geben, um Ihre Arbeit zu erledigen.

Also die Pause am Ende verlängern? ich habe sie mal auf 2000 erhöht und schaue ob wieder was passiert.

Und dann Dein Relays, das prellt. Das mag der Mega nicht.

Wie meinst du das?

Was für ein Relais ist das, welches du über Pin 47 schaltest.
Hat das eine Freilaufdiode ?

Es ist so ein 8 Kanal Relaisboard, darauf sind freilaufdioden.

calmato67:
Es ist so ein 8 Kanal Relaisboard, darauf sind freilaufdioden.

Wenn die nachgeschalteten Verbraucher (siehe Jurs Beitrag) keine Störungen produzieren, sollte das mit dem Relais funktionieren.

calmato67:
Falsch geraten, ich schalte rein ohmische Wiederstände.
Also betrifft mich dieses Thema nicht?

Das kommt darauf an, ob Du mit dem Arduino ein "nacktes Relais" schaltest, oder ein "Relais-Modul".

Ein "nacktes Relais" an einem 5V Mikrocontroller ist selbst eine "induktive Last", wegen der Relaisspule.

Da wäre einerseits zu prüfen, ob der Mikrocontroller überhaupt genügend Strom zum Versorgen der Relaisspule mit Strom hergibt. Ein 5V Relais kann ggf. 75mA Strom zum Schalten benötigen, aber ein Atmega gibt an einem OUTPUT nur "max. 40mA) ab. Dafür würde ein Schalttransistor benötigt werden.

Und außerdem braucht das nackte Relais noch die Freilaufdiode über die Anschlüsse der Relaisspule.

Falls Du mit "Realais aber ein bereits beschaltetes "Relais-Modul" meinst, dann ist da bereits ein Optokoppler oder Schalttransistor drauf, so dass der OUTPUT des Arduino nur einen geringen Schaltrom von wenigen mA bereitstellen muss. Und ein Relais-Modul hat auch immer bereits eine Freilaufdiode für die Relaiswicklung mit auf dem Modul verbaut.

Eine rein ohmsche Last als "geschalteter Verbraucher" benötigt jedenfalls keine speziellen Entstörmaßnahmen, anders als eine induktive Last.

Hallo,
ach, ich weiß nicht einmal ob es ein Mega ist (Post #0) oder ein Uno (Post #4)

Das kannst mal löschen delay(2000) am Ende

Dann

DateTime now = rtc.now();
delay(50);
float h1 = dht1.readHumidity();   //temperatur auslesen
delay(50);
 float dt1 = dht1.readTemperature() - 2;  // LF auslesen
delay(50);


lcd.print(now.second(), DEC);
 lcd.print(' ');
delay(50);

digitalWrite(relay1, LOW);
delay(50);

digitalWrite(relay1, HIGH);
delay(50);

Serial.println(dt1);
delay(50);

MegaPin
sind eigentlich MOSI, MISO, SS und SCK, keine Ahnung wie die auf Display´s
reagieren.

Verdrahtungsfehler/AnschlussFehler ausgeschlossen?

Gruß und Spaß
Andreas

SkobyMobil:
MegaPin
sind eigentlich MOSI, MISO, SS und SCK, keine Ahnung wie die auf Display´s
reagieren.

Keine Ahnung, wie das beim Mega ist, aber bei anderen Arduinos sind die SPI/ISP-Pins normale GPIOs und können auch als solche verwendet werden. Wenn sie nicht gerade als SPI/ISP genutzt werden.
Aber ein MEGA ist es schon, bei den Pinnummern.

Frage, was genau schaltest du mit den Relais ?

Entschuldigt meine stümperhafte Bezeichnung, ich habe ein 8-Kanal-Relais-Board.

Danach geschaltet sind nur Widerstände angeschlossen, wirklich nur Widerstände, 2 Seriell und 2 Parallel, jeweils zu 33Ohm, als Heizung.
Diese Widerstände werden von einer separaten 12V Quelle gespiesen.

@SkobyMobil: Wo steht was von einem Uno? Es ist auf jeden Fall ein Mega2560. Ich habe deine Vorschläge umgesetzt, aber sind so viele Delays nicht schlecht?
Ich schaue nun ob das Problem behoben ist, ansonsten werde ich das Display anders anschliessen. Welche Pins wären Ideal? Pin 22 bis 31 sind für Sensoren belegt, 32 - 53 für Relais, 20, 21 für das Zeitmodul.

Verdrahtungafehler habe ich mir auch schon überlegt und auch gesucht, kann ich mir aber nicht vorstellen, da das Display funktioniert, dann verschwindet die Schrift und nach einem Reset ist sie wieder da

Ok, damit sind es tatsächlich nur Widerstände.

Aus meiner Sicht brauchst du die Anschlüsse nicht umstecken, frage mich allerdings, warum du für das Display nicht auch I2C verwendest. Dann sind es nur zwei Kabel und die gehen auf die I2C-Pins.

Du betreibst jetzt aber nur ein Relais ?
Nicht dass der Strom für die 5 Volt des Mega zu hoch wird.

Dann könnte der auch Probleme machen.

Aus meiner Sicht brauchst du die Anschlüsse nicht umstecken, frage mich allerdings, warum du für das Display nicht auch I2C verwendest. Dann sind es nur zwei Kabel und die gehen auf die I2C-Pins.

Hast du ein Link zu sowas, wie das geht?

Zur zeit betreibe ich ein einzelnes Relais, später sollten aber einige mehr kommen... Was kann ich da mit dem Strom tun?

calmato67:
Hast du ein Link zu sowas, wie das geht?

Zur zeit betreibe ich ein einzelnes Relais, später sollten aber einige mehr kommen... Was kann ich da mit dem Strom tun?

Ein 5 Volt Netzteil mit genügend Leistung (ca. 2-3A) für alles.
Was das Displays betrifft, schau mal hier

Hallo,
"aber sind so viele Delays nicht schlecht?"

4 delay(50) sind so schlecht wie 1 delay(200)

Elektronische Aktoren haben Latenzzeiten. Hältst Du die nicht ein kann- es zu Problemen kommen.
In Deinem Sketch ist eigentlich nichts auffälliges.
Daher die Idee mit den delay().
Gruß und Spaß
Andreas

Ein 5 Volt Netzteil mit genügend Leistung (ca. 2-3A) für alles.

Aber das habe ich ja schon? 5V, 2A was den Arduino über den USB Port versorgt und noch (ohne über die Platine zu gehen) GND und VCC der Relaiskarte versorgt? Den Strom für die Relais sollte der Arduino ja abkönnen (total maximal 16)?

Weiters klappt es mit den vielen kleinen delays bisher.
Wenn ich nun aber mehrere DHTs habe, wie muss ich das dann machen?

float h1 = dht1.readHumidity();   // LF auslesen
delay(50);
float h2 = dht2.readHumidity();   // LF auslesen
delay(50);
float h3 = dht3.readHumidity();   // LF auslesen
delay(50);
float h4 = dht4.readHumidity();   // LF auslesen
delay(50);
float dt1 = dht1.readTemperature() - 2;  // temperatur auslesen
delay(50);
float dt2 = dht2.readTemperature() - 2;  // temperatur auslesen
delay(50);
float dt3 = dht3.readTemperature() - 2;  // temperatur auslesen
delay(50);
float dt4 = dht4.readTemperature() - 2;  // temperatur auslesen
delay(50);

oder so?

float h1 = dht1.readHumidity();   // LF auslesen
float h2 = dht2.readHumidity();   // LF auslesen
float h3 = dht3.readHumidity();   // LF auslesen
float h4 = dht4.readHumidity();   // LF auslesen
delay(50);
float dt1 = dht1.readTemperature() - 2;  // temperatur auslesen
float dt2 = dht2.readTemperature() - 2;  // temperatur auslesen
float dt3 = dht3.readTemperature() - 2;  // temperatur auslesen
float dt4 = dht4.readTemperature() - 2;  // temperatur auslesen
delay(50);

Logischerweise eher das erste, aber da summieren sinch dann ja die Delays doch...

Wegen dem I2C muss ich mich mal noch einlesen...

calmato67:
Aber das habe ich ja schon? 5V, 2A was den Arduino über den USB Port versorgt und noch (ohne über die Platine zu gehen) GND und VCC der Relaiskarte versorgt? Den Strom für die Relais sollte der Arduino ja abkönnen (total maximal 16)?

Wegen dem I2C muss ich mich mal noch einlesen...

Verstehe ich nicht. Wo hast du die Relaisplatinen angeschlossen ?
Direkt an USB ?
Oder an 5 Volt am Arduino.

I2C ist sehr interessant und du solltest dich da einlesen.

Ich wollte nicht per 12V Netzgerät den Arduino versorgen, da die Überschüssige Spannung dort verheizt wird, deshalb habe ich auf der Unterseite der Platine 2 Leiter an der USB Buchse angelötet und greife davon die 5V ab... (Barbarisch.. ich weiss, klapt aber...)

calmato67:
Ich wollte nicht per 12V Netzgerät den Arduino versorgen, da die Überschüssige Spannung dort verheizt wird, deshalb habe ich auf der Unterseite der Platine 2 Leiter an der USB Buchse angelötet und greife davon die 5V ab... (Barbarisch.. ich weiss, klapt aber...)

Das ist schon ok, solange der Strom nicht über die Platine fließt.