LCD an-/ausstellen

Hallo Forum,

Ich möchte einen (16x2) LCD Display an bzw ausstellen um Strom zu spaaren.
Die Versorgungsspannung soll über ein Relais geschaltet werden.
Habe nun ein paar mal zum Testen die Spannung im Betrieb abgenommen und wieder angesteckt.
(Ich muss wirklich Vcc und GND trennen sonst bleibt der LCD so halb an und zieht sich was er zum überleben brauch wohl über die Datenpins.)
Nach dem Wiederanstecken wird nurnoch Unsinn ausgegeben.
Wenn ich nach Aktivierung die Zeile:

lcd.begin(16,2);

Ausführe, scheint der Display normal zu funktionieren.
Könnte das auf dauer Probleme machen diese Zeile mehrfach aus zu führen?

Anfangs dachte ich der LCD lässt sich einfach über einen Befehl (de-)aktivieren, uncool.

Vielen Dank.

Reichts nicht die Hintergrundbeleuchtung auszuschalten?
Das geht auch per Software.

du willst Strom sparen und nimmst dafür ein stromfressendes Relais? Die meisten I2C Shields bieten die Möglichkeit, die Hintergrundbeleuchtung abzuschalten (wie hk007 schon schrieb). Das geht aber nicht bei jedem. Wenn nicht, dann würde ich die Versorgung der Hintergrundbeleuchtung per Transistor abschalten - aber keinesfalls per Relais! Dadurch könntest Du sie auch per PWM dimmen um Strom zu sparen. Ein 50% On/Off Zyklus führt zum Beispiel keines wegs zu einer 50% geringeren Helligkeit. Damit kann man Strom sparen und trotzdem was lesbares anzeigen.

Wie meine Vorredner das schon richtig erklärt haben, geht es nur über die Spannung der Hintergrundbeleuchtung. Das Problem mit der Betriebsspannung ist normal, da du damit den Controller des LCD durcheinander bringst.

Wenn du mit der richtigen Beschaltung Probleme hast, poste doch mal einen Link deines LCD, dann können wir dir weitere Infos geben. Das einfachste ist wirklich mit einem Transistor (Mosfet) schalten.

Dennoch bleibt die Anzeige weiterhin (dunkel) bestehen, da diese auch ohne Beleuchtung lesbar ist.

Nett das ihr euch so viel Gedanken um mich macht aber eine Antwort auf meine Frage wäre auch echt interessant.
Ich benutze einen Arduino Uno, alle analogen und digitalen Pins sind für mein Projekt bereits vergeben.
Zusätzlich habe ich einen I2C Portexpander mit dessen 8 Ausgängen ich 8 Relais auf einem Modul schalte.
Ich brauche für das Projekt Bodenfeuchtigkeitssensoren die ich, um unnötige Elektrolyse zu verhindern, immer nur kurz mit 5V Spannung versorge.
Ich kann also alles was ich mit 5V betreiben muss mit Transistoren betreiben ODER ich nehme einfach das übrig gebliebene Relais auf dem Modul und bin glücklich.
PWM kommt nicht in frage, ich hab keine Pins mehr.
I2C Bildschirmshield oder wie auch immer man das nennen will, kommt nicht in frage weil ich weder Buget noch Zeit mehr habe.
Und den Bildschirm habe ich bereits so bestückt und verkabelt das er nurnoch eine Zuleitung für die Spannung braucht und ich bin zu faul das wieder auseinander zu löten.

Was geschieht also bei wiederholten Aufruf von “lcd.begin(16,2);” während des Programmverlaufs?

Was geschieht also bei wiederholten Aufruf von "lcd.begin(16,2);" während des Programmverlaufs?

Da musst du nur die Library anschauen. begin() macht die ganze LCD Initialisierung. Da wird eine Reihe von Kommandos an das LCD geschickt um die Grundeinstellungen vorzunehmen.

Genau und interessant ist ob er jedes mal ein neues objekt lcd anlegt oder nur das alte überschreibt aber das versteh ich noch nicht....

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

im endeffekt lege ich ja dieses "lcd" an (ist das ein Objekt?) und führe dann eine funktion davon aus,
heißt er initialisiert sich neu aber der Uno lässt sich davon auf dauer nicht verwirren oder?

Das Objekt existiert doch schon! Du rufst lediglich eine Methode eines existierenden Objekts auf. Die Initialisierung betrifft nur das LCD. Den Arduino interessiert das nicht wirklich.

Cool
Dann werden meine Feuchtigkeitssensoren jetzt ein bisschen länger laufen aber dafür brauch ich keinen zusätzlichen Schnick Schnack. Danke :wink:

Dieser Display macht mich echt kirre...

Schalte seine +5 für Beleuchtung und Display an sich nun über ein Relais.
Benutze ich vorher lcd.noDisplay(); und nachher lcd.display(); bleibt die Hintergrundbeleuchtung, wenn auch etwas dunkler, bei ausgeschaltetem Relais an.
Scheint sich also über die Datenpins mit Saft zu versorgen.
Verzichte ich darauf, wird der Display wirklich komplett dunkel.
In meinem Projekt scheint ein erneuter aufruf von lcd.begin(); jedoch nicht mehr aus zu reichen.
Nach dem anschalten gibt er nurnoch unsinn aus.

Jemand irgendeinen Tipp???

JimmyPesto:
Scheint sich also über die Datenpins mit Saft zu versorgen.

Klar. Über die Schutzdioden. Du darfst an ICs allgemein nie Daten anlegen wenn keine Betriebsspannung vorhanden ist. Schalte die Datenpins erst auf INPUT bevor du die Spannung wegnimmst.

Schaltbild und Sketch wären hier sehr hilfreich.

Du kannst auch einen weiteren PCF8574 Portexpander dazuschalten, wenn du mehr I/O’s brauchst. Dem 2. IC gibst du eine freie I2C Adresse und fertig ist der Kukuck. Oder du nimmst gleich eine auf besagtem IC basierende Huckeplackplatine für ein LCD Display.

Schalte doch mit dem Relais nur den Pin für die Hintergrundbeleuchtung und lass das LCD die ganze Zeit arbeiten. Soviel Strom wird es ja wohl nicht brauchen.

Das ist doch sowieso ein Witz. LCD abschalten um Strom zu sparen. Und das mit einem Relais.
Das Relais braucht sicher mehr Strom, als das LCD inkl. Beleuchtung.

Kommt darauf an. Vielleicht ist es nur wenige Sekunden pro Tag angezogen? Vielleicht muss es nachts unbedingt dunkel sein?

Aber der Pin, der das Relais steuert, kann doch auch die Hintergrundbeleuchtung direkt, ohne Relais schalten?

Ja, leider wissen wir das nicht. Der TO hält ja alles geheim, Schaltbild und Thread dürfen wir nicht sehen, aber Hilfe will er haben.
Ich möchte hier auch noch mal den Tipp von "nix_mehr_frei" aufgreifen.
Wenn du dein Display mit einem I2C-Adapter bestückst, sparst du Ports am Arduino und hast zusätzlich noch eine einfache Moglichkeit die Displaybeleuchtung zu schalten. Das Board hat extra dafür einen Anschluss.

Hui, danke für die vielen Antworten!

Sketch

Datenpins auf Input stellen bevor ich den LCD ausschalte find ich eine gute Idee.
Werde ich mal Testen

Hardwaretechnisch werde ich aufgrund von Zeitmangel erstmal nix mehr ändern.
Nochmal, von einem Relais-Modul mit 8 channeln ist eins übrig geblieben. Mit diesem wollte ich dann die 5V für Bodenfeuchtigkeitssensoren schalten. Ich könnte das natürlich auch brach liegen lassen…
Dann hab ich erst begriffen, dass ich den LCD auch schalten muss.
Meine Outputs sind ALLE vergeben. Ich hab keine Zeit und keine Lust jetzt für einen Output noch einen weiteren Portexpander zu verlöten. Ende aus basta…

Also brauch ich jetzt nh “quick & durty” Lösung.
Wem das nicht fein genug ist der kann sich die Mühe sparen.

Im Automatikmodus ist das 5V Relais vllt 2 min am Tag eingeschaltet.
Im Handbetrieb ist es abhängig davon wie lange gegossen wird und es könnte durchaus eine Stunde am Tag geschaltet sein, weil der Fortschritt auf dem LCD angezeigt wird.
Was garnicht so gut ist, weil ich die Bodenfeuchtigkeit über den Gleichstromwiderstand bestimme und die Chinasensoren sehr schnell an Elektrolyse leiden. (Btw. könnte ich die Sensoren irgendwo für wenig Geld, ganz fein mit Gold bedampfen lassen?)
Von daher werde ich früher oder später beides getrennt schalten müssen, aber für meinen Testaufbau langt eine einfachere Lösung.

Edit:
Des Rätsels Lösung war in der Tat sehr einfach:
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);

Danke Serenifly für die unkomplizierte Lösung!!!

GIESOMAT.pdf (35.4 KB)

Und warum schließt du alle drei Taster und Pin 2, 3 und 13 kurz?
Das geht bestimmt schief.

Ja der Schaltplan ist etwas veraltet, habe noch keinen Aktuellen.
Nur Best. und die RTC sind an Pin2.
Hoch an Pin3.
Runter an Pin13.
und die Füllstandssensoren ziehen nicht auf 5V sondern GND.

Ich dachte ich brauche für jeden Tastendruck einen Interrupt.
Aber jetzt Polle ich das einfach in der Loop, weil ich schwierigkeiten hatte die Tasten in der ISR zu entprellen.